2707: [SDOI2012]走迷宫

题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\)


求scc缩点,每个scc高斯消元,scc之间直接DP

注意每次清空系数矩阵

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e4+5, M=1e6+5;
const double eps=1e-8;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n, m, s, t, de[N], u, v;
struct edge{int v, ne;} e[M];
int cnt=1, h[N];
inline void ins(int u, int v) {e[++cnt]=(edge){v, h[u]}; h[u]=cnt;}
int dfn[N], low[N], dfc, belong[N], scc;
struct List{int a[105], n;int& operator [](int x) {return a[x];}inline void push(int x) {a[++n]=x;}
}li[N];
int st[N], top;
void dfs(int u) { //printf("dfs %d\n",u);dfn[u] = low[u] = ++dfc;st[++top] = u;for(int i=h[u];i;i=e[i].ne) {int v=e[i].v;if(!dfn[v]) dfs(v), low[u] = min(low[u], low[v]);else if(!belong[v]) low[u] = min(low[u], dfn[v]);}if(dfn[u] == low[u]) {scc++;while(true) {int x=st[top--];belong[x] = scc;li[scc].push(x);if(x == u) break;}}
}double a[105][105], f[N]; int id[N];
void gauss(int n) { //puts("\ngauss");//for(int i=1; i<=n; i++)//  for(int j=1; j<=n+1; j++) printf("%lf%c",a[i][j], j==n+1 ? '\n' : ' ');for(int i=1; i<=n; i++) {int r=i;for(int j=i; j<=n; j++) if(abs(a[j][i])>abs(a[r][i])) r=j;if(r!=i) for(int j=1; j<=n+1; j++) swap(a[r][j], a[i][j]);for(int k=i+1; k<=n; k++) if(abs(a[k][i]) > eps){double t = a[k][i]/a[i][i];for(int j=i; j<=n+1; j++) a[k][j] -= t*a[i][j];}}for(int i=n; i>=1; i--) {for(int j=n; j>i; j--) a[i][n+1] -= a[i][j]*a[j][n+1];a[i][n+1] /= a[i][i];}
}
void solve(List &q) {memset(a,0,sizeof(a));int n=0;for(int i=1; i<=q.n; i++) id[q[i]] = ++n;// printf("%d ",q[i]); puts(" q");for(int i=1; i<=q.n; i++) {int u=q[i]; a[i][i]=1; a[i][n+1]=1;if(u==t) {a[i][n+1]=0; continue;}for(int p=h[u];p;p=e[p].ne) {int v=e[p].v; if(belong[v] != belong[u]) a[i][n+1] += f[v]/de[u];else a[i][id[v]] -= 1.0/de[u];}}gauss(n);for(int i=1; i<=q.n; i++) f[q[i]] = a[i][n+1];// printf("getf %d %lf\n",q[i],f[q[i]]);
}
namespace SCC {struct edge{int v, ne;} e[M];int cnt=1, h[N];inline void ins(int u, int v) {e[++cnt]=(edge){v, h[u]}; h[u]=cnt;}int vis[N];void dfs(int u) {if(vis[u]) return; vis[u]=1;for(int i=h[u];i;i=e[i].ne) dfs(e[i].v);//printf("solveSCC %d\n",u);solve(li[u]);}
}
void build() {for(int u=1; u<=n; u++)for(int i=h[u];i;i=e[i].ne)if(belong[u] != belong[e[i].v]) SCC::ins(belong[u], belong[e[i].v]);
}
int main() {freopen("in","r",stdin);n=read(); m=read(); s=read(); t=read();for(int i=1; i<=m; i++) {u=read(), v=read();de[u]++; ins(u, v);}dfs(s);//for(int i=1; i<=n; i++) printf("scc %d  %d %d\n",i, dfn[i], belong[i]);if(!dfn[t]) {puts("INF"); return 0;}for(int i=1; i<=n; i++) if(i!=t && de[i]==0 && dfn[i]) {puts("INF"); return 0;}build();SCC::dfs(belong[s]);//for(int i=1; i<=n; i++) printf("f %d %lf\n",i,f[i]);printf("%.3lf", f[s]);
}

BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]相关推荐

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

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

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

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

  3. BZOJ.2707.[SDOI2012]走迷宫(期望 Tarjan 高斯消元)

    题目链接 一个点到达终点的期望步数 \(E_i=\sum_{(i,j)\in G}\frac{E_j+1}{out[i]}\),\(out[i]\)为点\(i\)的出度. 那么对于一个DAG可以直接在 ...

  4. [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  5. bzoj 3143: [Hnoi2013]游走(高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3171  Solved: 1390 [Submit][Stat ...

  6. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

  7. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  8. BZOJ 2115 Wc2011 Xor DFS+高斯消元

    标题效果:鉴于无向图.右侧的每个边缘,求一个1至n路径,右上路径值XOR和最大 首先,一个XOR并能为一个路径1至n简单的路径和一些简单的XOR和环 我们开始DFS获得随机的1至n简单的路径和绘图环所 ...

  9. BZOJ 2728 HNOI2012 与非 高斯消元

    题目大意:给定k位二进制下的n个数,求[l,r]区间内有多少个数能通过这几个数与非得到 首先观察真值表 我们有A nand A = not A 然后就有not ( A nand B ) = A and ...

最新文章

  1. [Android动画] 帧动画-获取帧数( getNumberOfFrames)七
  2. osg 改变模型贴图
  3. Swift使用通知Notification
  4. ceph rbdmap遇到的一个问题
  5. libc.so.6(GLIBC_2.14)(64bit) is needed by...问题的解决办法
  6. cf831D(dp)
  7. lightning接口_Lightning太赚钱?iPhone永远不会用Type-C
  8. [转载] java 计算协方差_Java的深度:通过协方差暴露的API泄漏
  9. javascript的dom选择器
  10. 如何备份linux,如何备份Linux系统
  11. lintcode刷题目录
  12. Python - 批量修改文件夹名称
  13. 鸿蒙可能超越安卓吗,华为鸿蒙能超越安卓吗?或一统江湖?任正非已志在必得...
  14. 参考平面及其高度_海图基准面、深度基准、标高等常用参考标准
  15. 用hidusb.sys还是winusb.sys读写一个只有In/Out Interrupt Endpoints的STM32 USB设备?
  16. 要不要从单片机转Linux?进来看看大神怎么说
  17. golang长连接和短连接的那些事儿
  18. 雷电网络(二):掌握雷电网络的特点 | 区块链技术博客
  19. 复旦大学和中科大 计算机,强基计划遇冷?!复旦大学和中科大都没招满...
  20. 六十星系之21紫微天府坐寅申

热门文章

  1. php中instanceof的使用
  2. JS实现HTML上用button打开文件对话框
  3. 用友ERP供应链模块(一)----库存盘点
  4. python虚拟环境
  5. PCIe知识学习 (转载)
  6. java数组中最小的k个元素_java – 在数组中找到k个最小整数
  7. 被大众群体吹的神乎其神的Python到底都能干什么
  8. IT职场:程序员如何增加收入?
  9. java中的多态_Java中的多态
  10. java将0到9随机输出_生成0到9之间的随机整数