#include <stdio.h><br />#define N 6<br />#define TRUE 1<br />#define FALSE 0<br />#define MAX_VALUE 9999<br />typedef struct edge{<br />int from;<br />int to;<br />float weight;<br />}edge;<br />edge path[N]; //儲存第1到N-1步的走法<br />float c[N+1][N+1]; //儲存鄰接矩陣資訊<br />int closest[N+1]; //儲存在S中 離 j最近的頂點編號<br />float lowcost[N+1]; //lowcost[j] = c[j][closest[j]] 就是 j到S中最近頂點的距離<br />int s[N+1]; //標誌一個頂點是否加入到最小產生樹中<br />void prim(){<br />int i;<br />s[1] = TRUE; //頂點 1放入最小產生樹中<br />for(i=2;i<=N;i++){ //初始化<br />lowcost[i] = c[1][i]; //任何一點到S集合的最小距離,也就等同於到頂點1的距離,因為S中只有1一個頂點<br /> closest[i] = 1; //任何一點到S集合中的頂點 1 最近(因為S集合中只有頂點1)<br />s[i] = FALSE; //任何頂點都沒有加入到S集合中<br />}<br />int pf = 1;<br />for(i=1;i<N;i++){<br />float min = MAX_VALUE;<br />int j = 1;<br />for(int k=2;k<=N;k++){ //選出一個未選入最小產生樹的頂點,該頂點離S中頂點的距離最小<br />if(lowcost[k]<min && (!s[k])){<br />min = lowcost[k];<br />j=k;<br />}<br />}<br />printf("%d , %d/n",j,closest[j]);<br />path[pf].from = j;<br />path[pf].to = closest[j];<br />path[pf].weight = c[j][closest[j]];<br />pf++;</p><p>s[j] = TRUE;<br />for(k=2;k<=N;k++){ //針對所有未選入最小產生樹的頂點,進行更新<br />if(c[j][k] < lowcost[k] && (!s[k])){<br />lowcost[k] = c[j][k];<br />closest[k] = j;<br />}<br />}<br />}<br />}</p><p>void main(){<br />c[1][1] = MAX_VALUE; //頂點1<br />c[1][2] = 6;<br />c[1][3] = 1;<br />c[1][4] = 5;<br />c[1][5] = MAX_VALUE;<br />c[1][6] = MAX_VALUE;<br />c[2][1] = 6; //頂點2<br />c[2][2] = MAX_VALUE;<br />c[2][3] = 5;<br />c[2][4] = MAX_VALUE;<br />c[2][5] = 3;<br />c[2][6] = MAX_VALUE;<br />c[3][1] = 1; //頂點3<br />c[3][2] = 5;<br />c[3][3] = MAX_VALUE;<br />c[3][4] = 5;<br />c[3][5] = 6;<br />c[3][6] = 4;<br />c[4][1] = 5; //頂點4<br />c[4][2] = MAX_VALUE;<br />c[4][3] = 5;<br />c[4][4] = MAX_VALUE;<br />c[4][5] = MAX_VALUE;<br />c[4][6] = 2;<br />c[5][1] = MAX_VALUE; //頂點5<br />c[5][2] = 3;<br />c[5][3] = 6;<br />c[5][4] = MAX_VALUE;<br />c[5][5] = MAX_VALUE;<br />c[5][6] = 6;<br />c[6][1] = MAX_VALUE; //頂點6<br />c[6][2] = MAX_VALUE;<br />c[6][3] = 4;<br />c[6][4] = 2;<br />c[6][5] = 6;<br />c[6][6] = MAX_VALUE;</p><p>prim();</p><p>printf("-------------------------------------------/n");<br />printf("The path is: /n");<br />for(int i = 1;i<N;i++){<br />printf("%d----%d Weigth: %.2f /n",path[i].from,path[i].to,path[i].weight);<br />}<br />}