BZOJ2438:[中山市选2011]杀人游戏(强连通分量)
Description
Input
第一行有两个整数 N,M。 
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如[政治敏感]同志) 。
Output
仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。
Sample Input
1 2
1 3
1 4
1 5
Sample Output
HINT
警察只需要查证 1。假如1是杀手,警察就会被杀。假如 1不是杀手,他会告诉警察 2,3,4,5 谁是杀手。而 1 是杀手的概率是 0.2,所以能知道谁是杀手但没被杀的概率是0.8。
对于 100%的数据有 1≤N ≤ 10 0000,0≤M ≤ 30 0000
Solution
显然要先缩一下点……然后发现只有缩点后的图上入度为0的点需要查验。
统计一波入度为0的点然后直接计算就可以拿到28分的好成绩
发现一种奇怪的情况……比如1->2,3->2,。先查一下1,然后顺带可以知道2的身份。如果这个时候警察还没死,发现剩下了一个3,那么这个3就被钦定是杀手了= =
也就是说,如果一个点入度为0且不是由环缩成的的点,若它连向的点入度都不为1(也就是说它连向的点的身份都可以从别的点得知),那么这个点就允许不被调查,不过显然不被调查的点只能有一个。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (300009)
using namespace std; struct Edge{int to,next;}edge[N];
int n,m,cnt,emm,flag,u[N],v[N],Ind[N];
int Dfn[N],Low[N],stack[N],ID[N],Num[N];
int top,id_num,dfs_num;
int head[N],num_edge;
bool vis[N]; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Tarjan(int x)
{
Dfn[x]=Low[x]=++dfs_num;
stack[++top]=x; vis[x]=true;
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 (vis[edge[i].to])
Low[x]=min(Low[x],Dfn[edge[i].to]);
if (Low[x]==Dfn[x])
{
vis[x]=false; ID[x]=++id_num; Num[id_num]++;
while (stack[top]!=x)
{
vis[stack[top]]=false;
Num[id_num]++;
ID[stack[top--]]=id_num;
}
top--;
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; ++i)
scanf("%d%d",&u[i],&v[i]),add(u[i],v[i]);
for (int i=; i<=n; ++i)
if (!Dfn[i]) Tarjan(i); memset(head,,sizeof(head)); num_edge=;
for (int i=; i<=m; ++i)
if (ID[u[i]]!=ID[v[i]])
add(ID[u[i]],ID[v[i]]),Ind[ID[v[i]]]++; for (int i=; i<=id_num; ++i) if (!Ind[i])
{
cnt++;
if (Num[i]==) flag=true;
for (int j=head[i]; j; j=edge[j].next)
if (Ind[edge[j].to]==) flag=false;
if (flag) emm=;
}
printf("%.6lf\n",1.0-1.0*(cnt-emm)/n);
}
BZOJ2438:[中山市选2011]杀人游戏(强连通分量)的更多相关文章
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
		2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ... 
- 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]杀人游戏  Tarjan
		题目描述 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民 ... 
- BZOJ 2438: [中山市选2011]杀人游戏
		Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ... 
- 【BZOJ2438】 [中山市选2011]杀人游戏 tarjan强连通分量+缩点
		Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ... 
- 【bzoj2438】 中山市选2011—杀人游戏
		http://www.lydsy.com/JudgeOnline/problem.php?id=2438 (题目链接) 题意 n个点的有向图,其中有一个是杀手,每个人成为杀手的概率相同.警察询问一个人 ... 
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
		这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通 ... 
随机推荐
- 翻屏类 h5 适配方案:解决宽高自适应难题
			表格 图片等 宽度自适应 :width:100%; box-sizing: border-box; 基于淘宝适配方案flexible + 翻屏h5 适配方案adaptive flexible解读及 ... 
- JVM(三) 垃圾回收时间点和垃圾收集器
			收集器组合章节来自第一篇参考文章,非原创,作者总结地非常好! 分代收集相关概念来自参考文章第二篇,非原创 第二篇参考资料的文章质量很高,推荐阅读! 分代收集(Ge ... 
- Java生成验证码(二)
			前一篇博客已经介绍了如何用Java servlet产生验证码,本篇继续介绍如何使用一些开源组件生成验证码 ———————————————————————————————————————————— ... 
- SQL中的函数以及实例
			AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: selecte "函数名"("列名") ... 
- java设计模式--基础思想总结--抽象类与架构设计思想
			抽象类?这个东西我感觉没什么卵用啊,又不能拿来new对象,没有具体的对象的抽象类,有什么实际的意义呢?这是很多刚刚接触java抽象类语法时的第一反应(当然,包括我).确实,很多刚刚接触抽象类这个概念的 ... 
- c语言结构体可以直接赋值
			结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //de ... 
- pom文件解析
			Maven的依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成.因此,使用任何一个依赖之间,你都需要知道它的Maven坐标. ... 
- package和package-lock区别;dependencies和devDependencies区别
			package和package-lock package.json: 主要用来定义项目中需要依赖的包 package-lock.json: 在 npm install时候生成一份文件,用以记录当前状态 ... 
- cf1043E. Mysterious Crime(二分 前缀和)
			题意 题目链接 Sol 考场上做完前四题的时候大概还剩半个小时吧,那时候已经困的不行了. 看了看E发现好像很可做?? 又仔细看了几眼发现这不是sb题么... 先考虑两个人,假设贡献分别为\((x, y ... 
- 视差滚动-background-attachement
			之前项目中没有涉及到视觉滚动的网站,但是毕竟是一种常用的网站类别,不得不了解.实现方法很简单,做一下简单的分析... 概述:滚动视差是指多层背景以不同的速度移动,形成立体的运动效果,来带非常出色的视觉 ... 
