資料結構演算法題/圖的生成樹:Prim演算法和Kruskal
阿新 • • 發佈:2018-11-19
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演算法