HDU - 1863 畅通工程

来源:互联网 发布:软件安装包制作 编辑:程序博客网 时间:2024/05/07 15:09

解题思路:并查集。根据造价排序,价格少的优先,如果不在同一个集合就合并,加上价格。最后判断有几个集合,若大于 1 个就说明所给方案不能连接所有村庄,输出 ?

#include <iostream>#include <algorithm>using namespace std;struct node {    int a, b, v;};node p[1010];int fa[1010];int gf(int x) {    if (fa[x] == x) return x;    fa[x] = gf(fa[x]);}bool judge(int x, int y) {    int fx = gf(x);    int fy = gf(y);    if (fx == fy) return 1;    fa[fx] = fy;    return 0;}bool cmp (node a, node b) {    return a.v < b.v;}int main() {    int N, M;    while (scanf("%d%d", &N, &M) && N) {        for (int i = 0; i < N; i++)            scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].v);        for (int i = 0; i <= M; i++) fa[i] = i;        sort (p, p+N, cmp);        int sum = 0;        for (int i = 0; i < N; i++) {            if (!judge(p[i].a, p[i].b))                sum += p[i].v;        }        int flag = 0;        for (int i = 1; i <= M; i++)            if (fa[i] == i) flag++;        if (flag == 1) cout << sum << endl;        else cout << "?" << endl;    }return 0;}
0 0