【问题描述】  

  一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,

查出谁是杀手。 
  警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他
认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀手, 杀手将会把警察干掉。 
现在警察掌握了每一个人认识谁。 
  每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。 
  问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多
少?

  对于 100%的数据有 1≤N ≤  10 0000,0≤M ≤  30 0000

【分析】

  很简单的一道题。题目给了一个有向图,每查未知的一个人,猜错的概率增加1/n。如果出现环的话,那么我们只要在环上任意找一点,只要这人不是杀手,就可以直接推出整个环,也就是说一个环上猜错的概率只有1/n。然后我们就可以先强连通缩点。

  缩点以后,一个人是不是杀手可以由认识他的人(前继)推过来,因此我们可以先选入度为0的点,也只有这些点会有1/n的概率猜错。这样直接算出缩点后入度为0的点就行了。

  值得注意的是,有一个需要特判的情况,如下数据:

  3 1

  1 2

  这时入度为0的点有两个,也就是答案是1⁄3,但实际上我们只要判断玩1,2就能直接知道3是不是杀手,所以3不可能猜错,正确答案是2/3。最后判断一下是否存在大小为1的强连通分量然后-1就行了。

【代码】

/**************************************************************
Problem: 2438
User: N_C_Derek
Language: C++
Result: Accepted
Time:716 ms
Memory:19260 kb
****************************************************************/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int v,next;
}e[];
int n,m,et,ct,st,Index;
int d[],first[],s[],back_up[][],color[],dfn[],low[],num[];
bool p[],instack[];
void insert(int x,int y)
{
e[++et].v = y;
e[et].next = first[x];
first[x] = et;
}
void dfs(int x)
{
dfn[x] = low[x] = ++Index;
instack[x] = true;
s[++st] = x;
for (int i = first[x];i ;i = e[i].next)
{
if (!dfn[e[i].v])
{
dfs(e[i].v);
low[x] = min(low[x],low[e[i].v]);
}
else if (instack[e[i].v])
low[x] = min(low[x],dfn[e[i].v]);
}
if (dfn[x] == low[x])
{
ct ++;
do
{
color[s[st]] = ct;
instack[s[st]] = false;
num[ct] ++;
st --;
} while (s[st + ] != x);
}
}
int main()
{
scanf("%d %d",&n,&m);
memset(dfn,,sizeof(dfn));
for (int i = ;i <= m;i ++)
{
int x,y;
scanf("%d %d",&x,&y);
back_up[i][] = x,back_up[i][] = y;
insert(x,y);
}
for (int i = ;i <= n;i ++)
if (!dfn[i])
dfs(i);
for (int i = ;i <= m;i ++)
if (color[back_up[i][]] != color[back_up[i][]])
d[color[back_up[i][]]] ++;
int ans = ;
for (int i = ;i <= ct;i ++)
if (d[i] == )
ans++;
for (int i = ;i <= ct;i ++)
if (ans > && d[i] == && num[i] == )
{ans --;break;}
printf("%.6lf", - (double)ans / n);
}

【BZOJ2438】【中山市选2011】杀人游戏的更多相关文章

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

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

  2. bzoj2438[中山市选2011]杀人游戏

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. win2008系统日志不断出现【审核失败】

    win2008系统日志不断出现[审核失败] [现象] 今天查看windows日志,在  -安全-  发现不断有消息刷出,显示  -审核失败-  事件ID为4624 的记录  每分钟大概刷新8条消息(如 ...

  2. jmeter3.1 压测

    压测目标:error 为0,线程起到250,服务器配置达到最大 一.Jmeter3.1 压测 JMeter3.1提供一个用于生成HTML页面格式图形化报告的扩展模块.该模块支持通过两种方式生成多维度图 ...

  3. 用doxygen风格注释代码生成文档

    目录 用doxygen风格注释代码生成文档 1. 说明 2. 具体操作 2.1 生成头部注释 2.2 安装doxygen 2.3 工程配置 3. 总结 用doxygen风格注释代码生成文档 1. 说明 ...

  4. python3使用465端口发送邮件来解决阿里云封闭25端口问题

    import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr #发件人邮箱账号my_send ...

  5. 亚马逊免费服务器搭建Discuz!论坛过程(一)

    1:申请 目前亚马逊服务器免费12个月,需要一张信用卡即可免费注册领取. 地址:https://aws.amazon.com/cn/free/ 2: 创建实例 2.1进入控制台:https://ap- ...

  6. Atcoder ARC 082C/D

    C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...

  7. Bootstrap内联表单

    有时候我们需要将表单的控件都在一行内显示,就需要将表单控件设置成内联块元素(display:inline-block). 在Bootstrap框架中实现这样的表单效果是轻而易举的,你只需要在<f ...

  8. springboot启动报:Error creating bean with name 'dataSource' defined in class path resource

    需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.clas ...

  9. 【Codeforces 996B】World Cup

    [链接] 我是链接,点我呀:) [题意] [题解] 你可以找出来a[i]里面的最小值mi,显然是这个数字最可能先变成0,但还不确定. 然后用mi/n得到你最少需要走多少圈才能让那个mi变成" ...

  10. Firefox配置Fiddler

    Fiddler: Toos->Telerik Fiddler Options->HTTPS->Capture HTTPS CONNECTs Toos->Telerik Fidd ...