反向删除算法的证明

时间:2015-02-27 06:00:56

标签: algorithm graph proof proof-of-correctness

是这个证明,在维基百科页面https://en.wikipedia.org/wiki/Reverse-delete_algorithm(页面底部)中提供了吗?

伪代码

 1  function ReverseDelete(edges[] E)
 2    sort E in decreasing order
 3    Define an index i ← 0
 4    while i < size(E)
 5       Define edge ← E[i]
 6         delete E[i]
 7         if edge.v1 is not connected to edge.v2
 8             E[i] ← edge
 9         i ← i + 1
 10   return edges[] E

证明由两部分组成。首先,证明了应用算法后剩余的边缘形成了生成树。其次,证明了生成树的重量最小。

生成树

算法产生的剩余子图(g)没有断开,因为算法在第7行检查它.resualt子图不能包含一个循环,因为如果它确实那么当沿着我们将遇到的边缘移动时循环中的最大边缘,我们将删除该edge.thus g必须是主图G的生成树。

极小性

我们通过归纳证明以下命题P为真:如果F是在while循环结束时保留的边集,那么有一些最小生成树(它的边缘)是F的子集。 / p>

显然P在while循环开始之前保持不变。由于加权连通图始终具有最小生成树,并且由于F包含图的所有边,因此该最小生成树必须是F的子集。

现在假设某些非最终边集F的P为真,并且让T为F中包含的最小生成树。我们必须证明,在删除算法中的边e之后,存在一些(可能是其他的)生成树T',它是F的一个子集。

如果下一个删除的边e不属于T,那么T = T'是F的子集,P成立。

否则,如果e属于T:首先请注意该算法仅删除不会导致F中断开连接的边。所以e不会导致断线。但删除e会导致树T断开连接(因为它是T的成员)。假设e将T分成子图t1和t2。由于在删除e之后连接整个图形,因此在t1和t2之间必须存在路径(除了e之外),因此在F中必须存在循环C(在移除e之前)。现在我们必须在这个循环中有另一个边缘(称之为f),它不在T中但是在F中(因为如果所有循环边缘都在树T中那么它将不再是树)。我们现在声称T'= T - e + f是F的子集的最小生成树。

首先我们证明T'是生成树。我们知道通过删除树中的边并添加另一个不会导致循环的边,我们得到另一个具有相同顶点的树。因为T是生成树所以T'也必须是生成树。因为添加“f”不会导致任何循环,因为“e”被删除。(注意树T包含图形的所有顶点)。

其次我们证明T'是最小生成树。边缘“e”和“f”有三种情况。 wt是权重函数。

wt(f)&lt; wt(e)这是不可能的,因为这会导致树T'的重量严格小于T.由于T是最小生成树,因此根本不可能。

wt(f)> wt(e)这也是不可能的。从那时起,当我们以边缘权重的递减顺序经过边缘时,我们必须首先看到“f”。因为我们有一个循环C所以删除“f”不会导致F中的任何断开,所以算法会先从F中删除它。因此F中不存在“f”这是不可能的(我们已经证明f存在于步骤4中。

所以wt(f)= wt(e)所以T'也是最小生成树。 P持有。     因此,当while循环完成时(即我们已经看到所有边缘时)P保持,并且我们在结束时证明F变为生成树,并且我们知道F具有最小生成树作为其子集。所以F必须是最小的生成树本身。

修改

实际上我对段落有疑问“首先我们证明T'是生成树”,“我们在末尾F证明的部分成为生成树,我们知道F有一个最小生成树作为其子集所以F必须是最小的生成树本身

0 个答案:

没有答案