题意:
在一个DAG中,求删除一个点后的最长路的最小值,输出删去的点及最小值。N<=1e5, M<=5e5
测试得分:0
题解:
我的图论果然是太渣了,测试的时候连暴力的不会打啊。。。
首先考虑暴力,枚举删去的点,那么问题来了:如何在删去后找到整张图的最长路呢?(图论实在烂的我在测试时选择枚举每一个点跑spfa,然后发现连最小的部分分都可能会T,就弃了)然而当时根本不会利用这题的一个重要条件:DAG。由DAG想到什么呢,应该意识到它能做拓扑排序啊!(再次表示自己的图论简直。。。)对每一个联通块拓扑排序后,拓扑的深度最大值即为最长路(明明如此显然,别人轻易拿到的60分就这样没了)。
接着考虑正解,考虑还是枚举每一个点(因为求最值、统计答案都是难以避免这样的),目标就是将查找最长路的效率优化到log以内,显然还是按照原来的枚举顺序,是不可行的。考虑删掉一个点可以看作是将拓扑图分为两个拓扑图,且前一个向后一个有一些连边,那么对于这个新图,我们要考虑的就是两个拓扑图内分别的最长路及那些连边的贡献(贡献就是u,v在两个图中的深度和加1)。这样的话,两个拓扑图内点的深度可以预处理出来(即正向和反向),那么我们要安排一种删点的顺序,使得每次删完后改变的东西总和不超过n,m级别且能够维护,使得后面的操作也是如此。发现按拓扑图的顺序删点,每次将该点的正向深度与入边的影响删去,且加上反向深度与出边的影响,可以维护执行的修改,且这样对于后面的点,也相当于奠定了基础,后面的点也执行同样的操作,即可维持分成两个拓扑图及一些连边的状态,这与删去每个点的影响是相符的。单点修改、区间查询用数据结构容易维护(权值线段树等)。
综上, 是时候好好补一补图论了,不然联赛真的像这样就凉了。。。