前言
Kruskal\tt KruskalKruskal重构数,吼啊!
作者在血淋淋的经历中知道了一个道理,没有人能保证自己做出所有黄题。
当然这和此文章无关。
正文
Kruskal\tt KruskalKruskal 重构树,顾名思义,重构 Kruskal\tt KruskalKruskal 算法求出的最小生成树,比如我们有原图:
那么轻易可得出在 Kruskal\tt KruskalKruskal 算法下的最小生成树(因为 Prim\tt PrimPrim 算法和 Kruskal\tt KruskalKruskal 算法下的最小生成树有可能是不同的!):
此时呢,我们根据边权按照 从小到大 的顺序,以边权作为权值建立新节点,以原边连接的左右两点作为左右儿子,看不懂?那我们来试一下!首先是第一次选择,可以发现目前边权最小值是 111,所以我们选择 (3,2)(3,2)(3,2) 这对点:
注意 P(1)\tt{P}(1)P(1) 以 111 为权值的点,此时我们继续进行,可以发现目前的最小权值还是 111 且对应两点为 (2,5)(2,5)(2,5) 此时问题来了,两点有重合点 222 那该怎么办?简单,我们只需要把新建的节点作为 (P)(1)\tt(P)(1)(P)(1) 的父亲即可,于是就有了:
以这种方法一直下去,就可以得到最后的重构树:
此时,聪明的孩子就会说,这个东西有什么用啊,好问题,这玩意用处巨大!他有一个牛逼的性质:
- 图上任意两点 x,yx,yx,y 之间经过边的权值的最小值 === Kruskal\tt KruskalKruskal 最小生成树上的 x,yx,yx,y 路径上的最小值 === Kruskal\tt KruskalKruskal 重构树上 lca(x,y)\tt{lca}(x,y)lca(x,y)。
- 最大值同理。
这个性质给我们做题带来了巨大便利!