切換
舊版
前往
大廳
主題

ZeroJudge - a129: 最小生成樹 解題心得

Not In My Back Yard | 2019-04-03 12:13:13 | 巴幣 0 | 人氣 686

題目連結:


題目大意:
給定兩正整數 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


範例輸出:
10
-1


解題思維:
若不清楚最小生成樹的定義,可以先參考維基頁面的說明。

以下介紹尋找最小生成樹的其中一個方法—— Kruskal 演算法:
首先,我們所有邊以權重值由小排到大,因此我們的邊也是從小挑到大。一開始這些邊先與節點們分開,然後我們邊就慢慢加回去。

如果碰到某一條邊加上去會形成一個環,也就是邊的兩端點之間已經連通了,因此這條邊就不該加上去。重複以上過程直到所有邊都探訪過了一次,或是圖已經連通了。

此時,即為最小生成樹(除非此時的圖尚未連通)。


而要檢查一條邊的兩端點是否已經連通,可以使用併查集。參見這裡

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作