[CSP-S模拟测试]:轰炸行动(bomb)(塔尖+拓扑排序+语文)
题目描述
战狂也在玩《魔方王国》。他只会征兵而不会建城市,因此他决定对小奇的城市进行轰炸。
小奇有n座城市,城市之间建立了$m$条有向的地下通道。战狂会发起若干轮轰炸,每轮可以轰炸任意多个城市。
每座城市里都有战狂部署的间谍,在城市遭遇轰炸时,它们会通过地下通道撤离至其它城市。非常不幸的是,在地道里无法得知其它城市是否被轰炸,如果存在两个不同的城市$i$,$j$,它们在同一轮被轰炸,并且可以通过地道从城市$i$到达城市$j$,那么城市$i$的间谍可能因为撤离到城市$j$而被炸死。为了避免这一情况,战狂不会在同一轮轰炸城市$i$和城市$j$。
你需要求出战狂最少需要多少轮可以对每座城市都进行至少一次轰炸。
输入格式
第一行两个整数$n$,$m$。接下来$m$行每行两个整数$a$,$b$表示一条从$a$连向$b$的单向边。
输出格式
一行一个整数表示答案。
样例
样例输入1:
5 4
1 2
2 3
3 1
4 5
样例输出1:
3
样例输入2:
10 10
3 4
5 4
7 1
6 5
6 4
7 4
1 7
5 8
1 2
9 10
样例输出2:
3
数据范围与提示
对于20%的数据,$n,m\leqslant 10$。
对于40%的数据,$n,m\leqslant 1,000$。
对于另外30%的数据,保证无环。
对于100%的数据,$n,m\leqslant 1,000,000$。
题解
这显然是一道语文题,那么我先来解释一下题意。
这道题所说的不能同时炸的两座城市当且仅当城市$i$能到达城市$j$,或城市$j$能到达城市$i$,而不是说城市$i$有一条边能直接指向城市$j$,反之同理。
如下图中,点$1$虽不能直接到达点$4$和$5$,但是可以通过点$2$间接到达点$4$和$5$,所以这张图需要炸$5$次,而不是$3$次。

回归到这道题,首先,你可能会想到拓扑排序,用拓扑排序分层,一共有几层就需要炸几次。
那么问题来了,这道题会出现有环的情况,当然是塔尖啦,可以知道,一个环只能一个一个炸,不可能有两个可以一起炸,那么我们在缩环的时候记录一下环的大小即可。
题是简单题,语文不好才是硬伤。
再次印证了那句话:得语文者得$OI$,得语文者得天下!
时间复杂度:$\Theta(n+m)$。
期望的分:$100$分。
实际的分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[2000001],wzc[20000001];
int head[1000001],headw[1000001],cnt,cntw;
int n,m;
int dfn[1000001],low[1000001],sta[1000001],ins[1000001],c[1000001],d[1000001],size[1000001],num,top,tot;
queue<pair<int,int> > q;
int ans;
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void add_w(int x,int y)
{
wzc[++cntw].nxt=headw[x];
wzc[cntw].to=y;
headw[x]=cntw;
}
void tarjan(int x)//缩点
{
dfn[x]=low[x]=++num;
sta[++top]=x;
ins[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if(ins[e[i].to])
low[x]=min(low[x],dfn[e[i].to]);
}
if(dfn[x]==low[x])
{
tot++;
int y;
do
{
y=sta[top--];
ins[y]=0;
c[y]=tot;
size[tot]++;//记录环的大小
}while(x!=y);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int x=1;x<=n;x++)
for(int i=head[x];i;i=e[i].nxt)
if(c[x]!=c[e[i].to])
{
add_w(c[x],c[e[i].to]);//建新图
d[c[e[i].to]]++;
}
for(int i=1;i<=tot;i++)
if(!d[i])
q.push(make_pair(i,1));
while(q.size())//拓扑排序
{
pair<int,int> flag=q.front();
q.pop();
ans=max(ans,flag.second);
if(!--size[flag.first])//跑出了环
{
for(int i=headw[flag.first];i;i=wzc[i].nxt)
{
d[wzc[i].to]--;
if(!d[wzc[i].to])
q.push(make_pair(wzc[i].to,flag.second+1));
}
}
else q.push(make_pair(flag.first,flag.second+1));//注意环的大小
}
cout<<ans<<endl;
return 0;
}
rp++
[CSP-S模拟测试]:轰炸行动(bomb)(塔尖+拓扑排序+语文)的更多相关文章
- [CSP-S模拟测试]:Permutation(线段树+拓扑排序+贪心)
		题目描述 你有一个长度为$n$的排列$P$与一个正整数$K$你可以进行如下操作若干次使得排列的字典序尽量小对于两个满足$|i−j|\geqslant K$且$|P_i−P_j|=1$的下标$i$与$j ... 
- 2019.8.9 NOIP模拟测试15 反思总结
		日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ... 
- Android单元测试与模拟测试详解
		测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ... 
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
		目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ... 
- 安装nginx python uwsgi环境 以及模拟测试
		uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ... 
- 利用Python中的mock库对Python代码进行模拟测试
		这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ... 
- 转 C#实现PID控制的模拟测试和曲线绘图
		C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ... 
- Mockito:一个强大的用于Java开发的模拟测试框架
		https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ... 
- NOIP模拟测试1(2017081501)
		好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ... 
随机推荐
- centos  6.5 升级openssh-7.5
			1.环境 2.安装telnet 服务,防止ssh升级之后登陆不上服务器,使用telnet 连接服务器 yum install telnet-server -y chkconfig telnet on ... 
- 前端004/React常用UI组件
			每天进步一点点〜 Ant Design of React //蚂蚁金服设计平台.需要应用何种类型组件可参考API React + mobx + nornj 开发模式文件说明: [1].A.t.html ... 
- SpringBoot使用RestTemplate
			SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 设置pom引用 <?xml v ... 
- org.apache.ibatis.exceptions.PersistenceException:  ### Error querying database.  Cause: java.lang.NumberFormatException: For input string: "W%" ### Cause: java.lang.NumberFormatException: For input s
			一个常见的myBatis xml文件中的引号错误: org.apache.ibatis.exceptions.PersistenceException: ### Error querying data ... 
- [BZOJ2829] 信用卡 (凸包)
			[BZOJ2829] 信用卡 (凸包) 题面 信用卡是一个矩形,唯四个角做了圆滑处理,使他们都是与矩形两边相切的1/4园,如下图所示,现在平面上有一些规格相同的信用卡,试求其凸包的周长.注意凸包未必是 ... 
- Latex--入门系列二
			Latex 专业的参考 tex对于论文写作或者其他的一些需要拍版的写作来说,还是非常有意义的.我在网上看到这个对于Latex的入门介绍还是比较全面的,Arbitrary reference.所以将会翻 ... 
- 深入JavaScript之获取cookie以及删除cookie
			cookie存在哪? 存在document.cookie中 ookie长啥样? cookie是一个字符串,长下面这样:“name=xxx; age=22;” 注意:分号后面有个空格,记住这一点,下面的 ... 
- Ubuntu Anaconda3 环境下安装caffe
			安装Python环境 本人环境为Anaconda3 ,可参照 https://blog.csdn.net/ctwy291314/article/details/86571198 完成安装Python2 ... 
- 【转载】JDK8 特性 stream(),lambda表达式,
			Stream()表达式 虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同: 无存储.stream不是一种数据结构 ... 
- 本地主机访问远程linux系统服务器上的jupyter notebook
			1,机器情况:服务器 centos python环境已经配置好了,在虚拟环境下安装了anaconda 并且在里面安装了jupyter notebook 2,主机是 windows ipytho ... 
