给定带权图求最小生成树代码
时间: 2023-07-22 18:30:42 浏览: 96
以下是基于 Prim 算法的 C++ 代码实现,该算法的时间复杂度为 O(n^2):
```
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005; // 最大点数
const int INF = 0x3f3f3f3f; // 无穷大
int n, m; // 点数和边数
int g[MAXN][MAXN]; // 图的邻接矩阵表示
int lowcost[MAXN]; // 存储与已选点相邻的最小权值
bool vis[MAXN]; // 标记已选点
int prim() {
memset(lowcost, INF, sizeof(lowcost));
memset(vis, false, sizeof(vis));
int ans = 0;
lowcost[1] = 0;
for (int i = 1; i <= n; i++) {
int k = 0;
for (int j = 1; j <= n; j++) {
if (!vis[j] && (k == 0 || lowcost[j] < lowcost[k])) {
k = j;
}
}
vis[k] = true;
ans += lowcost[k];
for (int j = 1; j <= n; j++) {
if (!vis[j] && g[k][j] < lowcost[j]) {
lowcost[j] = g[k][j];
}
}
}
return ans;
}
int main() {
cin >> n >> m;
memset(g, INF, sizeof(g));
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u][v] = g[v][u] = w;
}
cout << prim() << endl;
return 0;
}
```
其中,g[i][j] 表示点 i 和点 j 之间的边权值,如果没有连边则赋值为 INF。Prim 算法的核心是每次找到与已选点相邻的最小权值边,将它所连接的点加入已选点集合,更新与它相邻的点的最小权值边。最终,所有点都被加入已选点集合,算法结束。
阅读全文