题目链接

一个点到达终点的期望步数 \(E_i=\sum_{(i,j)\in G}\frac{E_j+1}{out[i]}\),\(out[i]\)为点\(i\)的出度。
那么对于一个DAG可以直接在反向图上拓扑+DP求解。
于是对于环内高斯消元,缩点后拓扑+DP。
无解(无限步)的情况: 起点到不了终点;起点能够走到一个环,且在这个环内无法走到终点(走不出去)。

ps:1.T连出的边不能计算。
2.期望的计算式有个+1!
3.建反向边!
4.重边


注:
如果\(E_i\)表示从起点到点\(i\)的期望步数,那么起点可能多次到达点\(i\),\(E_i\)这个值就。。(可以就直接拿起点做例子?)
如果\(E_i\)表示到达终点的期望步数就没有这个问题。


//21136kb   5168ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=1e4+5,M=1e6+5;int n,m,S,T,Enum,H[N],to[M],nxt[M],_H[N],_to[M],_nxt[M],in[N],q[N];
int tot,bel[N],scc[N][103],num[N],sz[N],Index,dfn[N],low[N],sk[N],top;
double A[105][105],E[N],out[N];
bool vis[N],vis_s[N],exist[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void AddEdge(int u,int v){to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;_to[Enum]=u, _nxt[Enum]=_H[v], _H[v]=Enum;
}
void Tarjan(int x)
{dfn[x]=low[x]=++Index, sk[++top]=x, exist[x]=1;for(int i=H[x]; i; i=nxt[i])if(!dfn[to[i]]) Tarjan(to[i]),low[x]=std::min(low[x],low[to[i]]);else if(exist[to[i]]) low[x]=std::min(low[x],dfn[to[i]]);if(dfn[x]==low[x]){++tot;do{bel[sk[top]]=tot, num[sk[top]]=sz[tot],scc[tot][sz[tot]++]=sk[top], exist[sk[top--]]=0;}while(sk[top+1]!=x);}
}
void DFS(int x)
{vis[x]=vis_s[bel[x]]=1;if(x==T) return;//有没有都行 for(int i=H[x]; i; i=nxt[i])if(!vis[to[i]]) /*++in[bel[x]],//Wrong*/DFS(to[i]);
}
void Gauss(int n)
{for(int j=0; j<n; ++j){int mxrow=j;for(int i=j+1; i<n; ++i)if(fabs(A[i][j])>fabs(A[mxrow][j])) mxrow=i;if(mxrow!=j) for(int k=0; k<=n; ++k) std::swap(A[mxrow][k],A[j][k]);for(int i=j+1; i<n; ++i)if(A[i][j]){double t=A[i][j]/A[j][j];for(int k=j; k<=n; ++k)A[i][k]-=A[j][k]*t;}}for(int i=n-1; ~i; --i){for(int j=i+1; j<n; ++j) A[i][n]-=A[i][j]*A[j][n];A[i][n]/=A[i][i];}
}int main()
{n=read(),m=read(),S=read(),T=read();for(int u,v,i=1; i<=m; ++i) u=read(),v=read(),out[u]+=1.0,AddEdge(u,v);for(int i=1; i<=n; ++i)if(!dfn[i]) Tarjan(i);DFS(S);if(!vis[T]) {puts("INF"); return 0;}for(int x=1; x<=n; ++x)for(int i=H[x]; i; i=nxt[i])if(bel[x]!=bel[to[i]]) ++in[bel[x]];//反向图上的入度+1。for(int i=1; i<=tot; ++i)if(vis_s[i]&&!in[i]&&bel[T]!=i) {puts("INF"); return 0;}for(int i=1; i<=n; ++i) out[i]=1.0/out[i];int h=0,t=0;q[t++]=bel[T];
//  for(int i=1; i<=tot; ++i)
//      if(!in[i]) q[t++]=i;//in[]=0的只能是bel[T].while(h<t){int now=q[h++];memset(A,0,sizeof A);for(int j=0; j<sz[now]; ++j){int x=scc[now][j];A[j][j]=1.0, A[j][sz[now]]=E[x]/*之前加上的*/;if(x==T) continue;//不计算终点连出的边!for(int i=H[x]; i; i=nxt[i])if(bel[to[i]]==now){A[j][sz[now]]+=out[x],//步数+1.A[j][num[to[i]]]-=out[x];//是点的出度不是in[]! //-=不能直接赋值=:有重边!}}Gauss(sz[now]);for(int j=0; j<sz[now]; ++j){int x=scc[now][j];E[x]=A[j][sz[now]];for(int i=_H[x]; i; i=_nxt[i])if(bel[_to[i]]!=now){if(!--in[bel[_to[i]]]) q[t++]=bel[_to[i]];E[_to[i]]+=(E[x]+1)*out[_to[i]];}}}printf("%.3lf",E[S]);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8681877.html

BZOJ.2707.[SDOI2012]走迷宫(期望 Tarjan 高斯消元)相关推荐

  1. bzoj 2707: [SDOI2012]走迷宫(Trajan+高斯消元+Dp)

    2707: [SDOI2012]走迷宫 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 862  Solved: 328 [Submit][Statu ...

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

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

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

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

  4. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  5. LightOJ 1151 Snakes and Ladders (期望DP + 高斯消元)

    Description 'Snakes and Ladders' or 'Shap-Ludu' is a game commonly played in Bangladesh. The game is ...

  6. ICPC 2005 hangzhou Generator (UVA1358)KMP + 期望DP / 高斯消元

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Generator Weblink https://www.luogu.com.cn/problem/ ...

  7. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元

    [BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...

  8. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为nnn,剩余hphphp点生命,然后每个时刻如果生命值没有满那么有1m+1 ...

  9. 【BZOJ2337】XOR和路径,概率期望DP+高斯消元

    Time:2016.08.27 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 与游走思路有一定相似的地方 对答案的每一位进行判断 通过高斯消元解出每个点到n xor路径为1的概率 ...

最新文章

  1. 直播APP常用动画效果
  2. MYSQL5 表列更名删除等操作测试(更新中...)
  3. 对讲机的那点事:带你玩转LD800数字车载台读、写频操作:一
  4. 教你快速写出多线程Junit单元测试用例 - GroboUtils
  5. stm32 systick分析
  6. 计算机网络职称可以免考么,谁知道四川职称计算机考试的免考条件啊,我要去评职称,但不想去考职? 爱问知识人...
  7. 来学习ansibie(1)
  8. java 会话共享_java – servlet如何工作?实例化,会话,共享变量和多线程
  9. Python3——函数
  10. 外挂:一个很杯具的关键字
  11. 基于Spring Cloud的微服务架构
  12. java数据类型 枚举_枚举(enum)属于原始数据类型(primitive typ
  13. 网络爬虫/数据抓取,反爬虫(更新版)
  14. PPT模板制作如何添加动画?
  15. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
  16. 怎么安装苹果系统mac os x虚拟机
  17. javaweb监听器(统计在线人数:统计session)
  18. 以太网学习(2)-- 网络协议简介
  19. Mongdb重启后dirty很高,cache打满
  20. 鸿蒙系统支持980,稳了!鸿蒙系统升级名单再曝:至少麒麟980机型都能升级

热门文章

  1. 【译】Google's AutoML: Cutting Through the Hype
  2. 全面解析多种区块链隐私保护解决方案
  3. python double语法_python上手--基本语法和数据类型基础
  4. 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
  5. NOIP信息奥赛--1995“同创杯”初中复赛题题解(五)
  6. request用法_Go 语言 Web 应用开发 第 04 课:高级模板用法
  7. python 浮点数精度丢失_javascript解决小数的加减乘除精度丢失的方案
  8. [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)
  9. 【普及组模拟赛】游戏
  10. AtCoder AGC030C Coloring Torus (构造)