G - 程序设计:建立联系

开学了,班里有 n

个人,但是他们互不相识,我们需要让他们彼此直接或间接地是朋友,这样才能方便人与人之间的交流。

通过某种方法,我们预测出有 m
对朋友可能会建立,每一对的描述是将 xi 和 yi 之间建立一个双向朋友关系,花费为的时间与金钱量化为 zi

实际上我们可以把人们拉进一个群组,这样群组内的大家就可以迅速建立朋友,而不消耗任何花费。然而群成员上限至多是 k
个人,也就是说我们至多只能拉 k

个人进入群组。而且由于某些原因,我们只能建立至多一个群组。

求使得人与人之间彼此直接或间接的是朋友的最小代价。保证一定存在这种方案。
输入格式

第一行三个整数 n,m,k

接下来 m
行,每行三个整数 xi,yi,zi


输出格式

一行一个整数表示最小代价。
数据范围

对于 10%
的数据: n≤5,m≤5,k≤5

对于另外 10%
的数据: n≤2000,m≤4000,k=0

对于另外 20%
的数据: n≤2000,m≤4000,k≤n

对于另外 20%
的数据:n≤200000,m≤400000,k=0

对于 100%
的数据: k≤n≤200000,m≤400000,zi≤109,ai,bi≤n

Sample Input

3 3 2
2 1 1
3 2 2
1 3 2

Sample Output

1
#include<bits/stdc++.h>

using namespace std;
struct node{
    long long int x,y,z;
}a[400001];
long long int n,m,k;
long long int fa[200001];
bool cmp(node x,node y)
{
    return x.z<y.z;
}
long long int getf(long long int x)
{
    if(x==fa[x])
        return x;
    else
        return fa[x]=getf(fa[x]);
}
int main()
{
    cin>>n>>m>>k;
    for(long long int i=1;i<=n;i++)
    fa[i]=i;
    for(long long int i=0;i<m;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].z;
    }
    sort(a,a+m,cmp);
    long long int ans=0,index=0;
    for(long long int i=0;i<m;i++)
    {
        long long int u=a[i].x;
        long long int v=a[i].y;
        long long int w=a[i].z;
        long long int fu=getf(u);
        long long int fv=getf(v);
        if(fu==fv)
        continue;
        fa[fv]=fu;
        ans+=w;
        index++;
        if(index==n-k)
            break;
    }
    cout<<ans<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JdiLfc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值