# 1. 算法简述
kruskal 是基于贪心思想被设计出来的。此算法得目的是从给定的无向图中获得一棵生成树,并且此生成树得权值之和最小。举个现实中的例子,图的每个顶点都是一个城市,每条边的权值表示两个城市之间的距离,那么现在要铺设铁路,使得每个没做城市都可以互相到达,并且花费的铁轨最少,这个问题就可以用 kruskal 算法求解。
常见的最小生成树的算法有 kruskal 和 prim,此文章只叙述前者。
# 2. 算法描述
初始时,我们的最小生成树为空,对于图 G,我们从中找出权值最小的边,有了这条边后,如果把这条边和我们的最小生成树构成回路,那么不能把这条边放入最小生成树中,如果不会构成回路,那么就可以更新我们的最小生成树(把这条边和对应的一对顶点放进去)。重复以上操作,直到遍历完所有的边。
# 3. 代码
在上面的算法描述中,我们需要判断当前的边是否会跟生成树构成回路,对于这个条件判断在使用代码实现时,我们这样转换:
如果这条边的两个顶点都在最小生成树中出现了,那么这条边一定会跟最小生成树构成回路,不能添加到最小生成树中。
所以我们使用数据结构 Edge 来记录每条边的起点,终点和权重,使用 added 数组来表示顶点是否被添加到最小生成树中。
1 |
|