【BZOJ2438】【中山市选2011】杀人游戏
【问题描述】
一位冷血的杀手潜入 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】杀人游戏的更多相关文章
- 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—杀人游戏
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个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...
随机推荐
- 3B课程笔记分享_StudyJams_2017
昨晚才发现 Study Jams China的官方论坛也支持MarkDown,所以直接发在了那上面.http://www.studyjamscn.com/thread-21807-1-1.html
- HDU_1711_初识KMP算法
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Generics of a Higher Kind
http://adriaanm.github.io/files/higher.pdf https://www.atlassian.com/blog/archives/scala-types-of-a- ...
- HTML input 控件
<input type="file" id="file1" onChange="test()"> function test() ...
- Entity FrameWork 操作使用详情
Entity FrameWork 是以ADO.net为基础发展的ORM解决方案. 一.安装Entity FrameWork框架 二.添加ADO.Net实体数据模型 三.EF插入数据 using Sys ...
- c# md5加密封装
/// <summary> /// md5加密字符串 /// </summary> /// <param name="str">需要加密的字符串 ...
- Windows上使用iverilog+gtkwave仿真
主要参考了: https://www.cnblogs.com/lsgxeva/p/8280662.html 谢谢! ------------------------------------------ ...
- Redis学习笔记(二) - 主从复制
概述 指将一台redis服务器上的数据,复制到其他redis服务器上,前者称为主服务器(master),后者称为从服务器(slave). 默认情况下主从关系为一对多关系. 数据复制是单向的,只能从主服 ...
- 3分钟实现小程序唤起微信支付 Laravel教程
微信支付的接入,如果不使用成熟的开发包,将是巨大的工作量. 依赖 EasyWechat 先在 laravel 项目中依赖 easywechat 这个包 composer require "o ...
- html_entity_decode()、空格、 乱码问题
普通 ASCII 码空格为 32,但是浏览器会对普通空格进行自动归并,也就是如果你输入10个 0x20 的空格在HTML页面里面,可能会被合并成一个空格. 如果想要一致的呈现多个空格,就要用到 编码标 ...