题解 | 继续畅通工程

继续畅通工程

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
struct myType {
    int v1;
    int v2;
    int weight;
    int xj;
    myType(int _v1, int _v2, int _weight, int _xj) {
        v1 = _v1;
        v2 = _v2;
        weight = _weight;
        xj = _xj;
    }
};
bool compare(myType lhs, myType rhs) {
    if (lhs.xj > rhs.xj) {
        return true;
    }
    else if (lhs.xj < rhs.xj) {
        return false;
    }
    else {
        if (lhs.weight < rhs.weight) {
            return true;
        }
        else {
            return false;
        }
    }
}
int father[100];
void InitT(int n) {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}
int FindT(int u) {
    if (father[u] == u) { return u; }
    else {
        father[u] = FindT(father[u]);
        return father[u];
    }
}
void UnionT(int u, int v) {
    int uroot = FindT(u);
    int vroot = FindT(v);
    father[vroot] = uroot;
}
int main() {
    int n;
    int v1, v2, weight, xj;
    while (scanf("%d", &n) != EOF) {
        if (n == 0) { break; }
        vector<myType> p;
        InitT(n+1);
        int total = 0;
        int vertex = 0;
        for (int i = 0; i < n * (n - 1) / 2; ++i) {
            scanf("%d%d%d%d", &v1, &v2, &weight, &xj);
            myType e(v1, v2, weight, xj);
            p.push_back(e);
        }
        sort(p.begin(), p.end(), compare);
        for (int j = 0; j < n * (n - 1) / 2; ++j) {
            if (vertex == n - 1) { break; }
            if (FindT(p[j].v1) != FindT(p[j].v2)) {
                vertex++;
                UnionT(p[j].v1, p[j].v2);
                if (p[j].xj == 0) { total += p[j].weight; }
            }
        }
        printf("%d\n", total);
    }
    return 0;
}



#shit#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务