洛谷

题目就是让我们在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 创建用户异常类、将异常一直向上抛、 throw和throws的区别

    如果java提供的系统异常类型不能满足程序设计的需求,那么可以设计自己的异常类型. 从java异常类的结构层次可以看出,java类型的公共父类为Throwable.在程序运行中可能出现俩种问题:一种是 ...

  2. 用Emit技术替代反射

    之前在上篇博客说到用表达式来替代反射机制,可以获得较高的性能提升.这篇我们来说说用Emit技术来替代反射. System.Reflection.Emit命名空间类可用于动态发出Microsoft中间语 ...

  3. Python3 range()函数

    Python3 range() 函数用法  Python3 内置函数 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表. Pyth ...

  4. html块级元素与内联元素的区别

    1.  块级元素(block element): 概念理解:如果不用css控制,块级元素在文档流中以一行显示,及它所占的宽度为其父级元素所占的宽度,若超过宽度会重新另起一行显示,高度会随着内容高度的增 ...

  5. Angularjs学习笔记7_directive1

    1.基础知识 directive()接受两个参数 · name:字符串,指令的名字 · factory_function:函数,指令的行为 应用启动时,以name作为该应用的标识注册factory_f ...

  6. Spring 读取配置文件(二)

    Spring 读取配置文件并调用 bean package cn.com.test.receive; import org.springframework.beans.factory.annotati ...

  7. libevent源码学习_event_test

    对应的sample文件中提供了event_test.c,里面就是关于事件的简单示例,具体如下: /* * Compile with: * cc -I/usr/local/include -o even ...

  8. 内核并发管理---spin lock

    自旋锁最初是为了在smp系统上使用而设计. 1.在单处理器非抢占模式下,自旋锁不做任何事情. #ifdef CONFIG_PREEMPT_COUNT     //支持抢占模式 #define pree ...

  9. 进出口流程 & 报关单据

    出口流程 一. 委托人 1. 需找货运代理公司 2. 向代理公司询问价格 一般为 ALL IN 价格( 空运费+燃油费+战险费 ) 总费用 = ALL IN 价格 * ( 货物公斤数 ) ALL IN ...

  10. AV1视频编码标准资源汇总

    一直不看好HEVC,总觉得这东西绝对不可能再恢复像h264那么辉煌了,如此高昂的授权费,被淘汰估计也就这一两年了,有必要预研一下AV1,马上进去二进制码流冻结流程了,感觉aom越来越近了,毕竟goog ...