1. 程式人生 > >資料結構演算法題/圖的生成樹:Prim演算法和Kruskal

資料結構演算法題/圖的生成樹:Prim演算法和Kruskal

1. 生成樹

在一個任意連通圖G中,如果取它的全部頂點和一部分邊構成一個子圖G',即:V(G')=V(G)和E(G')⊆E(G)

若同時滿足邊集E(G')中的所有邊既能夠使全部頂點連通而又不形成任何迴路,則稱子圖G'是原圖G的一棵生成樹

連通圖是n個點n-1條邊。 在圖G的一棵生成樹G'中,若再增加一條邊,就會出現一條迴路。這是因為此邊的兩個端點已連通,再加入此邊後,這兩個端點間有兩條路徑,因此就形成了一條迴路,子圖G'也就不再是生成樹了。同樣,若從生成樹G'中刪去一條邊,就使得G'變為非連通圖。這是因為此邊的兩個端點是靠此邊唯一連通的,刪除此邊後,必定使這兩個端點分屬於兩個連通分量中,使G'變成了具有兩個兩通分量的非連通圖。

所以生成樹滿足以下條件:
(1)V(G')=V(G)和E(G')⊆E(G)

(2)G'聯通的

(3)G'沒有迴路

生成樹的性質:

(1)G'中有n-1條邊

(2)生成樹不唯一

2. 最小生成樹Minimum Spanning Tree(MST)

最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹

3 實現方法

求圖的最小生成樹的方法(演算法)主要有兩個:

(1)普里姆演算法:斷集法,子樹生長法

(2)克魯斯卡爾演算法:避圈法,短邊優先法

主要可以使用Prim和Kruskal演算法實現,對於稀疏圖來說,用Kruskal效率更高加上並查集可對其進行優化。

4 Kruskal

基本思路是:

先構造一個只有n個節點的子圖T。

然後從權值最小的邊Ei依次選取,如果新增Ei到T中不產生迴路則在T中新增這條邊。

如此重複直到新增到n-1條邊為止。

 

5 Prim演算法