資料結構 最小生成樹 普里姆演算法

2022-06-03 19:00:16 字數 1535 閱讀 2745

**

首先仍然是預定義:

1

#define ok 1

2#define error 0

3#define max_int 32767

4#define mvnum 100

56 typedef int

status;

7 typedef char

vertextype;

8 typedef int

arctype;910

struct

closedge[mvnum];

1415 typedef struct

amgraph;

結構體陣列closedge用於記錄與下標節點最小權值邊的值以及權值(即最小權值)。

建立圖:

int locatevex(amgraph *g,vertextype v)

return -1;}

status createudn(amgraph *g)

for (k = 0; k < g->arcnum; k++)

return

ok;}

int

min(amgraph g)

}return

index;

}

開始時讓min為最大值,index用於記錄最小值的下標,開始時設為-1。將closedge陣列中lowcost(最小權值)與min進行比較,若有比min小的,則將其值賦值給min,並用index記錄下標,重複比較,選出最小邊。返回index。

///////////////////////////////主

void

minspantree_prim(amgraph g, vertextype v)//從頂點v出發 按照普里姆演算法構建最小生成樹 並輸出每條邊 和 總權值

}closedge[k].lowcost = 0

;//初始化自身

for (i = 1; i < g.vexnum; i++)}}

cout<

其中,v為開始的節點。先確定v的下標,並將closedge陣列初始化:將其記錄的節點全部記錄為v節點,並記錄各個節點與其之間的權值。將closedge中v的權值記錄為0,表示已經在已經遍歷的陣列中。

接下來用min()函式確定最小權值的邊的另乙個節點下標k,由於closedge陣列中k下標的元素記錄了與其最短權值的邊的第一節點,故只需輸出closedge[k].adjvex和g.vex[k]。繼續查詢乙個頂點在遍歷陣列中而且另乙個頂點不再遍歷陣列中的最短邊:在for()迴圈中,如果j下標的lowcost值大於圖中k和j節點的權值,表明其不是最小權值邊,則將closedge下標為j的元素中的節點值賦值為圖中k下標的節點,並將其lowcost改為k和j的權值。

重複上面操作,得到最小生成樹。

加入main():

資料結構之最小生成樹 普里姆演算法

1 普里姆演算法 可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和頂點w之間必定存在一條邊,並且 該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合 u 包含已落在生成樹上 的結點 和v u 尚未落在生成樹上的頂點 則在所有連通u中...

資料結構 普里姆(Prim)演算法生成最小生成樹

乙個連通圖的生成樹是圖的極小連通子圖,它包含圖中的所有定點,並且只含盡可能少的邊,這意味著對於生成樹來說,就砍去使生成樹變成非連通圖 若給它怎家一條邊就會形成圖中的一條迴路。對於乙個帶權連通無向圖g v,e 生成樹不同,每個樹的權也可能不同。設w為g的所有生成樹的集合,若t為g中邊的權值之和最小的那...

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

關於什麼是prim 普里姆演算法 在實際生活中,我們常常碰到類似這種一類問題 如果要在n個城市之間建立通訊聯絡網,則連通n個城市僅僅須要n 1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提 下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...