题解 | #继续畅通工程#

继续畅通工程

https://www.nowcoder.com/practice/16212f7d46e44174b5505997ea998538

//还是畅通工程稍微修改即可
#include "bits/stdc++.h"
using namespace std;
int father[5000];
int height[5000];
struct Edge{
    int begin;
    int end;
    int cost;
    int build;
};

void Inti(){
    for (int i = 0; i < 5000; ++i) {
        father[i]=i;
        height[i]=1;
    }
}

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

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

bool compare1(Edge x,Edge y){
    if(x.build != y.build) return x.build>y.build;
    return x.cost<y.cost;
}
int main() {
    int n;
    while (scanf("%d",&n)!=EOF){
        if(n==0){ break;}
        Inti();
        int answer = 0;
        int flag;//1已建
        Edge edge[(n*(n-1))/2];
        for (int i = 0; i < (n*(n-1))/2; ++i) {
            scanf("%d%d%d%d",&edge[i].begin,&edge[i].end,&edge[i].cost,&edge[i].build);
        }
        sort(edge,edge+(n*(n-1))/2,compare1);
        for (int i = 0; i < (n*(n-1))/2; ++i) {
            if(Find(edge[i].begin)!=Find(edge[i].end)){
                Union(edge[i].begin,edge[i].end);
                if(!edge[i].build) answer+=edge[i].cost;
            }
        }
        printf("%d\n",answer);
    }
    return 0;
}

全部评论

相关推荐

09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 10:52
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务