BZOJ 2438: [中山市选2011]杀人游戏
Description
给你一个有向图,求至少询问多少次能够得到全部点的信息.
Sol
Tarjan + 强连通分量缩点 + 判断.
先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些点的信息,和这些点所连接的其他点的信息,显然我们需要知道的就是缩点后入度为0的点.
然后还有最后一个入度为0的单点,并且他的所有儿子都能被其他节点访问,那么最后就可以直接推断出这个点,所以要删去.
Code
#include<cstdio>
#include<stack>
#include<vector>
#include<iostream>
using namespace std; const int N = 100005;
#define debug(a) cout<<#a<<"="<<a<<" "
#define ct cout<<endl
#define _ct cout<<"----------"<<endl int n,m,cnt,bcnt;
int dfsn[N],low[N],ins[N],b[N],sz[N],vis[N];
vector<int> g[N];
vector<int> h[N];
int du[N];
stack<int> stk; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
void Tarjan(int u){
dfsn[u]=low[u]=++cnt,ins[u]=1,stk.push(u);
for(int i=0,lim=g[u].size(),v;i<lim;i++){
v=g[u][i];
if(!dfsn[v]){ Tarjan(v),low[u]=min(low[u],low[v]); }
else if(ins[v]) low[u]=min(low[u],dfsn[v]);
}if(dfsn[u]==low[u]){
++bcnt;int v=-1;
for(;u!=v;){ v=stk.top(),stk.pop(),ins[v]=0,b[v]=bcnt,sz[bcnt]++; }
}
}
int check(int x){
for(int i=0,lim=h[x].size();i<lim;i++) if(du[h[x][i]]<=1) return 0;
return 1;
}
int main(){
// freopen("in.in","r",stdin);
n=in(),m=in();
for(int i=1,u,v;i<=m;i++) u=in(),v=in(),g[u].push_back(v);
for(int i=1;i<=n;i++) if(!dfsn[i]) Tarjan(i);
// _ct;debug(bcnt),ct;
for(int i=1;i<=n;i++){
for(int j=0,lim=g[i].size();j<lim;j++) if(b[i]!=b[g[i][j]]&&!vis[b[g[i][j]]])
vis[b[g[i][j]]]=1,h[b[i]].push_back(b[g[i][j]]),du[b[g[i][j]]]++;
for(int j=0,lim=g[i].size();j<lim;j++) if(b[i]!=b[g[i][j]]) vis[b[g[i][j]]]=0;
}
// _ct;
int ans=0;
for(int i=1;i<=bcnt;i++) if(du[i]==0) ans++;
for(int i=1;i<=bcnt;i++) if(du[i]==0&&sz[i]==1&&check(i)){ ans--;break; }
// debug(ans),ct;
printf("%.6lf\n",(double)(n-ans)/n);
return 0;
}
BZOJ 2438: [中山市选2011]杀人游戏的更多相关文章
- bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...
- BZOJ——2438: [中山市选2011]杀人游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个 ...
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通 ...
- BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
发现每一次死亡的几率相等,所以只需要判断最少问多少人即可. 并且环上的点任意询问都可以. 所以直接Tarjan缩点,然后计算入度为0的点的数目. 但是还有一些情况的时候会减少一次询问,比如说:$1-& ...
- bzoj 2438: [中山市选2011]杀人游戏【tarjan】
没看太懂题意orz 最优的是tarjan缩点之后问入度为0的点,因为问这个点可以知道整个块的情况 答案是这ans个入度为0的点都不是杀手的概率\( \frac{n-ans}{n} \) 但是有特殊情况 ...
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- bzoj2438[中山市选2011]杀人游戏
Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...
随机推荐
- hdu 1020 Encoding
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Given a ...
- ecshop 获取某个商品的 所有订单信息 或者销量
把一下代码放到 lib_main.php 1.统计某个下单商品的人数 function get_goods_ordernum($goods_id){ $sql = "select count ...
- Django开发web环境搭建的简单方法(CentOS6.5环境)
这几天跟Linux下的Python + Django环境搭建卯上了.经过几天的琢磨,找到了一条自己认为给力的路径. 这里给出命令行,过程如下: 首次登陆,切换管理员: [web@bogon ~]$ s ...
- NopCommerce Url分析
using System; using System.Web; using System.Web.Routing; using Nop.Core; using Nop.Core.Data; using ...
- Autofac.Integration.Mvc.Owin分析
using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Secur ...
- C#和SQL实现的字符串相似度计算代码分享
http://www.jb51.net/article/55941.htm C#实现: 复制代码 代码如下: #region 计算字符串相似度 /// <summary> ...
- ASP.NET技巧:教你制做Web实时进度条
网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...
- sqlmap写文件为空之谜
恰逢有一个SQL注入可以通过sqlmap进行,而且权限高得离谱,直接就是root权限.既然是root权限当然是想直接getshell咯.可是只是sqlmap -u xxx --os-shell的时候却 ...
- yii2-按需加载并管理CSS样式/JS脚本
原文地址:https://segmentfault.com/a/1190000003742452
- CSV文件的读取 导出
CSV文件是 逗号分隔值文件 内容基本是这么存的... 姓名,年龄,性别/r/n王有才,,男/r/n王二妞,,女 一行值内用逗号 , 分开 行与行之间用 /r/n 分隔 说白了,他其实是一个字符 ...