kruskal解决最小生成数问题

还是畅通工程

https://www.nowcoder.com/practice/d6bd75dbb36e410995f8673a6a2e2229

#include <iostream>
#include <typeindex>
#include <bits/stdc++.h>
#include <vector>
using namespace std;

typedef struct edge{
    int x,y;
    int length;
};

vector<int> num;

int find(int x){
    return num[x]==x?x:find(num[x]);
}

bool cmp(edge x,edge y){
    return x.length<y.length;
}

void Union(int x,int y){
    num[find(x)]=y;
}

bool isOver(int n){
    int ans=0;
    for(int i=0;i<n;i++){
        if(find(i)==i){
            ans++;
        }
    }
    if(ans==1){
        return true;
    }
    return false;
}

int main() {
    int n;
    while(cin>>n){
        if(n==0){
            return 0;
        }
        for(int i=0;i<=n;i++){
            num.push_back(i);
        }
        edge side[n*(n-1)/2];
        for(int i=0;i<n*(n-1)/2;i++){
            cin>>side[i].x>>side[i].y>>side[i].length;
        }
        sort(side,side+n*(n-1)/2,cmp);
        int ans=0;
        for(int i=0;i<n*(n-1)/2;i++){
            if(find(side[i].x)!=find(side[i].y)){
                ans+=side[i].length;
                Union(side[i].x, side[i].y);
                if(isOver(n)){
                    break;
                }
            }
        }
        cout<<ans<<endl;
        num.clear();
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务