专栏文章
题解:P1195 口袋的天空
P1195题解参与者 2已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mio5wvgh
- 此快照首次捕获于
- 2025/12/02 13:53 3 个月前
- 此快照最后确认于
- 2025/12/02 13:53 3 个月前
思路
这一题可以用并查集来做。
因为是求最小代价,所以可以先按照代价把每个关系从小到大排序,优先连代价小的云。设 为棉花糖个数,一开始 为 (天上 朵云相当于 个棉花糖),接着遍历 从第 个关系到第 个关系,在第 个关系中,如果云 和 之间不连通,那么就可以合并云 和 ,合并后棉花糖就少了一朵,所以 减 ,代价加上 。当 时,输出代价,遍历完之后如果 还是大于 ,则输出
No Answer。注意:当 时,输出
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 条评论,欢迎与作者交流。
正在加载评论...