bzoj千题计划289:bzoj 2707: [SDOI2012]走迷宫
http://www.lydsy.com/JudgeOnline/problem.php?id=2707
dp[i] 表示从点i到终点的期望步数
dp[i]= Σ (dp[j]+1)/out[i]
j表示i的出边指向的店,out[i] 表示i的出边数
如果图是一张DAG,那么直接在反图 上 拓扑排序DP即可
现在有环,那就缩点,环上的用高斯消元
无解的情况:
1、起点走不到终点
2、存在一个联通块,起点能走到他,但这个联通块没有出边,且不是终点所在的联通块
因为此时一旦步入这个联通块将永远走不出去
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<iostream> #define N 10001
#define M 1000001 using namespace std; int front[N],to[M],nxt[M],tot;
int front_[N],to_[M],nxt_[M],tot_; int dfn[N],low[N],id;
int st[N],top;
bool vis[N]; vector<int>block[N];
int bl[N],cnt;
int num[N]; double out[N];
int in_[N]; bool vis_block[N]; double a[][],dp[N]; queue<int>q; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to_[++tot_]=u; nxt_[tot_]=front_[v]; front_[v]=tot_;
} void tarjan(int x)
{
dfn[x]=low[x]=++id;
st[++top]=x;
vis[x]=true;
for(int i=front[x];i;i=nxt[i])
if(!dfn[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}
else if(vis[to[i]]) low[x]=min(low[x],dfn[to[i]]);
if(dfn[x]==low[x])
{
cnt++;
while(st[top]!=x)
{
block[cnt].push_back(st[top]);
bl[st[top]]=cnt;
num[st[top]]=block[cnt].size()-;
vis[st[top--]]=false;
}
block[cnt].push_back(x);
bl[x]=cnt;
num[x]=block[cnt].size()-;
vis[st[top--]]=false;
}
} void dfs(int x)
{
vis[x]=vis_block[bl[x]]=true;
for(int i=front[x];i;i=nxt[i])
if(!vis[to[i]]) dfs(to[i]);
} void gauss(int n)
{
int r; double t;
for(int i=;i<n;++i)
{
r=i;
for(int j=i+;j<n;++j)
if(fabs(a[j][i])>fabs(a[r][i])) r=j;
if(r!=i)
for(int j=;j<=n;++j) swap(a[r][j],a[i][j]);
for(int k=i+;k<n;++k)
{
t=a[k][i]/a[i][i];
for(int j=i;j<=n;++j) a[k][j]-=t*a[i][j];
}
}
for(int i=n-;i>=;--i)
{
for(int j=i+;j<n;++j) a[i][n]-=a[i][j]*a[j][n];
a[i][n]/=a[i][i];
}
} int main()
{
int n,m,s,t;
read(n); read(m); read(s); read(t);
int u,v;
for(int i=;i<=m;++i)
{
read(u); read(v);
add(u,v); out[u]++;
}
for(int i=;i<=n;++i)
if(!dfn[i]) tarjan(i);
dfs(s);
if(!vis[t])
{
printf("INF");
return ;
}
for(int i=;i<=n;++i)
for(int j=front[i];j;j=nxt[j])
if(bl[i]!=bl[to[j]]) in_[bl[i]]++;
for(int i=;i<=cnt;++i)
if(vis_block[i] && !in_[i] && i!=bl[t])
{
printf("INF");
return ;
}
for(int i=;i<=n;++i) out[i]=1.0/out[i];
q.push(bl[t]);
int now,siz,x;
while(!q.empty())
{
now=q.front();
q.pop();
memset(a,,sizeof(a));
siz=block[now].size();
for(int i=;i<siz;++i)
{
x=block[now][i];
a[i][i]=;
a[i][siz]=dp[x];
if(x==t) continue;
for(int j=front[x];j;j=nxt[j])
if(bl[to[j]]==now)
{
a[i][siz]+=out[x];
a[i][num[to[j]]]-=out[x];
}
}
gauss(siz);
for(int i=;i<siz;++i)
{
x=block[now][i];
dp[x]=a[i][siz];
for(int j=front_[x];j;j=nxt_[j])
if(bl[to_[j]]!=now)
{
--in_[bl[to_[j]]];
if(!in_[bl[to_[j]]]) q.push(bl[to_[j]]);
dp[to_[j]]+=(dp[x]+)*out[to_[j]];
}
}
}
printf("%.3lf",dp[s]);
}
bzoj千题计划289:bzoj 2707: [SDOI2012]走迷宫的更多相关文章
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
- BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...
- bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster
http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
随机推荐
- [转载] 相机越贵画质越好?聊聊CMOS设计
似乎在很多人心目中,个位数机身就代表了品牌最强成像素质,这或许有“人不识货钱识货”的道理在作祟,但事实上如佳能1DX2或尼康D5,又或是索尼A9这种旗舰机真的就一定能代表本家的画质巅峰么?这一切都得从 ...
- tornado学习笔记
一.UIMOTHODS: 1.在项目目录创建uimothods.py文件(名称可以任意)内容: def test2(self): return ('hello uimothods') 2.tornad ...
- [2017BUAA软工助教]个人得分总表(至alpha结束)
一.表 学号 第0次 week1 week2 week3 个人项目 附加1 结对项目 附加2 a团队 a团队得分 a贡献分 总分(不计) 总分(记) 15061119 7 9.5 12 9 45.75 ...
- 第一个Sprint计划
时间:5月22-28日 (6天) 人员:杜殷浩(界面设计) 何广强(界面美化) 目标:将基本框架设计好,实现好.
- Alpha冲刺——day6
Alpha冲刺--day6 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...
- [Delphi]实现使用TIdHttp控件向https地址Post请求[转]
开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议.百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实 ...
- 群里提到的IE设置问题 ---B/S 下页面刷新问题
这里面四个选项的含义 下面是每个选项的作用和意义: 1. “每次访问此页时检查”选项表示浏览器每次访问一个页面时,不管浏览器是否缓存过此页面,都要向服务器发出访问请求.这种设置的优点是实时性很强,肯定 ...
- 【转】fiddler抓包时出现了tunnel to ......443 解密HTTPS数据
转: 1.在抓取https的数据包时,fiddler会话栏目会显示“Tunnel to….443”的信息,这个是什么原因呢? connect表示https的握手(也就是认证信息,只要是https就要进 ...
- linux运维之分析日志相关命令(1)
一.分析日志 1.查看有多少IP访问 awk '{print $1}' log_file|sort|uniq|wc -l 2.查看某一个页面被访问的次数 grep "/index.php&q ...
- 解题:CF1130E Wrong Answer
题面 巧妙构造题 这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子 令序列$a$的第一个元素为负,其余元素为正,且保证序列中至少有两个元素,那么Alice的代码将会从第二个元素开始计算 ...