最小生成樹Prim演算法

2021-07-14 21:23:34 字數 2715 閱讀 7119

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