发现每一次死亡的几率相等,所以只需要判断最少问多少人即可。

并且环上的点任意询问都可以。

所以直接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的更多相关文章

  1. bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2438 [题意] N个人中有一个杀手,每次询问一个人可能被杀或被告知其认识的人中谁是杀手 ...

  2. BZOJ——2438: [中山市选2011]杀人游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个 ...

  3. BZOJ 2438: [中山市选2011]杀人游戏

    Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...

  4. [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan

    考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...

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

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

  6. bzoj 2438: [中山市选2011]杀人游戏【tarjan】

    没看太懂题意orz 最优的是tarjan缩点之后问入度为0的点,因为问这个点可以知道整个块的情况 答案是这ans个入度为0的点都不是杀手的概率\( \frac{n-ans}{n} \) 但是有特殊情况 ...

  7. bzoj2438: [中山市选2011]杀人游戏(强联通+特判)

    2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...

  8. BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量

    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...

  9. bzoj2438[中山市选2011]杀人游戏

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

随机推荐

  1. Android - Zxing实现二维码的扫描与生成

    Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github:     ...

  2. java.lang.IllegalArgumentException: name MUST NOT NULL! at org.nutz.dao.impl.NutDao.fetch

    Nutz传值报错问题 作者:Vashon 时间:20150902 平台:Nutz框架 Java后台方法中拿值时报的错 报错信息: java.lang.IllegalArgumentException: ...

  3. ubuntu 14.04 构建openstack使用的ubunt 16 的桌面版的使用镜像

    1. 下载ubuntu 16.04桌面版的iso文件,我的个人网盘中有,可以下载 https://pan.baidu.com/s/14qT3lbbqLwDaejmz2VSkyw 2. 安装制作镜像文件 ...

  4. PCL点云处理可视化——法向显示错误“no override found for vtk actor”解决方法

    转:https://blog.csdn.net/bflong/article/details/79137692 参照:https://blog.csdn.net/imsaws/article/deta ...

  5. Cayley凯莱定理——一一对应

    定理 过$n$个有标志顶点的树的数目等于$n^{n-2}$. 此定理说明用$n-1$条边将$n$个已知的顶点连接起来的连通图的个数是$n^{n-1}$.也可以这样理解,将n个城市连接起来的树状网络有$ ...

  6. vue的使用-项目总结

    1,这是一个重前端逻辑,轻交互,数据展示的项目,可读性差,2,组件划分的坑,复用过多的坑,复用过多导致要在js手动判断太多东西,不便于可读3,vuex的坑,数据分为后台请求数据的暂存,前端页面逻辑的状 ...

  7. 数据库_4_SQL介绍

    SQL SQL:Structured Query Language,结构化查询语言(数据已查询为主:99%是在进行查询操作)    what型语言,而非how型的语言. SQL分为三个部分: DDL: ...

  8. leetcode_day1

    1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...

  9. C05 C语言字符串和数组

    目录 数组 字符串 数组 概念 数组是有序数据的集合. 数组中的每一个元素属于同一个数据类型. 通过数组名和下标唯一确定数组中的元素. 一维数组的定义 语法格式 数据类型   数组名[常量表达式] 例 ...

  10. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...