BZOJ3732-Network
给定一个无向图,求图中A点到B点的所有路径中,最长边的最小值
思路
可以直接求出最小生成树,答案即为a到b路径上的最小边权,用LCA 求解。
此处采用Kruskal重构树求解。
Kruskal重构树
在Kruskal算法中,当找到两个不属于同一集合的联通块(子树)时,我们直接用边将两联通块相连,从而构建出最小生成树。
在Kruskal重构树中,对于两个不属于同一集合的联通块,我们首先建立一个虚点,作为两个子树的父节点,让两个子树的根节点与虚点相连,即可构造Kruskal重构树。虚点的点权即为原边的边权。
通过这一性质,我们成功将最小生成树上的路径信息转化成了点权信息。
解法
Kruskal重构树的构建过程如下:
将边对于边权从小到大进行排序;
遍历边集,用并查集维护两点的连通性,若祖先不相同,则建立一个权值为边权的节点,其左右儿子分别为两个点的祖先节点,并将当前点设为两联通块的根节点;
对于构建完成的Kruskal重构树,对u,v求其LCA的点权即为所求解。
代码
1 |
|