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

2021-07-16 05:46:50 字數 955 閱讀 4591

普里姆演算法的基本思想:普里姆演算法是一種構造最小生成樹的演算法,它是按逐個將頂點連通的方式來構造最小生成樹的。時間複雜度為o(n^2)。

從連通網路n = 中的某一頂點u0出發,選擇與它關聯的具有最小權值的邊(u0, v),將其頂點加入到生成樹的頂點集合u中。以後每一步從乙個頂點在u中,而另乙個頂點不在u中的各條邊中選擇權值最小的邊(u, v),把該邊加入到生成樹的邊集te中,把它的頂點加入到集合u中。如此重複執行,直到網路中的所有頂點都加入到生成樹頂點集合u中為止。

假設g=(v,e)是乙個具有n個頂點的帶權無向連通圖,t(u,te)是g的最小生成樹,其中u是t的頂點集,te是t的邊集,則構造g的最小生成樹t的步驟如下:

(1)初始狀態,te為空,u=,v0∈v;

(2)在所有u∈u,v∈v-u的邊(u,v)∈e中找一條代價最小的邊(u′,v′)併入te,同時將v′併入u;

重複執行步驟(2)n-1次,直到u=v為止。

假設圖g採用鄰接矩陣g儲存,對應的prim(g,v)演算法如下:

/*注:closest[j]儲存該邊依附的在u中的頂點編號。對於每乙個頂點v∈v-u,closest[v]為u中距離v最近的乙個鄰接點。

lowcost域存放生成樹頂點集合內頂點到生成樹外各頂點的各邊上的當前最小權值;即邊(v,closest[v])是在所有與頂點v相鄰、且其另一頂點j∈u的邊中具有最小權值的邊,其最小權值為lowcost[v],即lowcost[v]=cost[v][closest[v]

adjvex域記錄生成樹頂點集合外各頂點距離集合內哪個頂點最近(即權值最小)。

*/ void prim(matgraph g,int v) //輸出求得的最小生樹的所有邊

{ int lowcost[maxvex]; //建立陣列lowcost

int closest[maxvex]; //建立陣列closest

int min,i,j,k;

for (i=0;i

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

1.鄰接矩陣儲存 cpp view plain copy 圖的鄰接矩陣儲存表示 define infinity int max define max vertex num 20 typedef enum graphkind typedef enum status typedef struct arc...

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

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

普里姆(Prim)求最小生成樹

一 普里姆 prim 演算法 1.基本思想 設g v,e 是具有n個頂點的連通網,t u,te 是g的最小生成樹,t的初始狀態為u u0 v te 重複執行下述操作 在所有u u,v v u的邊中找一條代價最小的邊 u,v 併入集合te,同時v併入u,直至u v。即 1 從連通網路 g 中的某一頂點...