克鲁斯卡尔算法

克鲁斯卡尔算法(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,如图:


剩下继续模拟.....因为都重复有环了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值