克魯斯卡爾重構樹

2021-10-17 20:27:30 字數 634 閱讀 4645

克魯斯卡爾重構樹就是在用克魯斯卡爾演算法計算最小生成樹時,構造出一棵樹。當題目需要用到最小生成樹時,常常利用重構樹將其轉化為樹上問題。

重構過程:

在連線兩個點時,將其連向乙個新點,新點的點權為這條邊的邊權。並查集上就把這兩點的父親設為這個新點。

這樣我們就維護了一棵從底向上點權遞增的一棵二叉樹。這棵樹具有很多的性質,以解決不一樣的問題。

1.對於兩個點,他們之間最小路徑的最大值就在他們的lca上。

2.通過倍增,我們可以求得乙個點y在經過的權值不超過z能到達的所有點。倍增到那個點,那個點為根的子樹就都是可達的,這個利用了點權的單調性。

cin >> n >> m;

for(

int i =

1; i <= m; i++

) cin >> e[i]

.x >> e[i]

.y >> e[i]

.v;sort

(e+1

,e+1

+cnt)

;//按大小排序

int cntx = n;

for(

int i =

1; i <= cnt; i++)}

dfs(cntx,0)

;

克魯斯卡爾重構樹

處理給出無向圖,會出現重邊,共m條路徑,每條路徑有乙個困難值,q次詢問,求從點x出發只經過困難值小於等於v的路徑,求某個值。克魯斯卡爾重構樹的核心思想是,當新增最小生成樹的邊的時候,不在兩個點之間直接加邊,而是新建節點,讓邊的兩個節點分別成為它的左右兒子節點,然後這個新建的點,就成為整個聯通塊的代表...

克魯斯卡爾演算法

測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...

克魯斯卡爾演算法

設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...