0%

图(四)

最小生成树

无向连通图才有最小生成树,最小生成树即为边权和最小的生成树。

Kruskal:

过程:

将 $m$ 条边按照权值升序,每次连接权值最小的顶点不在同一个连通块中的边。

使用并查集维护连通块,算法时间复杂度瓶颈为排序,时间复杂度:$O(m\log m)$。

Prim:

过程:

类似于 Dijkstra。

将点集划分成两部分:

  • 不在已生成的“最小生成树”子集中的点。(T)
  • 在已生成的“最小生成树”子集中的点。(S)

每次在 S 中选择一个最小的连接 S 和 T 集合的边连接即可。

根据选取边的时间复杂度不同,可得不同的时间复杂度:

  • 暴力选取:$O(n^2+m)$。
  • 二叉堆(优先队列):$O(n\log n+m\log n)$,因为不用删除了,所以时间复杂度一致。
  • 其它。

Boruvka:

基本思路为,从一个集合连出一条最短边,合并两个集合。每一轮操作,每个集合都会被合并,集合个数至少减小一半,初始共有 $n$ 个集合,时间复杂度:$O(m\log n)$。

本质上,Boruvka 用于求给定图的最小生成森林,当图连通时,即为求最小生成树。

次小生成树:

结论:次小生成树和最小生成树只有一条边不同。

瓶颈生成树(Kruskal重构树):

将在 Kruskal 过程中连接的两点,视作生成树上两叶子,建立一个新节点作为两点的父节点。最后形成的树即为 Kruskal 重构树。

结论:

原图中,两点之间的瓶颈路的瓶颈即为 Kruskal 重构树上 LCA 的权值。

瓶颈路:路径上最小边权最大的路径/路径上最大边权最小的路径。