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

2021-09-07 13:39:49 字數 2612 閱讀 9114

關於什麼是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

故結論成立.

這就是最小生成樹的

最優子結構性質

。在細想一下,mst也包括了重疊子問題的性質,那麼似乎我們

能夠用動態規劃來解決.但假設用動態規劃來解決mst,其時間複雜度是指數級別的。顯然不是太可取,

我們須要找尋更好的方法.既然mst滿足最優子結構性質,那麼它是否滿足貪婪選擇屬性呢?

為了更好地理解最小生成樹請看例如以下的樣例:

增加乙個地區有9個城鎮,鎮長要求你把這九個城鎮聯通起來,可是要求消耗最少,就是走的路最少。

如圖:

代表九個城鎮。而且相鄰城鎮之間的道路消耗已經標了出來,要求聯通全部消耗最好。

那麼能夠得到例如以下幾種情況:

總消耗:=11 + 26 + 20 + 22 + 18 + 21 + 24 + 19 = 161

總消耗:=8+12+10+11+17+19+16+7= 100

總消耗:=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,否則演算法終結

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

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

關於什麼是prim 普里姆演算法 在實際生活中,我們經常碰到類似這樣的一類問題 假設要在n個城市之間建立通訊聯絡網,則連通n個城市只需要n 1條線路。這時,我們需要考慮這樣乙個問題,如何在最節省經費前提 下建立這個通訊網.換句話說,我們需要在這n個城市中找出乙個包含所有城市的連通子圖,使得 其所有邊...

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

prim 演算法是一種貪心演算法 適合稠密圖 設g v,e 是無向連通帶權圖,v 設最小生成樹 t u,e 演算法結束時 u v,e e。貪心選擇的思想是 每次對於還未加入到 u 中 即 v u 中 所有點頂,從這些頂點中選擇乙個頂點,選擇的標準是,它距離 u 最近 和 u 中某個頂點的權值最小 將...

最小生成樹 普里姆演算法 Prim

最小生成樹 的7到12行先初始化了矩陣第一行的值,本來很奇怪,那其他行的值怎麼辦?看到最後的28 35行才知道,原來從下面開始會逐步初始化與上個頂點相關的邊的值,最後能夠把全部都初始化了。截圖如下 演算法定義 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 v new 其中x為集...