数据结构——最小生成树Kruskal算法

                       最小生成树Kruskal算法

       上一篇博客讲了最小生成树的Prim算法。而另一种常见的最小生成树算法就是克鲁斯卡尔算法。
       Kruskal算法跟Prim算法的思路不一样,Prim算法还是一种树由根到叶子节点的生成方法,也就是生成树慢慢长大,每次都往生成树中添加新的节点,最后让生成树中包含图中的所有节点。而Kruskal算法则是初始时把所有的节点都当成一棵树,通过树的合并来最终生成一棵包含所有节点的树,也就是图的最小生成树。两棵树如何合并呢?非常简单,就是在两棵树中分别选一个节点出来,把这两个节点用一根线连起来,两棵树就合并成一棵树了,那么要求合并后的权值最小,那么就要求这条新生成的边权值最小。再反过来想,如何取得最小边呢?那就是从图的边集中选择最小权值的边,看这条边的两个节点是不是分别在两棵树中,如果不是,那么说明这边条已经在生成了的树中了,舍去,再从图的边集中取另外一条权值最小的边,直到取到了一条边,它的两个节点分别在两棵树中为止。这时,就让这条边的两个节点所在的两棵树合并成一棵,树集中的两棵树就变为了一棵。这样一直进行下去,当树集中只剩一棵树时,就说明最终的最小生成树完成了。
       如何在边集中选择满足条件且权值最小的一条边呢?这里,可以把图的所有的边放入一个集合中,对这个集合进行排序,因为算法过程中不会对边的权值进行修改,所以不会破坏边集的有序性,整个Kruskal算法过程只需要对边集进行一次排序。排序时按增序列排序。给每条边一个标记,当标记为true是表示这边表已经被用过了,为false表示还没有被用过。这样从边集中选择满足条
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值