Kruskal 算法

设 T 是结果边集,初始时其值为空


证明

首先,证明 Kruskal 算法生成的图是生成树

如果一个图不是生成树,那么分为两种情况:

综上所述,Kruskal 算法生成的图是生成树

然后,证明 Kruskal 算法生成的生成树是最小生成树

设:

现在通过把 U 转换为 T,即将 T 中的边加入到 U,来证明 U 和 T 具有相同的代价。

首先将 a1 加入到 U 中,因为 U 是生成树,所以加入 a1 后,必然形成一个环,且这个环必然包含 x1、x2、...、xk 中的边。(否则,a1 与 E 形成环,而 E 也在 T 中,这与 T 中无环相矛盾)

删除这个环中属于 x1、x2、...、xk,且代价最大的边 xi,构成一个新的生成树 V。

假设 a1 大于 xi,按照 Kruskal 算法,xi 应该在 a1 之前被考虑,而 a1 在 a2、...、ak 之前被考虑,所以在考虑 xi 之前,T 中的边只能是 E 中的边。而 xi 既然没有被加入到 T,说明其必然与 E 中的边形成环。xi 和 E 都在 U 中,这与 U 是生成树相矛盾,所以 a1 不大于 xi。

假设 a1 小于 xi,那么 V 的代价小于 U 的代价,这于 U 是最小生成树相矛盾,所以 a1 不小于 xi。

综上所述,a1 等于 xi,所以 V 的代价等于 T 的代价。

依此类推,将 a2、...、ak 逐个地加入到 U,最终得到的树 T 与 U 具有相同的代价


参考文档