专栏文章

题解:P1195 口袋的天空

P1195题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mio5wvgh
此快照首次捕获于
2025/12/02 13:53
3 个月前
此快照最后确认于
2025/12/02 13:53
3 个月前
查看原文

思路

这一题可以用并查集来做。
因为是求最小代价,所以可以先按照代价把每个关系从小到大排序,优先连代价小的云。设 cntcnt 为棉花糖个数,一开始 cntcntnn(天上 nn 朵云相当于 nn 个棉花糖),接着遍历 ii 从第 11 个关系到第 mm 个关系,在第 ii 个关系中,如果云 xxyy 之间不连通,那么就可以合并云 xxyy ,合并后棉花糖就少了一朵,所以 cntcnt11,代价加上 ll。当 cnt=kcnt = k 时,输出代价,遍历完之后如果 cntcnt 还是大于 kk,则输出 No Answer
注意:当 k>nk > n 时,输出 No Answer

代码

CPP
#include <bits/stdc++.h>
using namespace std;
struct node{
	int x, y, l;
}a[10005];
int fa[1005];
bool cmp(node aa, node bb){
	return aa.l < bb.l;
}
int find(int x){
    if(fa[x] == x) return x;
    else return fa[x] = find(fa[x]);
}
bool merge(int x, int y){
	int rx = find(x), ry = find(y);
	if(rx == ry) return false;
	fa[rx] = ry;
	return true;
}
int main(){
	for(int i = 1; i < 1005; i++){
		fa[i] = i;
	}
	int n, m, k;
	cin >> n >> m >> k;
	for(int i = 1; i <= m; i++){
		cin >> a[i].x >> a[i].y >> a[i].l;
	}
	if(k > n){
		cout << "No Answer" << endl;
		return 0;
	}
	sort(a + 1, a + m + 1, cmp);
	int cnt = n;
	int ans = 0;
    if(cnt == k){
		cout << ans << endl;
		return 0;
	}
	for(int i = 1; i <= m; i++){
		if(merge(a[i].x, a[i].y) == true){
			cnt--;
			ans += a[i].l;
		}
        if(cnt == k){
			cout << ans << endl;
			return 0;
		}
	}
	cout << "No Answer" << endl;
}

update 2025/8/24 发布题解
update 2025/9/24 更新代码

评论

2 条评论,欢迎与作者交流。

正在加载评论...