9.21 生成树

Posted venividivici

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.21 生成树相关的知识,希望对你有一定的参考价值。

题意

给定一颗边带权树,求出对于每一条边来说,在保证其出现在最小生成树上的同时,它可能具有的最大边权

若最大边权可以为无限大,输出\(10^9\)


解法

考试时暴力跳链跳了\(98pts\),啊哈哈

首先把最小生成树跑出来,对于每一个非树边,它的答案是其覆盖的树边的边权的最大值;因为这条非树边是可以代替其覆盖的树边中的任意一个的

而对于每一个树边来说,它的答案是所有覆盖它的非树边的边权的最小值,因为这样它既能保证其本身的权值最大又不至于被其他非树边所替代

我们把非树边按边权从小到大排序(实际上由于求的是最小生成树,可以没必要排序)

由于边权已经是从小到大了,所以一个边的答案会由更新它的第一条非树边确定

我们每次在更新完一条非树边覆盖的边的答案时,就用并查集把它们缩起来,避免下次重复遍历到答案已经确定的边;把并查集的根设为深度最小的点

之后的修改操作直接跳到该并查集的根,也就确定了第一个没有被修改的边

至于非树边的答案,倍增求一下即可

复杂度是\(O(N \log N)\)的(如果不管并查集的\(\alpha\)的话)


代码

以上是关于9.21 生成树的主要内容,如果未能解决你的问题,请参考以下文章

❤️数据结构入门❤️(3 - 4)- 最小生成树

-生成树的相关问题

如何画出最小生成树即最小支撑树?

图——最小生成树

图——生成树和最小生成树 (概念解析)

c语言最小生成树