最小生成樹:這裡面有兩個概念:(1):必須為乙個樹,並且為一棵生成樹(樹的定義有且僅有乙個前驅結點,可以有有多個後驅子節點,並且(n-1)條邊都在圖中)
(2):必須是最小連通的。(多一條邊會使樹形成迴路,不滿足生成樹的概念,少一條邊,則會使樹不連通)
因此,最小生成樹必須滿足三個條件:
(1):必須包含n個結點
(2):必須包含(n-1) 條邊
(3):不能構成迴路。
最小生成樹的兩種構造方法:prim演算法,kruskal演算法。
1:prim演算法生成最小生成樹
prim 演算法的偽碼描述:適合於稠密圖
1prim演算法的**描述:void
prim();
3while(1)15}
16if
(mst中的v不夠n個)
1920}21
}22 }
12:kruskal演算法(克魯斯卡爾演算法)package
com.hone.graph.mincreatetree;
2import
com.hone.graph.adjmwgraph;34
//用prim演算法建立帶權圖g的最小生成樹closevertex
5public
class
prim
1617 minspantree temp=new
minspantree();
1819
//從結點0出發構造最小生成樹
20 temp.vertex=g.getvalue(0);
21 closevertex[0]=temp; //
儲存結點0
22 lowcost[0]=-1; //
用-1標記結點0,表示該結點已經加入到集合中
2324
//尋找最小權值對應的結點k
25for (int i = 1; i < n; i++) 32}
3334
//開始構建最小生成樹的當前結點和權值資料
35 minspantree curr=new
minspantree();
36 curr.vertex=g.getvalue(k); //
儲存此次迴圈中最小權值的結點k
37 curr.weight=mincost; //
儲存對應的權值
38 closevertex[i]=curr;
39 lowcost[k]=-1; //
標記結點k,表示該結點已經收錄到最小生成樹中
4041
42//
根據加入集合中u的結點修改lowcost中的數值
43for(int j=1; j)47}
48}49}
50 }
克魯斯卡爾演算法是按照帶權圖中邊的權值的遞增順序構造最小生成樹的方法。適合於稀疏圖
因此克魯斯卡爾演算法主要包括兩部分:(1):帶權圖g中各個邊的權值排序(時間複雜度的主要因素)
(2):判斷新選擇的兩個結點是否會構成乙個迴路(避免)
克魯斯卡爾演算法的偽碼描述:
時間複雜度主要在於邊權重結點之間的排序。o(e
loge)
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構(最小生成樹)
對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...
資料結構 最小生成樹
對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n 1條邊圖的生成子圖,且這n 1條邊的權值和最小。對於乙個圖的兩種演算法 prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。偽 實現 輔助變數 lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt 0表示當前樹連線節點...