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

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

所以直接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. UVA 10572 Black & White (状压DP)

    题意:有一个n*m的矩阵,其中部分格子已经涂黑,部分涂白,要求为其他格子也上黑/白色,问有多少种涂法可以满足一下要求: (1)任意2*2的子矩阵不可以同色. (2)所有格子必须上色. (3)只能有两个 ...

  2. docker配置国内镜像

    1. 配置 root@ros-OptiPlex-3050:~# cat /etc/docker/daemon.json {    "graph": "/mnt/docke ...

  3. CloudFoundry命令行和Kubernetes命令行的Restful API消费方式

    先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...

  4. Xcode5 如何添加一个Github/Repository 并且Checkout

    1. 添加一个Account  也就是添加一个 Repository. In Xcode, choose Xcode > Preferences, and click Accounts. Pre ...

  5. Google Colab的一些注意事项

    1.执行命令行前面加! 当我们使用python解释器时,我们需要不停地在命令行和IDE 之间切换,当我们需要使用命令行工具时.不过,Jupyter Notebook给了我们在notebook中运行sh ...

  6. 92.背包问题(lintcode)

    注意j-A[i-1]必须大于等于0,只大于0会报错 class Solution { public: /** * @param m: An integer m denotes the size of ...

  7. linux——nmap端口扫描命令

    先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...

  8. heartbeat安装配置

    一.环境 node01 192.168.127.101 心跳:192.168.42.101 node02 192.168.127.102 心跳:192.168.42.102 虚拟ip:192.168. ...

  9. leetcode-1-basic

    leetcode-algorithm 1. Two Sum 解法:循环,试呗..简单粗暴.. class Solution { public: vector<int> twoSum(vec ...

  10. LeetCode(153) Find Minimum in Rotated Sorted Array

    题目 Total Accepted: 65121 Total Submissions: 190974 Difficulty: Medium Suppose a sorted array is rota ...