Algorithm Design 最小生成樹

2022-07-25 00:51:25 字數 2612 閱讀 4096

本文主要介紹了最小生成樹的兩種解決辦法:kruskal以及prim

1/**

2kruskal演算法流程:

3(1)初始時所有節點屬於孤立的集合;

4(2)按照邊權遞增順序遍歷所有的邊,若遍歷到的邊兩個節點仍分屬於不同的

5集合(該邊即為聯通這兩個結合的邊中權值最小的那條),則確定該邊為最小生

6成樹上的一條邊,並將這兩個頂點分屬的集合合併;

7(3)遍歷完所有的邊之後,原圖上所有節點屬於同乙個集合則被選取的邊和原圖

8中所有節點構成最小生成樹;否則原圖不連通,最小生成樹不存在。910

11樣例輸入: 123

131 2 1

141 3 2

152 3 4 164

171 2 1

181 3 4

191 4 1

202 3 3

212 4 2

223 4 5 230

24樣例輸出:

253 265

27*/

2829 #include30 #include31

using

namespace

std;

3233

#define n 101

3435

inttree[n];

3637

int findroot(int x)//

找到代表集合的樹的根節點

3847}48

49struct edge//

邊結構體

5058 }edge[6000

];59

60int

main()

6169

70 sort(edge + 1, edge + 1 + n * (n - 1) / 2);//

按照邊權值遞增排序所有的邊

7172

for(int i = 1 ; i <= n ; i ++)

7376

77int ans = 0;//

最小生成樹上邊權值的和,初始值是0

78for(int i = 1 ; i <= n * (n - 1) / 2 ; i ++)//

按照權值遞增順序遍歷所有的邊

7988}89

90 printf_s("

%d\n

", ans);//

輸出91}92

}9394/**95

prim演算法流程:

96(1)設定兩個集合v和s,任意選擇乙個頂點作為起始頂點,將起始頂點放入集合s,

97其餘頂點放入集合v;

98(2)然後使用貪心策略,選擇一條長度最短並且頂點分別在s和v中的邊(即為最小

99生成樹中的一條邊),將這條邊在v中的頂點加入到集合s中;

100(3)迴圈執行(2),直到s中包含了所有頂點。

101102

樣例輸入:

1033

1041 2 1

1051 3 2

1062 3 4

1074

1081 2 1

1091 3 4

1101 4 1

1112 3 3

1122 4 2

1133 4 5

1140

115樣例輸出:

1163

1175

118*/

119120 #include121 #include122

using

namespace

std;

123124

#define maxint 0x3f3f3f3f

125#define n 110

126int

n;127

128int map[n][n];//

存放圖129

int low[n];//

存放每兩個節點之間最小權值

130int visited[n];//

標記某節點是否已經被訪問

131132

intprim()

133146

147for(int i = 1; i < n; i ++)

148158

}159

160 result += min;//

最小權值累加

161 visited[pos] = 1;//

標記該點

162//

更新權值

163for(int j = 1 ; j <= n ; j ++)

164168

}169

170return

result;

171}

172173

intmain()

174187

188for(int i = 1 ; i <= n ; i ++)

189197

}198

199 ans =prim();

200 printf_s("

%d\n

", ans);

201}

202 }

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...

最小生成樹

在乙個具有幾個頂點的連通圖g中,如果存在子圖g 包含g中所有頂點和一部分邊,且不形成迴路,則稱g 為圖g的生成樹,代價最小生成樹則稱為最小生成樹。最小生成樹的特點 1 mst性質 最小生成樹性質 設g v,e 是乙個連通網路,u是頂點集v的乙個真子集。若 u,v 是g中一條 乙個端點在u中 例如 u...