關於什么是Prim(普里姆算法)?
在實際生活中,我們常常碰到類似這種一類問題:如果要在n個城市之間建立通信聯絡網,
則連通n個城市僅僅須要n-1條線路。這時。我們須要考慮這樣一個問題。怎樣在最節省經費前提
下建立這個通信網.換句話說,我們須要在這n個城市中找出一個包括全部城市的連通子圖,使得
其全部邊的經費之和最小. 這個問題能夠轉換為一個圖論的問題:圖中的每一個節點看成是一個城市,
節點之間的無向邊表示修建該路的經費。即每條邊都有其對應的權值,而我們的目標是挑選n-1條
邊使全部節點保持連通。而且要使得經費之和最小.
這里存在一個顯而易見的事實是: 最優解中必定不存在循環(可通過反證法證明). 因此。最后找
出的包括全部城市的連通子圖必定沒有環路。
這樣的連通且沒有環路的連通圖就簡稱為樹。而在一個
連通圖中刪除全部的環路而形成的樹叫做該圖的生成樹.對於城市建立通信連通網。須要找出的樹由
於具有最小的經費之和。因此又被稱為最小生成樹(Minimum Cost Spanning Tree),簡稱MST.
基本思路?
因為生成樹必須包括原圖里面的全部節點。關鍵的問題就在於邊的選擇,怎么才干找出n-1條邊,
使得全部節點連通。而且權重最小呢? 這里。我們先來看看MST有什么特點設有上圖所看到的的最小生
成樹T,假設刪除邊(u,v)∈T,則T將被分解成兩個子樹:T1和T2,因此。T1和T2各自是其所包括節點的最
小生成樹。此處可用反證法證明:如果T1(也可如果為T2)不是其所包括節點的最小生成樹。那么,勢必
還存在的生成樹T',那么,T'+w(u,v)+T2<T1+w(u,v)+T2。這與我們的如果T是最小生成樹相矛盾,
故結論成立.
這就是最小生成樹的最優子結構性質。在細想一下,MST也包括了重疊子問題的性質,那么似乎我們
能夠用動態規划來解決.但假設用動態規划來解決MST,其時間復雜度是指數級別的。顯然不是太可取,
我們須要找尋更好的方法.既然MST滿足最優子結構性質,那么它是否滿足貪婪選擇屬性呢?
為了更好地理解最小生成樹請看例如以下的樣例:
增加一個地區有9個城鎮,鎮長要求你把這九個城鎮聯通起來,可是要求消耗最少,就是走的路最少。
如圖:
代表九個城鎮。而且相鄰城鎮之間的道路消耗已經標了出來,要求聯通全部消耗最好。
那么能夠得到例如以下幾種情況:
1.
總消耗:=11 + 26 + 20 + 22 + 18 + 21 + 24 + 19 = 161
2、
總消耗:=8+12+10+11+17+19+16+7= 100
3、
總消耗:=8+12 + 10+11 +16 +19 + 16 +7 = 99
綜上三圖可知最后一個以微小的差距贏了第二個。
這樣的就叫做最小生成樹。
對於Prim的算法:
設圖G=(V,E),U是頂點集V的一個非空子集。假設(u,v)是一條具有最小權值的邊。當中u∈U,v∈V-U,
則必存在一棵包括邊(u,v)的最小生成樹.
上述的性質能夠通過反證法證明。假設(u,v)不包括在G的最小生成樹T中。那么,T的路徑中必定存
在一條連通U和V-U的邊,假設將這條邊以(u,v)來替換,我們將獲得一個權重更低的生成樹,這與T
是最小生成樹矛盾.既然MST滿足貪婪選擇屬性。那么。求解最小生成樹的問題就簡化了非常多。
總結一下,詳細的步驟大概例如以下:
構建一棵空的最小生成樹T,並將全部節點賦值為無窮大.
- 構建一棵空的最小生成樹T。並將全部節點賦值為無窮大.
- 任選一個節點放入T。另外一個節點集合為V-T.
- 對V-T中節點的賦值進行更新(因為此時新增加一個節點,這些距離可能發生變化)
- 從V-T中選擇賦值最小的節點,增加T中
- 假設V-T非空,繼續步驟3~5,否則算法終結