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