下面是一个查找生成树的算法:
STNew(G, w)
Z ← empty array
for each edge e in E, taken in random order do
Z ← Z ∪ e
if Z has a cycle c then
let e' be a maximum-weight edge on c
Z ← Z − e'
return (Z)
此算法是否始终返回生成树?
我会说是的。它有点像伪装的Kruskals算法 - 排序。
我试图用矛盾来证明这一点。见下文。
假设Z不是生成树。这意味着图中存在循环或断开连接。由于算法的第4行,不能有循环。
但是现在,我怎样才能证明没有断线?
作为图论的新手,我真的没有其他想法。有人会有任何想法或建议吗?
答案 0 :(得分:1)
是的,算法总是找到生成树(如果存在,即图表有源)。不确定它是否找到了 minimal 生成树。您已经证明结果图中没有循环,因此我们只需要显示连接性。
证明结果图已连接:
假设它不是,并且(至少)有2个连接的组件U1,U2。
原始图表已连接,因此有一些边缘连接U1
和U2
,让它为e
。检查选择e
并添加到Z
的点。
现在,由于U1
和U2
未连接,因此有一点e
被删除(否则它们已连接)。让我们迭代一些边e'
。涉及的周期包含e
(因为它被删除),因此它包含来自u1
的节点U1
和来自u2
的节点U2
,以便e=(u1,u2)
。 W.L.O,让周期为u1-v1-v2-...-vk-u2-u1
。但请注意,删除e
后,仍有一条路径u1-v1-v2-...-vk-u2
连接U1
和U2
,因此组件仍然连接在一起。对于将来的任何迭代,这都是正确的,这意味着组件U1
和U2
在结果图中连接。
矛盾。
QED