普裡姆(Prim)算法,和克魯斯卡爾算法一樣,是用來求權重連通圖的最小生成樹的算法。
基本思想
對于圖G而言,V是所有頂點的集合;現在,設定兩個新的集合U和T,其中U用于存放G的最小生成樹中的頂點,T存放G的最小生成樹中的邊。 從所有uЄU,vЄ(V-U) (V-U表示出去U的所有頂點)的邊中選取權值最小的邊(u, v),将頂點v加入集合U中,将邊(u, v)加入集合T中,如此不斷重複,直到U=V為止,最小生成樹構造完畢,這時集合T中包含了最小生成樹中的所有邊。
<a></a>

以上圖G4為例,來對普裡姆進行示範(從第一個頂點A開始通過普裡姆算法生成最小生成樹)。
初始狀态:V是所有頂點的集合,即V={A,B,C,D,E,F,G};U和T都是空!
第1步:将頂點A加入到U中。
此時,U={A}。
第2步:将頂點B加入到U中。
上一步操作之後,U={A}, V-U={B,C,D,E,F,G};是以,邊(A,B)的權值最小。将頂點B添加到U中;此時,U={A,B}。
第3步:将頂點F加入到U中。
上一步操作之後,U={A,B}, V-U={C,D,E,F,G};是以,邊(B,F)的權值最小。将頂點F添加到U中;此時,U={A,B,F}。
第4步:将頂點E加入到U中。
上一步操作之後,U={A,B,F}, V-U={C,D,E,G};是以,邊(F,E)的權值最小。将頂點E添加到U中;此時,U={A,B,F,E}。
第5步:将頂點D加入到U中。
上一步操作之後,U={A,B,F,E}, V-U={C,D,G};是以,邊(E,D)的權值最小。将頂點D添加到U中;此時,U={A,B,F,E,D}。
第6步:将頂點C加入到U中。
上一步操作之後,U={A,B,F,E,D}, V-U={C,G};是以,邊(D,C)的權值最小。将頂點C添加到U中;此時,U={A,B,F,E,D,C}。
第7步:将頂點G加入到U中。
上一步操作之後,U={A,B,F,E,D,C}, V-U={G};是以,邊(E,G)的權值最小。将頂點G添加到U中;此時,U=V。
此時,最小生成樹構造完成!它包括的頂點依次是:A B F E D C G。
以"鄰接矩陣"為例對普裡姆算法進行說明,對于"鄰接表"實作的圖在後面會給出相應的源碼。
1. 基本定義
Graph是鄰接矩陣對應的結構體。
vexs用于儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用于儲存矩陣資訊的二維數組。例如,matrix[i][j]=1,則表示"頂點i(即vexs[i])"和"頂點j(即vexs[j])"是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。
EData是鄰接矩陣邊對應的結構體。
2. 普裡姆算法
運作結果: