让T’ 是一个边集,使得|T| = |T’|。证明W(T) <= W(T’)。
你会很难做到这一点,因为它通常是错误的。
考虑
1
A---B
2 \ / 3
C
| 4
D
Kruskal 算法生成边集T = { (A,B), (A,C), (C,D) },这是唯一的最小生成树。
但边集T' = { (A,B), (A,C), (B,C) } 与T 具有相同的基数,并且
W(T') = 6 < W(T) = 7
问题陈述中缺少一些条件(例如 T' 应该连接图表)。
你是对的。忘了说T'没有循环了
在这种情况下,T' 跨越一棵树(1)。并且由于假设|T'| = |T|,所以T'跨越的树连接图,即是一棵生成树。
(1) 由于没有循环,直接得出T' 的每个连通分量都是一棵树。具有n 顶点的树具有n-1 边。因此如果T' 有k 连通分量,则图中的顶点数为
V = |T'| + k
但T 是一棵生成树,而|T| = |T'|,因此
V = |T| + 1 = |T'| + 1
这意味着k = 1。
因此要求您简单地证明 Kruskal 算法的正确性。你可以很容易地在文献中找到证明,例如on wikipedia。
正确性证明(通过对顶点数的归纳):
引理:设G 是具有N > 1 顶点的连通图,而T 是G 的最小生成树。让e 成为T 中的一个边。
然后T \ {e} 通过识别e 的两个端点a 和b 投影到从G 获得的图G' 的最小生成树。相反,如果T' 是G 的一组边投影到G' 的最小生成树,则T' ∪ {e} 是G 的最小生成树。
证明:设p : G -> G' 是标识a 和b 的投影。
那么p(T \ {e}) 没有循环。
假设p(T \ {e}) 包含一个循环C。那么p^(-1)(C) 必须是连接a 和b 的路径。但随后T 将包含循环p^(-1)(C) ∪ {e},这与T 是一棵树的前提相矛盾。
因此p(T \ {e}) 是G' 与基数N - 2 的无循环边集,这意味着(见上文)它是一棵生成树。
让T'' 成为G' 和S = p^(-1)(T'') 的最小生成树。
那么S ∪ {e} 没有循环。
如果S 中存在循环,则将投影到T'' 中的循环,因此S ∪ {e} 中的每个循环都必须包含e。假设C 是S ∪ {e} 中的一个循环。那么C \ {e} 是连接a 和b 的路径,因此C \ {e} 投影到G' 中的一个循环,因为a 和b 投影到G' 的同一顶点。这与T'' 是一棵树的前提相矛盾。
所以S ∪ {e} 是基数N - 1 的边集,没有循环,因此(见上文)G 的生成树。
那么W(T) <= W(S ∪ {e}) 因为T 是最小生成树,因此
W(p(T \ {e})) = W(T \ {e}) <= W(S) = W(T'')
由于T'' 被假定为G' 的最小生成树,因此等式成立,p(T \ {e}) 是G' 的最小生成树,S ∪ {e} 是最小生成树G 的树。
现在进行归纳以证明 Kruskal 算法的正确性:
对于一个至多有两个顶点的图,很明显该算法会产生一个最小生成树。
对于n >= 2,假设算法对所有最多具有n 顶点的连接图的正确性。 (归纳假设)
让G 是一个有n+1 顶点的连通图。让e 成为算法中选择的第一条边,a 和b 是它的端点。
让G' 是通过识别a 和b 和p :: G -> G' 投影从G 获得的图形。
设T为算法选择的边集。
那么p(T \ {e})是Kruskal算法在G'上选择的边集。因此,根据上面的引理,T 是G 的最小生成树。
(好吧,维基百科中的证明可能更简单,但我想制作一个不同的证明。)