克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔(Kruskal)算法 是求最小生成树的 了解最小生成树
普利姆(Prime)算法是以 点 为基础,挑选与 已有点 相连的最小边。
克鲁斯卡尔(Kruskal)算法是以 边 为基础,先将边从小到大排列,从小到大的添加不构成「环路」的边。
判断「环路」使用的是 并查集 的数据结构 学习并查集
1.要点
- 核心:先将边从小到大排列,从小到大的添加不构成「环路」的边
- 判断「环路」:使用 并查集 的数据结构 学习并查集
- 时间复杂度:O(n log n) (这是由排序方式实现的)
2.图解
求下面图的最小生成树
首先将边从小到大排列 如下表所示。
| 边 | from | to | weight | | ---------- | ---- | ---- | ------ | | edges[0]
| B
| C
| 2 | | edges[1]
| A
| C
| 3 | | edges[2]
| A
| B
| 3 | | edges[3]
| B
| D
| 4 | | edges[4]
| C
| D
| 6 | | edges[5]
| A
| D
| 7 |
选取最小的边 BC,
- 通过 并查集
find()
找到 root 根节点,判断 B、C 不为同一颗子树 - 通过 并查集
union()
将 B、C 合并为一颗树
选取第二小的边 AC,
- 通过 并查集
find()
找到 root 根节点,判断 A、C 不为同一颗子树 - 通过 并查集
union()
将 A、{'B'