1 #include "stdio.h"
2 #include "stdlib.h"
3 struct edge
4 {
5 int m;
6 int n;
7 int d;
8 }a[5010];
9 int cmp(const void *a,const void *b)//按升序排列
10 {
11 return((struct edge*)a)->d - ((struct edge*)b)->d;
12 }
13 int main(void)
14 {
15 int i,n,t,num,min,k,g,x[100];
16 printf("请输入顶点的个数:");
17 scanf("%d",&n);
18 t = n * ( n - 1 ) / 2;
19 for(i=1;i<=n;i++)
20 x[i]=i;
21 printf("请输入每条边的起始端点、权值:\n");
22 for(i=0;i<t;i++)
23 scanf("%d%d%d",&a[i].m,&a[i].n,&a[i].d);//输入每条边的权值
24 qsort(a,t,sizeof(a[0]),cmp);
25 min=num=0;
26 for(i=0;i<t && num < n-1;i++)
27 {
28 for(k=a[i].m;x[k]!=k;k=x[k])//判断线段的起始点所在的集合
29 x[k]=x[x[k]];
30 for(g=a[i].n;x[g]!=g;g=x[g])//判断线段的终点所在的集合
31 x[g]=x[x[g]];
32 if(k!=g)//如果线段的两个端点所在的集合不一样
33 {
34 x[g]=k;
35 min+=a[i].d;
36 num++;
37 printf("最小生成树中加入边:%d%d\n",a[i].m,a[i].n);
38 }
39 }
40 printf("最小生成树的权值为:%d\n",min);
41 return 0;
42 }