算法讲解—最小生成树(Kruskal 算法)
简介
根据度娘的解释我们可以知道,最小生成树(Minimum Spanning Tree, MST)就是:一个有 n n n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n n n 个结点,并且有保持图连通的最少的边。
简单点来说就是求最小的连通图,就是从一个点能到达图的任意一点,且花费的代价最小(所有边的权值最小)。
最小生成树问题通常用于网络设计、电路设计等领域,目的是找到连接所有节点的最低成本方式。常见的算法有克鲁斯卡尔算法(Kruskal)和普里姆算法(Prim)等。

Kruskal 算法
要实现最小生成树,最著名的就是 Kruskal 算法。
Kruskal 算法是一种用来求解最小生成树问题的贪心算法。最小生成树问题是指在一个连通带权无向图中找到一个生成树,使得所有边的权重之和最小。
Kruskal 算法的基本思想是从小到大选择边,直到选出 n − 1 n-1 n−1 条边为止( n n n 为节点数)。具体步骤如下:
-
将图中的所有边按照权重从小到大进行排序。
-
初始化一个空的集合 M M M,用来存放最小生成树的边。
-
遍历排序后的边,如果当前边的两个端点不在同一个连通分量中,则将这条边加入集合 M M M ,并将两个端点所在的连通分量合并。
-
重复步骤 3 3 3,直到集合 M M M 中的边数达到 n − 1 n-1 n−1 条,其中 n n n 为节点数。
-
最后得到的集合 M M M 就是最小生成树。
Kruskal 算法的时间复杂度主要取决于排序边的时间复杂度,通常使用快速排序等快速的排序算法,因此总的时间复杂度为 O ( E log E ) O(E \log E) O(ElogE),其中

最低0.47元/天 解锁文章
1763

被折叠的 条评论
为什么被折叠?



