BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
发现每一次死亡的几率相等,所以只需要判断最少问多少人即可。
并且环上的点任意询问都可以。
所以直接Tarjan缩点,然后计算入度为0的点的数目。
但是还有一些情况的时候会减少一次询问,比如说:$1->3,2->3$此时只需要询问1或2即可,因为必然有一个人是杀手。
所以需要一系列特殊判断,但是自己写挂了,天真的以为在$n=1$的时候几率为0,然后挂掉了,显然并不需要询问。
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 600005 struct Graph{
int n,fr[maxn],h[maxn],to[maxn],ne[maxn],en,inside[maxn];
int sta[maxn],top,bel[maxn],idx,vcnt,siz[maxn];
int dfn[maxn],low[maxn],ins[maxn],in[maxn],out[maxn];
void init(){memset(h,-1,sizeof h); en=0;idx=0;vcnt=0;}
void add(int a,int b)
{fr[en]=a;to[en]=b;ne[en]=h[a];h[a]=en++;out[a]++;in[b]++;}
void Tarjan(int o)
{
low[o]=dfn[o]=++idx;ins[o]=1;
sta[++top]=o;
for (int i=h[o];i>=0;i=ne[i])
if (!low[to[i]]) Tarjan(to[i]),low[o]=min(low[o],low[to[i]]);
else if (ins[to[i]]) low[o]=min(low[o],dfn[to[i]]);
if (low[o]==dfn[o])
{
int x=-1; vcnt++;
while (x!=o)
{
x=sta[top--];
bel[x]=vcnt;
siz[vcnt]++;
ins[x]=0;
}
}
}
void Solve(){F(i,1,n)if(!dfn[i])Tarjan(i);}
int cal()
{
int ret=0;
F(i,1,n) if (!in[i]) ret++;
return ret;
}
int flag()
{
// memset(vis,0,sizeof vis);
int ret=0;
F(i,1,n)
{
if (siz[bel[i]]==1&&in[i]==0)
{
int tmp=0x3f3f3f3f,flag=0;
for (int j=h[i];j>=0;j=ne[j])
{
flag=1;
tmp=min(inside[bel[to[j]]],tmp);
}
if ((tmp>=2&&flag)||in[i]+out[i]==0) ret=1;
}
}
return ret;
}
}G1,G2; int n,m;
int vis[maxn]; int main()
{
// freopen("killer1.in","r",stdin);
scanf("%d%d",&n,&m);G1.init();G2.init();
// if (n==1){printf("0.000000\n");return 0;}
F(i,1,m){int u,v;scanf("%d%d",&u,&v);G1.add(u,v);}
G1.n=n;G1.Solve();
F(i,1,n)
for (int j=G1.h[i];j>=0;j=G1.ne[j]){
if (G1.bel[G1.fr[j]]!=G1.bel[G1.to[j]]&&vis[G1.to[j]]!=i)
{
vis[G1.to[j]]=i;
G2.add(G1.bel[G1.fr[j]],G1.bel[G1.to[j]]);
G1.inside[G1.bel[G1.to[j]]]++;
}
}
G2.n=G1.vcnt;
printf("%.6f\n",1.0*(n-G2.cal()+G1.flag())/(n*1.0));
}
BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP的更多相关文章
- 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]杀人游戏
Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通 ...
- 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 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...
随机推荐
- iOS 如何解决并发请求时,只接受最后一个请求返回的结果
大致意思是 虽然NSOperation 的cancel 并不能取消请求,但是可以对这个NSOperation进行标记. 当cancel 属性是YES时,表明 NSOperation虽然已经执行,并 ...
- NBUT 1116 Flandre's Passageway (LIS变形)
题意: 给一个有n*m格子的矩形,设每格边长100,要从(1,1)走到(n,m)需要耗(n+m)*100,但是其中有一些格子是可以直接穿过的,也就是走对角线,是100*根号2长,给出k个可以穿过的格子 ...
- 接口接收gzip压缩数据并解压
asp.net 接收前端gzip 压缩后的数据,接收端需要进行解压 public string GetResponseBody(HttpWebResponse response) { string r ...
- html与css入门经典视频教程 千锋说要这样学
PHP初学者看过来,老师带来的PHP入门经典视频教程,带你轻松入门,学习PHP就是这么简单. 很多人不理解为什么学习PHP要先学习HTML基础和CSS,其实PHP作为服务器的脚本语言,在开发过程中用于 ...
- 解决Starting to watch source with Jekyll and Compass. Starting Rack on port 4000
问题 Starting to watch source with Jekyll and Compass. Starting Rack on port 4000 rake aborted! Errno: ...
- 清空iptables
/sbin/iptables -P INPUT ACCEPT /sbin/iptables -F iptables -L
- php日期时间和时间戳转化
echo date("Y-m-d H:i:s", 1409138643);echo strtotime('2014-08-28 23:00:00');
- CAD交互绘制圆形云线批注(网页版)
js中实现代码说明: 动态拖放时的绘制事件: function DoDynWorldDrawFun(dX,dY,pWorldDraw,pData) { //自定义实体的GUID标识符 var sGui ...
- robotframework接口测试实例
*** Settings *** Library Collections Library RequestsLibrary *** Test Cases *** test Create Session ...
- EOF与feof
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file).在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件.在文本文件中,数据都是 ...