1. 程式人生 > 其它 >Kruskal演算法證明(轉載)

Kruskal演算法證明(轉載)

1、演算法概述

用於生成連通無向圖的最小代價生成樹。 2、演算法步驟 步驟一:T是邊的集合,其初始狀態為空; 步驟二:從原圖剩餘邊中選取一條最小代價的邊; 步驟三:看其是否與當前T中其它邊構成環路; 步驟四:如果未構成環路,則加入T中;否則,丟棄該邊; 步驟五:是否還有剩餘邊,如果有則返回步驟二,否則,程式結束。 3、演算法證明 要證明Kruskal演算法生成的是最小生成樹,我們分兩步來證明: (1)Kruskal演算法一定能得到一個生成樹; (2)該生成樹具有最小代價。 證明如下: (1)假設該演算法得到的不是生成樹,根據樹的定義,就有兩種情形,第一是得到的圖是有環的,第二就是得到的圖是不連通的。由於演算法要求每次加入邊都是無環的,所以第一種情形不存在,下面就只需證明第二種情形不存在即可。 假設得到的圖是不連通的,則至少包含兩個獨立的的邊集,假設其中一個為E,則E中邊對應的所有點都無法到達其它邊集對應的點(否則,根據演算法定義,相應的聯絡邊應被加入樹中),而這與原圖是連通的產生矛盾,因此,第二種情形也不可能存在。得證。 (2)假設圖有n個頂點,則生成樹一定具有n-1條邊.由於圖的生成樹個數是有限的,所以至少有一棵樹具有最小代價,假設該樹為U。先做出如下假設: 1)得到的樹為T。 2)U和T中不同的邊的條數為k,其它n-1-k條邊相同,這n-1-k條邊構成邊集E。; 3)在T中而不在U中的邊按代價從小到大依次為a1,a2,...,ak。 4)在U中而不在T中的邊按代價從小到大依次為x1,x2,...,xk。 現在我們通過把U轉換為T(把T的邊依次移入U中),來證明U和T具有相同代價。 首先,我們將a1移入U中,由於U本身是一棵樹,此時任意加一條邊都構成迴路,所以a1的加入必然產生一條迴路,且這條迴路必然包括x1,x2,...,xk中的邊。(否則a1與E中的邊構成迴路,而E也在T中,這與T中無迴路矛盾。) 在這個迴路中刪除屬於x1,x2,...,xk且代價最大邊xi構成一個新的生成樹V。 假設a1代價小於xi,則V的代價小於U,這與U是最小代價樹矛盾,所以a1不可能小於xi。 假設a1大於xi,按照Kruskal演算法,首先考慮代價小的邊,則執行Kruskal演算法時,xi應該是在a1之前考慮,而a1又在a2,...,ak之前考慮,所以考慮xi之前,T中的邊只能是E中的邊,而xi既然沒加入樹T,就說明xi必然與E中的某些邊構成迴路,但xi和E又同時在U中,這與U是生成樹矛盾,所以a1也不可能大於xi。 因此,新得到的樹V與T具有相同代價。 依次類推,把a1,a2,...,ak的邊逐漸加到U中,最終得到的樹(T)與U代價相同。 證明結束。   轉載自http://blog.sina.com.cn/s/blog_70ec9a6f01012c0y.html