2、追捕

【题目背景】

Duan2baka:“jmsyzsfq天下第一蠢!”

jmsyzsfq:“你说什么?!”

【题目描述】

于是Duan2baka开始了逃亡的旅程,而jmsyzsfq也开始追捕Duan2baka。  他们来到了一个有n个节点的有向图,迅速逃跑的Duan2baka会首先降落在有向图的某个节点T上,因为怕发出声音,他会永远静止不动。而随后跟来的jmsyzsfq会降落在图上随机一个节点S上(可以与T相同),并可以沿着图中的有向边随意走动。因为jmsyzsfq有着敏锐的嗅觉而且绝顶聪明,他一定会沿着正确的方向寻找Duan2baka。你可以认为,如果图中存在一条合法的从S到T的路径,那么jmsyzsfq一定会抓到Duan2baka——因此jmsyzsfq能否追捕到Duan2baka在他刚刚降落在图上的时候就已经确定了。现在请你帮帮jmsyzsfq,在他降落前告诉他有多大的概率能够追捕到Duan2baka,并告诉他想要追到Duan2baka他可以降落在哪些节点上。

【输入格式】

输入第一行包含三个整数n,m,opt,表示图中有n个节点,m条有向边;opt为0或1,含义见输出格式所述。

输入第2至m+1行每行两个整数u,v描述了图中一条从u到v的有向边。

输入第m+2行一个整数T表示Duan2baka降落的位置。

【输出格式】

如果输入的opt为0,只需要输出jmsyzsfq能够追捕到Duan2baka的概率。

如果输入的opt为1,输出两行,第一行输出jmsyzsfq能够追捕到Duan2baka的概率;第二行按从小到大输出想要追到Duan2baka他可以降落的节点编号,编号间用空格隔开。

对于jmsyzsfq能够追捕到Duan2baka的概率,是一个既约分数,形如“a/b”(a,b为整数),使gcd(a,b)=1,如果a=b,输出1/1。

【样例1输入】

9 10 1

1 2

2 1

2 4

6 1

9 6

6 5

5 3

3 7

3 1

1 8

1

【样例1输出】

2/3

1 2 3 5 6 9

【样例1解释】

图中共9个节点,能够到达节点S=1的节点共6个:{1,2,3,5,6,9}。所以能够追捕到Duan2baka的概率为6/9=2/3。

【样例2输入】

5 7 1

1 2

1 3

1 5

2 4

4 1

4 5

5 3

1

【样例2输出】

3/5

1 2 4

【数据范围与约定】

opt=0和opt=1的数据各50%。

对于opt=0和opt=1的情况,有着完全相同的子任务:

对于10%的数据,n,m≤100。

对于另外30%的数据,n,m≤100,000。

对于另外10%的数据,保证图是一个完全图,即对于任意两个点u和v,必然有两条有向边u→v和v→u。

对于另外20%的数据,保证图是一个有向无环图,即对于任意一个点x,不存在图上一条路径从x经过其它点后回到x。

对于另外20%的数据,保证如果图上存在一条边u→v,一定存在一条边v→u。

对于100%的数据,n,m≤1,000,000,保证数据合法且不存在重边、自环。

思路:

有大佬广搜秒切

本蒟蒻表示想复杂了

我先用tarjan缩了一遍点,然后建反图

因为求可达他的点,就是求他可达的点

然后dfs扫一遍就好了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
using namespace std;
int low[],dfn[],sta[],tot,bnt;
int top,n,m,head[],color[],opt,cnt;
int vis[],pl,bj[];
struct ljb{
int to,nxt;
}x[];
struct cb{
int from,to;
}y[];
inline void add(int from,int to)
{
bnt++;
x[bnt].to=to;
x[bnt].nxt=head[from];
head[from]=bnt;
}
void tarjan(int wz)
{
cnt++;
low[wz]=cnt;
dfn[wz]=cnt;
top++;
sta[top]=wz;
vis[wz]=;
for(rii=head[wz];i!=;i=x[i].nxt)
{
int ltt=x[i].to;
if(dfn[ltt]==)
{
tarjan(ltt);
low[wz]=min(low[wz],low[ltt]);
}
else
{
if(vis[ltt]!=)
{
low[wz]=min(low[wz],dfn[ltt]);
}
}
}
if(low[wz]==dfn[wz])
{
tot++;
while(sta[top+]!=wz)
{
color[sta[top]]=tot;
vis[sta[top]]=;
top--;
}
}
}
void dfs(int wz)
{
bj[wz]=;
for(rii=head[wz];i!=;i=x[i].nxt)
{
int ltt=x[i].to;
if(bj[ltt]==)
{
dfs(ltt);
}
}
}
int main()
{
freopen("hunt.in","r",stdin);
freopen("hunt.out","w",stdout);
scanf("%d%d%d",&n,&m,&opt);
for(rii=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
y[i].from=from;
y[i].to=to;
add(from,to);
}
for(rii=;i<=n;i++)
{
if(dfn[i]==)
{
tarjan(i);
}
}
memset(x,,sizeof(x));
memset(head,,sizeof(head));
bnt=;
for(rii=;i<=m;i++)
{
int from=y[i].from;
int to=y[i].to;
if(color[from]!=color[to])
{
add(color[to],color[from]);
}
}
scanf("%d",&pl);
dfs(color[pl]);
int cnt=;
for(rii=;i<=n;i++)
{
if(bj[color[i]]==)
{
cnt++;
}
}
int gc=__gcd(cnt,n);
cout<<cnt/gc<<"/"<<n/gc<<endl;
if(opt==)
{
for(rii=;i<=n;i++)
{
if(bj[color[i]]==)
{
printf("%d ",i);
}
}
}
}

(其实不缩点也完全可以)

20181029NOIP模拟赛T2的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180530模拟赛T2——绀碧之棺

    题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...

  5. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  6. 2019.11.11 模拟赛 T2 乘积求和

    昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...

  7. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  8. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  9. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

随机推荐

  1. JavaEE中表现层、持久层、业务层的职责分析(转载)

    表现层.持久层.业务层 注:本文转载于:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html 为了实现web层(struts)和持 ...

  2. [小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位

    无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元 ...

  3. 08_Redis持久化——RDB方式

    [简述] 持久化:Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据,这一过程就是持久化. Redis支持两种方式的持久化,简单来说如下: RDB方式:会根据指定 ...

  4. 【阿里云产品公测】OpenSearch初体验

    OpenSearch是一个非常有意义的功能,对于很多数据量较大的站点, SF2<   如果搜索功能自己做的话,或者用数据库里的查询语句,首先效率低下,而且占用资源. ); <Le6   另 ...

  5. 【Udacity】数据的差异性:值域、IQR、方差和标准差

    一.值域(Range) Range = Max - Min 受异常值(Outliers)影响 二.四分位差(IQR) 四分位距(interquartile range, IQR),又称四分差.是描述统 ...

  6. Scrum团队开发

    Scrum学习心得 什么是scrum Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scrum主 ...

  7. wpf 转型 android开发总结

    今年马上就要过去了,这一年中我经历了从wpf转型到qt/qml,然后最近又要开始搞android,从我个人的经验来看不论是qml还是android从框架和设计上都跟wpf类似,并且移动端的设计因为很多 ...

  8. Oracle案例07——ORA-28000: the account is locked

    遇到这个错误,一般我们想到的是数据库用户被锁,只需要执行用户解锁即可恢复,但这里之所以写出来是因为比较奇葩的一个问题. 昨天下午接同事信息,说一个用户连接报被锁,经过沟通发现其实连接一个ADG的备库作 ...

  9. Hadoop学习---Ubuntu中hadoop完全分布式安装教程

    软件版本 Hadoop版本号:hadoop-2.6.0-cdh5.7.0: VMWare版本号:VMware 9或10 Linux系统:CentOS 6.4-6.5 或Ubuntu版本号:ubuntu ...

  10. 设置C++ cout输出精度

    cout.precision(5); 数字表示小数点位数 // modify precision #include <iostream> // std::cout, std::ios in ...