概念:設g=(v,e)是乙個無向連通圖,生成樹上各邊的權值之和為該生成樹的代價,在g的所有生成樹中,代價最小的生成樹就稱為最小支撐樹,或稱最小生成樹。
區別:最小生成樹是各邊權值和最小的數
最優歸併樹是帶權外部路徑長度最短的樹
演算法:kruskal演算法 && prim演算法
**來自
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6#define infinite 0xffffffff
7#define vertexdata unsigned int //
頂點資料
8#define uint unsigned int
9#define vexcounts 6 //
頂點數量
10char vextex = ;
11struct
node
12closedge[vexcounts]; //
prim演算法中的輔助資訊
16 typedef struct
17arc; //
原始圖的邊資訊
22void adjmatrix(unsigned int adjmat[vexcounts]) //
鄰接矩陣表示法
2329 adjmat[0][1] = 6; adjmat[0][2] = 1; adjmat[0][3] = 5
;30 adjmat[1][0] = 6; adjmat[1][2] = 5; adjmat[1][4] = 3
;31 adjmat[2][0] = 1; adjmat[2][1] = 5; adjmat[2][3] = 5; adjmat[2][4] = 6; adjmat[2][5] = 4
;32 adjmat[3][0] = 5; adjmat[3][2] = 5; adjmat[3][5] = 2
;33 adjmat[4][1] = 3; adjmat[4][2] = 6; adjmat[4][5] = 6
;34 adjmat[5][2] = 4; adjmat[5][3] = 2; adjmat[5][4] = 6;35
}36int minmum(struct node * closedge) //
返回最小代價邊
3747}48
return
index;49}
50void minispantree_prim(unsigned int
adjmat[vexcounts], vertexdata s)
51
56 closedge[s].data = s; //
從頂點s開始
57 closedge[s].lowestcost = 0;58
for (int i = 0; i < vexcounts;i++) //
初始化輔助陣列
5965}66
for (int e = 1; e <= vexcounts -1; e++) //
n-1條邊時退出
6778}79
}80}81
void readarc(unsigned int adjmat[vexcounts],vector&vertexarc) //
儲存圖的邊代價資訊
8296}97
}98}99
bool
compare(arc a, arc b)
100103
bool findtree(vertexdata u, vertexdata v,vector> &tree)
104114
115if (index_u != index_v) //
u,v不在一顆樹上,合併兩顆樹
116121
tree[index_v].clear();
122return
true
;123
}124
return
false
;125
}126
void minispantree_kruskal(unsigned int
adjmat[vexcounts])
127136
for (unsigned int i = 0; i < vertexarc.size(); i++)//
依次從小到大取最小代價邊
137
144}
145}
146147
intmain()
148;
150 adjmatrix(adjmat); //
鄰接矩陣
151 cout << "
prim :
"<152 minispantree_prim(adjmat,0); //
prim演算法,從頂點0開始.
153 cout << "
-------------
"<< endl << "
kruskal:
"<154 minispantree_kruskal(adjmat);//
kruskal演算法
155return0;
156 }
資料結構與演算法11 最小生成樹
最小生成樹 問題提出 要在n個城市間建立通訊聯絡網,城市間的通訊線路造價不同,希望找到一種方案使得建立該通訊網所需花費的總代價最小。問題分析 n個城市間,最多可設定n n 1 2條線路 n個城市間建立通訊網,至少需n 1條線路 問題轉化為 如何在可能的線路中選擇n 1條,能把所有城市 頂點 連起來,...
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構(最小生成樹)
對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...