最小生成樹之Prim(普里姆)算法


關於什么是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,並將全部節點賦值為無窮大.

  1. 構建一棵空的最小生成樹T。並將全部節點賦值為無窮大.
  2. 任選一個節點放入T。另外一個節點集合為V-T.
  3. 對V-T中節點的賦值進行更新(因為此時新增加一個節點,這些距離可能發生變化)
  4. 從V-T中選擇賦值最小的節點,增加T中
  5. 假設V-T非空,繼續步驟3~5,否則算法終結

這就是最小生成樹和Prim算法的解說。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM