P4819 [中山市选]杀人游戏

思路分析

题意最开始理解错了(我太菜了)

把题意简化一下,就是找到可以确定杀手身份的最小的危险查看数

(就是不知道该村名的身份,查看他的身份具有危险的查看数量),用

该数除以总人数,保留6位小数,我们将每个村名和他认识的人之间

连接一条有向边,得到一个有向图,考虑到图中带有环,因为查看一

个人的身份时我们便可以知道他认识的人的具体身份,所以针对一个

环我们只要查看任意一人的身份就可以无危险的得知剩余其他人的身

份,且只有第一次查看为危险查看,我们可以看出将环缩为点和按

环判断结果是相同的,为了节省时间,我们考虑将环缩为点,对于缩

点后的图,我们发现想要知道杀手是谁,只要满足所有入度为0的点

被查看即可,但要注意,对于缩圈后的图,假设有n个点,我们查看

了n-1个点的身份,剩下一个点的身份就不用查了。最后将其减掉即

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=3e5+100;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
int dfn[maxn];
int low[maxn];
int n,m;
int cnt;
struct node{
int nex;
int to;
}e[maxn];
int head[maxn];
void add(int u,int v){
cnt++;
e[cnt].nex=head[u];
e[cnt].to=v;
head[u]=cnt;
}
int sti[maxn];
int vis[maxn];
int tot;
int cnt1;
int cnt2;
int clo[maxn];
int siz[maxn];
void tarjan(int x){
low[x]=dfn[x]=++cnt1;
vis[x]=1;
sti[++tot]=x;
for(int i=head[x];i;i=e[i].nex){
int y=e[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y]){
low[x]=min(low[x],dfn[y]);//只用于更新最后一个点;
}
}
if(dfn[x]==low[x]){
int now=-1;
cnt2++;
while(now!=x){
now=sti[tot];
tot--;
vis[now]=0;
clo[now]=cnt2;//强联通分量编号
siz[cnt2]++;//强联通分量节点个数
}
}
}
int in[maxn];
int u[maxn];
int b[maxn];
int main(){
// freopen("a.in","r",stdin);
n=read();
m=read();
for(int i=1;i<=m;i++){
u[i]=read();
b[i]=read();
// cout<<u[i]<<" "<<b[i]<<endl;
add(u[i],b[i]);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
cnt=0;
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
for(int i=1;i<=m;i++){
if(clo[u[i]]!=clo[b[i]]){
add(clo[u[i]],clo[b[i]]);
// cout<<clo[u[i]]<<" "<<u[i]<<" ";
// cout<<clo[b[i]]<<" "<<b[i]<<endl;
in[clo[b[i]]]++;
}
}
int fla=0;
double ans=0;
// cout<<cnt2;
for(int i=1;i<=cnt2;i++){
if(siz[i]==1&&!in[i]&&!fla){
int pd=0;
// cout<<i;
for(int j=head[i];j;j=e[j].nex){
int y=e[j].to;
if(in[y]==1){
// cout<<y<<endl;
pd=1;
// break;
}
}
if(!pd)
fla=1;
}
if(!in[i]){
ans++;
}
}
if(fla)
ans--;
// cout<<ans;
printf("%.6f",1.0-ans/(double)n);
return 0;
}

洛谷 P4819 [中山市选]杀人游戏(tarjan缩点)的更多相关文章

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

    洛谷 题目就是让我们在DAG中找到一些点,覆盖所有点. 因为是DAG,可以想到tarjan缩一下点.假设我们需要找x个点,那么答案就是(n-x)/n. 我们怎么选点呢? 敏锐的我们很快就能想到,直接选 ...

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

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

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

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

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

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

  5. P4819 [中山市选]杀人游戏

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

  6. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  7. Tarjan缩点【p4819】[中山市选]杀人游戏

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

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

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

  9. 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率

    2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1638  Solved: 433[Submit][Statu ...

随机推荐

  1. Azure Storage 系列(四)在.Net 上使用Table Storage

    一,引言 今天我们就不多说废话了,直接进入正题,Azure Table Storage.开始内容之前,我们先介绍一下Azure Table Storage. 1,什么是Azure Table Stor ...

  2. SpringBoot简单(登录/显示/登出)工程下载 使用Thymeleaf输出页面文字

    下载地址:https://files.cnblogs.com/files/xiandedanteng/SessionShare20191226.zip 测试用,画面如下: SpringMVC入门弟子也 ...

  3. pythont多线程

    import threading # 线程模块 def function(num): pass thread_1 = threading.Thread(target=function, args=(1 ...

  4. 痞子衡嵌入式:IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞问题的分析解决经验. 事情缘起恩智浦官方论坛上的一 ...

  5. oracle之三 自动任务调度

    Oracle 自动任务调度 13.1 Oracle任务调度概述 在Oracle中任务调度指某一(组)执行程序在特定的时间被周期性的执行.Oracle把任务调度称为job(作业). Advanced S ...

  6. .NetCore之接口缓存

    1.问题:我们平时做开发的时候肯定都有用到缓存这个功能,一般写法是在需要的业务代码里读取缓存.判断是否存在.不存在则读取数据库再设置缓存这样一个步骤.但是如果我们有很多地方业务都有用到缓存,我们就需要 ...

  7. docker部署安装zabbix

    安装docker 安装docker需要配置网络yum源,centos7自带的版本太低了 第一步:下载阿里云的docker安装包 在yum仓库的目录之下 [root@localhost yum.repo ...

  8. Docker网络(五)

    本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...

  9. archaius(3) 配置管理器

    基于上一节介绍的配置源,我们来继续了解配置管理器.配置源只是抽象了配置的获取来源,配置管理器是基于配置源的基础上对这些配置项进行管理.配置管理器的主要功能是将配置从目标位置加载到内存中,并且管理内存配 ...

  10. jenkins在windows系统及linux环境安装

    一.下载 jenkins是当前持续集成(Continuous integration,简称 CI)的主流工具,在项目中得到了广泛的推广和应用. 下载地址: https://jenkins.io/dow ...