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 intvertex;
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 ...