最小生成樹的一些證實

轉自:關於最小生成樹的一些理解

(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的矩形。構造一個無向圖,節點就是矩形頂點,邊就是矩形的邊,邊權就是矩形邊長。顯然,原圖有兩棵最小生成樹(「兩寬與一長」),全部邊都在某棵最小生成樹上,可是有兩棵生成樹不是最小生成樹(「兩長與一寬」)。

相關文章
相關標籤/搜索