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

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=1e5+5,maxm=3e5+5;
 5
 6 int pre[maxn],low[maxn],scc[maxn],clock,cnt;
 7 int head[maxn],f[maxm],e[maxm],nxt[maxm],k;
 8 int adde(int u,int v){
 9     e[++k]=v,f[k]=u;
10     nxt[k]=head[u],head[u]=k;
11 }
12 int n,m,r[maxn],a[maxn],t;
13 int size[maxn],num[maxn];
14
15 int dfs(int u){
16     pre[u]=low[u]=++clock;
17     a[++t]=u;
18     for(int i=head[u];i;i=nxt[i]){
19         int v=e[i];
20         if(!pre[v]){
21             dfs(v);
22             low[u]=min(low[u],low[v]);
23         }
24         else if(!scc[v]){
25             low[u]=min(low[u],pre[v]);
26         }
27     }
28     if(low[u]==pre[u]){
29         num[++cnt]=u;
30         while(t){
31             scc[a[t]]=cnt;
32             size[cnt]++;
33             if(a[t--]==u) break;
34         }
35     }
36 }
37
38 int pd(int x){
39     int u=num[x];
40     for(int i=head[u];i;i=nxt[i])
41         if(r[scc[e[i]]]==1) return 0;
42     return 1;
43 }
44
45 int main(){
46     scanf("%d%d",&n,&m);
47     int u,v;
48     for(int i=1;i<=m;i++){
49         scanf("%d%d",&u,&v);
50         adde(u,v);
51     }
52
53     for(int i=1;i<=n;i++)
54         if(!pre[i]) dfs(i);
55
56     for(int i=1;i<=k;i++)
57         if(scc[f[i]]!=scc[e[i]]) r[scc[e[i]]]++;
58
59     int ans=0;
60     for(int i=1;i<=cnt;i++)
61         if(!r[i]) ans++;
62
63     for(int i=1;i<=cnt;i++)
64         if(size[i]==1&&!r[i]&&pd(i)){
65             ans--;
66             break;
67         }
68
69     printf("%.6lf",(double)(n-ans)/n);
70     return 0;
71 }

View Code

转载于:https://www.cnblogs.com/xkui/p/4552391.html

【强连通分量+概率】Bzoj2438 杀人游戏相关推荐

  1. [补档][中山市选2011]杀人游戏

    [中山市选2011]杀人游戏 题目 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识 ...

  2. 杀人游戏-Tarjan

    图论建模-杀人游戏 杀人游戏 [中山市选]杀人游戏 题目描述一位冷血的杀手潜入Na-wiat,并假装成平民.警察希望能在 N N N个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是 ...

  3. [洛谷P4819][中山市选]杀人游戏

    题目大意:有一张$n$个点$m$条边的有向图,有一个关键点,如果你访问一个点,你会知道它连出的边中有没有关键点,以及若有的话是哪个.问最优策略下不访问关键点而知道关键点的概率 题解:发现若一个点不是关 ...

  4. 2017.10.10 杀人游戏 思考记录

    这个题题目描述还是有一点问题..这里的知道关系是有传递性的.第一次理解成只会明白直接相连的,最小点覆盖  --   这样就成np了吧.. 所以就比较显然了,,对于每组能互达的强连通分量,都只需一个头上 ...

  5. CF467D Fedor and Essay 有向图强连通分量+缩点

    文章目录 一.题目 二.题解 三.Code Thanks! 一.题目 传送门 翻译: 在你帮助Fedor在«Call of Soldiers 3»这款游戏中找到朋友之后,他完全停止了学习.今天,英语老 ...

  6. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

  7. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  8. HDU4635(强连通分量+Kosaraju算法)

    题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...

  9. poj3352(强连通分量)

    题意:添加多少边才能使这个无向图为双连通分量. 注意:双连通分量适用于无向图:而强连通分量适用于有向图.但是这两个概念都是一样的. #include<iostream> #include& ...

最新文章

  1. (十二) 完整注释的代码摘录
  2. python流程图基本元素-Python初学(十一)
  3. 从零开始数据科学与机器学习算法-数据预处理与基准模型-01
  4. 数学的列向量内积计算方法
  5. 架构师成长之路(内附推荐书籍)
  6. C++(STL):23 ---序列式容器queue源码剖析
  7. openssh升级之后git账户免密登陆失效
  8. python 时分秒毫秒_第一篇:Python处理时间日期
  9. Django中的ORM进阶操作
  10. 23种设计模式及案例整理分享(建议收藏)
  11. centOS6和centOS7网卡重启方法,以及关闭防火墙的方法
  12. datatable的数据进行组内排序_极客算法训练笔记(六),十大经典排序之希尔排序,快速排序...
  13. MyEclipse创建Maven工程
  14. 威纶触摸屏如何设置数值输入元件的上下限和用户密码登录?
  15. 408计算机考研 各科题目题号,2021考研408计算机专业基础综合数据结构试题特点分析...
  16. 开篇一:基于ESP8266的电子墨水屏万年历
  17. 关于app的几个核心功能的设计想法
  18. 大数据论文_02_MapReduce(个人总结)
  19. php memcached 性能测试,多种方法实时监测 Memcached 命中率
  20. jmeter计算测试QPS

热门文章

  1. 200万存银行理财,年利率5%,未来30年够养老了吗?
  2. PHP执行外部程序的方法
  3. 民间借贷利息多少才合法?
  4. VS2010 + OpenCV 2.4.1 环境配置
  5. VC动态链接数据库类ADOConn
  6. 变电站计算机监控系统的作用和工作原理,变电站计算机监控系统的主要功能.pdf...
  7. asp python 定时任务_Python定时任务轻量解决方案——Schedule
  8. numpy安装_Python进阶之NumPy快速入门(一)
  9. C语言 游戏远程call调用,关于远程注入游戏并调用 call 的问题
  10. java int相除向上取整_Java基础篇——Java运算符