1 //最小代價生成樹 2 //prim算法(稠密圖):從與這棵樹相連的邊中選擇最短的邊,並將這條邊及其所連頂點接入當前樹中 3 void Prim(MGraph g,int v0,int &sum) { 4 int lowcost[maxsize],visit[maxsize],v;//lowcost存放當前樹到其他頂點的最小權值的頂點 5 int min,k; 6 v=v0; 7 for(int i=0; i<g.n; i++) { 8 lowcost[i]=g.edges[v0][i]; 9 visit[i]=0; 10 } 11 visit[v0]=1; 12 sun=0; 13 for(int i=0; i<g.n-1; i++) { 14 min=INF;//INF是比所有權值都大的整數 15 for(int j=0; j<g.n; j++) { 16 if(visit[j]==0&&lowcost[j]<min) { 17 min=lowcost[j]; 18 k=j; 19 } 20 } 21 v=k; 22 visit[k]=0; 23 sum+=min; 24 for(int j=0; j<g->n; j++) { 25 if(visit[j]==0&&lowcost[j]>g.edges[v][j]) { 26 lowcost[j]=g.edges[v][j]; 27 } 28 } 29 } 30 } 31 32 //Kruskal算法(稀疏矩陣):每次找出候選邊中權值最小的邊,就將該邊並入生成樹中。 33 //重復此過程直到所有的邊都被檢測完為止 34 typedef struct Road { 35 int a,b,w;//分別表示兩個頂點和路徑的權值 36 }; 37 Road road[maxsize]; 38 int v[maxsize];//表示並查集 39 int getRoot(int a) { 40 if(a!=v[a])a=v[a]; 41 return a; 42 } 43 void Kruskal(MGraph g,int &sum,Road road[]) { 44 int E,N; 45 E=g.e; 46 N=g.n; 47 for(int i=0; i<N; i++)v[i]=i; 48 sort(road,E); 49 for(int i=0; i<E; i++) { 50 int a=getRoot(road[i].a); 51 int b=getRoot(road[i].b); 52 if(a!=b) { 53 v[a]=b; 54 sum+=road[i].w;//求生成樹的權值,這句並不是本算法的固定寫法,也可改成其他 55 } 56 } 57 }