最小生成树的一些证实

转自:关于最小生成树的一些理解

(1)       定义在一棵树里添加一条边,并在产生的圈里删除一条边叫作一次操做。(也就是说换掉一条边而且保证结果是树),则树A和B是无向图的两个生成树,则A能够经过若干次操做变成B。html

证:把树看做边的集合,若是B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。算法

 

注:这个命题比较容易证,它告诉咱们任何两棵生成树均可以经过不断换边获得。(重要的是换边的过程当中始终保持是树。)spa

“能够经过若干次操做”,这个“能够”并无“特殊”的含义,也就是说咱们能够随便加一条B有而A没有的边,总能够找到一条合适的边删掉。htm

 

(2)       把一个连通无向图的生成树边按权值递增排序,称排好序的边权列表为有序边权列表,则任意两棵最小生成树的有序边权列表是相同的。(算法导论23.1-8)blog

 

证:设最小生成树有n条边,任意两棵最小生成树分别称为A, B, 若是e是一条边,用w(e)表示该边的权值。排序

A的边按权值递增排序后为a1, a2,……an   w(a1)≤w(a2)≤……w(an)ci

B的边按权值递增排序后为b1, b2,……bn  w(b1)≤w(b2)≤……w(bn)get

设i是两个边列表中,第一次出现不一样边的位置,ai≠bi方法

不妨设w(ai)≥w(bi)集合

情形1  若是树A中包含边bi,则必定有j>i使得  bi=aj ,事实上,这时有 w(bi)=w(aj)≥w(ai) ≥w(bi) 故 w(bi)=w(aj)=w(ai),在树A的边列表中交换边ai和 aj的位置并不会影响树A的边权有序列表,两棵树在第i个位置的边变成同一条边。

 

情形2  树A中并不包含边bi,则把bi加到树A上,造成一个圈,因为A是最小生成树,这个圈里任意一条边的权值都不大于w(bi) ,另外,这个圈里存在边aj不在树B中。所以,有w(aj)≤w(bi),且j>i (由于aj不在B中)。因而,有w(bi)≤w(ai)≤w(aj)≤w(bi),所以

w(ai)= w(aj) = w(bi)。那么在树A中把aj换成bi仍然保持它是一棵最小生成树,并不会影响树A的边权有序列表,而且转换成情形1。

 

注:这个命题说明,若是无向图的边权都不相同,则最小生成树是惟一的。可是其逆命题不成立。即若是无向图的最小生成树惟一,则无向图的边权是可能有相同的。例子,好比原图自己就是一棵树,而且有两条边的边权相等。

 

(3)       A,B是同一个无向连通图的两棵不一样的最小生成树,则A能够经过若干次(1)中定义的换边操做,而且保证每次结果仍然是最小生成树,最终转换成B。

 

证:作法和(2)相似,也是要找一条树B有可是树A没有的边。事实上(2)的证实过程“情形2”的部分,就已经找到这样一条边了。按照(2)中给出的方法,就能够把A转换成B。

注:上述证实过程证得了和(1)中相似的结论,可是此时的“能够”暂时有“特殊”的含义,至少证实中须要以必定的规则选边。这显得有点不“美观”。那么,是否能够任意选边呢?考虑任意选边形成的“后果”:把任意一条B有而A没有的边加入到A,因为A是最小生成树,因此造成的圈里全部的边的权值都不大于新加的边,那么若是这个圈里没有其余的这种权值的边,换句话说,若是这个圈里的这条边是惟一权值最大的边怎么办呢?或者,若是这个圈里全部和这条边权值相等的边都也在B中,那么该如何保证换边后,A和B相同的边数增多一条呢?下面证实,这些状况不可能出现。

 

(4)       一个连通无向图G,不会有一棵最小生成树包含G的一个圈中所有最大权值的边。

 

证:设图的节点集合是V。反证,假设有一棵最小生成树T包含G中某个圈的所有权值最大的边,设其中一条边是e, 则在树中删掉边e,T-e是不连通的,它把节点分红了两部分(连通份量),A和B=V-A。在原图G中,这条边在一个圈C里,且在C中权值是最大的。则(C-e)是G中一条路,这条路中有节点在A中,也有节点在B中,所以必然有一条边e’,它一端在A中,一端在B中,显然它不在T-e中。因而把e’加入到T-e中,这样造成的是一棵树T’。(|V|-1条边的连通图显然是树),而因为w(e’)<w(e),有w(T’)<w(T),与T是最小生成树矛盾。

 

注:特别地,若是一个圈中权值最大的边惟一,则最小生成树不包含这条边。

(算法导论上习题23.1-5要证实:若是一条边是一个圈中权值最大的边,必定有一棵最小生成树不包含它。由这个结论能够马上得出。当圈中最大权值的边惟一时,算法导论上这个命题稍弱。)

至此证实了任何两棵不一样的最小生成树A,B,能够随意选一条B有而A没有的边,添加到A上,由(4)的结论,造成的圈里,至少有一条边和这条新加的边权值相同,而且它不在B中,删掉它。这样能够最终把A转化成B。

 

(5)       对于一个连通无向图的生成树,只考虑它的边权,造成的有序边权列表中,最小生成树是有序边权列表字典序最小的。(字典序就是一般的定义,两个序列A,B的字典序相同当且仅当A=B。不然,序列A,B出现最先位置的不相等的元素时,若是序列A的该位置元素更小,则序列A字典序小,反之,则序列B的字典序更小。若是直到一个序列结束都没有这样的位置,则较短的序列字典序小)。

 

证:设A是一棵最小生成树,而B是否是一棵最小生成树。利用(2)的结论,由于任何最小生成树的有序边权列表是相同的,因此能够用Krusal算法产生的最小生成树的有序边权列表。Krusal算法的优势是按边权顺序加边,而且当边权相等时,只要不造成圈,加哪条边均可以造成最小生成树。把B的边都按递增顺序排序:

B的边按权值递增排序后为b1, b2,……bn  w(b1)≤w(b2)≤……w(bn)

用Krusal算法求原图的一棵最小生成树,

具体地,加第i条边时(1≤i≤n),若是对该加的边e,有w(e)=w(bi),则选择bi代替e加入。不可能出现w(e)>w(bi),由于Krusal算法是按边权由小到大考虑加边的,若是出现这种状况,说明,选择bi加入是不合法的——会造成圈,而此时的图是树B的子图,这与B是树矛盾。

 

注:有了(2)的结论,结合Krusal算法的过程,知道Krusal算法加边的顺序构成的边权列表就是一个有序边权列表。因而,只考虑有序边权列表时,能够用Krusal算法产生的特殊的最小生成树代替任何一棵最小生成树。

 

若是一棵树是最小生成树,则对它采起一次(1)中的操做,显然,它的总权值不减。那么它的逆命题是否是成立?也就是若是说一棵生成树,对它采起一次(1)中的操做后,它的总权值不减,它是不是最小生成树?再换句话说,一棵非最小生成树,是否必定能够找到一条边进行(1)中的操做后,总权值会减少?这个命题看起来是显然的,可是是否有可能一棵非最小生成树当前不管怎样采起(1)中的操做都会形成总权值暂时的增大,而至少要操做两次,才能把权值下降呢?答案是不会的。

 

(6)       一棵树不是最小生成树,则必定存在一个(1)中描述的操做,使得操做以后,它的总权值减少。

 

证:设A不是最小生成树,A的边按权值递增排序后为a1, a2,……an   w(a1)≤w(a2)≤……w(an)。利用Krusal算法,加第i条边时(1≤i≤n),若是对该加的边ei,有w(ei)=w(ai),则选择ai代替ei加入。直到第j次时(1≤j≤n),有w(ej)<w (aj),则仍加入ej,自此后仍执行普通的Krusal算法(即任意处理权值相同的边),这样生成的最小生成树E,有w(ej)<w( aj) 且对全部1≤i<j有ei=ai,因为权值递增关系,ej不在A中,那考虑把ej加入到A中造成的圈,圈里其余任意的边ax,若w(ax)≤w(ej)<w (aj),则有x<j,因而这些边是在第j步以前和Krusal算法同样加入的。所以,圈里至少有一条边ay知足w(ay)≥w (aj)>w(ej) (y≥j>x),因而删除ay可让A的总权值减少。

 

注:可见确实有这样的操做。因而马上得出如下结论:

 

(7)       一棵生成树不是最小生成树,则必定存在(1)中的操做,不断进行把它转换成一棵最小生成树,并且每次操做后权树的总权值都会减少。

 

证:由(6)知,存在一个这样的操做,任选一个这样的操做,总权值会减少。这样不断地进行下去,由于不一样的生成树的个数是有限的,因此总权值不可能一直减少下去,也不可能无限逼近与一个常数,最终可使其变成一棵最小生成树。

 

注:由此可知,这种操做也是“任意”选边的,并无特殊性。若是把一个图的全部生成树看做节点,把对每一个生成树进行一次(1)中定义操做看做造成的树做为它的邻居。

那么综合上述结论:造成的图是个无向连通图。任何“局部最优解”也是“全局最优解”(只进行一次操做不能减少总权值,则是最小生成树,能够随意从任何一个“非最优势”,保持权值减少地逐步达到“最优势“)。

 

(8)       若是一棵生成树,任何边都在某棵最小生成树上,则它不必定是最小生成树。

反例:考虑一个长为2,宽为1的矩形。构造一个无向图,节点就是矩形顶点,边就是矩形的边,边权就是矩形边长。显然,原图有两棵最小生成树(“两宽与一长”),全部边都在某棵最小生成树上,可是有两棵生成树不是最小生成树(“两长与一宽”)。

相关文章
相关标签/搜索