方法一: #include <stdio.h> #include <string.h> #define MAX 100 #define MAXCOST 10000 int sum; void Prim(int graph[][MAX],int n) { int i,j,k,min; int lowcost[MAX]; int adjvex[MAX]; for(i=1;i<n;i++) lowcost[i]=graph[0][i]; //从第一个的顶点开始 memset(adjvex,0,sizeof(adjvex)); min=MAXCOST; for(i=1;i<n;i++) { min=MAXCOST; for(j=1;j<n;j++) if(adjvex[j]==false && lowcost[j]<min) { min=lowcost[j]; k=j; //记下最小的点 } adjvex[k]=true; //为true表示该权值已经是最小,为flase是还不确定,应继续更新 for(j=1;j<n;j++) { if(adjvex[j]==false && lowcost[j]>graph[k][j]) //更新lowcost lowcost[j]=graph[k][j]; } } for(i=1;i<n;i++) sum+=lowcost[i]; //这就是最小生成树 } int main() { int n,m,i,j; int graph[MAX][MAX]; int prist[MAX]; scanf("%d",&m); while (m--) { scanf("%d",&n); //顶点个数 sum=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d",&graph[i][j]); //输入边的值 if(i==j) graph[i][j]=MAXCOST; } Prim(graph,n); printf("%d/n",sum); } return 0; } 方法二: #include <stdio.h> #define N 100 int sum; void Prim(int graph[][N],int vertex) { int lowcost[N]; int adjvex[N]; int i,j,mink,min; for(i=1;i<vertex;i++) { lowcost[i]=graph[0][i]; adjvex[i]=0; } for(i=1;i<vertex;i++) { min=lowcost[1]; mink=1; for(j=2;j<vertex;j++) { if(min>lowcost[j]) { min=lowcost[j]; mink=j; } } sum+=min; printf("%d->%d:%d/n",adjvex[mink],mink,min); lowcost[mink]=N; for(j=1;j<vertex;j++) { if(lowcost[j]>graph[mink][j] && lowcost[j]<N) { lowcost[j]=graph[mink][j]; adjvex[j]=mink; } } } } int main() { freopen("e://t.txt","r",stdin); int vex[N][N]; int vertex,i,j; sum=0; scanf("%d",&vertex); for(i=0;i<vertex;i++) for(j=0;j<vertex;j++) scanf("%d",&vex[i][j]); Prim(vex,vertex); printf("%d/n",sum); return 0; }