⑴ 普里姆演算法的普里姆演算法的實現
為了便於在兩個頂點集U和V-U之間選擇權最小的邊,建立了兩個輔助數組closest和lowcost,它們記錄從U到V-U具有最小權值的邊,對於某個j∈V-U,closest[j]存儲該邊依附的在U中的頂點編號,lowcost[j]存儲該邊的權值。
為了方便,假設圖G採用鄰接矩陣g存儲,對應的Prim(g,v)演算法如下:
void Prim(MatGraph g,int v) //輸出求得的最小生樹的所有邊
{ int lowcost[MAXVEX]; //建立數組lowcost
int closest[MAXVEX]; //建立數組closest
int min,i,j,k;
for (i=0;i<g.n;i++) //給lowcost[]和closest[]置初值
{ lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for (i=1;i<g.n;i++) //構造n-1條邊
{ min=INF; k=-1;
for (j=0;j<g.n;j++) //在(V-U)中找出離U最近的頂點k
if (lowcost[j]!=0 && lowcost[j]<min)
{ min=lowcost[j];
k=j; //k為最近頂點的編號
}
printf( 邊(%d,%d),權值為%d
,closest[k],k,min);
lowcost[k]=0; //標記k已經加入U
for (j=0;j<g.n;j++) //修正數組lowcost和closest
if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j])
{ lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
普里姆演算法中有兩重for循環,所以時間復雜度為O(n2),其中n為圖的頂點個數。由於與e無關,所以普里姆演算法特別適合於稠密圖求最小生成樹。
⑵ 最小生成樹 普里姆演算法有問
普里姆演算法構造最小生成樹演算法的思想是:選擇一個結點,然後從這個結點開始,選擇權值最小的邊,用一條邊連接,然後再以前面的那個結點開始,和你連接的那個結點作為根節點,再選擇權值最小的邊進行連接。
對權值給出解釋:以上圖為例,權值就是你第一個圖那幾條邊(弧)上,所標的數字。
對樓主所提出的問題:並不是連接那圓圈中最小的圓圈,如果沒錯的話,那圓圈中的數字表示的是V1---V6六個頂點,並不是代表數字,以3和6為頂點,找權值最小邊,顯然6——4為最小,即權值為2,頂點364相連接的時候各以364為頂點尋找最小邊,應該先從6連接到2,那麼現在加入頂點的為3642頂點,現在以3642為頂點尋找最小邊,應該從2連接到1,現在被連接的有63421,在以63421為頂點尋找最小邊
出現了問題:如果以5為權值的話,無論從2連接到4還是從3連接到4都出現了環,當然我們知道數中是不能出現環的,所以尋找次小的,剩餘5與13之間權值最小為13.所以將1連接5,即得到最小生成樹。
樓主可以按照我說的在紙上畫一下試試
從6連接到3因為有前提條件:從頂點V3開始用普里姆方法求其最小生成數,可見是從頂點3連接到6,而不是從6連接到3
希望可以解決樓主的疑惑,謝謝!
⑶ 鍥炬墍紺烘槸涓涓鏃犲悜甯︽潈鍥,璇峰垎鍒鎸塒rim綆楁硶鍜孠ruskal綆楁硶奼傛渶灝忕敓鎴愭爲.
•鏅閲屽嗭紙Prim錛夌畻娉
鍩烘湰鎬濇兂
鍋囪綨=(V,E)鏄涓涓鍏鋒湁n涓欏剁偣鐨勮繛閫氱綉錛孴=(U,TE)鏄鎵奼傜殑鏈灝忕敓鎴愭爲錛屽叾涓璘鏄疶鐨勯《鐐歸泦錛孴E鏄疶鐨勮竟闆嗐
錛1錛夊垵濮婾={u0}(u0鈭圴),TE=蠁錛
錛2錛夊湪鎵鏈塽鈭圲,v鈭圴-U鐨勮竟涓閫変竴鏉′唬浠鋒渶灝忕殑杈癸紙u0錛寁0錛夊苟鍏ラ泦鍚圱E錛屽悓鏃跺皢v0騫跺叆U錛
錛3錛夐噸澶嶏紙2錛夛紝鐩村埌U=V涓烘銆
姝ゆ椂錛孴E涓蹇呭惈鏈塶-1鏉¤竟錛屽垯T=錛圴錛寋TE}錛変負N鐨勬渶灝忕敓鎴愭爲銆
娉ㄦ剰錛1.鏈灝忕敓鎴愭爲涓嶅敮涓銆
2.璇ュ浘浠庤妭鐐規渶灝忓紑濮嬨
⑷ 利用普里姆演算法求解最小生成樹,寫出步驟或畫圖表示過程。
<1,6>邊長度未知,這里看成無窮大。
歷次循環中,選擇兩端點分別在U,V中的邊中長度最小者,
具體如下:
1. 將1加入U中,其餘點加入V中。
2. 選擇邊<1,7>,將7加入U中,從V中除去該點。
3. 選擇邊<7,6>,將6加入U中,從V中除去該點。
4. 選擇邊<1,2>,將2加入U中,從V中除去該點。
5. 選擇邊<2,3>,將3加入U中,從V中除去該點。
6. 選擇邊<2,4>,將4加入U中,從V中除去該點。
7. 選擇邊<2,5>,將5加入U中,從V中除去該點。
結束。由上述六條邊組成的樹為求得的最小生成樹。
⑸ 什麼是普利姆演算法
Prim演算法:是圖的最小生成樹的一種構造演算法。
假設 WN=(V,{E}) 是一個含有 n 個頂點的連通網,TV 是 WN 上最小生成樹中頂點的集合,TE 是最小生成樹中邊的集合。顯然,在演算法執行結束時,TV=V,而 TE 是 E 的一個子集。在演算法開始執行時,TE 為空集,TV 中只有一個頂點,因此,按普里姆演算法構造最小生成樹的過程為:在所有「其一個頂點已經落在生成樹上,而另一個頂點尚未落在生成樹上」的邊中取一條權值為最小的邊,逐條加在生成樹上,直至生成樹中含有 n-1條邊為止。
如果看不懂還可以找一本數據結構的書看,這個演算法挺簡單的。
btw:其實你有空問,應該有空網路啊~網路就有了。懶得寫,我還是直接從網路過來的~
⑹ prim演算法是什麼
prim演算法是圖論中的一種演算法。
普里姆演算法(Prim演算法),圖論中的一種演算法,可在加權連通圖里搜索最小生成樹。意即由此演算法搜索到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點(英語:Vertex (graph theory)),且其所有邊的權值之和亦為最小。
簡介
最小生成樹是數據結構中圖的一種重要應用,它的要求是從一個帶權無向完全圖中選擇n-1條邊並使這個圖仍然連通(也即得到了一棵生成樹),同時還要考慮使樹的權最小。
為了得到最小生成樹,人們設計了很多演算法,最著名的有prim演算法和kruskal演算法。教材中介紹了prim演算法,但是講得不夠詳細,理解起來比較困難,為了幫助大家更好的理解這一演算法,本文對書中的內容作了進一步的細化,希望能對大家有所幫助。
⑺ 用普里姆演算法構造如圖所示的圖G的一棵最小生成樹。
解:使用普里姆演算法構造出如下圖G的一棵最小生成樹。