“Kruskal 算法从许多单点分量出发,按全局边序逐渐合并;Prim 始终只有一棵活动树。Borůvka 算法又让所有分量并行选择出边。三者共享割性质,但 Prim 的键更新、Kruskal…”
形式陈述 ​
给定有限无向带权图 find(u) != find(v) 检测前一种情形,用 union(u,v) 完成合并。
正确性不变量是
若原图有
设 find/union 总耗时
直觉
Kruskal 把每个顶点先看作一座孤岛,再按造价从低到高开放桥梁。若一座桥连接两座已经互通的岛,它只会制造环而不会扩大可达范围;若连接两个分量,它又是当前能跨过相应分量割的最便宜选择,可以安全保留。
算法的进度由“全局边序”驱动,而非某棵树的前沿。许多小树会同时成长并逐步合并,所以输出不依赖根,也不维护从根到顶点的键。
例子与边界
设四个顶点的边权为
算法接受
负权边只会更早出现,不影响正确性。不连通输入自然停在多个树上,不需要伪造无穷权连接。平行边按独立边 ID 排序:若较轻者已连接两个端点,较重平行边随后会被判为成圈;自环的两个端点从一开始就在同一分量,永远跳过。
相同权边的扫描顺序可能改变树。例如四边形四条边都为
推论与应用
Kruskal 很适合边列表与稀疏离线输入,因为主访问模式是一遍排序后顺序扫描。单链接聚类可把当前并查集分量视为簇,在只剩目标簇数时停止;下一条跨簇边的权重就是这一级合并阈值。外存输入的主成本可能是排序 I/O,此时 RAM 的
Prim 算法维护一棵活动树及外部顶点键,Kruskal 维护许多分量与全局边序。Borůvka 算法则每轮为所有分量并行挑选最轻出边并收缩。若图持续插删边,删除一条已选边会要求在线寻找替代跨割边;静态排序和普通并查集都不能支持这种拆分,需另用动态最小生成森林结构。
参考资料
- Joseph B. Kruskal, “On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem,” Proceedings of the American Mathematical Society 7(1), 1956, pp. 48–50。
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,§21.2。
- Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,§4.5。