最小生成树
2026-08-29 14:48:31
发布于:广东
1阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct DSU {
vector<int> parent;
vector<int> sz;
DSU(int n = 0) { init(n); }
void init(int n) {
parent.resize(n + 1);
sz.resize(n + 1);
for (int i = 0; i <= n; ++i) {
parent[i] = i;
sz[i] = 1;
}
}
int find(int x) {
if (parent[x] == x) return x;
parent[x] = find(parent[x]);
return parent[x];
}
bool unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return false;
if (sz[a] < sz[b]) {
int tmp = a; a = b; b = tmp;
}
parent[b] = a;
sz[a] += sz[b];
return true;
}
};
struct Edge {
int u;
int v;
int w;
};
bool cmpedg(const Edge& a, const Edge& b) {
return a.w < b.w;
}
int main() {
int n, m;
cin>>n>>m;
vector<Edge> edg;
edg.reserve(m);
for (int i = 0; i < m; ++i) {
int x, y, z;
cin >> x >> y >> z;
edg.push_back({x, y, z});
}
sort(edg.begin(), edg.end(), cmpedg);
DSU dsu(n);
long long total = 0;
int used = 0;
for (size_t i = 0; i < edg.size(); ++i) {
if (dsu.unite(edg[i].u, edg[i].v)) {
total += edg[i].w;
++used;
if (used == n - 1) break;
}
}
int comps = 0;
for(int i=1;i<=n;i++)
if(dsu.find(i)==i) ++comps;
if(comps==1) cout << total << '\n';
else cout << "orz\n";
return 0;
}
这里空空如也







有帮助,赞一个