乙個連通圖的生成樹是圖的極小連通子圖,它包含圖中的所有定點,並且只含盡可能少的邊,這意味著對於生成樹來說,就砍去使生成樹變成非連通圖;若給它怎家一條邊就會形成圖中的一條迴路。
對於乙個帶權連通無向圖g=(v,e),生成樹不同,每個樹的權也可能不同。設w為g的所有生成樹的集合,若t為g中邊的權值之和最小的那棵生成樹,則t成為g的最小生成樹。
prim演算法的執行非常類似於尋找圖的最短路徑的dijkstra演算法。假設n=是連通網,et是n上最小生成樹中邊的集合。演算法從vt=(u0∈v),et={}開始,重複執行下述操作:在所有u∈vt,v∈v-vt的邊(u,v)∈e中找一條代價最小的邊(u0,v0)並加入集合et,同時將v0併入vt,直到vt=v為止。此時et中必有n-1條邊,則t=為n的最小生成樹。
prim算分的步驟如下:
初始化:向空樹t=(vt,et)中新增圖g=(v,e)的任一定點u0,使vt=,et=空集;
迴圈下述操作:從圖g中選擇滿足且具有最小權值的邊(u,v),並置vt=vt∪,et=et∪。
第一步:
從圖中選擇一條最短的邊加入集合,不難看出,1是此時最短的邊。
第二步:
此時我們可以從v1,v2兩個頂點出發,尋找下乙個定點與這兩個頂點之一相連,並且能使相連的這條邊是最短的,所以我們下乙個選擇的是v6,此時頂點集合有:v1,v3,v6。
第三步:
從v1,v3,v6三個頂點出發,我們要尋找下一條最短的邊,不難發現,此時2是最短的那一條邊,連線v6,v4,所以把它加入邊的集合(要注意,加入的邊不能使生成樹帶有迴路!),此時頂點集合:v1,v3,v4,v6
第四步:
從v1,v3,v6,v4四個頂點出發,尋找下一條最短的邊並且不能使生成樹帶有迴路,此時可以發現,v3到v2的5是最短的這條邊。
第五步:
最後一步,從v1,v2,v3,v6,v4的頂點出發,尋找嚇下一條最短的邊,並且不能形成迴路,很明顯v2到v5這條邊最短,加入之後最小生成樹已經形成。
void prim(g,t);//新增任一頂點)
while((v-u)!=空集); //頂點歸入輸}}
prim演算法的時間複雜度為o(|v|²),不依賴於|e|,因此它很適合於求解邊稠密的圖的最小生成樹,雖然採用其他辦法可以改進prim演算法的時間複雜度,但增加了實現的複雜性。 普里姆(Prim)演算法
普里姆 prim 演算法 網類 template class netgraph 析構函式 void print 列印鄰接矩陣 void minispantree prim prim演算法生成最小生成樹 獲取資料el在頂點表中的位置 template int netgraph getposition ...
普里姆Prim演算法介紹
普里姆 prim 演算法,和克魯斯卡爾演算法一樣,是用來求加權連通圖的最小生成樹的演算法。基本思想 對於圖g而言,v是所有頂點的集合 現在,設定兩個新的集合u和t,其中u用於存放g的最小生成樹中的頂點,t存放g的最小生成樹中的邊。從所有u u,v v u v u表示出去u的所有頂點 的邊中選取權值最...
演算法之 普里姆(Prim)演算法
普里姆演算法 prim s algorithm 是圖中的一種演算法,可在加權連通圖中搜尋最小生成樹。該演算法的作用就是根據圖中權值找到連線所有頂點的最短路徑,也就是連線所有頂點的最小權值之和,也是這個加權圖中的最小生成樹。1.選取權值最小邊的其中乙個頂點作為起始點。2.找到離當前頂點權值最小的邊,並...