跳转至

Borůvka 算法

Borůvka 算法是一种基于贪心的最小生成树算法。它比 Prim 算法和 Kruskal 算法更加古老。在 Borůvka 算法的基础上,已经发展出了线性的最小生成树算法

Borůvka 算法的思想是:每次迭代,选取每一个连通块中最小的连向另一个连通块的边,将其加入最小生成树。其过程如下伪代码所示:

\begin{array}{ll} 1 & \textbf{Input.}\text{ Edge set }E\text{ and vertex set }V\text{ of the graph}\\ 2 & \textbf{Output.}\text{ A minimum spanning tree of the graph}\\ 3 & \textbf{Method.}\\ 4 & \textbf{Function}\text{ Borůvka(void)}\\ 5 & \qquad S\text{ is a graph of vertex set }V\text{ and empty edge set}\\ 6 & \qquad\textbf{while}\text{ the count of connected components in }S>1\\ 7 & \qquad\qquad T\text{ is an empty set}\\ 8 & \qquad\qquad\textbf{for}\text{ each connected component }C\text{ in }S\\ 9 & \qquad\qquad\qquad T\gets T+\text{the minimum edge connects }C\text{ and another component}\\ 10 & \qquad\qquad\textbf{for}\text{ each edge }(u,v)\in T\\ 11 & \qquad\qquad\qquad S\gets S+(u,v)\\ 12 & \qquad\textbf{return }S\\ 13 & \textbf{End}\\ 14 & \textbf{return }\text{Borůvka()} \end{array}

对于每次迭代,迭代后的每个连通块至少包含两个迭代前的连通块,故连通块总数至少减少一半,迭代次数为对数级别。

可以发现,对于每次迭代,T 中所有边 (在去重之后) 不会形成不满足以下条件的环:

  • 环上所有边权值相等

这也正是 Borůvka 算法要求边权互不相等的原因。但我们可以给边随意分配一个第二关键字,或是用并查集排除形成环的边。因此,Borůvka 算法可以用于存在边权相同的图。

评论