【bzoj2438】[中山市选2011]杀人游戏 Tarjan
题目描述
输入
第一行有两个整数 N,M。
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x) 。
输出
仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。
样例输入
5 4
1 2
1 3
1 4
1 5
样例输出
0.800000
题解
Tarjan
显然只需要查证所有 缩点后入度为0的强连通分量中的任意一个点 即可,即必须查证的人的个数等于入度为0的强连通分量个数。
但是这并不一定是最优解。考虑一种情况:

这时只需要查证2(或者查证1)即可,可以不查证1(或2)。
具体原因是:一个入度为0的强连通分量大小为1,如果它指向的所有点都不仅由它到达(即减去它到其的边数后入度不为0),那么可以先查证其它点,直到最后仅剩下这个点,即可不查证该点。
于是需要再统计一下是否有这种情况。具体方法:枚举每个点,判断它所有能够到达的点是否仅由它到达即可。注意这样的点只能保留1个(多了无法排除),因此需要及时终止循环。
最后 (n-必须查证的人)/n 即为存活概率。
时间复杂度$O(n+m)$
#include <cstdio>
#include <algorithm>
#define N 100010
#define M 300010
using namespace std;
int head[N] , to[M] , next[M] , cnt , deep[N] , low[N] , tot , vis[N] , ins[N] , sta[N] , top , bl[N] , si[N] , num , ind[N];
inline void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void tarjan(int x)
{
int i;
deep[x] = low[x] = ++tot , vis[x] = ins[x] = 1 , sta[++top] = x;
for(i = head[x] ; i ; i = next[i])
{
if(!vis[to[i]]) tarjan(to[i]) , low[x] = min(low[x] , low[to[i]]);
else if(ins[to[i]]) low[x] = min(low[x] , deep[to[i]]);
}
if(deep[x] == low[x])
{
int t;
num ++ ;
do
{
t = sta[top -- ] , si[num] ++ ;
ins[t] = 0 , bl[t] = num;
}while(t != x);
}
}
bool judge(int x)
{
int i;
bool flag = 1;
for(i = head[x] ; i ; i = next[i]) ind[bl[to[i]]] -- ;
for(i = head[x] ; i ; i = next[i])
if(!ind[bl[to[i]]])
flag = 0;
for(i = head[x] ; i ; i = next[i]) ind[bl[to[i]]] ++ ;
return flag;
}
int main()
{
int n , m , i , x , y , ans = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y);
for(i = 1 ; i <= n ; i ++ )
if(!vis[i])
tarjan(i);
for(x = 1 ; x <= n ; x ++ )
for(i = head[x] ; i ; i = next[i])
if(bl[x] != bl[to[i]])
ind[bl[to[i]]] ++ ;
for(i = 1 ; i <= num ; i ++ )
if(!ind[i])
ans ++ ;
for(i = 1 ; i <= n ; i ++ )
if(si[bl[i]] == 1 && !ind[bl[i]] && judge(i))
break;
if(i <= n) ans -- ;
printf("%.6lf\n" , (double)(n - ans) / n);
return 0;
}
【bzoj2438】[中山市选2011]杀人游戏 Tarjan的更多相关文章
- BZOJ2438: [中山市选2011]杀人游戏(tarjan)
题意 题目链接 Sol 这题挺考验阅读理解能力的.. 如果能读懂的话,不难发现这就是在统计有多少入度为\(0\)的点 缩点后判断一下即可 当然有一种例外情况是\(1 -> 3, 2 -> ...
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
- 【BZOJ2438】 [中山市选2011]杀人游戏 tarjan强连通分量+缩点
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- bzoj2438[中山市选2011]杀人游戏
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...
- BZOJ2438:[中山市选2011]杀人游戏(强连通分量)
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通 ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- 【bzoj2438】 中山市选2011—杀人游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同.警察询问一个人 ...
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...
随机推荐
- 使用Python对Csv文件操作
csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存储为csv文件,文件内容是: No.,Name,Age,Score 1,mayi, ...
- 修改pytorch官方实例适用于自己的二分类迁移学习项目
本demo从pytorch官方的迁移学习示例修改而来,增加了以下功能: 根据AUC来迭代最优参数: 五折交叉验证: 输出验证集错误分类图片: 输出分类报告并保存AUC结果图片. import os i ...
- web前端逻辑计算,血的教训
在web前端进行页面开发的过程中,难免的遇到逻辑问题,这不是什么大问题,既然走上IT条黑道,那小伙伴们的逻辑推理能力及逻辑计算能力是不会有太大问题的. 然而,有的逻辑计算,就算你逻辑计算能力超强,也不 ...
- 洛谷 P3952
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- json_decode结果为null的几种原因
值只能是UTF-8编码,元素最后不能有逗号,元素不能使用单引号,元素值中间不能有空格和n.
- flask 中访问时后台错误 error: [Errno 32] Broken pipe
解决办法:app.run(threaded=True) 个人理解:flask默认单线程,访问一个页面时会访问到很多页面,比如一些图片,加入参数使其为多线程
- Python学习 :格式化输出
方式一:使用占位符 % 常用占位符:% s (s = string 字符串) % d (d = digit 整数(十进制)) % f ( f = float 浮点数) na ...
- 关于mysql连接时候出现"error 2003: can't connect to mysql server on 'localhost'(10061)问题的解决
天,在使用navicat Premium 连接数据库时,出现了一个弹出窗口显示: "error 2003: can't connect to mysql server on 'localho ...
- 网站标题被篡改成北京赛车、PK10的解决处理办法
客户网站于近日被跳转到赌博网站,打开后直接跳转到什么北京赛车,PK10等内容的网站上去,客户网站本身做了百度的推广,导致所有访问用户都跳转到赌博网站上去,给客户带来很大的经济损失,再一个官方网站的形象 ...
- JSOI2018 R1 & 九省联考2018 滚粗记
在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...