题解 | #还是畅通工程#

还是畅通工程

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

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
const int MAX=100;

struct Edge{
    int from;
    int to;
    int length;
    bool operator<(const Edge& e)const{
        return length<e.length;
    }
};

Edge edge[MAX*MAX];
int father[MAX];
int height[MAX];

void Initialize(int n){
    for(int i=0;i<n;i++){
        father[i]= i;
        height[i]=0;
    }
    return;
}

int Find(int x){
    if(x!=father[x]){
        return Find(father[x]);
    }
    return father[x];
}

void Union(int x, int y){
    x= Find(x);
    y= Find(y);
    if(x!=y){
        if(height[x]<height[y]){
            father[x]=y;
        }else if(height[y]<height[x]){
            father[y]=x;
        }else{
            father[y]=x;
            height[x]++;
        }
    }
    return;
}



int Kruskal(int n, int edgeNumber){
    Initialize(n);
    sort(edge,edge+edgeNumber);
    int sum=0;
    for(int i=0;i<edgeNumber;i++){
        Edge current=edge[i];
        if(Find(current.from)!=Find(current.to)){
            Union(current.from,current.to);
            sum+=current.length;
        }
    }
    return sum;
}


int main(){
    int N;
    while(scanf("%d",&N)!=EOF){
        if(N==0){
            break;
        }
        int numD=N*(N-1)/2;
        int a,b,disAB;
        for(int i=0;i<numD;i++){
            scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].length);
        }
        int answer=Kruskal(N,numD);
        printf("%d\n",answer);
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
10-13 13:49
南京大学 财务
饿魔:笑死我了,你简直是个天才
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务