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

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

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

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

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

#include<cstdio>
#include<cmath>
const int N=10010,M=1000010;
int n,m,x,y,i,j,S,T;
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];
double e[N],a[110][110],ans[110],tmp;
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';}
inline void add(int x,int y){
v[0][++ed]=y;nxt[0][ed]=g[0][x];g[0][x]=ed;
v[1][ed]=x;nxt[1][ed]=g[1][y];g[1][y]=ed;
}
inline void ADD(int x,int y){d[y]++,v[2][++ed]=y;nxt[2][ed]=g[2][x];g[2][x]=ed;}
inline void addnode(int x,int y){V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}
void dfs1(int x){
vis[x]=1;
for(int i=g[0][x];i;i=nxt[0][i])if(!vis[v[0][i]])dfs1(v[0][i]);
q[++t]=x;
}
void dfs2(int x,int y){
vis[x]=0,addnode(f[x]=y,x);
for(int i=g[1][x];i;i=nxt[1][i])if(vis[v[1][i]])dfs2(v[1][i],y);
}
inline void cal(int x){
int i,j,k,u,y,cnt;double t;
for(tot=0,i=G[x];i;i=NXT[i])id[V[i]]=++tot;
for(cnt=0,i=G[x];i;i=NXT[i]){
for(u=V[i],++cnt,j=1;j<=tot+1;j++)a[cnt][j]=0;
if(u==T){a[cnt][cnt]=1;continue;}
for(j=g[0][u];j;j=nxt[0][j]){
if(inf[f[y=v[0][j]]]){inf[x]=1;return;}
a[cnt][cnt]+=1,a[cnt][tot+1]+=1;
if(f[y]==x)a[cnt][id[y]]-=1;else a[cnt][tot+1]+=e[y];
}
}
for(i=1;i<=tot;i++){
for(k=i,j=i+1;j<=tot;j++)if(std::fabs(a[j][i])>std::fabs(a[k][i]))k=j;
if(k!=i)for(j=i;j<=tot+1;j++)tmp=a[i][j],a[i][j]=a[k][j],a[k][j]=tmp;
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;
}
for(ans[tot]=a[tot][tot+1]/a[tot][tot],i=tot-1;i;i--){
for(ans[i]=a[i][tot+1],j=tot;j>i;j--)ans[i]-=ans[j]*a[i][j];
ans[i]/=a[i][i];
}
for(i=G[x];i;i=NXT[i])e[V[i]]=ans[id[V[i]]];
}
int main(){
read(n),read(m),read(S),read(T);
while(m--)read(x),read(y),add(x,y);
for(i=1;i<=n;i++)if(!vis[i])dfs1(i);
for(ed=0,i=n;i;i--)if(vis[q[i]])dfs2(q[i],++cnt);
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]);
for(i=1;i<=cnt;i++)if(!d[i])if(f[T]!=i)inf[i]=1;
for(h=i=1,t=0;i<=cnt;i++)if(!d[i]){
q[++t]=i;
if(f[T]==i)cal(i);
}
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]);
if(inf[f[S]])puts("INF");else printf("%.3f",e[S]);
return 0;
}

  

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. Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  2. Linux 实现rsyslog日志里面的IP地址记录 未测试

    之前我是在bashrc中添加了一句,让系统操作日志时向rsyslog发送一份内容,现在只要在发送的时候,自己再获取下当前的远程登录IP加进去就可以,像这样 /etc/bashrc sshClientI ...

  3. Javascript样例之文档章节滚动全版(DOM)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBMAAAC5CAIAAAD1bOCRAAAMEUlEQVR4nO3d4XEbyREGUGRCZQDGcG

  4. raw格式镜像文件压缩并转换为qcow2格式

    raw格式文件,这个比较占用空间,你可以用以下命令将其压缩并转换成qcow2格式. # virt-sparsify --compress --convert qcow2 ubuntu.img ubun ...

  5. 【持续集成】使用Jenkins实现多平台并行集成

    使用Jenkins实现多平台并行集成 二月 15, 2012 暂无评论 我们的后端C应用都是支持跨平台的,至少目前在Linux和Solaris上运行是没有问题的,这样一来我们在配置持续集成环境时就要考 ...

  6. MSSQL 2008错误提示:更改对于登录sa失败

    MSSQL 2008错误提示:更改对于登录sa失败: 使用Windows方式登录数据库后,执行以下命令: EXEC sp_password null,"123456"," ...

  7. Segment Tree Modify

    For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in thi ...

  8. 部署Office Web Apps Server并配置其与SharePoint 2013的集成

    部署Office Web Apps Server并配置其与SharePoint 2013的集成   Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.P ...

  9. Eclipse在已创建的project中导入其他文件

    Eclipse在已创建的project中导入其他文件 前两天被同事问到,如何通过不拷贝源文件的方式,在之前已经创建好的project中直接导入其他目录下的文件, 整理了一下,将目前所知道的eclips ...

  10. iOS和android游戏纹理优化和内存优化(cocos2d-x)(转载)

    转自http://blog.csdn.net/langresser_king/article/details/8426708 (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x ...