最小生成树c++
时间: 2023-07-05 13:09:13 浏览: 111
最小生成树的C++语言实现
下面是Kruskal算法实现最小生成树的C++代码,时间复杂度为O(mlogm),其中m为边数。
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int p[N]; // 并查集数组
struct Edge{
int a, b, w;
}edges[N];
bool cmp(Edge a, Edge b){
return a.w < b.w;
}
int find(int x){ // 并查集查找
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
int kruskal(){ // Kruskal算法求最小生成树
sort(edges, edges + m, cmp);
for(int i = 1; i <= n; i++) p[i] = i; // 初始化并查集
int res = 0, cnt = 0;
for(int i = 0; i < m; i++){
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
int pa = find(a), pb = find(b);
if(pa != pb){
p[pa] = pb;
res += w;
cnt++;
if(cnt == n - 1) break; // 边数已满,退出循环
}
}
return res;
}
int main(){
cin >> n >> m;
for(int i = 0; i < m; i++)
cin >> edges[i].a >> edges[i].b >> edges[i].w;
int ans = kruskal();
cout << ans << endl;
return 0;
}
```
阅读全文