kruskal重構樹是一個比較冷門的數據結構。
其實可以看做一種最小生成樹的表現形式。
在普通的kruskal中,如果一條邊連接了在2個不同集合中的點的話,我們將合並這2個點所在集合。
而在kruskal重構樹中,如果一條邊連接了在2個不同集合中的點,我們將新建一個節點出來,並用這個新節點作為一個中轉連接這2個集合。
如圖就是一棵kruskal重構樹,方點表示新建出的節點,圓點是原圖中的點,方點點權即邊權。
這樣建出的樹會有一些美妙的性質,例如往上走點權是遞增的,原圖中的每個點都是葉子節點等。
當然一個更重要的是,如果我們要在最小生成樹上求一些東西,這些建出的方點可以給我們提供方向。
原因就是我們每次都將新建的節點作為父親,那么這些節點將會引導每個原圖中的節點一步步向上,從而形成一個有根樹,而且由於每個點被新建出的順序將直接決定它的深度等信息,這棵樹會有很多奇妙的性質。
例如我們可以一直向上走,找到某個節點使得這個節點即以下的點都滿足點權小於k,這樣我們就可以篩選出滿足互相到達不會經過超過k的權值的邊的點對。
當然也可以有別的用法,於是我們就可以快速的篩選出最小生成樹上滿足具有某些性質的節點。
同時kruskal重構樹也將平時隱藏在並查集里的一些關系提出來放在了樹里,因此也可以看做kruskal重構樹其實是維護了一個類似並查集的關系