【强连通分量+概率】Bzoj2438 杀人游戏
2015-06-04 17:14
225 查看
Description
一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀手, 杀手将会把警察干掉。
现在警察掌握了每一个人认识谁。
每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。
问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?
Sulotion
最优的询问对象是,把强连通分量缩成一个点(问其中一个可推出所有,只要不第一次问就是罪犯可以一直安全),问那些入度为0的(这里相当于再把连通的缩为一个点)。这样我们就得到了一些互不相干的点集,怎么计算概率呢?设点集大小为s1,s2,..
那么ans=(n-1)/n(第一次问不是罪犯)*[(s1-1/n-1)(集合在第一点集中)+((n-s1)/(n-1))*((n-s1-1)/(n-s1))*((s2-1)*(n-s1-1))(分别为,不在第一点集,第二次不问到罪犯,在第二点集的概率)+...]。
上面的式子分子分母可以连着消掉,然后得到ans=(n-tot)/n, tot为点集个数,也就是缩点后入度为0的点。
有一种特殊情况(连通题做一道一道特殊情况...)
如果有一个单独地点(大小为1&&入度为0&&不影响其它点入度是否为0),那么其他的都确定了,他自然也就可以肯定了,也不会对别的点有影响,不用算入tot。
Code
#include<cstdio> #include<algorithm> using namespace std; const int maxn=1e5+5,maxm=3e5+5; int pre[maxn],low[maxn],scc[maxn],clock,cnt; int head[maxn],f[maxm],e[maxm],nxt[maxm],k; int adde(int u,int v){ e[++k]=v,f[k]=u; nxt[k]=head[u],head[u]=k; } int n,m,r[maxn],a[maxn],t; int size[maxn],num[maxn]; int dfs(int u){ pre[u]=low[u]=++clock; a[++t]=u; for(int i=head[u];i;i=nxt[i]){ int v=e[i]; if(!pre[v]){ dfs(v); low[u]=min(low[u],low[v]); } else if(!scc[v]){ low[u]=min(low[u],pre[v]); } } if(low[u]==pre[u]){ num[++cnt]=u; while(t){ scc[a[t]]=cnt; size[cnt]++; if(a[t--]==u) break; } } } int pd(int x){ int u=num[x]; for(int i=head[u];i;i=nxt[i]) if(r[scc[e[i]]]==1) return 0; return 1; } int main(){ scanf("%d%d",&n,&m); int u,v; for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); adde(u,v); } for(int i=1;i<=n;i++) if(!pre[i]) dfs(i); for(int i=1;i<=k;i++) if(scc[f[i]]!=scc[e[i]]) r[scc[e[i]]]++; int ans=0; for(int i=1;i<=cnt;i++) if(!r[i]) ans++; for(int i=1;i<=cnt;i++) if(size[i]==1&&!r[i]&&pd(i)){ ans--; break; } printf("%.6lf",(double)(n-ans)/n); return 0; }
View Code
相关文章推荐
- 【转】6.4.6 将驱动编译进Linux内核进行测试
- Android NDK编译本地文件以及引用第三方so文件
- 软件測试自学指南---从入门到精通
- Mysql用户与权限管理
- 在Ubuntu系统上安装Gnome Flashback桌面的教程
- pdf文件怎么修改
- 百度URL服务接口
- SAT阅读题的高效答题步骤
- 判断某设备端口通不通
- 我永远不会过那种苦日子了
- Android-APP-CPU 耗电测试的例子
- OpenCV学习笔记(三十九)——再谈OpenCV的数据结构,Mat是如此强大
- 25个经典的Spring面试问答
- nginx 数组模型
- php mcrypt CBC
- web service创建的详细步骤
- qml实现幻灯片
- css3 翻转和旋转的差别
- microsoft office2013弹出激活向导该怎么办?
- Lmabda表达式读值