代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e3 + 10;//N的值可以修改
int m, n, k = 0, sum = 0;
struct edge {
int u, v, w;
}e[N], mst[N];
bool cmp(edge a, edge b) {
if (a.w < b.w) {
return 1;
} else {
return 0;
}
}
int fa[N];//并查集用的集合数组
int Find(int x) {
if (fa[x] == x) {
return x;
} else {
return fa[x] = Find(fa[x]);
}
}
void Union(int a, int b) {
int faa = Find(a);
int fbb = Find(b);
if (faa != fbb) {
fa[fbb] = faa;
}
}
int main() {
cin >> n >> m;
//每个点初始化 自成连通分量
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
for (int i = 1; i <= m; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
sort(e, e + m, cmp);
//放边
for (int i = 1; i <= m; i++) {
//取一条边,看看这条边的两端是不是同一个连通分量
if (Find(e[i].u) != Find(e[i].v)) {
k++;
mst[k].u = e[i].u;
mst[k].v = e[i].v;
mst[k].w = e[i].w;
sum += e[i].w;
//这条边的两端需要变成一个连通分量(集合)
Union(e[i].u, e[i].v);
if (k == n - 1) {
break;
}
}
}
if (k < n - 1) {
cout << "Orz";
} else {
cout << sum;
}
return 0;
}