洛谷P4180

被教练安排讲题 可恶
这道题我是十月初上课时花了一下午作出来的,当时连倍增都不会,过程比较困难,如今看看还能够
原本想口胡一发,后来想了想可能之后要用,仍是写成文章吧算法

Description

求一棵严格次小生成树的权值和ip

Analysis

次小生成树,分为严格和不严格两种io

把不严格的次小生成树中权值与最小生成树相同的除去,剩下那个的就是严格次小生成树统计

因此考虑如何除去非严格部分就好了数据

Solution

既然要求次小生成树树严格小,那就能够维护一个最大值和一个次大值,保证次大值严格小于最大值时间

算法方面,使用 Kruskal 和 倍增生成

预先 DFS 处理这棵树的点深度,每一个点的父亲,最大值和次大值的初始值script

再使用倍增求出每一个点所能到达的最大值和次大值枚举

而后找出一颗最小生成树,统计它的权值和,并对于每条处于最小生成树中的边打一个标记文章

对于每条不在最小生成树中的边,找出与它相对的处于最小生成树中的最大的一条边,删去,而后一边跳一边枚举路径上的边权

而后判断当前枚举边与删去边的权值大小,若相同加入当前边的次大值,不然加入最大值,而后统计权值

最后把统计出的全部权值取一个最小值就是严格次小生成树的权值

正确性证实:

想将一条非树边加入生成树中,就必须删去它的始点终点到公共祖先路径上的一条边,不然就会构成环

想要使得生成的生成树严格小且尽量小,就必须使得删去的那条树边尽量大

对于每条枚举边,它的权值一定大于等于删去边,为了不次小生成树不严格,当等于时就只能加入其次大值,不然加入其最大值

对于全部边都进行此处理,得出权值和最小的一定是严格且最小的生成树

如此 本题便获得解决

Other Things

本题比较恶心,不要读完数据直接建图,不然会爆

肯定好生成树后,只建出一颗最小生成树便可

另外代码就不放了,到如今时间比较长了,写的也比较丑

但愿各位看懂了

相关文章
相关标签/搜索