克鲁斯卡尔最小生成树的C++代码
时间: 2023-12-30 20:52:04 浏览: 62
最小生成树有很多种生成方法,主要有普利姆算法和克鲁斯卡尔算法,通过C语言easyx图形库实现
5星 · 资源好评率100%
以下是克鲁斯卡尔算法的C++代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct Edge {
int u, v, w;
bool operator<(const Edge& e) const {
return w < e.w;
}
} edges[MAXN];
int fa[MAXN];
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main() {
int n, m; // n: 点数, m: 边数
cin >> n >> m;
for(int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
edges[i] = {u, v, w};
}
sort(edges, edges + m);
for(int i = 1; i <= n; i++) {
fa[i] = i;
}
int cnt = 0, ans = 0;
for(int i = 0; i < m && cnt < n - 1; i++) {
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
int fu = find(u), fv = find(v);
if(fu != fv) {
fa[fu] = fv;
cnt++;
ans += w;
}
}
if(cnt < n - 1) {
cout << "impossible" << endl;
} else {
cout << ans << endl;
}
return 0;
}
```
其中 `edges` 数组存储所有边的信息,`find` 函数是并查集的常见操作,用于查找某个节点的祖先节点。
阅读全文