Prime演算法——學習筆記
阿新 • • 發佈:2018-12-12
Prime演算法是圖論中的經典演算法,用於在圖中尋找最小生成樹。Prime演算法的原理在於:
(1)任取一點加入點佇列V
(2)在滿足一端點在點佇列V中,一端點(新節點)不在佇列中的所有邊中尋找最短邊
(3)把新節點加入點佇列V中,把新邊加入邊佇列E
(4)重新執行(2)直到所有點都加入點佇列
以上圖(圖片搜尋自百度圖片)為例
(1)首先任選節點,選擇A節點,發現最短邊AD,加入佇列 V=[A,D];E=[AD]
(2)以V為基礎繼續搜尋,找到DF,加入佇列V=[A,D,F];E=[AD,DF]
(3)找到AB,加入佇列V=[A,D,F,B];E=[AD,DF,AB]
……
(5)找到EG,加入佇列V=[A,D,F,B,E,C,G];E=[AD,DF,AB,BE,EC,EG]
上程式碼:
//邊 struct Edge{ int start; int end; int length; }; //需要傳入圖鄰接矩陣graph,點的個數length Edge* Fun(int **graph,int length){ //length個點,(length-1)條邊 int* V=(int*)calloc(length,sizeof(int)); Edge* E=(Edge*)malloc((length-1)*sizeof(Edge)); //先設起始點,置1說明入佇列 V[0]=1; for(int i=0;i<length-1;i++){ //尋找滿足要求的最短邊 for (int j=0,min=INT_MAX; j<length; j++) { //判斷當前點是否在點佇列 if(V[j]>0){ for(int k=0;k<length;k++){ if(V[k]==0&&graph[j][k]<min&&graph[j][k]>0){ min=graph[j][k]; E[i].start=j; E[i].end=k; E[i].length=min; } } } } //把新點加入佇列 V[E[i].end]=1; } free(V); return E; }