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 }
时间: 2024-11-10 16:28:29