首先求出SCC缩点,E[T]=0,按拓扑序计算

对于无边连出的块,如果不是T所在块,则称该块是死路块

对于一个块,如果其中的点连出的边是死路块,则它也是死路块

否则对于每块进行高斯消元求出期望

如果S点所在块为死路块,则答案为INF

  1. #include<cstdio>
  2. #include<cmath>
  3. const int N=10010,M=1000010;
  4. int n,m,x,y,i,j,S,T;
  5. int g[3][N],nxt[3][M],v[3][M],ed,G[N],NXT[N],V[N],d[N],q[N],f[N],h,t,cnt,id[N],tot;bool vis[N],inf[N];
  6. double e[N],a[110][110],ans[110],tmp;
  7. inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
  8. inline void add(int x,int y){
  9. v[0][++ed]=y;nxt[0][ed]=g[0][x];g[0][x]=ed;
  10. v[1][ed]=x;nxt[1][ed]=g[1][y];g[1][y]=ed;
  11. }
  12. inline void ADD(int x,int y){d[y]++,v[2][++ed]=y;nxt[2][ed]=g[2][x];g[2][x]=ed;}
  13. inline void addnode(int x,int y){V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}
  14. void dfs1(int x){
  15. vis[x]=1;
  16. for(int i=g[0][x];i;i=nxt[0][i])if(!vis[v[0][i]])dfs1(v[0][i]);
  17. q[++t]=x;
  18. }
  19. void dfs2(int x,int y){
  20. vis[x]=0,addnode(f[x]=y,x);
  21. for(int i=g[1][x];i;i=nxt[1][i])if(vis[v[1][i]])dfs2(v[1][i],y);
  22. }
  23. inline void cal(int x){
  24. int i,j,k,u,y,cnt;double t;
  25. for(tot=0,i=G[x];i;i=NXT[i])id[V[i]]=++tot;
  26. for(cnt=0,i=G[x];i;i=NXT[i]){
  27. for(u=V[i],++cnt,j=1;j<=tot+1;j++)a[cnt][j]=0;
  28. if(u==T){a[cnt][cnt]=1;continue;}
  29. for(j=g[0][u];j;j=nxt[0][j]){
  30. if(inf[f[y=v[0][j]]]){inf[x]=1;return;}
  31. a[cnt][cnt]+=1,a[cnt][tot+1]+=1;
  32. if(f[y]==x)a[cnt][id[y]]-=1;else a[cnt][tot+1]+=e[y];
  33. }
  34. }
  35. for(i=1;i<=tot;i++){
  36. for(k=i,j=i+1;j<=tot;j++)if(std::fabs(a[j][i])>std::fabs(a[k][i]))k=j;
  37. if(k!=i)for(j=i;j<=tot+1;j++)tmp=a[i][j],a[i][j]=a[k][j],a[k][j]=tmp;
  38. for(j=i+1;j<=tot;j++)for(t=a[j][i]/a[i][i],k=i;k<=tot+1;k++)a[j][k]-=a[i][k]*t;
  39. }
  40. for(ans[tot]=a[tot][tot+1]/a[tot][tot],i=tot-1;i;i--){
  41. for(ans[i]=a[i][tot+1],j=tot;j>i;j--)ans[i]-=ans[j]*a[i][j];
  42. ans[i]/=a[i][i];
  43. }
  44. for(i=G[x];i;i=NXT[i])e[V[i]]=ans[id[V[i]]];
  45. }
  46. int main(){
  47. read(n),read(m),read(S),read(T);
  48. while(m--)read(x),read(y),add(x,y);
  49. for(i=1;i<=n;i++)if(!vis[i])dfs1(i);
  50. for(ed=0,i=n;i;i--)if(vis[q[i]])dfs2(q[i],++cnt);
  51. for(ed=0,i=1;i<=n;i++)for(j=g[0][i];j;j=nxt[0][j])if(f[i]!=f[v[0][j]])ADD(f[v[0][j]],f[i]);
  52. for(i=1;i<=cnt;i++)if(!d[i])if(f[T]!=i)inf[i]=1;
  53. for(h=i=1,t=0;i<=cnt;i++)if(!d[i]){
  54. q[++t]=i;
  55. if(f[T]==i)cal(i);
  56. }
  57. while(h<=t)for(i=g[2][x=q[h++]];i;i=nxt[2][i])if(!(--d[v[2][i]]))cal(q[++t]=v[2][i]);
  58. if(inf[f[S]])puts("INF");else printf("%.3f",e[S]);
  59. return 0;
  60. }

  

BZOJ2707 : [SDOI2012]走迷宫的更多相关文章

  1. BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】

    题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

  2. BZOJ2707: [SDOI2012]走迷宫(期望 tarjan 高斯消元)

    题意 题目链接 Sol 设\(f[i]\)表示从\(i\)走到\(T\)的期望步数 显然有\(f[x] = \sum_{y} \frac{f[y]}{deg[x]} + 1\) 证明可以用全期望公式. ...

  3. 【BZOJ2707】[SDOI2012]走迷宫 Tarjan+拓扑排序+高斯消元+期望

    [BZOJ2707][SDOI2012]走迷宫 Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,M ...

  4. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  5. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  6. SDOI2012 走迷宫

    走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...

  7. bzoj 2707 [SDOI2012]走迷宫(SCC+高斯消元)

    Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿 ...

  8. 【bzoj2707】走迷宫

    Portal --> bzoj2707 Solution 首先题目有一个十分明显的暗示..强联通分量..那肯定就是要tarjan一波咯 先看看什么情况下会\(INF\),其实就是题目里面讲的两种 ...

  9. [SDOI2012]走迷宫 (强连通分量缩点,动态规划,高斯消元)

    题面 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

随机推荐

  1. python 最佳入门实践

    勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...

  2. python setup.py uninstall

    I have installed a python package with python setup.py install How do I uninstall it? ============== ...

  3. XPath常用定位节点元素语句总结

    将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表达式可以选择DOM树中的nodes( ...

  4. Java中static静态关键字的使用

    我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...

  5. Simple Chroma Key 0.1.16 图片抠像(vs2003) 无任何插件

    学习扣像的最基础代码 (只支持 BMP TGA) simplechromakey.rar

  6. Gym 100851G Generators (vector+鸽笼原理)

    Problem G. Generators Input file: generators.in Output file: generators.outLittle Roman is studying li ...

  7. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  8. 何时使用hadoop fs、hadoop dfs与hdfs dfs命令(转)

    hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后 ...

  9. Struts2中的ActionContext、OGNL及EL的使用

    文章分类:Java编程 本文基于struts2.1.8.1,xwork2.1.6 1.EL         EL(Expression Language)源于jsp页面标签jstl,后来被jsp2.0 ...

  10. linux下绘图工具dia

    官网:https://wiki.gnome.org/Apps/Dia [root@ok Software]# wget --limit-rate=100k ftp://ftp.gnome.org/pu ...