克鲁斯卡尔算法(Kruskal)也是生成最小生成树的算法,和普利姆算法的目标一样,但是实现原理却不一样!普利姆算法是从顶点出发,而克鲁斯卡尔是从边出发的,在边数比较少的情况下使用克鲁斯卡尔算法是比较快速的!
伪代码:
int Find(int nParent[],int f){
//查找结点
while(nParent[f]>0){
f=nParent[f]
}
return f;
}
void MiniSpanTree_Kruskal(MGraph G){
int i=0,n=0,m=0;
Edge edges[MAGEDEGE]={0};//定义边集数组
int nParent[MAXVEX];//定义parent数组用来判断边与边是否行程环路,MAXVEX在这次演示是9
for(i=0;i<G.numVertexes;i++){//G.numVertexes 在这里演示也是9
nParent[i]=0;
}
for(i=0;i<G.numEdges;i++){
n=Find(nParent,edges[i].begin);
m=Find(nParent,edges[i].end);
if(n==m)//表示有环
continue;
nParent[n]=m;//保存一下
printf("(%d,%d) %d",edges[i].begin,edges[i].end,edges.<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00"><div v:shape="_x0000_s1026" class="O"><span lang="EN-US">weight</span></div></p:colorscheme>);
}
}
图1:
算法模拟:
1.i=0,n=Find(nParent,4),n=4,m=Find(nParent,7),m=7,如图:
2.i=1,n=Find(nParent,2),n=2,m=Find(nParent,8),m=8,如图:
3.i=2,n=Find(nParent,0),n=0,m=Find(nParent,1),m=1,如图:
4.i=3,n=Find(nParent,3),n=1,m=Find(nParent,5),m=5,如图:
5.i=4,n=Find(nParent,1),n=5,m=Find(nParent,8),m=8,如图:
6.i=5,n=Find(nParent,3),n=3,m=Find(nParent,7),m=7,如图:
7.i=6,n=Find(nParent,1),n=8,m=Find(nParent,6),m=6,如图:
8.i=7,n=Find(nParent,5),n=6,m=Find(nParent,6),m=6,如图:
9.i=8,n=Find(nParent,1),n=6,m=Find(nParent,2),m=6,如图:
10.i=9,n=Find(nParent,6),n=6,m=Find(nParent,7),m=6,如图:
11.i=10,n=Find(nParent,3),n=7,m=Find(nParent,4),m=7,如图:
12.i=11,n=Find(nParent,3),n=7,m=Find(nParent,8),m=7,如图:
剩下的就不继续模拟了.....因为都重复有环了