最小生成树:克鲁斯卡尔(Kruskal)和普里姆(Prim)

1 前言:

一般来说,最小生成树算法以克鲁斯卡尔(Kruskal)和普里姆(Prim)较为经典。最小生成树是什么呢?举个例子,对于无向图来说,如果2个顶点如果要实现互相连通,至少需要1条边;3个顶点要互相连通,至少需要2条边;n个顶点如果需要互相连通,至少需要n-1条边。如果n个顶点有n条边,那一定有一个环存在。生成树就是无环图。

2 : 克鲁斯卡尔(Kruskal)

      算法思想:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。

2.1流程 

下图是所有点之间的权重图

第1-2步

第一步:因为E和F之间的权值是2,权值最小,所以第一步选择E和F相连

第二步:在剩下的权值中,权值3最小,是C和D。而且,C和D之间连接后不会产生环,所以第二步选C和D相连

第3-4步

第三步:在剩下的权值中,权值为4是最小的,也就是E和D相连,而且E和D相连后不会产生环,所以选择E和D相连。

第四步:在剩下的权值中,权值为5是最小的,也就是C和E相连,但是如果把C和E相连后,(CDE)就产生了环,就不是生成树了,摒弃。接着,剩下的权值中,权值为6是最小的,也就是C和F相连,但是如果把C和F相连后,(CFED)就产生了环,就不是生成树了,摒弃。接着,剩下的权值中,权值为7是最小的,也就是B和F相连,B和F相连后,不会产生环。所以选择B和F相连。

第5-6步

第五步:剩下权值中,可以把E和G能连起来

第六步:声现象权值中,可以把A和B连起来,其他的连起来会产生环。到此,克鲁斯卡尔(Kruskal)算法结束。

3 普里姆(Prim)

算法思想:(将所有顶点分成两个集合,集合M和N。M是需要的,N是剩下的)1:以一个点出发,这个点组成一个集合M,剩下的点组成集合N。3:在集合B中找一个点,这个点距离集合M距离最小。3:循环第2个过程,直到集合M是全集,N是空集。

3.1 流程

下图是所有点之间的权重图

 第1-2步

第一步:以A点出发(也可以以其他的点),A点组成了M集合,所有的点到集合M的距离中,最小的是B-A,距离为4。

第二步:此时A-B组成了M集合,剩下的点到集合M的路径有C-M和H-M,距离都是8。随便定一个点H,(也可以C)

此时B-A-H组成一个集合M 

第3-4步

第三步:B-A-H组成集合M,剩下的点到这个集合的距离的最小值是1,也就是G到M的距离,也就是G到H的距离。

第四步:B-A-H-G组成集合M,剩下的点到这个集合的距离的最小值是2,也就是F到M的距离,也就是F到G的距离

此时B-A-H-G-F组成集合M

第5-6步

第五步:B-A-H-G-F组成集合M,剩下的点到这个集合的距离的最小值是4,也就是C到M的距离,也就是C到F的距离。

第六步:B-A-H-G-F-C组成集合M,剩下的点到这个集合的距离的最小值是2,也就是I到M的距离,也就是I到C的距离

此时B-A-H-G-F-C-I组成了集合M

第7-8步

第七步:B-A-H-G-F-C-I组成集合M,剩下的点到这个集合的距离的最小值是7,也就是D到M的距离,也就是D到C的距离。

第八步:B-A-H-G-F-C-I-D组成集合M,剩下的点到这个集合的距离的最小值是9,也就是E到M的距离,也就是E到D的距离

此时B-A-H-G-F-C-I-D-E组成了集合M,算法结束。

4 总结: 

        克鲁斯卡尔(Kruskal)和普里姆(Prim)都是最小生成树的算法,克鲁斯卡尔(Kruskal)是近似贪心算法,一直找权值最小的边,但是这个过程不能让这棵树有环。普里姆(Prim)体现一种集合的思想,将这棵树作为一个整体,从剩下的点中找到与这个集合的最短的边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值