五 最小生成樹之Kruskal和Prim

2021-06-07 04:02:58 字數 1699 閱讀 9221

1.演算法介紹

在實際問題中常常要遇到佈線和租用的優化情況,在保持連通的情況下達到最小成本。這就是最小生成樹(minimum spanning tree)或最優樹(optimal tree)演算法的由來。

最小生成樹的兩個經典演算法—kruskal與prim,都是用於求無向連通圖的最小生成樹演算法。

2.演算法過程

kruskal過程:

(i):初始化。集合te和陣列visit,其中te用來儲存最小生成樹的邊,visit通過訪問標識來檢測環

(ii):將圖g(v,e)的所有邊,按照權值不減順序排列,選取其中的第乙個邊e(u,v),如果u和v的visit都為0(即都沒訪問過,不存在環),則將邊e加入集合te中,設定相應的visit元素

(iii):檢測visit是否全部為1,如果都訪問過了,則結束演算法;否則,跳轉到(ii)

kruskal的複雜度一般表示為o(mlogn),其中m為圖的邊數,而n為圖的頂點數

prim過程:

(i):初始化。集合te、s、陣列distant和closest,將圖的第乙個節點1放入s中,distant[1]=0,closest[1]=0。其中te用來儲存最小生成樹的邊,s用來記錄在集合te中的頂點,distant用來記錄任意節點v∈v-s到s的最小距離,closest用來儲存節點v和s距離最近的節點。

(ii):如果s中的頂點個數小於v,則repeat:

從s中取出最後乙個節點v,對於每個節點u∈v-s,如果distant[u]更新完畢後,遍歷節點u∈v-s,找出distant中的最小值distant[i],並取出其closest[i]=k,則將頂點i放入s中,將邊e(i,k)放入te中

prim演算法複雜度為o(v^2)

3.演算法示例

kruskal 最小生成樹

include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...

最小生成樹Kruskal

最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...

最小生成樹(kruskal)

kruskal演算法 1 記graph中有v個頂點,e個邊 2 新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊 3 將原圖graph中所有e個邊按權值從小到大排序 4 迴圈 從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中 if 這條邊連線...