原文連結:
http://www.wutianqi.com/?p=1284
<hr>
給定一個帶權的無向連通圖,如何選取一棵產生樹,使樹上所有邊上權的總和為最小,這叫最小產生樹.
求最小產生樹的演算法
(1) 克魯斯卡爾演算法
圖的存貯結構採用邊集數組,且權值相等的邊在數組中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間.
(2) 普裡姆演算法
圖的存貯結構採用鄰接矩陣.此方法是按各個頂點連通的步驟進行,需要用一個頂點集合,開始為空白集,以後將以連通的頂點陸續加入到集合中,全部頂點加入集合後就得到所需的最小產生樹 .
下面來具體講下:
克魯斯卡爾演算法
方法:將圖中邊按其權值由小到大的次序順序選取,若選邊後不形成迴路,則保留作為一條邊,若形成迴路則除去.依次選夠(n-1)條邊,即得最小產生樹.(n為頂點數)
第一步:由邊集數組選第一條邊
第二步:選第二條邊,即權值為2的邊
第三步:選第三條邊,即權值為3的邊
第四步:選第四條邊,即權值為4的邊
第五步:選第五條邊
普裡姆演算法
方法:從指定頂點開始將它加入集合中,然後將集合內的頂點與集合外的頂點所構成的所有邊中選取權值最小的一條邊作為產生樹的邊,並將集合外的那個頂點加入到集合中,表示該頂點已連通.再用集合內的頂點與集合外的頂點構成的邊中找最小的邊,並將相應的頂點加入集合中,如此下去直到全部頂點都加入到集合中,即得最小產生樹.
例在中從1點出發求出此圖的最小產生樹,並按產生樹的邊的順序將頂點與權值填入表中.
———————>先寫出其鄰接矩陣
第一步:從①開始,①進集合,用與集合外所有頂點能構成的邊中找最小權值的一條邊
①——②權6
①——③權1 -> 取①——③邊
①——④權5
第二步:③進集合,①,③與②,④,⑤,⑥構成的最小邊為
①——④權5
③——⑥權4 -> 取③——⑥邊
第三步:⑥進集合,①,③,⑥與②,④,⑤構成的各最小邊
①——②權6
③——②權5
⑥——④權2 -> 取⑥——④邊
第四步:④進集合,①,③,⑥,④與②,⑤構成的各最小邊
①——②權6
③——②權5 -> 取③——②邊
⑥——⑤權6
第四步:②進集合,①,③,⑥,②,④與⑤構成的各最小邊
②——⑤權3 -> 取②——⑤邊
這也是在網上找到的一個Kruskal和Prim構造過程圖,貼出來:
這題的模版我暫時沒找到好的。我覺得這題主要還是思想,當然,給一些題目來練習是必不可少的。
HDOJ 1233 還是暢通工程
HDOJ 1863 暢通工程
HDOJ 1879 繼續暢通工程
http://www.wutianqi.com/?p=1286
HDOJ 1102 Constructing Roads
http://www.wutianqi.com/?p=1313
HDOJ 1875 暢通工程再續
http://www.wutianqi.com/?p=1300