bzoj2438[中山市选2011]杀人游戏
Description
一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,
查出谁是杀手。
警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他
认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀手, 杀手将会把警察干掉。
现在警察掌握了每一个人认识谁。
每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。
问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多
少?
Input
第一行有两个整数 N,M。
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如胡锦涛同志) 。
Output
仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。
Sample Input
1 2
1 3
1 4
1 5
Sample Output
HINT
警察只需要查证 1。假如1是杀手,警察就会被杀。假如 1不是杀手,他会告诉警
察 2,3,4,5 谁是杀手。而 1 是杀手的概率是 0.2,所以能知道谁是杀手但没被杀的概
率是0.8。对于 100%的数据有 1≤N ≤ 10 0000,0≤M ≤ 30 0000
数据已加强!
思路:本人初中党表示对概率这东西不是很懂。。。
大神的题解:http://www.cnblogs.com/xkui/p/4552391.html
题目的关键在于要想到,既然是关系问题(思考一下并查集是否可以解?不能,我认为出现了“x 认识 y(y 不一定认识 x,例如胡锦涛同志)”表明不可用),就涉及到只要是几个人构成了有向图强联通分量,那么质问其中一人就可以得知所有的分量内的关系,缩一下点就没有必要枚举所有人。而此时,直接去问那些入度为0的分量。至于为什么可以参照这个公式哦:
ans=(n-1)/n(第一次问不是罪犯)*[(s1-1/n-1)(集合在第一点集中)+((n-s1)/(n-1))*((n-s1-1)/(n-s1))*((s2-1)*(n-s1-1))(分别为,不在第一点集,第二次不问到罪犯,在第二点集的概率)+...]。(问入度为0的点集可以保证它们之间互补相干)。
当然此题程序也并非单纯的模板
特判:当有一个分量只包括一个点、入度为0且不影响其他分量的入度是否为0(似乎不是桥),那么当其他点问过后,就不用关心这个点了,从ans中删除它的增量1。
1590224
| ksq2013 | 2438 | Accepted | 37256 kb | 1032 ms | C++/Edit | 2083 B | 2016-08-14 11:08:14 |
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,first[1000111],du[1000111],sz[1000111],hd[1000111],ecnt,ans=0;
int pre[1000111],sccn[1000111],lowlink[1000111],mstack[1000111],stack_cnt,dfs_clock,scc_cnt;
struct edge{
int u,v,nxt;
}e[300333];
void link(int u,int v)
{
e[++ecnt].u=u;
e[ecnt].v=v;
e[ecnt].nxt=first[u];
first[u]=ecnt;
}
void dfs(int u)
{
int v;
pre[u]=lowlink[u]=++dfs_clock;
mstack[++stack_cnt]=u;
for(int i=first[u];i;i=e[i].nxt){
v=e[i].v;
if(!pre[v]){
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccn[v])
lowlink[u]=min(lowlink[u],pre[v]);
}
if(!(pre[u]^lowlink[u])){
hd[++scc_cnt]=u;
do{
v=mstack[stack_cnt--];
sccn[v]=scc_cnt;
++sz[scc_cnt];
}while(v^u);
}
}
void tarjan()
{
memset(pre,0,sizeof(pre));
memset(sccn,0,sizeof(sccn));
memset(lowlink,0,sizeof(lowlink));
stack_cnt=dfs_clock=scc_cnt=0;
for(int i=1;i<=n;i++)
if(!pre[i])
dfs(i);
}
bool jud(int u)
{
for(int i=first[u];i;i=e[i].nxt)
if(du[sccn[e[i].v]]==1)
return 0;
return 1;
}
int main()
{
memset(sz,0,sizeof(sz));
memset(du,0,sizeof(du));
memset(first,0,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
link(u,v);
}
tarjan();
for(int i=1;i<=ecnt;i++)
if(sccn[e[i].u]^sccn[e[i].v])
++du[sccn[e[i].v]];
for(int i=1;i<=scc_cnt;i++)
if(!du[i])
++ans;
for(int i=1;i<=scc_cnt;i++)//special judge;
if(!du[i]&&sz[i]==1&&jud(hd[i]))
{--ans;break;}
printf("%.6lf\n",(double)(n-ans)/n);
return 0;
}
bzoj2438[中山市选2011]杀人游戏的更多相关文章
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
- 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—杀人游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 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个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...
随机推荐
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q66-Q68)
Question 66 You are designing an application that will use a timer job that will run each night to s ...
- 微信公众号里打开链接下载APP
嵌入这样的代码 <a href="http://a.app.qq.com/o/simple.jsp?pkgname=com.violationquery" target=&q ...
- xmpp整理笔记:环境的快速配置(附安装包)
现在虽然环信的xmpp框架很火,但是也有一些弊端.环信的框架部分代码不开源,而且收费模式不科学,用户量一直低于免费线则好,一旦超过,收费极高. xmpp感觉还是从xmppFramework框架学起比较 ...
- SQL for SQLite
语法 verb + subject + predicate commannds(命令) SQL由命令组成,以分号为结束.命令有token组成,token由white space分隔,包括空格.tab. ...
- Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...
- Grunt安装配置教程:前端自动化工作流
Grunt这货是啥? Grunt 是一个基于任务的 JavaScript 项目命令行构建工具. 最近很火的前端自动化小工具,基于任务的命令行构建工具 http://gruntjs.com Grunt能 ...
- Maven基础配置--nexus私服配置
登录nexus私服后台,按照下图1-3的顺序进行添加仓库: 其中步骤3有三种仓库类型(Type)进行选择 1. Hosted Repository:本地仓库,在私服服务器上存放用户自行上传的jar包: ...
- ASP.NET features need application service database support
搭建的web程序出现如上图所示的错误 原因程序使用以下ASP.NET 特性 Membership (the SqlMembershipProvider class). Role management ...
- Learning The Bash Shell读书笔记(整理)
最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...
- Hessian 二进制RPC协议框架
Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议. 和其他Web服务的实现框架不同的是,Hessian是一个使用二进制轻量级的Web服务协议的框架,免除了许多附加的 ...