資料結構筆記12 最小生成樹

2021-10-01 05:10:27 字數 1570 閱讀 4403

生成樹的代價:設g=(v,e)是乙個無向連通網,生成樹上各邊的權值之和稱為該生成

樹的代價。

最小生成樹:在圖g所有生成樹中,代價最小的生成樹稱為最小生成樹。

prim演算法 

基本思想:

設g=(v, e)是具有n個頂點的連通網,

t=(u, te)是g的最小生成樹, 

t的初始狀態為u=(u0∈v),te=,

重複執行下述操作:

在所有u∈u,v∈v-u的邊中找一條代價最小的邊(u, v)併入集合te,同時v併入u,直至u=v。

陣列lowcost[n]:用來儲存集合v-u中各頂點與集合u中頂點最短邊的權值,

lowcost[v]=0表示頂點v已加入最小生成樹中;

陣列adjvex[n]:用來儲存該邊所依附的(集合v-u中各頂點與集合u中頂點的最短邊)集

合u中的頂點。

偽**1. 初始化兩個輔助陣列lowcost(=arc[0][i])和adjvex(=0)(0是始點);

2. 輸出頂點u0,將頂點u0加入集合u中;

3. 重複執行下列操作n-1次

3.1 在lowcost中選取最短邊(lowcost[k]),取對應的頂點序號k;

3.2 輸出頂點k和對應的權值;

3.3 將頂點k加入集合u中(lowcost[k]=0);

3.4 調整陣列lowcost和adjvex;

實現void prime(mgraph g),

2、然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。

1、若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生

成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量;

2、若被考察邊的兩個頂點屬於同乙個連通分量,則捨去此邊,以免造成迴路,

3、如此下去,當t中的連通分量個數為1時,此連通分量便為g的一棵最小生成樹。 

演算法思想

1. 初始化:u=v;  te=; 

2. 迴圈直到t中的連通分量個數為1  

2.1 在e中尋找最短邊(u,v);

2.2 如果頂點u、v位於t的兩個不同連通分量,則

2.2.1 將邊(u,v)併入te;

2.2.2 將這兩個連通分量合併為乙個;

2.3 在e中標記邊(u,v),使得(u,v)不參加後續最短邊的選取;

三個關鍵問題

1、圖的儲存結構

採用邊集陣列儲存圖。

2、如何判斷一條邊所依附的兩個頂點在同乙個連通分兩中(並查集)

定義parent[i]陣列。陣列分量的值表示頂點i的雙親節點(初值為-1;)

當一條邊(u,v)的兩個頂點的根結不同時,這兩個結點屬於不同的連通分量(利用

parent 陣列查詢一棵樹的根節點。當乙個結點n的parent==-1,樹的根節點即為n)

3、如何將一條邊所依附的兩個頂點合併到同乙個連通分量中

要進行聯通分量的合併 ,其中乙個頂點所在的樹的根節點為vex1,另乙個頂點所在的

樹的根節點為vex2,則:parent[vex2]=vex1;

void edgegraph::kruskal()

return t;

}

資料結構筆記 最小生成樹

edge類,表示邊的資訊 public class edgeimplements comparable public edge edgee 返回第乙個頂點 public int v 返回第二個頂點 public int w 返回權重 public weight weight 給定乙個頂點返回另乙個頂...

資料結構筆記(最小生成樹)

生成樹的代價 設g v,e 是乙個無向連通網,生成樹上各邊的權值之和稱為該生成樹的代價。最小生成樹 在圖g所有生成樹中,代價最小的生成樹稱為最小生成樹。性質 假設g v,e 是乙個無向連通網,u是頂點集v的乙個非空子集。若 u,v 是一條具有最小權值的邊,其中u u,v v u,則必存在一棵包含邊 ...

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...