\(Kruskal\) 重構樹
解決的基本問題:一張圖中 \(u\) 到 \(v\) 路徑上最大邊的最小值。
構建:在從小到大加邊的過程中,如果 \(u\), \(v\) 不在一個並查集中,就建立一個新的節點 \(X\),並將 \(fu\) 和 \(fv\) 分別作為 \(X\) 的左右兒子, \(X\) 的點權就是這條邊的邊權。這樣樹,我們稱為 \(Kruskal\) 重構樹。
\(Kruskal\) 重構樹有如下重要性質:
- \(Kruskal\) 重構樹是一顆二叉樹。
- 兩點 \(u\) 和 $v $ 的最近公共祖先 $ LCA(u,v)$ 的點權為原圖中從 $u $ 到 \(v\) 滿足最大邊最小的路徑上的邊的最大值。
- 任意點的權值大於左右兒子的權值,是一個大根堆(若邊權從大到小排序,則為小根堆)。
- \(Kruskal\) 重構樹整棵樹的根就是最後所建的結點。
- 若原圖不連通,即建出的是一個森林,那麼就遍歷每個節點,找到其並查集的根作為其所在樹的根。
SOJ - Network:重構樹板子
SOJ - 神奇的花園:重構樹+啟發式合併