BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量

Description

一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。警察能够对每一个人
进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀
手, 杀手将会把警察干掉。现在警察掌握了每一个人认识谁。每一个人都有可能是杀手,可看作他们是杀手的概
率是相同的。问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?

Input

第一行有两个整数 N,M。
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如博文中含有违规内容同志) 。

Output

仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。

Sample Input

5 4
1 2
1 3
1 4
1 5

Sample Output

0.800000

HINT

警察只需要查证 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[N],to[M],nxt[M],cnt;
int bel[N],scc,tot,dfn[N],low[N],in[N],siz[N],ans,S[N],top,ins[N],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);
}

最新文章

  1. nginx反向代理下thinkphp、php获取不到正确的外网ip
  2. 关于ckeditor ajax提交到后台 问题
  3. Validate Binary Search Tree
  4. 【转】CSS深入理解流体特性和BFC特性下多栏自适应布局
  5. Android控件大全(三)——RecyclerView
  6. Android6.0动态权限申请步骤以及需要注意的一些坑
  7. Windows Server 2008找回密码
  8. 「Foundation」结构体
  9. VBS 自动发送邮件
  10. RadAsm使用
  11. 关于并发下内存及CPU使用情况的思考
  12. HashMap 与 Hashtable 的区别
  13. 编写一篇博文介绍COOKIE和Session的原理及异同
  14. python面向对象入门(1):从代码复用开始
  15. java大数相加
  16. 为什么Firefox在SSH上这么慢?
  17. 实现 SPA 的三种方式
  18. &lt;YARN&gt;&lt;MRv2&gt;&lt;Spark on YARN&gt;
  19. CentOS安装nginx以及负载均衡的搭建
  20. ScrollView嵌套LinearLayout布局不能撑满全屏的问题

热门文章

  1. 编写Web Serviceclient訪问www.webxml.com.cn提供的服务
  2. solr 最佳实践
  3. 赞一下TMS Software 和 AdvStringGrid
  4. 【转】css浮动元素的知识
  5. 阿里巴巴为什么主推HSF?比Dubbo有哪些优势?
  6. wamp中apache2.4.9配置httpd.conf允许外部访问
  7. 侧边打赏-html
  8. python staticmethod和classmethod(转载)
  9. OpenCV 的四大模块
  10. Presenting view controllers on detached view controllers is discouraged