Kruskal: 每次考虑最短一条边, 如果会形成回路则不选择该边, 如果不会形成回路则选择该边, 直到选出了n-1条边
要点: 每次都选择不会形成回路的最短边
数学归纳法
① n<=2时, 显然成立
② 设n = k时成立, 则当n = k+1时:
将图划分为 子图A(k) 和 B(1)
∵ n = k时成立
∴ A(k)可以构造最小生成树, 设为T
对于子图B(1), 它与树T有若干条边
注意到:
∵ T是不含回路的, B(1)-T只选择一条边
∴ 选择 B(1)-T 的其中任意一条边都不会形成回路
如果选择B(1)-T中最短的一条边
∵ T是最小的, B(1)-T也是最小的
∴ 选出的树在全局上是最小的(且不含回路)
所以 n=k+1 时成立
这种划分更适用于Prim算法的证明
③ 从另一种角度划分, 设n=a时 和 n=b 时成立, 则当n=a+b时:
将图划分为 子图A(a) 和 B(b)
∵ n=a时成立
∴ A(a)可以构造最小生成树, 设为TA
同理, B(b) 可以构造最小生成树, 设为TB
TA与TB有若干条边
注意到:
∵ TA是不含回路的, TB也是不含回路的, TA-TB只选择一条边
∴ TA-TB 的其中任意一条边被选择都不会形成回路
如果选择TA-TB中最短的一条边
∵ TA是最小的, TB也是最小的, TA-TB也是最小的
∴ 选出的树在全局上是最小的(且不含回路)
所以 n=a+b 时成立
这种划分与Kruskal算法较为贴切: 每次选择不会形成回路的最短边, 就是在考虑局部的两个子树的合并, 局部最优递推出全局最优