Skip to content

算法Algorithm

Borůvka 算法

施工中 · 内容逐步修订

Boruvka algorithm

每轮为每个连通分量并行选择最轻出边并收缩,构造最小生成森林。

形式陈述 ​

算法与安全性 ​

为构造最小生成树,初始令每个顶点自成分量。固定一个全局边顺序,以 (w(e),id(e)) 为比较键,边 ID 互异。每轮扫描跨分量边,为每个有出边的分量选择键最小的出边,再用并查集接受连接不同当前根的候选。所有分量都按同一规则处理权重平局。

固定的平局规则可理解为不改变原权重大小关系的符号微扰,它在原图的最小生成树中选定一棵唯一的 T∗。对轮初分量 C,选出的边 e 是割 (C,V∖C) 上唯一最轻的边,因而属于 T∗:若不属于,加入它形成的圈上还有一条跨割边 f,用 e 替换 f 会严格改善微扰后的总权,矛盾。每轮所有候选都属于同一棵 T∗,所以去掉重复记录后可同时加入,不必把“每条边分别安全”误当成“整批一定安全”的证明。对不连通图,在每个原连通分量内应用同一论证。

这一约定也直接排除了候选中的真环:若有环,环上比较键最大的边不可能被任一端分量选中,因为该端还有环上另一条更小的出边。同一条无向边被两端同时选择只产生重复记录,DSU 会在第二次遇到时跳过它。

直觉

Borůvka 不是从某一个顶点向外长树,而是让当前森林的每个分量同时寻找最便宜的对外连接。每个非孤立分量都必须与至少另一个分量合并,所以超级顶点数按轮成倍缩小;统一平局规则下的割性质与重复候选处理,使实际接受的森林能够扩充为某棵最小生成树。

Borůvka 算法轮次示意图
例子与边界

一轮状态追踪 ​

设轮初分量为 A={1,2},B={3},C={4,5},跨边最小权分别为 w(AB)=2,w(AC)=5,w(BC)=3。A 与 B 都选择 AB,C 选择 BC。去重后依次接受 AB、BC,三个旧分量在这一轮合成一个。

候选可以共享端点,但上述统一平局规则保证去重后没有环。若允许不同分量各自任意打破平局,等权三角形可能让三个顶点各选下一条边而选出整圈,此时还需一个经证明安全的去环方案;本页采用统一边序,直接避免这项额外义务。

轮数与总工作 ​

令某个原连通分量在轮初还含 c>1 个超级顶点。每个超级顶点都有出边并至少选一条,所以候选边图的每个新连通块含至少两个旧分量;轮末超级顶点数至多 c/2。因此 n≥1 时至多 ⌈log2⁡n⌉ 轮,这个界与边权随机性无关。

一种明确的实现先冻结本轮的分量标签,再扫描 m 条原边。轮内尚未 union 时,父指针森林固定;对全部 n 个顶点做完全路径压缩,可在 O(n) 总时间取得根标签:不直接连根的节点第一次作为查找路径内部节点被访问后,就被压成根的孩子,其余每次查询只付常数收尾成本。之后每条边只查两次数组标签,每轮为 O(n+m)。

收集完候选后才执行 union。有出边的活动分量逐轮至少减半,全部轮次的候选记录数为 O(n),这些合并的总成本为 O(nα(n))。连同初始化,总时间为 O((n+m)log⁡(n+1)),辅助空间为 O(n);连通且 n≥2 时可写为 O(mlog⁡n)。这里的线性扫描来自冻结标签与分阶段处理,而不是把一般的单次 DSU 查找当作最坏常数。断开图最终输出最小生成森林;孤立点没有候选边,空图直接结束。

收缩实现不变量 ​

扫描边时应以轮初根为分量身份收集候选,再统一执行 union。若边扫描到一半就合并,后半轮的“每个分量最轻边”会混用两个不同阶段的分量划分,安全性与减半分析都不再对应同一轮。

收缩后,旧内部边可删除;同一对超级顶点之间的平行边只需保留最轻者供 MST 选择。若保留原边列表重复扫描也仍正确,只是工作量较大。候选记录要保存原始端点,才能把超级顶点间选择还原为输出森林边。

推论与应用

与 Prim、Kruskal 对照 ​

Prim 从一个连通块逐边扩展,Kruskal 全局按边权排序,Borůvka 为所有分量并行选边并收缩。三者都用割性质证明贪心选择的安全性;Borůvka 的全分量扫描便于并行处理,轮末收缩则逐步减小后续问题的规模。

参考资料
  • Robert Sedgewick、Kevin Wayne,BoruvkaMST.java,固定边扫描次序统一处理权重平局,先收集候选再合并。
  • Otakar Borůvka, original MST work, 1926.
  • Robert Tarjan, Data Structures and Network Algorithms, 1983.
  • Karger, Klein, Tarjan, randomized MST, JACM 1995.
关系图谱9 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系