最小生成樹、Prim算法以及Kruskal算法

 最小生成樹:

           最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹。最小生成樹其實是最小權重生成樹的簡稱。

       一個連通圖可能有多個生成樹。當圖中的邊具有權值時,總會有一個生成樹的邊的權值之和小於或者等於其它生成樹的邊的權值之和。廣義上而言,對於非連通無向圖來說,它的每一連通分量同樣有最小生成樹。

       以有線電視電纜的架設爲例,若只能沿着街道佈線,則以街道爲邊,而路口爲頂點,其中必然有一最小生成樹能使佈線成本最低。簡單點說有幾個城市你要設計一個路線,這個路線能走完所有的這幾個城市,而且路程最短,這個路線就是最小生成樹的含義。

       最小生成樹中邊的條數爲(V爲頂點數),最小生成樹是一棵沒有迴路的樹,而且是包含圖的所有頂點的最小的樹。


(a) 無向圖


(b) G 的最小生成樹

Prim算法:

       普里姆算法(Prim算法),圖論中的一種算法,可在加權連通圖裏搜索最小生成樹。即由此算法搜索到的邊子集所構成的樹中,不但包含了連通圖的所有頂點,且其所有邊的權值之和亦爲最小。

算法簡單描述:

1).輸入:一個加權連通圖,其中頂點集合爲V,邊集合爲E;

2).初始化:Vnew = {x},其中x爲集合V中的任一節點(起始點),Enew = {},爲空;

3).重複下列操作,直到Vnew = V:

a.在集合E中選取權值最小的邊<u, v>,其中u爲集合Vnew中的元素,而v不在Vnew集合當中,並且v∈V(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);

b.將v加入集合Vnew中,將<u, v>邊加入集合Enew中;

4).輸出:使用集合Vnew和Enew來描述所得到的最小生成樹。

根據上面的無向圖G,由Prim算法得到最小生成樹的過程如下:



Kruskal算法:

       Prim算法解決的問題相同,都是尋找最小生成樹的算法。但Kruskal算法是按照邊的權重順序(從小到大)將邊加入生成樹中,但是若加入該邊會與生成樹形成環則不加入該邊。直到樹中含有V-1條邊爲止。這些邊組成的就是該圖的最小生成樹。

算法簡單描述:

1).記Graph中有v個頂點,e個邊

2).新建圖Graphnew,Graphnew中擁有原圖中相同的e個頂點,但沒有邊

3).將原圖Graph中所有e個邊按權值從小到大排序

4).循環:從權值最小的邊開始遍歷每條邊直至圖Graph中所有的節點都在同一個連通分量中

if這條邊連接的兩個節點於圖Graphnew中不在同一個連通分量中

添加這條邊到圖Graphnew
根據上面的無向圖G,由Kruskal算法得到最小生成樹的過程如下:






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章