對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。
最小生成樹必須滿足三個條件:
1>構造的最小生成樹必須包括n個頂點;
2>構造的最小生成樹有且僅有n-1條邊;
3>構造的最小生成樹中不存在迴路。
普利姆演算法(prim)
假設g=(v,e)為一無向連通網,其中,v為網中頂點的集合,e為網中邊的集合。設定兩個新的集合u和t,其中,u為g的最小生成樹的頂點的集合,t為g的最小生成樹的邊的集合。普里姆演算法的思想是:令集合u的初值為u=(假設構造最小生成樹時從頂點u1開始),集合t的初值為t={}。從所有的頂點 u∈u 和頂點 v∈v-u 的帶權邊中選出具有最小權值的邊(u,v),將 頂點 v 加入集合 u 中,將邊(u,v)加入集合 t 中。如此不斷地重複直到 u=v 時,最小生成樹構造完畢。此時,集合 u 中存放著最小生成樹的所有頂點,集合t中存放著最小生成樹的所有邊。
對於鄰接矩陣實現的圖,prim演算法:
public
int prim()
lowcost[0] = 0;
closevex[0] = 0;
for (int i = 0; i < nodes.length; i++)
++j;
}lowcost[k] = 0;
for (j = 1; j < nodes.length; j++)
克魯斯卡爾演算法(kruskal)第一步:首先比較網中所有邊的權值,找到最小的權值的邊(d,e),加入到生成樹的邊集te中,te=。
第二步:再比較圖中除邊(d,e)的邊的權值,又找到最小權值的邊(a,d)並且不會形成迴路,加入到生成樹的邊集te中,te=。
第三步:再比較圖中除te以外的所有邊的權值,找到最小的權值的邊(a,b) 並且不會形成迴路,加入到生成樹的邊集te中,te=。
第四步:再比較圖中除te以外的所有邊的權值,找到最小的權值的邊(e,c) 並且不會形成迴路,加入到生成樹的邊集te中,te=。此時,邊集te中已經有n-1條邊,所以求圖6.15(a)的無向連通網的最小生成樹的過程已經完成,如圖6.16所示。這個結果與用普里姆演算法得到的結果相同。
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構 最小生成樹
對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n 1條邊圖的生成子圖,且這n 1條邊的權值和最小。對於乙個圖的兩種演算法 prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。偽 實現 輔助變數 lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt 0表示當前樹連線節點...
資料結構 生成樹和最小生成樹
生成樹 指的是乙個包含了g的所有頂點的樹。生成樹是g的乙個極小連通的子圖。從g的任意頂點出發,做一次深度 廣度優先遍歷,訪問g中的n個頂點,並將順次訪問的兩個頂點之間的路徑記錄,經歷的n條邊就構成了g的極小連通子圖,也就是g的一棵生成樹。對於深度優先 dfs 和廣度優先 bfs 只要在if語句中加入...