洛谷(LG)P1195口袋的天空

就是一道裸题,求的就是有几块生成树,算并查集的时候加一个判断就好了(每合并一次tot++,直到tot==n-k为止,然后输出就好了) 

https://www.luogu.org/problemnew/show/P1195

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n,m,k,f[1005],tot,maxn;
long long ans;
struct ctrl {
int u,v,w;
}p[10005];
int find(int i){return f[i]==i?i:f[i]=find(f[i]);}
bool cmp(ctrl c,ctrl v){return c.w<v.w;}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;++i) f[i]=i;
for(int i=0;i<m;++i) scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
sort(p,p+m,cmp);
for(int i=0;i<m;++i)
{
int x=find(p[i].u),y=find(p[i].v);
if(x!=y){
tot++;
f[x]=y;
ans+=p[i].w; 
if(tot==n-k)
{
printf("%d\n",ans);
return 0;
}
}

printf("No Answer");
return 0;
}

 

   
上一篇:Bootstrap3基础 栅格系统 标尺(col-lg/md/sm/xs-1)


下一篇:算法导论 — 2.3 设计算法