传送门口袋的天空 - 洛谷
一个基础并查集问题
主要思路:起初天上有n朵云,我们可以认为是n个棉花糖,要让棉花糖的数量减到k,那么我们可以写一个bool函数判断两朵云能否连接,如果能连接,那么棉花糖数量减一,当数量减到k时跳出就可以了
对并查集不熟悉的同学可以看看这两位大神的文章(个人认为讲的很清楚,成功让本菜鸟明白了并查集)
【算法与数据结构】—— 并查集_the_ZED的博客-CSDN博客_并查集
并查集详解 ——图文解说,简单易懂(转)_多反思,多回顾,要坚持。-CSDN博客_并查集详解
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int pre[1010];
struct cloud{
int x;
int y;
int l;
}c[10010];
bool cmp(cloud a,cloud b){
return a.l<b.l;
}
//初始化
void init(int n)
{
for(int i=1;i<=n;i++){
pre[i]=i;
}
}
int find(int x){
if(x!=pre[x]) pre[x]=find(pre[x]);
return pre[x];
}
bool Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b){
pre[a]=b;
return true;
}
return false;
}
int main()
{
int n,m,k;
cin>>n>>m>>k;
init(n);
int cnt=n;
for(int i=1;i<=m;i++){
cin>>c[i].x>>c[i].y>>c[i].l;
}
sort(c+1,c+m+1,cmp);
int ans=0;
for(int i=1;i<=m;i++){
if(Union(c[i].x,c[i].y)) {//如果连接成功,棉花糖数量减一
cnt--;
ans+=c[i].l; //加上连接需要的代价
}
if(cnt==k) break;
}
if(cnt==k) cout<<ans;
else cout<<"No Answer";
return 0;
}
另外,以下两题也可以用同样的思路ac