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

数据已加强!

思路:本人初中党表示对概率这东西不是很懂。。。

大神的题解: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]杀人游戏的更多相关文章

  1. bzoj2438: [中山市选2011]杀人游戏(强联通+特判)

    2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...

  2. BZOJ2438:[中山市选2011]杀人游戏(强连通分量)

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

  3. BZOJ2438: [中山市选2011]杀人游戏(tarjan)

    题意 题目链接 Sol 这题挺考验阅读理解能力的.. 如果能读懂的话,不难发现这就是在统计有多少入度为\(0\)的点 缩点后判断一下即可 当然有一种例外情况是\(1 -> 3, 2 -> ...

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

    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...

  5. 【bzoj2438】 中山市选2011—杀人游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同.警察询问一个人 ...

  6. 【BZOJ2438】 [中山市选2011]杀人游戏 tarjan强连通分量+缩点

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

  7. 【bzoj2438】[中山市选2011]杀人游戏 Tarjan

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

  8. BZOJ 2438: [中山市选2011]杀人游戏

    Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...

  9. bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...

随机推荐

  1. Sql Server 2008 数据库附加失败提示9004错误解决办法

    附加数据库 对于 服务器“WSS_Content”失败.  (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlS ...

  2. Atitit.iso格式蓝光 BDMV 结构说明

    Atitit.iso格式蓝光 BDMV 结构说明 1. Iso是个复合文件1 2. Iso内部格式如下1 2.1. Bdmv文件夹格式 BDMV(Blu-ray Disk Movie.BD-MV),为 ...

  3. asp.net实现动态添加table行

    asp.net动态的生成,删除table的行,主要是在后台动态创建单元行,单元表格,效果图: 2.代码: <%@ Page Language="C#" AutoEventWi ...

  4. Android studio 如何查看当前git 分支的4种方式

    1.第一种       2.第二种       3.第三种 4.第四种       前面3种都是通过android studio 操作的. 第四种是通过命令行操作.(可以在 git bash 中输入命 ...

  5. GDataXMLNode应用

    一.GDataXMLNode的安装配置过程 1.将GDataXMLNode文件加入至工程中 2.向Frameworks文件中添加libxml2.dylib库 3.在Croups & Files ...

  6. Android jni helloworld

    新建Android项目,设置布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...

  7. java 网络编程基础 1

    关于协议: 应用层网络协议包括:http,ftp,telnet,..... 传送层网络协议:使用socket封装的TCP,或UDP 端口: 用于网络通讯时传输数据时区分当前网络连接是与本机中的哪个应用 ...

  8. git各种命令介绍以及碰到的各种坑

    一.各种命令介绍: git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地 ...

  9. 安装centos 7后恢复windows 2008R2 (Windows7)启动项

    安装CentOS 7,安装之后发现Win2008R2的启动项不见了(Windows7同理).一般安装Linux过程中会自动识别windows系统并添加引导项,centos的问题在于默认不支持ntfs分 ...

  10. 《Hey程序员 你适合加入创业公司吗?》再补充

    笔者经过多年的走访发现,不是所有优秀的程序员都能在创业公司如鱼得水.根据笔者的经验,具备下面几点优秀品质的程序员会更容易适应创业公司的环境. 1.娴熟的调试技巧可以说,程序员的大部分时间都花在调试程序 ...