轰炸行动(bomb):tarjan,拓扑排序
考场上看错题,没什么好说的。
然而它就是一个大板子。
发的题解勉强还能看。但是我还想再讲讲。
题目的表述是,如果从A能直接或间接到B,那么就不能同时轰炸A和B。
那么我们从图里随便拽出一条有向路径,从这条路径中随意挑2个点AB,那么要么能从A到B要么从B到A
那么你任意挑出的这两个点只要不是同一个点那么就不能同时轰炸。
带下划线的那一段有什么用呢?它的正确性是显然的。
我所说的“有向路径”没有加任何附加限制,所以可以包括环,环上转几圈就可能出现同一个点呗。
我们考虑单纯的一个环。那么它上的每一个都要单独炸一次。
再考虑单纯的一条路径,那么路径上的每一个点也需要单独炸一次。
如果一个路径进入了一个环,那么这上面的点也必须单独炸一次(路径上的点可以到达环上的任意点)。
如果一个环引出了一个路径,那么环上的点亦可到路径上,都要单独炸一次。
综上,就是要找出一条路径使它上面的不同的点尽量多,不同的点的个数即为答案。
上面那一堆话里已经包括了这个意思:环上的每个点都会给路径长度增加1,且对联通性没有影响。
所以考虑tarjan缩完强联通分量后就没有环了,只不过环变成了权值等于环中点数的一个大点而已
其余普通点的权值为1。现在的问题就变成了在一个DAG里找一条路径使它上面的点权和最大。
不能dfs,因为这是有向的DAG,虽然不是环但也不是树,它可以长得很恶心。

在这个恶心图里面跑dfs就会多次重复地经过3和3下面的点导致大量浪费。
可以倒着搜加个记忆化什么的,然而一个拓扑排序会更方便一些。
#include<bits/stdc++.h>
using namespace std;
map<int,int>mm;
int n,m,fir[],l[],to[],cnt=,dfn[],low[];
int _fir[],_l[],_to[],_cnt,w[],in[];
int sta[],ins[],tim,top,bl[],cnt_scc,ans,dis[];
int q[],t;
void connect(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
void _connect(int a,int b){_l[++_cnt]=_fir[a];_fir[a]=_cnt;_to[_cnt]=b;in[b]++;}
void tarjan(int p){
dfn[p]=low[p]=++tim;sta[++top]=p;ins[p]=;
for(int i=fir[p];i;i=l[i])
if(!dfn[to[i]])tarjan(to[i]),low[p]=min(low[p],low[to[i]]);
else if(ins[to[i]])low[p]=min(low[p],low[to[i]]);
if(dfn[p]==low[p]){
w[++cnt_scc]++;
while(sta[top]!=p)ins[sta[top]]=,bl[sta[top--]]=cnt_scc,w[cnt_scc]++;
top--;bl[p]=cnt_scc;ins[p]=;
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=,a,b;i<=m;++i)scanf("%d%d",&a,&b),connect(a,b);
for(int i=;i<=n;++i)if(!dfn[i])tarjan(i);
for(int i=;i<=n;++i)for(int j=fir[i];j;j=l[j])
if(bl[i]!=bl[to[j]])_connect(bl[i],bl[to[j]]);
for(int i=;i<=cnt_scc;++i)if(!in[i])q[++t]=i;
for(int h=;h<=t;++h){
int dt=dis[q[h]]+w[q[h]];ans=max(ans,dt);
for(int i=_fir[q[h]];i;i=_l[i]){
in[_to[i]]--;dis[_to[i]]=max(dis[_to[i]],dt);
if(!in[_to[i]])q[++t]=_to[i];
}
}
printf("%d\n",ans);
}
码量其实也不大
轰炸行动(bomb):tarjan,拓扑排序的更多相关文章
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图
https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...
- bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 【BZOJ2707】[SDOI2012]走迷宫 Tarjan+拓扑排序+高斯消元+期望
[BZOJ2707][SDOI2012]走迷宫 Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,M ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...
随机推荐
- day 19作业
目录 今日作业: 今日作业: 1.什么是对象?什么是类? 答:对象是特征与技能的集合体,类是一系列对象相同的特征与技能的结合体 2.绑定方法的有什么特点 答:由对象来调用称之为对象的绑定方法,不同的对 ...
- python编程基础之十二
列表:一种有序的集合,可以同时存储多个数据,列表元素可修改,属于可变序列 创建列表: 列表名 = [列表选项一,列表选项二,列表选项三,......] list1 = [] list2 = [10,2 ...
- Vue-CLI项目-vue-cookie与vue-cookies处理cookie
08.31自我总结 Vue-CLI项目-vue-cookie与vue-cookies处理cookie vue-cookie 一.模块的安装 npm install vue-cookie --save ...
- PowerUp攻击模块实战
PowerUp攻击模块实战 1.将PowerUp.ps1脚本上传至目标服务器,然后在本地执行 2.使用IEX在内存中加载此脚本,执行以下命令,脚本将进行所有的检查. powershell.exe ...
- PowerSploit-CodeExecution(代码执行)脚本渗透实战
首先介绍一下国外大牛制作的Powershell渗透工具PowerSploit,上面有很多powershell攻击脚本,它们主要被用来渗透中的信息侦察.权限提升.权限维持. 项目地址:https://g ...
- [NOIp2009] luogu P1071 潜伏者
翘课间操和体育课来水博客. 题目描述 CCF的题面贼长,但貌似除了背景以外,每句话都删不掉.不写啦,反正也是Ctrl C的. Solution 显然这是一道码农题. #include<cstdi ...
- [JZOJ5817] 【NOIP提高A组模拟2018.8.15】 抄代码
Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...
- 初识AutoIt
1.定义 AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组 ...
- VoodooPad Mac笔记本
VoodooPad Mac笔记本 VoodooPad是记录您的笔记和想法的地方.想法,图片,列表,密码和妈妈的苹果派食谱.包括您需要跟踪和组织的所有内容,VoodooPad会与您一起成长而不会妨碍您. ...
- 16.Linux yum扩展
1.列出yum源可用的软件仓库 [root@yinwucheng ~]# yum repolist [root@yinwucheng ~]# yum repolist all 查看所有的仓库 ``` ...