一般求最小生成树的时候,最流行的是Kruskal算法,一种基于拟阵证明的贪心,通过给边排序再扫描一次边集,利用并查集优化得到,复杂度为(O(ElogE))。另一种用得比较少的是Prim算法,利用优先队列实现做到(O(ElogV))。
在翻ZYQN博客的时候,看见他写的位运算最小生成树中提到了Borůvka算法,于是学了一下。
算法
Borůvka算法是1926年发明的,是最早发明的最小生成树算法,复杂度为(O(ElogV))。
算法思想非常简单。初始时每个点都是一颗不同的树,每次遍历边表,找距离每棵树最近的另一棵树,并把它们连起来。可以发现,每一次一棵树都与另一棵树连接起来,所以每次树的数量都至少减少到一半,所以这样操作的次数为(O(logV))次。每次我们遍历边表,连接所用的时间为(O(E+V*alpha (V))),所以总复杂度为(O(ElogV)),实现起来也非常简单。
代码
参考bzoj2429的题解。