开学了,班里有 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;
}