mst(minimum spanning tree,最小生成樹)問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是:設圖g頂點集合為v,u為最小生成樹的頂點的集合。建立兩個陣列:lowcost[i]和mst[i],前者表示以i為終點的邊的最小權值;後者對應lowcost[i]的起點。若lowcost[i]=0,則表示頂點i已經加入到u中;若lowcost[i]為無窮大,則表示無通路;若mst[i]=0,則表示頂點i已經加入到u中。
第一步:
首先任意選擇圖g中的一點作為起始點a,將該點加入集合u;
第二步:判斷v中各個頂點到u中a點的lowcost[i],及對應的mst[i](均等於a),將lowcost[i]的最小值對應的邊的終點i(假設i=b)加入到u中,則此時u中含有2個頂點a和b;
第三步:重新設定lowcost[i]和mst[i]的值(此時lowcost[i]等於ai邊和bi邊直接的最小權值,mst[i]等於對應最小權值的頂點,a或b);
第四步:以此類推,直到所有頂點全部加入到u中,此時就構建了一顆mst。
以下是圖例說明:
初始狀態:
我們假設v1是起始點,進行初始化(*代表無限大,即無通路):
lowcost[2]=6
,lowcost[3]=1
,lowcost[4]=5
,lowcost[5]=*,lowcost[6]=*
mst[2]=1
,mst[3]=1,mst[4]=1
,mst[5]=1,mst[6]=1
,(所有點預設起點是v1)
明顯看出,以v3為終點的邊的權值最小=1,所以邊=1加入mst
此時,因為點v3的加入,需要更新lowcost陣列和mst陣列:
lowcost[2]=5
,lowcost[3]=0
,lowcost[4]=5
,lowcost[5]=6,
lowcost[6]=4
mst[2]=3
,mst[3]=0,
mst[4]=1
,mst[5]=3,mst[6]=3
明顯看出,
以v6為終點的邊的權值最小=4,所以邊=4加入mst
此時,因為點v6的加入,需要更新lowcost陣列和mst陣列:
lowcost[2]=5
,lowcost[3]=0
,lowcost[4]=2
,lowcost[5]=6
,lowcost[6]=0
mst[2]=3
,mst[3]=0,
mst[4]=6
,mst[5]=3,
mst[6]=0
明顯看出,
以v4為終點的邊的權值最小=2,所以邊=4加入mst
此時,因為點v4的加入,需要更新lowcost陣列和mst陣列:
lowcost[2]=5,
lowcost[3]=0,
lowcost[4]=0,
lowcost[5]=6
,lowcost[6]=0
mst[2]=3,
mst[3]=0,
mst[4]=0
,mst[5]=3
,mst[6]=0
明顯看出,
以v2為終點的邊的權值最小=5,所以邊=5加入mst
此時,因為點v2的加入,需要更新lowcost陣列和mst陣列:
lowcost[2]=0,
lowcost[3]=0,
lowcost[4]=0,
lowcost[5]=3,
lowcost[6]=0
mst[2]=0,
mst[3]=0,
mst[4]=0
,mst[5]=2
,mst[6]=0
很明顯,
以v5為終點的邊的權值最小=3,所以邊=3加入mst
lowcost[2]
=0,lowcost[3]=0
,lowcost[4]=0,lowcost[5]=0
,lowcost[6]=0
mst[2]=0,mst[3]=0
,mst[4]=0,mst[5]=0
,mst[6]=0
至此,mst構建成功,如圖所示:
prim演算法結構如下:
#define inf 65535
#define maxv 100
void prim(graph *graph,int v)
for(j=0;jvertex_num;j++)
} }}
參考: 最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...
最小生成樹 Prim演算法
prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...
最小生成樹 prim 演算法
一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...