按照Kruskal 方法构造最小生成树的过程如图所示:

在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选取了n-1 条边为止,就构成了一棵最小生成树。
Kruskal 算法的实现:
算法的框架:
构造非连通图T=(V,{})
k = i= 0;//k为边数
while(k《< n-1) {
i++;
检查边E中第i条边的权值
最小边(u,v)
若(u,v) 加入T不是T产生回路,
则(u,v)加入T,且k++
}
c语言实现:
C 语言实现Kruskal 算法,其中函数Find 的作用是寻找图中顶点所在树的根结点在数组father 中的序号。需说明的是,在程序中将顶点的数据类型定义成整型,而在实际应用中,可依据实际需要来设定。
?
- typedef int elemtype; typedef struct {
- elemtype v1; elemtype v2;
- int cost; }EdgeType;
- void Kruskal(EdgeType edges[ ],int n) /*用Kruskal 方法构造有n 个顶点的图edges 的最小生成树*/
- { int father[MAXEDGE]; int i,j,vf1,vf2;
- for (i=0;i<n;i++) father[i]=-1; i=0;j=0;
- while(i<MAXEDGE && j<n-1) { vf1=Find(father,edges[i].v1);
- vf2=Find(father,edges[i].v2); if (vf1!=vf2)










