prim最小生成樹

2022-02-28 17:12:34 字數 1070 閱讀 1470

prim和dijkstra相似,都使用了貪心策略,加一些限制條件。

prim每次會找出盡量小的那個邊,將其加入到樹中,最終使得生成樹長大。

樹中有n-1個節點時或者剩下的所有邊都是inf,演算法結束。

(如果剩下的所有邊都是inf, 那麼最小生成樹不存在)。

我們這裡使用鄰接矩陣來實現prim演算法。

初始化:

定義dist陣列,儲存每個節點到樹的最小距離,當節點在樹中時更新為0。

先找到乙個根節點a,將其加入樹中, dist[a] = 0

(1)從還沒加入到樹中的節點中選擇一條到樹距離最短的i,將其加入樹中:

dist[i] = 0

(2)節點 i 加入樹可能導致其他節點到樹的最短距離改變,所以我們對與 i 節點相連的並且不在樹中的節點最短距離進行更新

如果g[i][j] < dist[j]

dist[j] = g[i][j]

(3)迴圈直到找出了n-1條邊或者剩下的邊中都是inf,演算法結束。

typedef int

vertex;

typedef

intweight;

typedef

struct

mygraph

mygraph;

void prim(mygraph&g, vertex u)

int count = 1

;

for(; count < g.v; count++)

}//若找不到則代表不能得到生成樹

if(k == -1

)

return

false

;

//將最小節點加入

dist[k] = 0

; count++;

//更新dist陣列

for(int i = 0; i < g.v; i++)

}}

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...