【bzoj2438】 中山市选2011—杀人游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接)
题意
n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同。警察询问一个人,如果这个人不是杀手,那么会告诉警察它认识的人哪些是杀手;如果这个人是杀手,警察就挂了。问在最优决策下警察有多大概率找到杀手。
Solution
熏题。最优决策一定是我们找到一个点,使它能尽可能到达更多的点。然后我们会发现必须询问的人缩点后就是入度为0的点。如果最后剩下了一个人,那么这个人是可以被推出来的,坑死了。
总的来说,入度为0的点是一定要被询问的,如果存在一个入度为0的点,它的size==1并且到达的所有点的入度>1,这个点是可以被推出来的。
细节
坑
代码
// bzoj2438
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=300010;
int size[maxn],dfn[maxn],low[maxn],bel[maxn],s[maxn],r[maxn];
int head[maxn],u[maxn],v[maxn],num,cnt,top,n,m;
struct edge {int to,next;}e[maxn];
map<pair<int,int>,int> mp; void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
}
void Tarjan(int x) {
dfn[x]=low[x]=++cnt;
s[++top]=x;
for (int i=head[x];i;i=e[i].next) {
if (!dfn[e[i].to]) {
Tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if (!bel[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);
}
if (low[x]==dfn[x]) {
bel[x]=++num;size[num]=1;
while (s[top]!=x) bel[s[top--]]=num,size[num]++;
top--;
}
}
int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
scanf("%d%d",&u[i],&v[i]);
link(u[i],v[i]);
}
cnt=0;
for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i);
memset(head,0,sizeof(head));
for (int i=1;i<=m;i++)
if (bel[u[i]]!=bel[v[i]] && !mp[pair<int,int>(bel[u[i]],bel[v[i]])]) {
link(bel[u[i]],bel[v[i]]),r[bel[v[i]]]++;
mp[pair<int,int>(bel[u[i]],bel[v[i]])]=1;
}
int flag=0,ans=0;
for (int i=1;i<=num;i++) if (!r[i]) {
ans++;
int tmp=1;
for (int j=head[i];j;j=e[j].next) if (r[e[j].to]==1) {tmp=0;break;}
flag|=tmp & (size[i]==1);
}
printf("%.6lf",(double)(n-ans+flag)/n);
return 0;
}
【bzoj2438】 中山市选2011—杀人游戏的更多相关文章
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
- bzoj2438[中山市选2011]杀人游戏
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...
- BZOJ2438:[中山市选2011]杀人游戏(强连通分量)
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- BZOJ2438: [中山市选2011]杀人游戏(tarjan)
题意 题目链接 Sol 这题挺考验阅读理解能力的.. 如果能读懂的话,不难发现这就是在统计有多少入度为\(0\)的点 缩点后判断一下即可 当然有一种例外情况是\(1 -> 3, 2 -> ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- 【BZOJ2438】 [中山市选2011]杀人游戏 tarjan强连通分量+缩点
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- 【bzoj2438】[中山市选2011]杀人游戏 Tarjan
题目描述 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民 ...
- BZOJ 2438: [中山市选2011]杀人游戏
Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...
- bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...
随机推荐
- [codeForce-1006C]-Three Parts of the Array (简单题)
You are given an array d1,d2,…,dnd1,d2,…,dn consisting of nn integer numbers. Your task is to split ...
- 6.把建模工具导出的dea文件导入到three.js程序中
1.使用Three.js渲染导出的DAE 在Three.js中使用Collada(即.dae)文件的话,首先得要用到 ColladaLoader.js. 但是这个ColladaLoader.js并不包 ...
- CentOS7下,防火墙设置
CentOS中防火墙程序主要是firewall和iptables两种. CentOS7中firewall服务已经默认安装好了,而iptables服务需要自己用yum install iptabes- ...
- 随手记录-linux-Linux目录结构
转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...
- scrapy有用的(代理,user-agent,随机延迟等)
代理 方法一(待测试) 见scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware import os # 设置相应的代理用户名密码,主机和 ...
- OO第三阶段作业总结
调研: 最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据.机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且 ...
- Java中的常见异常
非检查异常:Error 和 RuntimeException 以及他们的子类.0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界Ar ...
- 信安实践——CSRF攻击与防御
1.实验原理 CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的 ...
- Hadoop HA 深度解析
社区hadoop2.2.0 release版本开始支持NameNode的HA,本文将详细描述NameNode HA内部的设计与实现. 为什么要Namenode HA? 1. NameNode High ...
- 浅谈iOS内存管理机制
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...