[BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通分量里只有他一个而且他能到达的所有点都能被其他入度为零的点所达到 ,这个细节70分.......
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define N 100010
#define M 300010
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct VIA
{
int to,next;
}c[M];
struct Via
{
int to,next,w;
}C[M<<];
int head[N],t,Head[N],T;
int dfn[N],low[N],stack[N],top;
inline void add(int x,int y)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
}
inline void Add(int x,int y,int z)
{
C[++T].to=y;
C[T].w=z;
C[T].next=Head[x];
Head[x]=T;
}
inline int Min(int x,int y)
{
return x<y?x:y;
}
int n,m,Ti,num,belong[N];
bool in[N];
bool special[N];
void Tarjan(int x)
{
in[x]=;
stack[++top]=x;
dfn[x]=low[x]=++Ti;
for(int i=head[x];i;i=c[i].next)
if(!dfn[c[i].to])
{
Tarjan(c[i].to);
low[x]=Min(low[x],low[c[i].to]);
}
else if(in[c[i].to])
low[x]=Min(low[x],dfn[c[i].to]);
if(low[x]==dfn[x])
{
int j,i=;
++num;
do
{
j=stack[top--];
in[j]=;
belong[j]=num;
i++;
}while(j!=x);
if(i==)
special[num]=;
}
}
int In[N];
inline void Build_New()
{
for(int x=;x<=n;x++)
for(int i=head[x];i;i=c[i].next)
if(belong[x]!=belong[c[i].to])
++In[belong[c[i].to]],Add(belong[x],belong[c[i].to],),Add(belong[c[i].to],belong[x],-);
}
inline void Init()
{
n=read(),m=read();
for(int i=,x,y;i<=m;i++)x=read(),y=read(),add(x,y);
}
int visit[N];
bool F(int x,int to)
{
if(visit[x]==t)return ;
if(In[x]==&&x!=to)return ;
for(int i=Head[x];i;i=C[i].next)
if(C[i].w==-)
if(F(C[i].to,to))
return ;
return ;
}
inline int find()
{
t=;
for(int i=;i<=num;i++)
if(In[i]==&&special[i])
{
if(Head[i]==)return ;
bool ans=;
for(int j=Head[i];j;j=C[j].next)
if(C[j].w==)
{
++t;
ans&=F(C[j].to,i);
}
if(ans)return ;
}
return ;
}
inline void work()
{
for(int i=;i<=n;i++)
if(!dfn[i])Tarjan(i);
Build_New();
int get=;
for(int i=;i<=num;i++)if(!In[i])get++;
get=n-get;
get+=find();
double ans=(double)get/n;
printf("%.6lf",ans);
}
int main()
{
Init();
work();
return ;
}
.
[BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点的更多相关文章
- bzoj 2438: [中山市选2011]杀人游戏【tarjan】
没看太懂题意orz 最优的是tarjan缩点之后问入度为0的点,因为问这个点可以知道整个块的情况 答案是这ans个入度为0的点都不是杀手的概率\( \frac{n-ans}{n} \) 但是有特殊情况 ...
- BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
发现每一次死亡的几率相等,所以只需要判断最少问多少人即可. 并且环上的点任意询问都可以. 所以直接Tarjan缩点,然后计算入度为0的点的数目. 但是还有一些情况的时候会减少一次询问,比如说:$1-& ...
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...
- bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...
- BZOJ 2438: [中山市选2011]杀人游戏
Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...
- BZOJ——2438: [中山市选2011]杀人游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个 ...
- 【BZOJ2438】 [中山市选2011]杀人游戏 tarjan强连通分量+缩点
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...
- BZOJ2438: [中山市选2011]杀人游戏(tarjan)
题意 题目链接 Sol 这题挺考验阅读理解能力的.. 如果能读懂的话,不难发现这就是在统计有多少入度为\(0\)的点 缩点后判断一下即可 当然有一种例外情况是\(1 -> 3, 2 -> ...
- 【bzoj2438】[中山市选2011]杀人游戏 Tarjan
题目描述 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民 ...
随机推荐
- java服务端项目开发规范
更新内容 2015-03-13 (请先更新svn的mybatis.xml.BaseMapper.java.Pager.java文件) 加入测试类规范 加入事物控制规范 加入mapper接口规则 ...
- haproxy + keepalived 实现高可用负载均衡集群
1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf jdk-7u65-lin ...
- C# 生成机器码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- R语言学习笔记(十四):零碎知识点(41-45)
41--ls( ) ls()可以用来列出现存的所有对象. pattern是一个具名参数,可以列出所有名称中含有字符串"s"的对象. > ls() [1] "s&qu ...
- 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介
数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...
- Xcode9新变化
http://www.cnblogs.com/lurenq/archive/2017/09/26/7594909.html
- mysql 大数据分页查询优化
应用场景: 当有一张表的数据非常大,需要使用到分页查询,分页查询在100w条后查询效率非常低: 解决方案: 1.业务层解决:只允许用户翻页一百页以内,十条一页: 2.使用where id > 5 ...
- 「日常训练」 神、上帝以及老天爷 (HDU 2048)
题意 数论中的错排问题.记错排为Dn" role="presentation">DnDn,求Dnn!" role="presentation&q ...
- zabbix 通过key(键值)获取信息
在agent端进行修改264行,例如: UserParameter=get.os.type,head -1 /etc/issue 保存重启agent 验证 zabbix_get -s IP -k ge ...
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...