- BC20280018's blog
最小生成树模板
- 2025-9-13 16:17:45 @
最小生成树模板
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz
。
输入格式
第一行包含两个整数 ,表示该图共有 个结点和 条无向边。
接下来 行每行包含三个整数 ,表示有一条长度为 的无向边连接结点 。
输出格式
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz
。
输入输出样例 #1
输入 #1
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出 #1
7
说明/提示
对于 的数据,,。
对于 的数据,,。
对于 的数据,,。
对于 的数据:,,。
#include <bits/stdc++.h>
using namespace std;
int fa[5010];
int n, m, k;
struct edge
{
int u, v, w;
};
int cnt;
edge g[200010];
void add(int u, int v, int w)
{
cnt++;
g[cnt].u = u;
g[cnt].v = v;
g[cnt].w = w;
}
int findfa(int x)
{
return fa[x] == x ? x : fa[x] = findfa(fa[x]);
}
void merge(int x, int y)
{
x = findfa(x);
y = findfa(y);
fa[x] = y;
}
bool cmp(edge A, edge B)
{
return A.w < B.w;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
fa[i] = i;
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
sort(g + 1, g + m + 1, cmp);
int tot = 0;
int ans = 0;
for (int i = 1; i <= m; i++)
{
int fx = findfa(g[i].u), fy = findfa(g[i].v);
if (fx != fy)
{
ans += g[i].w;
merge(fx, fy);
k++;
}
if (k == (n - 1))
{
printf("%d\n", ans);
return 0;
}
}
printf("orz\n");
return 0;
}