Kruskal算法的实现

 

 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 }

 

posted @ 2015-05-26 17:43  niceforbear  阅读(195)  评论(0编辑  收藏  举报