演算法與資料結構 最小生成樹(最小支撐樹)

2022-07-31 09:27:17 字數 2683 閱讀 4697

概念:設g=(v,e)是乙個無向連通圖,生成樹上各邊的權值之和為該生成樹的代價,在g的所有生成樹中,代價最小的生成樹就稱為最小支撐樹,或稱最小生成樹。

區別:最小生成樹是各邊權值和最小的數

最優歸併樹是帶權外部路徑長度最短的樹

演算法:kruskal演算法 && prim演算法

**來自

1 #include 2 #include 3 #include 4 #include 5

using

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 為一無向連通...