口袋的天空

题面

最小生成树版子题

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,k,ans,fa[10005],cnt; 
struct Node{
    int x;
    int y;
    int l; 
}a[10005];
inline bool cmp(const Node &a,const Node &b){
    return a.l<b.l;
}
inline int Find(int i){
    if(fa[i]==i)return i;
    return fa[i]=Find(fa[i]);
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(register int i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].l);
    sort(a+1,a+m+1,cmp);
    for(register int i=1;i<=m;i++)
        fa[i]=i;
    cnt=n;
    for(register int i=1;i<=m;i++){
        int f1,f2;
        f1=Find(a[i].x);
        f2=Find(a[i].y);
        if(f1!=f2){
            fa[f1]=f2;
            cnt--;
            ans+=a[i].l;
        }
        if(cnt==k)break;
    }
    if(ans==0)printf("No Answer\n"); 
    else printf("%d\n",ans);
    return 0;
}

  

posted @ 2019-07-15 12:29  [jackeylove]  阅读(136)  评论(0编辑  收藏  举报