码蹄杯 供水管线 题型:最小生成树

19 阅读1分钟

码题集OJ-供水管线 (matiji.net)

image.png 样例输入:

3 3
1 2 3
1 3 5
2 3 8

样例输出:

8

image.png

思想

题目说要去掉一些管道,使得管道管理费用最小,并且城市之间不再形成回路。那么也就是会生成一颗树。而树越小管理费用越小,因此,本题就是让我们求一最小生成树。

因此直接套用最小生成树模板即可:

#include<bits/stdc++.h>

using namespace std;
const int N = 1e2 + 10;
struct NODE
{
	int i, j, c;
	bool operator<(const NODE& t)const
	{
		return c < t.c;
	}
}p[N];
int n, k, fa[N], ans;
void Init()
{
	for (int i = 1; i < N; i++)
		fa[i] = i;
}
int find(int x)
{
	if (x != fa[x])fa[x] = find(fa[x]);
	return fa[x];
}

void merge(int x, int y)
{
	x = find(x), y = find(y);
	if (x != y)
		fa[x] = y;
}
int main()
{
	Init();
	cin >> n >> k;
	for (int i = 1; i <= k; i++)
		cin >> p[i].i >> p[i].j>>p[i].c;
	sort(p + 1, p + k + 1);

	for (int i = 1; i <= k; i++)
	{
		if (find(p[i].i) != find(p[i].j))
		{
			ans += p[i].c;
			merge(p[i].i, p[i].j);
		}
	}

	cout << ans<<endl;
	return 0;
}