BZOJ 2438 中山市选2011 杀人游戏 Tarjan

题目大意:有n个人,其中一个是杀手,可以询问一些人,如果是杀手就会死,如果是平民,他会告诉你他认识的人中有谁是杀手有谁是平民

警告:数据有误,请谨慎提交!

易知如果我需要访问x个人,那么答案就是1-x/n 我们需要访问最少的人

如果我访问的人是平民,那么这个点所有的后继我都能知道

于是Tarjan缩点之后入度为零的点就是答案

但是还有一个问题 比如说这组样例

3 1

1 2

我访问了1,那么1和2是不是凶手我就都知道了

既然只有三个人,我知道1和2是不是凶手,那么3也一定知道 没必要去访问3

于是如果出现单点的话 ans还要-1

此题到此为止 如果数据没问题这里可以AC了 但是这样写交上去是WA的 为什么呢? 因为数据出错了

判断单点的条件是某个强连通分量入度和出度都为0且size为1 但是出题人忘记了判断出度为0 导致数据错误

于是我们把出度为0这个条件注释掉才能AC 即便过不去样例

无视网上那些乱改的标程吧……1 0这组数据居然能输出0我也是醉了

#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct abcd{
	int to,next;
}table[300300];
int head[M],tot;
int n,m,ans;
int dpt[M],low[M],T,belong[M],size[M],into[M],out_of[M],cnt,stack[M],top;
bool v[M],flag;
void Add(int x,int y)
{
	table[++tot].to=y;
	table[tot].next=head[x];
	head[x]=tot;
}
void Tarjan(int x)
{
	int i;
	dpt[x]=low[x]=++T;
	stack[++top]=x;
	for(i=head[x];i;i=table[i].next)
	{
		if(v[table[i].to])
			continue;
		if(dpt[table[i].to])
			low[x]=min(low[x],dpt[table[i].to]);
		else
			Tarjan(table[i].to),low[x]=min(low[x],low[table[i].to]);
	}
	if(low[x]==dpt[x])
	{
		int t;++cnt;
		do{
			t=stack[top];
			stack[top--]=0;
			belong[t]=cnt;
			size[cnt]++;
			v[t]=1;
		}while(t!=x);
	}
}
int main()
{
	int i,x,y;
	cin>>n>>m;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		Add(x,y);
	}
	for(i=1;i<=n;i++)
		if(!v[i])
			Tarjan(i);
	for(x=1;x<=n;x++)
		for(i=head[x];i;i=table[i].next)
			if(belong[x]!=belong[table[i].to])
				into[belong[table[i].to]]++,out_of[belong[x]]++;
	for(i=1;i<=cnt;i++)
		if(!into[i])
		{
			if( !flag && size[i]==1/* && !out_of[i] */)
			{
				flag=1;
				continue;
			}
			ans++;
		}
	cout<<fixed<<setprecision(6)<<1.0-(double)ans/n<<endl;
}
时间: 2024-10-18 10:11:21

BZOJ 2438 中山市选2011 杀人游戏 Tarjan的相关文章

BZOJ 2438 中山市选 2011 杀人游戏 Tarjan

题目大意:给出一张有向人物关系图,告诉你谁认识谁,认识具有传递性.其中有一个人是犯人.现在警察要调查谁是犯人.他可以问任何人.但是如果他问到了犯人,那么它就会死.如果他问到的一个人认识犯人,这个人就会告诉警察谁是犯人.问警察保证自身安全并知道犯人是谁的概率最大是多少. 思路:这个题前一阵子重测了,加强了数据,卡掉了网上一片AC代码.. 正解并不是很难想.首先先缩点,整个图变成拓扑图,之后会出现一些类似根的东西,这些scc入度为0,只要警察询问了这些scc每一个中的任意一个,就肯定能知道谁是犯人.

bzoj 2438: [中山市选2011]杀人游戏 (强联通分量 Tarjan)

Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌握了每一个人认识谁. 每一个人都有可能是杀手,可看作他们是杀手的概率是相同的. 问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少? Input 第一行有两个整数 N,M. 接下来有 M 行,每行两个整数 x

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手谁是平民,问不被杀的情况下知道谁是杀手的概率. [思路] 对于一个scc,如果我们询问一个不是杀手的人,就可以成功遍历整个scc. 求scc,然后缩点. 对于每一个入度为0的scc,我们需要去询问一下,那么被杀的概率为1/n * ans.ans为入度为0的scc个数. 但还有一种特殊的情况,如果一个

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

Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些点的信息,和这些点所连接的其他点的信息,显然我们需要知道的就是缩点后入度为0的点. 然后还有最后一个入度为0的单点,并且他的所有儿子都能被其他节点访问,那么最后就可以直接推断出这个点,所以要删去. Code #include<cstdio> #include<stack> #inclu

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

http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀 手, 杀手将会把警察干掉.现在警察掌握了每一个人认识谁.每一个人都有可能是杀手,可看作他们是杀手的概 率是相同的.问:根据最优的情况,保证警察自身安全并知

【BZOJ2438】[中山市选2011]杀人游戏 Tarjan

[BZOJ2438][中山市选2011]杀人游戏 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌握了每一个人认识谁. 每一个人都有可能是杀手,可看作他们是杀手的概率是相同的. 问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少? Input 第一行有两个

2438. [中山市选2011]杀人游戏【强连通分量】

Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀 手, 杀手将会把警察干掉.现在警察掌握了每一个人认识谁.每一个人都有可能是杀手,可看作他们是杀手的概 率是相同的.问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少? Input 第一行有两个整数 N,M. 接下来有 M 行,每行两个整数 x,

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

2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的存活概率,那么也就是找到直接找到杀手的最小概率 那么我们采用强联通缩点: 统计每个联通分量的入度,如果入度为0(证明除此联通分量里的点,没有人可以知道连通分量里的信息,那就一定要先选一个人访问),那么sum++(因为依据题意,假如问到连通分量里的任意一个人,只要ta不是杀手,那么一定可以安全的遍历强

[中山市选2011]杀人游戏

[中山市选2011]杀人游戏 时间限制: 1 Sec  内存限制: 128 MB提交: 64  解决: 33[提交][状态][讨论版] 题目描述 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌握了每一个人认识谁. 每一个人都有可能是杀手,可看作他们是杀手的概率是相同的. 问:根据最优的情况,保