【模板】最小生成树
链接:https://www.luogu.com.cn/problem/P3366
来源:洛谷
题目描述:
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。
输入格式:
第一行包含两个整数 N,MN,M,表示该图共有 NN 个结点和 MM 条无向边。
接下来 MM 行每行包含三个整数 X_i,Y_i,Z_i,表示有一条长度为 Z_i的无向边连接结点 X_i,Y_i 。
输出格式:
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz。
//这道题目应该还需要单独判断是否连通来决定输出的
//最开始忘了,直接给提交上去,结果还过了
//个人比较懒,后面也没有再进行完善了
//这道题数据很弱,一些常数开小了居然也混过去了!!(自行纠正)
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000;
struct edge
{
int u, v, w;
} e[MAX];
bool cmp(const edge &a, const edge &b)
{
return a.w < b.w;
}
int father[MAX];
int get(int x)
{
return father[x] == x ? x : father[x] = get(father[x]);
}
void merge(int x, int y)
{
x = get(x);
y = get(y);
if (x != y)
father[x] = y;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++)
cin >> e[i].u >> e[i].v >> e[i].w;
sort(e + 1, e + m + 1, cmp);
for (int i = 1; i <= n; i++)
father[i] = i;
int res = 0;
int ans = 0;
for (int i = 1; i <= m && res < n - 1; i++)
{
int x = e[i].u;
int y = e[i].v;
if (get(x) == get(y))
continue;
else
{
res++;
merge(x, y);
ans += e[i].w;
}
}
cout << ans << endl;
return 0;
}