題目連結:
題目大意:
給定兩正整數 n 、 m (1 ≦ n ≦ 100, 000,1 ≦ m ≦ 200, 000),代表一個無向權重圖有 n 個節點以及 m 條邊。
接著的 m 列輸入,每列給定三正整數 i 、 j 、 c (0 ≦ i 、 j < n, c 為非負且可被 int 型態存取),代表其中一條邊連接 i 、 j 兩端點,權重值為 c 。
求此圖的最小生成樹。如果存在,輸出這棵樹的權重值之和;反之,輸出「-1」。
3 3
0 1 5
1 2 5
2 0 10
4 2
1 2 5
2 3 5
若不清楚最小生成樹的定義,可以先參考
維基頁面的說明。
以下介紹尋找最小生成樹的其中一個方法—— Kruskal 演算法:
首先,我們所有邊以權重值由小排到大,因此我們的邊也是從小挑到大。一開始這些邊先與節點們分開,然後我們邊就慢慢加回去。
如果碰到某一條邊加上去會形成一個環,也就是邊的兩端點之間已經連通了,因此這條邊就不該加上去。重複以上過程直到所有邊都探訪過了一次,或是圖已經連通了。
此時,即為最小生成樹(除非此時的圖尚未連通)。
而要檢查一條邊的兩端點是否已經連通,可以使用併查集。參見
這裡。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。