BZOJ 3832 [Poi2014] Rally 拓扑排序

博客探讨了在有向无环图(DAG)中如何找到删除一个节点后使得最长路径最小的问题。首先介绍了不删除节点时,通过构建超级源S和超级汇T求解最长链的方法。接着,讨论了删除节点后,如何快速更新最长链,利用每个节点到S和T的最长距离预处理,并维护割集的概念,通过拓扑排序动态维护S集和T集。最终,利用堆或权值线段树维护最值,确保求得正确答案。在实际实现时需要注意边长度的处理。
摘要由CSDN通过智能技术生成

题目大意:给出一个DAG,要求删掉一个点之后使最长路最小,求删掉的点和最长路长度。

给出题人跪了orz

先考虑不删点的情况。想求一个图的最长链,在DAG应尝试DP,但起点、终点都不能固定,怎么转化呢?既然会求固定起点与终点的最长链,就强制固定一个点让其在此开始或结束,因此想到设置一个超级源S与超级汇T,求S到T的最长链后减2即为答案1

下面考虑删除点。枚举每一个点将其删除,求得图中最长链,就要想办法快速地维护删点以后图的最长链。
感觉这里真的好神啊…可以预处理出每一个点到S、T的最长距离,那么每一条边的起点到S的最长距离与终点到T的最长距离都已知。这样就可以用一条边赋上权值来表示经过这条边的最长路,这样就可以用若干条边中最大的来表示出图中的最长路。要怎么选取边才能保证这些边代表的最长路包含图中的最长路呢?

当图中从起点到终点的所有路径都要经过选取的边时,经过这些边的最长路中就一定包含图中的最长路,也就是说最长路即图的一个割集中边权的最大值。
为了维护割集可以维护两个集合:S集和T集2。按照拓扑序删点。初始状态下,将S点视为已经删除,可以从图中任一点出发到达T,即所有点处于T集中。然后,将拓扑序的下一个点,从T集中删掉,就是把这个点的所有入边以及这个点到T的最长路删掉,此时的最大值就是删掉这个点的答案,再将这个点加入S集,就是把这个点的所有出边以及S到这个点的最长路加进去,表示把这个点重新加回来。
动态维护一些值的最值可以使用堆或是权值线段树。

#include <cstdio>
#include <cstring>
#include <queue>
#define Max(a,b) (a>b?a:b)
#define N 1001005
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值