题目链接

Solution

可以考虑到如果知道环内一点的身份,如果凶手在其中就查出来了,同时不会有危险.
那么对警察造成威胁的就是那些身份不明且不能从其他点转移过来的点.
那么大部答案就是缩完点之后入度为 \(0\) 的联通块数量.
但是,会有特殊情况:

如图,我们就只要查 \(2\) 或者 \(1\) 其中的一点即可.
也就是说如果一个联通块仅包含一个点,且其出边所到的点都能由其他点推导出来.
那么我们可以通过调整对于入度为 \(0\) 的点的访问顺序以忽略这个点.
同时这样的点只能有一个(可以很简单举出反例).

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000008;
struct sj{int to,next;}a[maxn];
int head[maxn],size,flagg;
int dfn[maxn],low[maxn];
int sta[maxn],top,belong[maxn];
int cnt,tot,v[maxn],n;
int du[maxn],ans,num,m;
int fr[maxn],to[maxn],siz[maxn];
void add(int x,int y)
{a[++size].to=y;a[size].next=head[x];head[x]=size;
}void tarjan(int x)
{dfn[x]=low[x]=++tot;sta[++top]=x;v[x]=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!dfn[tt]){tarjan(tt);low[x]=min(low[x],low[tt]);}else if(v[tt]) low[x]=min(low[x],dfn[tt]);}if(dfn[x]==low[x]){belong[x]=++cnt;v[x]=0;do{siz[cnt]++;belong[sta[top]]=cnt;v[sta[top]]=0;}while(sta[top--]!=x);}
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y; scanf("%d%d",&x,&y);add(x,y);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int x=1;x<=n;x++)for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(belong[tt]!=belong[x])du[belong[tt]]++,fr[++num]=belong[x],to[num]=belong[tt];}memset(a,0,sizeof(a));memset(head,0,sizeof(head));size=0;for(int i=1;i<=num;i++)add(fr[i],to[i]);for(int x=1;x<=cnt;x++)if(du[x]==0){ans++;if(siz[x]==1){int flag=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(du[tt]==1){flag=0;break;}}if(!flagg)flagg=flag;if(!head[x])flagg=1;}}ans-=flagg;if(n==1)ans=0;if(m==0)ans=n-1;printf("%.6lf\n",(n*1.0-ans*1.0)/(n*1.0));
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9605664.html

[中山市选]杀人游戏 (Tarjan缩点)相关推荐

  1. bzoj2438 luogu4819 [中山市选]杀人游戏

    https://www.lydsy.com/JudgeOnline/problem.php?id=2438 一开始以为是一道大水题,后来发现有些地方还是要想清楚才能写出来 首先Tarjan缩点 在不清 ...

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

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

  3. [洛谷P4819][中山市选]杀人游戏

    题目大意:有一张$n$个点$m$条边的有向图,有一个关键点,如果你访问一个点,你会知道它连出的边中有没有关键点,以及若有的话是哪个.问最优策略下不访问关键点而知道关键点的概率 题解:发现若一个点不是关 ...

  4. 杀人游戏-Tarjan

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

  5. P4819-[中山市选]杀人游戏【tarjan】

    正题 题目链接:https://www.luogu.com.cn/problem/P4819 题目大意 nnn个人,一个杀手,搜查一个平民可以知道他认识的人的身份,搜查杀手就会死,求最优情况下警察的最 ...

  6. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点

    题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过 ...

  7. [补档][中山市选2011]杀人游戏

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

  8. bzoj 2464: 中山市选[2009]小明的游戏(BFS)

    2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 963  Solved: 394 [Submit][Sta ...

  9. bzoj千题计划169:bzoj2463: [中山市选2009]谁能赢呢?

    http://www.lydsy.com/JudgeOnline/problem.php?id=2463 n为偶数时,一定可以被若干个1*2 矩形覆盖 先手每次从矩形的一端走向另一端,后手每次走向一个 ...

最新文章

  1. 用户管理之用户的查询获取
  2. 计算机学硕哪些学校好考,什么学校研究生好考,计算机专业研究生哪个学校好考一点...
  3. 5.java.lang.IndexOutOfBoundsException(数组下标越界异常)
  4. java中 inheritdoc,【Java】Javadoc的使用
  5. 江夏学院计算机,福建江夏学院计算机作业.doc
  6. mybatis源码_MyBatis架构和源码
  7. 文本分类-TensorRT优化结果对比图
  8. 3/5 MySQL入门总结:数据库(DATABASE)操作
  9. Express使用nodemailer完成邮箱验证功能详细流程(含封装,可作自定义模块)
  10. [ SHELL编程 ] 远程服务器传输文件
  11. git中如何提交空目录
  12. server.mappath 与page命名空间说明
  13. JAVA清稿word_java开发实现word在线编辑及流转
  14. pymysql数据库使用教程_小白进阶之路,如何使用pymysql直连数据库?
  15. iptables详解(图文)
  16. 好用的滚动式截图工具picpick
  17. epson机器人编程 范例_Epson机械手简单实例编程
  18. 三大微分中值定理和洛必达法则、泰勒公式
  19. C#解决串口数据丢失问题
  20. 2022年最该收藏的8个数据分析模型

热门文章

  1. mysql主从报错_Mysql主从报错锦集
  2. java中算两个时间内的秒数_java – Joda Time – 计算两个日期之间的秒数会引发异常....
  3. Rabbit发送消息,消费者消费异常
  4. Java 多线程 —— 死锁与锁的错误用法
  5. Spring Boot————静态方法如何调用Spring容器中的Bean
  6. php 表单提交文件大小,PHP如何通过表单直接提交大文件详解
  7. html编译圣诞情缘,H5+JS+CSS3 实现圣诞情缘
  8. java字符串匹配dp_[OI]字符串DP小结
  9. java流读写_java流概述以及文件读写示例
  10. python使用pkg包_Python deb-pkg-tools包_程序模块 - PyPI - Python中文网