题目链接:HDU 1879

Problem Description

Input

Output

Sample Input

3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0

Sample Output

3
1
0

Author

Source

浙大计算机研究生复试上机考试-2008年

Solution

题意

如题。

思路

最小生成树

最小生成树裸题。把已建的道路的成本设为 0,跑一遍最小生成树即可。

Code

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;

struct Edge {
    int u, v, w;
} edge[maxn];

int far[maxn];

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

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

int cmp(Edge a, Edge b) {
    return a.w < b.w;
}

int Kruskal(int n, int m) {
    init(n);
    sort(edge + 1, edge + 1 + m, cmp);
    int ans = 0;
    for(int i = 1; i <= m; ++i) {
        int x = find(edge[i].u);
        int y = find(edge[i].v);
        if(x != y) {
            ans += edge[i].w;
            far[x] = y;
        }
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    int n;
    while(cin >> n && n) {
        int m = n * (n - 1) / 2;
        for(int i = 1; i <= m; ++i) {
            int f;
            cin >> edge[i].u >> edge[i].v >> edge[i].w >> f;
            if(f) {
                edge[i].w = 0;
            }
        }
        cout << Kruskal(n, m) << endl;
    }
    return 0;
}
01-22 14:32