村村通工程kruskal算法代码实现
时间: 2023-11-12 08:11:21 浏览: 91
Kruskal算法实现
Kruskal算法是用来求解最小生成树的一种算法,下面是Kruskal算法的C++代码实现:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int MAXM = MAXN * (MAXN - 1) / 2;
struct Edge {
int u, v, w;
} e[MAXM];
int n, m, fa[MAXN];
int find(int x) {
if (fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
void kruskal() {
sort(e, e + m, [](Edge a, Edge b) {
return a.w < b.w;
});
for (int i = 1; i <= n; i++) fa[i] = i;
int ans = 0;
for (int i = 0; i < m; i++) {
int u = e[i].u, v = e[i].v, w = e[i].w;
int fu = find(u), fv = find(v);
if (fu != fv) {
ans += w;
fa[fu] = fv;
}
}
cout << ans << endl;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
kruskal();
return 0;
}
```
其中,e数组存储边的信息,包括起点、终点和边的权值;find函数用来查找节点x所属的集合;kruskal函数用来实现Kruskal算法。在kruskal函数中,首先对边按照权值从小到大排序,然后初始化并查集,然后遍历每一条边,如果这条边的起点和终点不在同一个集合中,就将它们合并到同一个集合中,并将边的权值加入到最小生成树的权值中。最后输出最小生成树的权值即可。
阅读全文