从孤立顶点逐步合并森林

算法起初不选任何边,把每个顶点看作单独一棵树。将候选边按权重排序后依次检查:若两端已经由已选边连通,加入它会形成环,便跳过;若分属不同部分,就接入该边并合并这两个部分。

在连通图中,选满V减一条边后,森林成为覆盖全部V个顶点的树。每次接入的并不一定与同一个起点相邻,因此结构可以同时在多个区域生长;这与Prim维护一棵向外扩展的树有明显区别。

参考:[1]

用并查集识别会形成环的选择

并查集为每个当前连通部分维护身份。检查一条边时,先比较两个端点的代表;代表相同表示已存在一条已选路径,再加边就会成环,代表不同则在接入后执行合并。它避免每次都从头遍历整片已选子图。

最优性来自全局按权排序与安全接边规则共同作用,而不只是“不要成环”。当前两个部分之间最先遇到的合适轻边,符合相应割上的安全选择;任意挑一批不成环边虽然也可能得到生成树,却不保证总权重最小。

参考:[1] [2]

排序成本与断开图

在连通图上,通常先排序E条边,再配合高效并查集处理,标准实现的最坏时间为O(E log E),还需保存边与组件状态。若边已经按合适顺序给出,排序部分的工作可以不同;成本结论应说明输入表示与实现。 一般断开图还须计入初始化全部V个顶点的工作;存在大量孤立点时,不能只按边数估算,额外存储也须包含顶点状态。

算法允许负权和相同权重,遇到并列时可能选择不同的同成本树。原图断开时,处理完候选边仍无法连接所有顶点,结果是最小生成森林;不能把它误报为已经得到一棵覆盖全图的连通树。

参考:[2] [1] [3]