24/02/06总结

该篇文章介绍了如何通过调整最小生成树中边的顺序,结合并查集数据结构,解决一个问题,即在给定边权值的情况下,找到k个最小边连接不同集合,同时计算总和。程序实现包括输入处理、边排序、并查集操作和终止条件判断。
摘要由CSDN通过智能技术生成

P2121 拆地毯

思路:我们只需要对最小生成树略微修改,把边权从大到小排序即可.

注意判断已经加入到同一个并查集中的数量为k.
ac:

	#include "iostream"
	#include "algorithm"
	using std::cin;
	using std::cout;
	using std::endl;
	using std::sort;
	int n, m, k;
	int a[100005];
	unsigned long long sum = 0;
	struct point {
		int u, v, w;
	}b[100005];

	bool cmp(point a, point b) {
		return a.w > b.w;
	}

	int find(int x) {
		if (a[x] == x)return x;
		else return a[x] = find(a[x]);
	}

	void Union(int t1, int t2) {
		a[find(t1)] = find(t2);
	}
	int main() {
		cin >> n >> m >> k;
		for (int i = 1; i <= n; i++)
			a[i] = i;
		for (int i = 1; i <= m; i++) {
			cin >> b[i].u >> b[i].v >> b[i].w;
		}
		sort(b + 1, b + 1 + m, cmp);
		for (int i = 1; i <= m; i++) {
			if (find(b[i].u) != find(b[i].v))
			{
				Union(b[i].u, b[i].v);
				sum += b[i].w;
				k--;
			}
			if (k == 0) {
				cout << sum;
				return 0;
			}
		}

	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值