生成樹的代價:設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個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...