洛谷

题目就是让我们在DAG中找到一些点,覆盖所有点。

因为是DAG,可以想到tarjan缩一下点。假设我们需要找x个点,那么答案就是(n-x)/n。

我们怎么选点呢?

敏锐的我们很快就能想到,直接选出所有入度为0的点。

但是,当我们发现一个入度为0的点,但是其中元素为1,而它的出边所到的点的入度都>1,则x--。

因为它们可以被别的点更新。

code:

#include <bits/stdc++.h>
using namespace std; const int N=100010;
const int M=300010;
int n,m;
int s[M][2],o[N];
int low[N],dfn[N],sccno[N],scc,dfscnt,w[N];
int sta[N],top;
struct Edge {
int next,to;
}e[M];
int last[N],len,in[N],ans; char buffer[M],*S,*T;
inline char Get_Char()
{
if(S==T)
{
T=(S=buffer)+fread(buffer,1,M,stdin);
if(S==T) return EOF;
}
return *S++;
} int Get_Int()
{
char c;
int re=0;
for(c=Get_Char();c<'0'||c>'9';c=Get_Char());
while(c>='0'&&c<='9')
re=(re<<1)+(re<<3)+(c^48),c=Get_Char();
return re;
} void add(int x,int y)
{
s[++o[0]][0]=y,s[o[0]][1]=o[x],o[x]=o[0];
} void tarjan(int x)
{
sta[++top]=x;
low[x]=dfn[x]=++dfscnt;
for (int i=o[x];i;i=s[i][1]) {
int y=s[i][0];
if (!dfn[y])
tarjan(y),low[x]=min(low[x],low[y]);
else if (!sccno[y])
low[x]=min(low[x],dfn[y]);
}
if (dfn[x]==low[x]) {
++scc;
while (1) {
int y=sta[top--];
sccno[y]=scc;
++w[scc];
if (x==y) break;
}
}
} void add2(int x,int y)
{
e[++len].to=y,e[len].next=last[x],last[x]=len;
} int main()
{
int x,y;
n=Get_Int(),m=Get_Int();
if (!m) {printf("%.6lf",1.0/n);return 0;}
if (n==1) {puts("1.000000");return 0;}
for (int i=1;i<=m;++i)
x=Get_Int(),y=Get_Int(),add(x,y);
for (int i=1;i<=n;++i)
if (!dfn[i]) tarjan(i);
for (x=1;x<=n;++x)
for (int i=o[x];i;i=s[i][1]) {
y=s[i][0];
if (sccno[x]!=sccno[y]) {
add2(sccno[x],sccno[y]);
++in[sccno[y]];
}
}
bool flag=0;
for (x=1;x<=scc;++x) {
if (w[x]==1&&in[x]==0) {
bool k=0;
for (int i=last[x];i;i=e[i].next) {
y=e[i].to;
if (in[y]>1) k=1;
else {k=0;break;}
}
if (k) flag=1;
}
if (flag) {--ans;break;}
}
for (int i=1;i<=scc;++i)
if (!in[i]) ++ans;
double tmp=(n-ans)*1.0/n;
printf("%.6lf",tmp);
return 0;
}

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

  1. 洛谷 P4819 [中山市选]杀人游戏(tarjan缩点)

    P4819 [中山市选]杀人游戏 思路分析 题意最开始理解错了(我太菜了) 把题意简化一下,就是找到可以确定杀手身份的最小的危险查看数 (就是不知道该村名的身份,查看他的身份具有危险的查看数量),用 ...

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

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

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

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

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

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

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

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

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

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

  7. BZOJ2440/洛谷P4318 [中山市选2011]完全平方数 莫比乌斯函数

    题意:找到第k个无平方因子数. 解法:这道题非常巧妙的运用了莫比乌斯函数的性质! 解法参考https://www.cnblogs.com/enzymii/p/8421314.html这位大佬的.这里我 ...

  8. 洛谷 P2059 [JLOI2013]卡牌游戏(概率dp)

    题面 洛谷 题解 \(f[i][j]\)表示有i个人参与游戏,从庄家(即1)数j个人获胜的概率是多少 \(f[1][1] = 1\) 这样就可以不用讨论淘汰了哪些人和顺序 枚举选庄家选那张牌, 枚举下 ...

  9. 洛谷 大牛分站 P1000 超级玛丽游戏

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

随机推荐

  1. Java 连接使用 Redis

    1. 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. 首先你需要下载驱动包,下载 jedis.j ...

  2. c++ vector容器的使用,序列倒叙reverse(),容器底部插入一个数值push_back()

    问题:程序实现将que[i]添加到que2最后,再将que2反转输出. 例如: 输入 4 1 2 3 4 输出 4 2 1 3 #include<iostream> #include< ...

  3. 分别在.NET Framework 与 .NET Core 框架下 编写Windows Service(windows服务程序)

    前言,为什么会分别在两个框架下编写Windows Service,是因为最近在做区块链这块,使用的是NEO(小蚁区块链)的相关技术,NEO使用的是.net core 2.1,业务上需要写两个程序,一个 ...

  4. 转 iOS:NSAttributedString

    NSAttributedString: http://blog.csdn.net/kmyhy/article/details/8895638 CTFramesetterSuggestFrameSize ...

  5. AMD 3600+ X2 CPU配合昂达A69T主板超频教程

    本次超频使用电脑硬件配置如下: AMD 3600+ X2 90nm 昂达 A69T HDMI 宇瞻 DDR II 1G 667普条 西数 WD2500KS SATAII  250G 16M 戴尔 普通 ...

  6. 怎样设置mysql的表不区分你大写和小写

    Linux上安装MySQL默认是数据库的表大写和小写敏感的.改动非常easy.仅仅要该一个mysql的配置文件就能够了. mysql> show tables; +--------------- ...

  7. php学习网站推荐

    http://nikic.github.io/https://github.com/walu/phpbook http://www.chinaunix.net/ https://news.ycombi ...

  8. pthread_create11121

    #include <stdlib.h> #include <stdio.h> #include <pthread.h> void* test(void* args) ...

  9. Python内置函数之bool()

    该函数是一个类对象 class bool([x]) bool()只能传入一个参数. bool()用来判断对象是否为True,返回值为True或者False. 下面看看例子: >>> ...

  10. 【藏】使用Entity Framework时要注意的一些性能问题

    这篇文章写的很好: http://diaosbook.com/Post/2012/12/9/performance-issue-in-select-one-or-few-colums-via-enti ...