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

2021-08-15 15:29:26 字數 2343 閱讀 9930

關於什麼是prim(普里姆演算法)?

在實際生活中,我們常常碰到類似這種一類問題:如果要在n個城市之間建立通訊聯絡網,

則連通n個城市僅僅須要n-1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提

下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得

其全部邊的經費之和最小.

這個問題能夠轉換為乙個圖論的問題:圖中的每乙個節點看成是乙個城市,

節點之間的無向邊表示修建該路的經費。即每條邊都有其對應的權值,而我們的目標是挑選n-1條

邊使全部節點保持連通。而且要使得經費之和最小.

這裡存在乙個顯而易見的事實是: 最優解中必定不存在迴圈(可通過反證法證明). 因此。最後找

出的包括全部城市的連通子圖必定沒有環路。

這樣的連通且沒有環路的連通圖就簡稱為樹。而在乙個

連通圖中刪除全部的環路而形成的樹叫做該圖的生成樹.對於城市建立通訊連通網。須要找出的樹由

於具有最小的經費之和。因此又被稱為最小生成樹(minimum cost spanning tree),簡稱mst.

基本思路?

帶權圖:邊賦以權值的圖稱為網或帶權圖,帶權圖的生成樹也是帶權的,生成樹t各邊的權值總和稱為該樹的權。

最小生成樹(mst):權值最小的生成樹。

生成樹和最小生成樹的應用:要連通n個城市需要n-1條邊線路。可以把邊上的權值解釋為線路的造價。則最小生成樹表示使其造價最小的生成樹。

因為生成樹必須包括原圖裡面的全部節點。關鍵的問題就在於邊的選擇,怎麼才幹找出n-1條邊,

使得全部節點連通。而且權重最小呢? 這裡。我們先來看看mst有什麼特點

設有上圖所看到的的最小生

成樹t,假設刪除邊(u,v)

∈t,則t將被分解成兩個子樹:t1和t2,因此。t1和t2各自是其所包括節點的最

小生成樹。此處可用反證法證明:如果t1(也可如果為t2)不是其所包括節點的最小生成樹。那麼,勢必

還存在的生成樹t',那麼,t'+w(u,v)+t2

故結論成立.

這就是最小生成樹的

最優子結構性質

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

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

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

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

圖例說明

不可選可選

已選(vnew)

此為原始的加權連通圖。每條邊一側的數字代表其權值。--

-頂點d被任意選為起始點。頂點a、b、e和f通過單條邊與d相連。a是距離d最近的頂點,因此將a及對應邊ad以高亮表示。

c, g

a, b, e, f

d下乙個頂點為距離d或a最近的頂點。b距d為9,距a為7,e為15,f為6。因此,f距d或a最近,因此將頂點f與相應邊df以高亮表示。

c, g

b, e, f

a, d

演算法繼續重複上面的步驟。距離a為7的頂點b被高亮表示。

cb, e, g

a, d, f

在當前情況下,可以在

c、e與

g間進行選擇。

c距b為8,

e距b為7,

g距f為11。點

e最近,因此將頂點

e與相應邊

be高亮表示。

無c, e, g

a, d, f, b

這裡,可供選擇的頂點只有c和g。c距e為5,g距e為9,故選取c,並與邊ec一同高亮表示。

無c, g

a, d, f, b, e

頂點g是唯一剩下的頂點,它距f為11,距e為9,e最近,故高亮表示g及相應邊eg。無g

a, d, f, b, e, c

現在,所有頂點均已被選取,圖中綠色部分即為連通圖的最小生成樹。在此例中,最小生成樹的權值之和為39。無無

a, d, f, b, e, c, g

參考**

#include#include#define max 1000000000;

int a[1001][1001],d[1001],p[1001];

int main()

for(i=1;i<=n;i++)

d[i]=1000000000;

d[1]=0;

for(i=2;i<=n;i++)

p[t]=j;

for(j=1;j<=n;j++)

if(a[t][j]=0&&d[j]>a[t][j])

printf("%d",ans);

return 0;

}

最小生成樹 普里姆演算法

普利姆演算法 最小生成樹 把所有頂點分為 2 個集合 乙個表示已經選中的頂點集合 另乙個表示未選中的頂點集合 例如 a,b,c,d,e 五個頂點 1.任意選擇乙個頂點 放在 已經選中的頂點集合中 假如 選a 2.將a 與未選中頂點集合中 選擇 一頂點 條件 權值最小的乙個頂點 如何權值相同 則任意選...

最小生成樹 普里姆演算法

當我們要求解n個連線城市之間的路線問題,就需要我們進行乙個計算。而在連通網上面,我們稱這類問題為最小代價生成樹 最小生成樹 問題。今天我們主要討論的是用普里姆演算法實現最小生成樹。如圖所示,a圖是乙個有權值的連通圖。要對其進行最小生成樹求解,假設初始點為v1,尋找與1有關係而且權值最小的頂點 圖源嚴...

普里姆演算法 最小生成樹

include includeusing namespace std 普里姆演算法求最小生成樹 先取一點,然後求其周圍各點最近的,將其納入最小生成樹裡面,再在生成最小生成樹周圍求最近的,之後再納入,這樣不斷遍歷每個節點 void minispantree prim mgraph g for int ...