【问题描述】  

  一位冷血的杀手潜入 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. PCL: 根据几何规则的曲面剖分-贪婪法表面重建三角网格

    点云场景中进行物体识别,使用全局特征的方法严重依赖于点云分割,难以适应杂乱场景.使用局部特征,即对点云进行提取类似于3D SURF.ROPS之类的局部特征,需要寻找离散点云块的局部显著性. 点云的基本 ...

  2. 《3D建模初步》参考资料

    本门课程主要从3D打印角度来介绍3D建模的简单知识.课程采用免费的3D CAD软件Autodesk 123D Design来具体演示一些简单模型的构建方法,并介绍3D打印有关的知识与方法. 课程以&l ...

  3. (转)PostGIS+QGIS+GeoServer+OpenLayers实现数据的存储、服务的发布以及地图的显示

    http://blog.csdn.net/gisshixisheng/article/details/41575833 标题比较长,主要呢是实现以下几点: 1.将shp数据导入到PostGIS中: 2 ...

  4. drf04 drf视图类

    REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...

  5. Robot Framework(六)变量

    变量 2.5.1简介 变量是Robot Framework的一个不可或缺的特性,它们可以在测试数据的大多数地方使用.最常见的是,它们用于测试用例表和关键字表中关键字的参数,但所有设置都允许在其值中使用 ...

  6. BZOJ : [Usaco2013 Nov]Crowded 单调队列

    正反两遍个来一次单调队列 DP 即可. Code: #include<cstdio> #include<deque> #include<algorithm> usi ...

  7. Python实现ATM+购物商城

    需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...

  8. COOKIE, SESSION, JSESSION

    http://www.360doc.com/content/11/1027/10/7472437_159535413.shtml

  9. 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺 Scrum meeting 3

    项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11012922.html 团队名称 奋斗吧!菜鸟 作业学习目标 A ...

  10. CSS行高line-height的学习

    一.定义和用法 line-height 属性设置行间的距离(行高). 可能的值 normal默认.设置合理的行间距. number设置数字,此数字会与当前的字体尺寸相乘来设置行间距. length设置 ...