今日要完成的任務是最小生成樹(普里姆演算法)
試實現普里姆最小生成樹演算法。
函式介面定義:
void Prim(AMGraph G, char u);
其中 G 是基於鄰接矩陣儲存表示的無向圖,u表示起點
裁判測試程式樣例:
#include <iostream>
#define MVNum 10
#define MaxInt 32767
using namespace std;
struct edge{
char adjvex;
int lowcost;
}closedge[MVNum];
typedef struct{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G , char v);//實現細節隱藏
int Min(AMGraph G);//實現細節隱藏
int CreateUDN(AMGraph &G);//實現細節隱藏
void Prim(AMGraph G, char u);
int main(){
AMGraph G;
CreateUDN(G);
char u;
cin >> u;
Prim(G , u);
return 0;
}
/* 請在這裡填寫答案 */
輸入樣例:
第1行輸入結點數vexnum和邊數arcnum。第2行輸入vexnum個字元表示結點的值,接下來依次輸入arcnum行,每行輸入3個值,前兩個字元表示結點,後一個數表示兩個結點之間邊的權值。最後一行輸入一個字元表示最小生成樹的起始結點。
7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
0
輸出樣例:
按最小生成樹的生成順序輸出每條邊。
0->5
5->4
4->3
3->2
2->1
1->6
1 void Prim( AMGraph G, char v ) 2 { 3 int distance[G.vexnum]; 4 int parent[G.vexnum]; 5 //記錄v的下標 6 int index=0; 7 int i,min=MaxInt,imin,count=0; 8 // 1.初始化這棵樹,即以v為起始點,同時初始化陣列distance[] 9 // 注:distance陣列表示該樹的任意一點到該點的最小距離 10 11 //尋找v的下標 12 for (i = 0; i < G.vexnum; i++) 13 { 14 if (G.vexs[i]==v) 15 { 16 index=i; 17 } 18 19 } 20 for (i = 0; i < G.vexnum; i++) 21 { 22 if (i==index) 23 { 24 distance[i]=0; 25 parent[i]=index; 26 }else 27 { 28 distance[i]=G.arcs[index][i]; 29 parent[i]=index; 30 } 31 } 32 while (1) 33 { 34 if (count==G.vexnum-1) 35 { 36 break; 37 } 38 39 // 2.從小樹現有的結點出發,尋找邊權值最小的點: 40 for ( i = 0; i < G.vexnum; i++){ 41 if (min>distance[i]&&distance[i]!=0) 42 { 43 //記錄最小值及其下標 44 min=distance[i]; 45 imin=i; 46 47 } 48 49 } 50 //更新已到達過得節點數 51 52 count++; 53 // 3.找到後輸出該邊 54 if (count<G.vexnum-1) 55 { 56 printf("%c->%c\n",G.vexs[parent[imin]],G.vexs[imin]); 57 }else 58 { 59 printf("%c->%c",G.vexs[parent[imin]],G.vexs[imin]); 60 } 61 62 63 64 65 //初始化min以便下次尋找 66 min=MaxInt; 67 // 4.將該點的distance陣列中的值賦值為0,標記已經遍歷過 68 distance[imin]=0; 69 // 5.迴圈遍歷結點,更新distance[]陣列 70 for ( i = 0; i < G.vexnum; i++){ 71 if (distance[i]!=0&&G.arcs[i][imin]<MaxInt) 72 { 73 if (distance[i]>G.arcs[i][imin]) 74 { 75 distance[i]=G.arcs[i][imin]; 76 parent[i]=imin; 77 } 78 } 79 } 80 } 81 }