题解 | 畅通工程

畅通工程

https://www.nowcoder.com/practice/4878e6c6a24e443aac5211d194cf3913

#include <stdio.h>
#include <set>
using namespace std;

int FindDjsjointSet(int father[], int n) {
    if (father[n] == n) {
        return n;
    }
    father[n] = FindDjsjointSet(father, father[n]);
    return father[n];
}

void UnionDjsjointSet(int father[], int u, int v) {
    int uroot = FindDjsjointSet(father, u);
    int vroot = FindDjsjointSet(father, v);
    if (uroot != vroot) {
        father[vroot] = uroot;
    }
}

int main() {
    int m, n;
    while (scanf("%d %d", &m, &n) != EOF && m != 0) {
        int father[10005];
        for (int i = 1; i <= m; i++) {
            father[i] = i;
        }

        for (int i = 0; i < n; i++) {
            int u, v;
            scanf("%d %d", &u, &v);
            UnionDjsjointSet(father, u, v);
        }

        set<int> rootn;
        for (int i = 1; i <= m; i++) {
            rootn.insert(FindDjsjointSet(father, i));
        }

        printf("%d\n", (int)rootn.size() - 1);
    }

    return 0;
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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