为什么要学Kruskal重构树
有时候,题目让我们多次求一个图的两点路径上最小值最大/最大值最小是多少。这种时候,根据一个比较显然的结论,我们可以把问题搬到一颗最小/最大生成树里面去做。 这个时候,我们当然可以倍增来搞这个问题。但在这里,我想向大家引入一种新的数据结构,它是基于kruskal求生成树的算法改来的,因此被称为Kruskal重构树。
什么是Kruskal重构树
这张图可以一目了然的介绍Kruskal重构树: 图出自https://blog.csdn.net/wu_tongtong/article/details/77601523
怎么建Kruskal重构树
肥肠简单,我们在做Krusckal算法的时候,当我们要连边的时候,我们把这两个点连向一个新构建的点(在图中以方点表示),然后把这两个点的fa设为那个方点,方点的权值为这条边的权值,继续做Kruskal即可。 代码可能更优表现力:
1 | bool cmp(edge x,edge y) |
Kruskal重构树有什么性质
- 两个点在原图中的所有路径上某条路径中的最小值最大/最大值最小即为他们在Kruskal重构树上这两个点的LCA的权值
- 这是一个二叉树
- 树上权值满足堆的性质 (从我们构建过程中可以很简单的证明)
Kruskal重构树相关题目
1.BZOJ 3732 真*模板题 2.NOI2018 归程 相关性质的简单应用
注:肥肠感谢julao lbc的教学