建树
模仿kruskal的过程,先将边权排序
依次遍历每条边
若该边连接的两个节点u和v不在一个并查集内
就新建一个结点node
该点点权为这条边的边权
找到u,v所在并查集的根 fufufu,fvfvfv
连边(node,fu)(n o d e , fu )(node,fu) (node,fv)( n o d e , fv)(node,fv)
并更新并查集fa[fu]=nodef a [ fu ] = n o d efa[fu]=node , fa[fv]=nodefa[fv]=nodefa[fv]=node
遍历完原图所有边后
我们建出来的必定是一棵树
也就是我们要的kruskal重构树
注意这棵树是以最后新建的结点为根的有根树
若原图不连通,即建出的是一个森林
那么就遍历每个节点,找到其并查集的根作为其所在树的根
性质
1.是一个小/大根堆 /
每个点对应子树里都是边长小于等于(/大于等于)它的点权的联通块 (由建树时边权的排序方式决定)
应用:求从u出发只经过边权不超过x的边能到达的结点
我们只要在求出边权升序排序的kuaskal重构树
找到树上深度最小的,点权不超过x的结点(一般用树上倍增)
那么它子树内的所有节点就是上述所求
2.LCA(u,v) 的权值是 原图 u到v路径上最大/小边权的最小/大值(由建树时边权的排序方式决定)
3.重构树中代表原树中的点的节点全是叶子节点,其余节点都代表了一条边的边权。