POJ - 1611The Suspects(并查集)

POJ - 1611The Suspects

并查集。

将每个组的学生进行合并,最后 \(0\) 号学生所在集合的学生个数即为答案。

#include <cstdio>
#include <vector>
using namespace std;

/**
 * Disjoint Set Union
 */
class DSU
{
    vector<int> s;
    int cnt;
 public:
    DSU(int n) {
        cnt = n;
        s.resize(n+1);
        for (int i = 1; i <= n; ++i) s[i] = i;
    }
    int find(int x) {
        if (x != s[x]) s[x] = find(s[x]);
        return s[x];
    }
    bool unite(int u, int v) {
        int x = find(u);
        int y = find(v);
        if (x != y) {
            s[y] = x;
            --cnt;
            return true;
        }
        return false;
    }
    int getCnt() {
        return cnt;
    }
};

int main()
{
    int n, m;
    while (~scanf("%d%d", &n, &m)&&(n|m)) {
        DSU dsu(n);
        while (m--) {
            int k;
            scanf("%d", &k);
            if (k == 0) continue;
            int u;
            scanf("%d", &u);
            --k;
            while (k--) {
                int v;
                scanf("%d", &v);
                dsu.unite(u+1,v+1);
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            if (dsu.find(i) == dsu.find(1)) ++ans;
        }
        printf("%d\n", ans);
    }

    return 0;
}

posted @ 2021-03-01 15:44  Zewbie  阅读(39)  评论(0编辑  收藏  举报