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

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit:
1638  Solved: 433
[Submit][Status][Discuss]

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

数据已加强!

Source

Solution

不错的题,思路应该比较简单,但容易遗漏问题

把认识关系转化到图上,那么我们发现,如果我们询问一个平民,那么他的所有后继点就都知道了

那么我们先对图进行Tarjan缩一下点,有入度的点,显然我们可以不用直接访问,那么我们访问每个入度为0的点

不过这里有个特殊情况,如果存在一个被搁置的点,他最后是不用访问的比如:3个人ABC,A认识B,那么访问A后,A,B和C的身份都能得知

这样就可以少询问一个,但是注意,这种情况的条件是:

入度为0,且只包含1个点,且这个点指向的SCC的入度>=2(缩点前)【并不仅仅是出入度为0】<-特别容易出错

比如:3个人ABC,A认识B,C认识B,那么访问A或C后都可以得到所有人身份;

证明:

若这个点的所有出边所指向的强连通分量都有其它的前驱 那么我把这个点放在最后 用作排除不会对推理造成干扰 反之若有一个后继入度为1 那么就算不调查这个单点也要调查那个后继 对答案没有影响

然后答案显然是(N-x)/N (x为需要询问的点数)

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 100010
#define MAXM 300010
int N,M;
struct EdgeNode{int next,to;}edge[MAXM],road[MAXM];
int cnt,tot,head[MAXN],last[MAXN];
void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
void AddRoad(int u,int v) {tot++; road[tot].next=last[u]; last[u]=tot; road[tot].to=v;}
int dfn[MAXN],low[MAXN],scc,t,belong[MAXN],visit[MAXN],size[MAXN],ind[MAXN],ans,st[MAXN],top;
void Tarjan(int x)
{
dfn[x]=low[x]=++t;
visit[x]=; st[++top]=x;
for (int i=head[x]; i; i=edge[i].next)
if (!dfn[edge[i].to])
Tarjan(edge[i].to),low[x]=min(low[x],low[edge[i].to]);
else
if (visit[edge[i].to]) low[x]=min(low[x],dfn[edge[i].to]);
if (dfn[x]==low[x])
{
scc++; int now=;
while (x!=now)
now=st[top--],size[scc]++,
visit[now]=,belong[now]=scc;
}
}
map<int,bool>mp;
bool check(int x)
{
if (ind[x]!= || size[x]!=) return ;
for (int i=last[x]; i; i=road[i].next)
if (ind[road[i].to]==) return ;
return ;
}
int main()
{
N=read(),M=read();
int x,y;
while (M--) x=read(),y=read(),AddEdge(x,y);
for (int i=; i<=N; i++) if (!dfn[i]) Tarjan(i);
for (int i=; i<=N; i++)
{
mp.clear();
for (int j=head[i]; j; j=edge[j].next)
if (belong[i]!=belong[edge[j].to] && !mp[belong[edge[j].to]])
ind[belong[edge[j].to]]++,AddRoad(belong[i],belong[edge[j].to]),mp[belong[edge[j].to]]=;
}
for (int i=; i<=scc; i++) if (!ind[i]) ans++;
for (int i=; i<=scc; i++)
if (check(i)) {ans--;break;}
printf("%.6lf",double(N-ans)/N);
return ;
}

这题一眼秒思路,然后细节WA了好久...最后看了Po姐才了解到问题

细节啊细节!!

【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率的更多相关文章

  1. LG4819/BZOJ2438 「中山市选2011」杀人游戏 Tarjan缩点+概率

    问题描述 LG4819 BZOJ2438 题解 发现如果有一些人之间认识关系形成环,只需要问一个人就能把控整个环. \(\mathrm{Tarjan}\)缩点. 缩点之后所有入度为\(0\)的点,必须 ...

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

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

  3. [中山市选]杀人游戏 (Tarjan缩点)

    题目链接 Solution 可以考虑到如果知道环内一点的身份,如果凶手在其中就查出来了,同时不会有危险. 那么对警察造成威胁的就是那些身份不明且不能从其他点转移过来的点. 那么大部答案就是缩完点之后入 ...

  4. 【BZOJ2438】[中山市选]杀人游戏 Tarjan+概率

    [中山市选]杀人游戏 Tarjan+概率 题目描述 ​ 一位冷血的杀手潜入\(Na\)-\(wiat\),并假装成平民.警察希望能在\(N\)个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...

  5. bzoj2438 杀人游戏 Tarjan强联通

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

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

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

  7. [BZOJ2438]杀人游戏(缩点+特判)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2438 分析:如果出现了环,那么只要询问环上的一个人,那么环上其他的人的信息也就知道了, ...

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

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

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

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

随机推荐

  1. Centos5.8 安装SVN并配置HTTP访问

    安装 svn sudo yum install subversion 测试 svn --version 安装 httpd 的 svn 模块 sudo yum install mod_dav_svn 前 ...

  2. Android 开发之旅:view的几种布局方式及实践

    本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...

  3. Theano2.1.2-基础知识之第一步:代数

    来自:http://deeplearning.net/software/theano/tutorial/adding.html Baby Steps - Algebra 一.两个标量相加 在学习the ...

  4. Nginx文件类型错误解析漏洞--攻击演练

    今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...

  5. xmind 使用备忘

    快捷键: shift+enter 编辑文字时回车换行 enter 快速建立同级主题(纵向) tab 快速建立子主题(横向) F4 插入注释 alt+左键+移动 拖动 shift+左键+移动 将元素脱离 ...

  6. 【分布式协调器】Paxos的工程实现-cocklebur简介(二)

    Cocklebur集群的工作原理 在集群正常工作时,整个集群只会有一个Leader,其他都是Follower.Client可以注册到某个Follower,当然也可以注册到Leader,为了减轻Lead ...

  7. 大新闻!HoloLens即将入华商用

    昨天微软搞了大新闻,Terry和Alexi到了深圳,在WinHEC大会上宣布了2017上半年HoloLens正式入华商用. 关于HoloLens的技术原理和细节官方文档和报道已经披露很多了,他是一款真 ...

  8. Windows下搭建PHP环境:Apache+PHP+MySQL

    本文简单记录一下Windows下搭建PHP环境的过程,一些细节可以参照本文参考资料,此文不再赘述 准备工作: Windows下手工搭建PHP环境需要先下载相应的软件,需要注意的是Apache与PHP的 ...

  9. js基础知识温习:构造函数与原型

    构造函数 构造函数主要用于初始化新对象.按照惯例,构造函数名第一个字母都要大写. 构造函数有别于其它函数在于它使用new操作符来调用生成一个实例对象.换句话说,如果一个函数使用new操作符来调用,则将 ...

  10. 用程序集编写clr表值函数:把正则表达式引入数据库中

    正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...