克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/jiangguangchao/article/details/102697314

基本思想

先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树(不构成回路),则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上(构成回路),则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有 n-1 条边为止。

基本步骤

1、新建图G,G中拥有原图中相同的节点,但没有边;
2、将原图中所有的边按权值从小到大排序;
3、从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中;
4、重复3,直至图G中所有的节点都在同一个连通分量中。

关于步骤3的解释:选取的边要是剩下边权值最小的,且与G中的边不构成回路。

详细步骤图解

原图如下:
在这里插入图片描述

第一步:判断权值为1的连接边hg是否属于集合,由于开始集合为空,则将两个节点加入到集合,且连接该边,并判断是否属于回路;
在这里插入图片描述

第二步:判断权值为2的连接边ic是否属于集合,由于集合只有节点h和g,则将节点i和c加入到集合中,且连接该边,并判断是否属于回路;
在这里插入图片描述

第三步:判断权值为2的连接边gf是否属于集合,根据判断规则,把f加入到集合,且连接该边;
在这里插入图片描述

第四步:根据判断规则,将节点a和b加入到集合,且连接该边;
在这里插入图片描述

第五步:根据判断规则,连接该边cf;
在这里插入图片描述

第六步:根据判断规则,连接节点i和g时形成回路,则放弃,继续下次判断;

第七步:判断权值为7的连接边;根据判断规则,节点i和h形成回路,则放弃,将节点d加入到集合,并连接该边;
在这里插入图片描述

第八步:判断权值为8的连接边;根据判断规则,连接节点a和h;
在这里插入图片描述

第九步:判断权值为9的连接边;将节点e加入到集合,并连接该边;此时集合已经包含所有节点,则终止循环;
在这里插入图片描述

总结

1、克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边有关系,可以证明其时间复杂度为O(eloge)

2、克鲁斯卡尔算法和普利姆算法一样,都是贪心算法,不同的是克鲁斯卡尔算法是从森林到树,而普利姆一直保持着一个树。

3、克鲁斯卡尔算法适合边少的,也即稀疏图。

参考文章:
【1】算法——最小生成树:Kruskal算法、Prim算法
【2】克鲁斯卡尔算法

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/102697314