P1195 口袋的天空 (图论 并查集 生成树)

题目背景

小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述

给你云朵的个数 NN,再给你 MM 个关系,表示哪些云朵可以连在一起。

现在小杉要把所有云朵连成 KK 个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。

输入格式

第一行有三个数 N,M,KN,M,K。

接下来 MM 行每行三个数 X,Y,LX,Y,L,表示XX云和 YY 云可以通过 LL 的代价连在一起。

输出格式

对每组数据输出一行,仅有一个整数,表示最小的代价。

如果怎么连都连不出 KK 个棉花糖,请输出 No Answer

输入输出样例

输入 #1复制

3 1 2
1 2 1

输出 #1复制

1

说明/提示

对于 30\%30% 的数据,N \le 100N≤100,M \le 10^3M≤103;

对于 100\%100% 的数据,1 \le N \le 10^31≤N≤103,1 \le M \le 10^41≤M≤104,1 \le K \le 101≤K≤10,1 \le X,Y \le N1≤X,Y≤N,0 \le L<10^40≤L<104。

代码如下: 同样模板题

#include<bits/stdc++.h>
using namespace std;
int n , m , k;
int par[100005];
struct road
{
    int c1 , c2 , d;
}a[100005];


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

bool unite(int x , int y)
{
    x=find(x);
    y=find(y);
    if(x!=y) {par[y]=x;n--;return true;}
    else return false;
}

bool cmp( road a ,  road b)
{
    return a.d<b.d;
}

int main()
{
    int sum=0;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        par[i]=i;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i].c1>>a[i].c2>>a[i].d;
    }
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(unite(a[i].c1,a[i].c2))
            sum+=a[i].d;
//        cout<<sum;
        if(n==k)  {cout<<sum<<endl;return 0;}
    }
    cout<<"No Answer";
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值