BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
2018-06-28 11:09
786 查看
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
Description
一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀 手, 杀手将会把警察干掉。现在警察掌握了每一个人认识谁。每一个人都有可能是杀手,可看作他们是杀手的概 率是相同的。问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?Input
第一行有两个整数 N,M。
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如博文中含有违规内容同志) 。
Output
仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。
Sample Input
5 41 2
1 3
1 4
1 5
Sample Output
0.800000HINT
警察只需要查证 1。假如1是杀手,警察就会被杀。假如 1不是杀手,他会告诉警
察 2,3,4,5 谁是杀手。而 1 是杀手的概率是 0.2,所以能知道谁是杀手但没被杀的概
率是0.8。对于 100%的数据有 1≤N ≤ 10 0000,0≤M ≤ 30 0000
数据已加强!
设选取x个人查证,自身安全的概率就是(n-x)/n。
也就是说我们要在保证能查到凶手的前提下查证尽可能少的人。
把每个强连通分量缩点,把每个入度为0的点取了。
需要特判一种情况,就是其他人身份都可以确定了,还差一个人自然就确定了。
找一下是否存在入度为0,siz=1,且所有出边入度都不为1的点即可。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 100050 #define M 300050 int head ,to[M],nxt[M],cnt; int bel ,scc,tot,dfn ,low ,in ,siz ,ans,S ,top,ins ,xx[M],yy[M],n,m; inline void add(int u,int v) { to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } void dfs(int x) { int i;dfn[x]=low[x]=++tot; S[++top]=x; ins[x]=1; for(i=head[x];i;i=nxt[i]) { if(!dfn[to[i]]) { dfs(to[i]); low[x]=min(low[x],low[to[i]]); }else if(ins[to[i]]) { low[x]=min(low[x],dfn[to[i]]); } } if(dfn[x]==low[x]) { int t=S[top--]; ins[t]=0; bel[t]=++scc; siz[scc]=1; while(t!=x) { t=S[top--]; ins[t]=0; bel[t]=scc; siz[scc]++; } } } int main() { scanf("%d%d",&n,&m); int i,j; for(i=1;i<=m;i++) { scanf("%d%d",&xx[i],&yy[i]); add(xx[i],yy[i]); } for(i=1;i<=n;i++) if(!dfn[i]) dfs(i); memset(head,0,sizeof(head)); cnt=0; for(i=1;i<=m;i++) { if(bel[xx[i]]!=bel[yy[i]]) { add(bel[xx[i]],bel[yy[i]]); in[bel[yy[i]]]++; } } for(i=1;i<=scc;i++) { if(in[i]==0) ans++; } int flg=0; for(i=1;i<=scc;i++) { if(siz[i]==1&&in[i]==0) { int ok=1; for(j=head[i];j;j=nxt[j]) { if(in[to[j]]==1) {ok=0; break;} } if(ok) {flg=1; break;} } } ans-=flg; printf("%.6f\n",1.0*(n-ans)/n); }
相关文章推荐
- bzoj 2438: [中山市选2011]杀人游戏 强连通分量
- bzoj2438: [中山市选2011]杀人游戏(强联通)
- BZOJ 2438([中山市选2011]杀人游戏-有向图Tarjen缩点-到点为止)
- [bzoj 2438--中山市选2011]杀人游戏
- bzoj 2438: [中山市选2011]杀人游戏 (强联通分量 Tarjan)
- bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)
- [强联通] bzoj 2438: [中山市选2011]杀人游戏
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
- [bzoj2438][中山市选2011]杀人游戏
- bzoj2438[中山市选2011]杀人游戏
- BZOJ 2438 [中山市选2011] 杀人游戏 题解与分析
- BZOJ——2438: [中山市选2011]杀人游戏
- bzoj2438[中山市选2011]杀人游戏
- bzoj 2438: [中山市选2011]杀人游戏(Tarjan)
- BZOJ 2438 中山市选2011 杀人游戏 Tarjan
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
- 【bzoj2438】【中山市选2011】【杀人游戏】【强连通分量缩点】
- BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
- BZOJ2438: [中山市选2011]杀人游戏
- BZOJ 2438 [中山市选2011] 杀人游戏 (图的联通,tarjan)