最小生成树之Kruskal算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树之Kruskal算法相关的知识,希望对你有一定的参考价值。

用Kruskal方法解决无向连通图最小生成树问题:

1所有的点初始化的时候自成一个集合

2所有的边按照权值大小,从小到大排序

3选取权值小的边加入现有集合中,且加入后必须不构成环路,加入后,记录点的祖先

4重复步骤3,直到所有的点都被放入一个集合中

 1 /*
 2 desription:use Kruskal method to solve mini span tree problem
 3 copyright:Hou Shengtao
 4 data:2016/12/7
 5 */
 6 #include<stdio.h>
 7 #include<stdlib.h>
 8 #define max 100
 9 #define INF 999
10 int edge_num,vertex_num;
11 int p[max];//record SET ID
12 struct edge{
13     int a;
14     int b;
15     int w;
16 }e[max];
17 void sort(){
18     int i,j;
19     
20     for(i=1;i<edge_num;i++){
21         j=i-1;
22         int x=e[i].w;
23         int aa=e[i].a;
24         int bb=e[i].b;
25         
26         while(j>=0&&e[j].w>x){
27             e[j+1].a=e[j].a;
28             e[j+1].b=e[j].b;
29             e[j+1].w=e[j].w;
30             j--;
31         }
32         e[j+1].a=aa;
33         e[j+1].b=bb;
34         e[j+1].w=x;    
35     }
36 }
37 //find() use to find the ancester node
38 int find(int x){
39     return x==p[x]?x:(p[x]=find(p[x])); 
40 }
41 //unioned() use to pass the ancester ID to its children
42 //so that all the mini tree vertex have the same ID
43 void unioned(int x,int y){
44     p[find(x)]=find(y);
45 }
46 void Kruskal(){
47     //init
48     int i,j;
49     for(i=0;i<vertex_num;i++){
50         p[i]=i;//init the SET ID
51     } 
52     //sorting according to edge‘s weight
53     sort();
54     printf("\n");
55     for(i=0,j=0;i<vertex_num&&j<edge_num;i++,j++){
56         if(find(e[j].a)==find(e[j].b))continue;//form circle,skip
57         
58         unioned(e[j].a,e[j].b);
59         
60         printf("start:%d end:%d weight:%d\n",e[j].a,e[j].b,e[j].w);    
61     }
62 }
63 
64 int main(){
65     
66     FILE *fin  = fopen ("mst.in", "r");
67     FILE *fout = fopen ("mst.out", "w");
68     
69     char buf[10];
70     fgets(buf,10,fin);
71     edge_num=atoi(buf);    
72     fgets(buf,10,fin);
73     vertex_num=atoi(buf);
74     printf("edge_num:%d\n",edge_num);
75     printf("vertex_num:%d\n",vertex_num);
76     
77     int i;
78     for(i=0;i<edge_num;i++){
79         int start,end,weight;//start point,end point and the weight of edge
80         fgets(buf,10,fin);
81         sscanf(buf,"%d %d %d",&start,&end,&weight);
82         printf("start:%d end:%d weight:%d\n",start,end,weight);
83         e[i].a=start;
84         e[i].b=end;
85         e[i].w=weight;
86     }
87     Kruskal();
88 
89     return 0;
90 } 

 

以上是关于最小生成树之Kruskal算法的主要内容,如果未能解决你的问题,请参考以下文章

23最小生成树之Kruskal算法

caioj1090最小生成树之kruskal算法模板元问题

JS实现最小生成树之克鲁斯卡尔(Kruskal)算法

最小生成树之Kruskal算法

最小生成树之Kruskal算法

(王道408考研数据结构)第六章图-第四节2:最小生成树之克鲁斯卡尔算法(思想代码演示答题规范)