题解 | #继续畅通工程#

继续畅通工程

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

求最小生成树,如果一条路已经修好,将其w置为0

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 110;
int p[N];
int n;

void init() {
    for (int i = 0; i <= n; i++) p[i] = i;
}

int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void un(int u, int v) {
    int root1 = find(u), root2 = find(v);
    if (root1 != root2) p[root1] = root2;
}

struct edge {
    int u, v, w;
    edge(int _u, int _v, int _w) {
        u = _u;
        v = _v;
        w = _w;
    }
};

vector<edge> es;
int sum = 0;

bool cmp(edge e1, edge e2) {
    if (e1.w < e2.w) return true;
    return false;
}

void kruskal() {
    sort(es.begin(), es.end(), cmp);

    int cnt = 0;
    for (auto x : es) {
        int root1 = find(x.u), root2 = find(x.v);
        if (root1 == root2) continue;
        cnt++;
        sum += x.w;
        un(root1, root2);
        if (cnt == n - 1) {
            break;
        }
    }

    cout << sum << endl;
}

int main() {

    while (cin >> n) {
        if(n == 0) break;
        init();
        es.clear();
        sum = 0;
        int u, v, w, op;
        for (int i = 0; i < n * (n - 1) / 2; i++) {
            cin >> u >> v >> w >> op;
            if (op == 1) w = 0;
            es.push_back({u, v, w});
        }

        kruskal();
    }

    return 0;
}

王道考研机试 文章被收录于专栏

包含考研机试打卡表题目

全部评论

相关推荐

09-13 08:41
服装/纺织设计
那一天的Java_J...:你第一次参加面试吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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