【模板】最小生成树
题目链接:luogu P3366
题目大意
就是求一个图的最小生成树,如果不能连通,就输出 orz
。
思路
就是模板题,按着模板做就完事了。
最小生成树其实有点贪心的思想,就是每次都连现有权值最小而且两边不属于同一个连通块的边。
然后不停这样连下去,直到整个图都连通了。
至于看两边属不属于同一个连通块我们可以用并查集来搞。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
struct road {
int x, y, z;
}a[200001];
int n, m, fa[5001], num;
long long ans;
bool cmp(road x, road y) {
return x.z < y.z;
}
int find(int now) {
if (fa[now] == now) return now;
return fa[now] = find(fa[now]);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++)
scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
sort(a + 1, a + m + 1, cmp);
for (int i = 1; i <= m; i++) {
int X = find(a[i].x), Y = find(a[i].y);
if (X == Y) continue;
fa[X] = Y;
num++;
ans += 1ll * a[i].z;
if (num == n - 1) break;
}
if (num == n - 1) printf("%lld", ans);
else printf("orz");
return 0;
}