【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=2438

【题意】

N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手谁是平民,问不被杀的情况下知道谁是杀手的概率。

【思路】

对于一个scc,如果我们询问一个不是杀手的人,就可以成功遍历整个scc。

求scc,然后缩点。

对于每一个入度为0的scc,我们需要去询问一下,那么被杀的概率为1/n * ans。ans为入度为0的scc个数。

但还有一种特殊的情况,如果一个scc入度为0,但它的所有出度的入度皆大于1,那么它的出度可以不通过询问这个scc得知,而且最终通过其他n-1个点推出这个点的情况。这时候需要对ans-1,但这种情况只计算一次。

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e5+;
const int M = 7e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Edge {
int v,nxt;
}e[M];
int en=,front[N];
void adde(int u,int v)
{
e[++en]=(Edge){v,front[u]}; front[u]=en;
} int pre[N],lowlink[N],scc_cnt,sccno[N],S[N],top,dfn; void tarjan(int u)
{
pre[u]=lowlink[u]=++dfn;
S[++top]=u;
trav(u,i) {
int v=e[i].v;
if(!pre[v]) {
tarjan(v);
lowlink[u]=min(lowlink[v],lowlink[u]);
} else
if(!sccno[v])
lowlink[u]=min(lowlink[u],pre[v]);
}
if(pre[u]==lowlink[u]) {
++scc_cnt;
for(;;) {
int x=S[top--];
sccno[x]=scc_cnt;
if(x==u) break;
}
}
} int cnt[N],in[N],n,m,ans; int main()
{
n=read(),m=read();
int u,v;
FOR(i,,m) {
u=read(),v=read();
adde(u,v);
}
FOR(i,,n) if(!pre[i]) tarjan(i);
FOR(u,,n) {
cnt[sccno[u]]++;
trav(u,i) {
int v=e[i].v;
if(sccno[u]!=sccno[v])
in[sccno[v]]++;
}
}
FOR(i,,scc_cnt) if(!in[i]) ans++;
int flag=;
FOR(i,,n)
if(cnt[sccno[i]]==&&in[sccno[i]]==) {
int f=;
trav(i,j) {
int v=e[j].v;
if(in[sccno[v]]<=) { f=; break; }
}
if(f) {
flag=; break;
}
}
ans-=flag;
printf("%.6lf\n",(double)(n-ans)/n);
return ;
}

bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)的更多相关文章

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个 ...

  2. bzoj 2438: [中山市选2011]杀人游戏【tarjan】

    没看太懂题意orz 最优的是tarjan缩点之后问入度为0的点,因为问这个点可以知道整个块的情况 答案是这ans个入度为0的点都不是杀手的概率\( \frac{n-ans}{n} \) 但是有特殊情况 ...

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

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

  4. [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan

    考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...

  5. [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点

    这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通 ...

  6. BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP

    发现每一次死亡的几率相等,所以只需要判断最少问多少人即可. 并且环上的点任意询问都可以. 所以直接Tarjan缩点,然后计算入度为0的点的数目. 但是还有一些情况的时候会减少一次询问,比如说:$1-& ...

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

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

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

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

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

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

随机推荐

  1. iOS Container View Controller

    一.UIViewController 做iOS开发的经常会和UIViewController打交道,从类名可知UIViewController属于MVC模型中的C(Controller),说的更具体点 ...

  2. 极客编程必备的五大PHP开发应用

    有了PHP应用可以帮助编码爱好者事半功倍,提升项目质量:有了这些最新的且灵活的PHP应用使创建编码项目更加简单.便捷.本文,我们收集了五大最新的PHP开发应用. PHP应用在网络上并不多见.最重要的是 ...

  3. AsciiDoc Markup Syntax Summary

    AsciiDoc Markup Syntax Summary ============================== A summary of the most commonly used ma ...

  4. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

  5. 【C#设计模式——创建型模式】工场方法模式

    工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...

  6. nand flash 扇区的管理以及初始化

    (1)首先需要了解NAND FLASH的结构.如图: 以镁光MT29F4G08BxB Nand Flash为例,这款Flash(如上图)以4个扇区(sector)组成1个页(page),64个页(pa ...

  7. CentOS 6.5系统使用yum方式安装LAMP环境和phpMyAdmin详细过程

    介绍如何在CentOs6.2下面使用YUM配置安装LAMP环境,一些兄弟也很喜欢使用编译的安装方法,个人觉得如果不是对服务器做定制,用yum安装稳定简单,何必去download&make&am ...

  8. Python3 学习第一弹:基本数据类型

    本人学习主要从<python基础教程第二版>,<dive into python3>等书籍,及一些网上大牛的博客中学习特别是Python官方文档<Python Tutor ...

  9. 对象不支持“attachEvent”属性或方法的解决办法

    有些脚本在IE11下执行会报错误: 对象不支持“attachEvent”属性或方法 解决办法 解决办法:把attachEvent改为addEventListener即可

  10. Apache Struts2 s2-020补丁安全绕过漏洞

    CNVD-ID CNVD-2014-01552 发布时间 2014-03-11 危害级别 高 影响产品 Apache struts 2.0.0-2.3.16 BUGTRAQ ID 65999 CVE ...