P1195 口袋的天空
n个点,m条边,连成k个集合,也就是连(n-k)条边,并且使得连接的边权值最小
1.判断能不能成功 m>n-k
2.连n-k条边使得边权值之和最小,所以Kruskal算法有边的排序
//口袋的天空
//分析一下,就是k棵树要连n-k条边,怎么使边之和最小呢
//Kruskal算法有排序
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
const int M=10010;
int p[N];
int n,m,k;
int res=0,cnt=0;
struct edge{
int a,b,c;
}e[M];
bool cmp(edge a,edge b){
return a.c<b.c;
}
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main(){
cin>>n>>m>>k;
if(m<n-k){
cout<<"No Answer"<<endl;
return 0;
}
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
e[i]={a,b,c};
}
sort(e,e+m,cmp);
for(int i=1;i<=n;i++){
p[i]=i;
}
for(int i=0;i<n;i++){
int a=e[i].a,b=e[i].b,c=e[i].c;
a=find(a);b=find(b);
if(a!=b){
p[a]=b;
res+=c;
cnt++;
}
if(cnt==k) break;
}
cout<<res<<endl;
return 0;
}