kruskal重构树
kruskal重构树
构造
做kruskal时,每次一条边若在生成树上会连,构建一个虚点,儿子为改边连接的两个点,点权为该边边权。
注意:此时要将该虚点设为当前union的根。
为方便后续查询,需要 dfs 或者直接扫一遍预处理lca。
性质
- 最终树的形态会变为 \(2n-1\) 个节点,\(n\) 个叶子的二叉树,且只有非叶子节点有权值。
注意:根据这点,部分数组要开两倍空间。
-
由1加上我们做kruskal排序的过程,若我们把边从小到大排序(下列几条均在此条件下),那么非叶子节点权值自上而下依次递减。
-
由1和2推出,图上任意两点简单路径最大边权最小值为两点在重构树上的lca。
-
由3延伸,到一个点的简单路径最大边权最小值在一定范围内 \([l,r]\) 的一定是重构树上某棵子树的所有叶子减去它的某棵子树的所有叶子。
-
若查询点权,可将边权赋值为 \(\max(a[u], a[v])\)。
-
每个点的权值是它子树最大的。
易错点
- 建完重构树可能是森林,也就是原图是不联通的。
- (未知错误)连接虚点时建议老老实实存边,否则可能会有奇奇怪怪的错误?
本文来自博客园,作者:xxcxu,转载请注明原文链接:https://www.cnblogs.com/Maraschino/articles/18100251