L2-024 部落 (25 分) 并查集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiang_6/article/details/88735325

需要知道总人数和不想交部落数

首先并查集,把每一组的人和在一起,然后两个set分别表示所有人id和部落代表的id

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 1e4 + 7;

int n;
int f[maxn];
vector<int> vec;

void init() {
    vec.clear();
    for(int i = 1; i < maxn; ++i) {
        f[i] = i;
    }
}
set<int> all;

int find_(int x) {
    return (x == f[x] ? x : f[x] = find_(f[x]));
}
int main() {
    scanf("%d", &n);
    init();
    for(int i = 1; i <= n; ++i) {
        int k; scanf("%d", &k);
        if(k) {
            int t;
            scanf("%d", &t); all.insert(t);
            for(int j = 1; j < k; ++j) {
                int x; scanf("%d", &x); all.insert(x);
                int t_ = find_(t);
                int x_ = find_(x);
                f[x_] = f[t_];
            }
        }
    }
    cout << all.size() << " ";
    set<int> st;
    for(auto i : all) {
        st.insert(find_(i));
//        cout << i << " = " << find_(i) << endl;
    }
    cout << st.size() << endl;
    int q; scanf("%d", &q);
    while(q--) {
        int a, b; scanf("%d%d", &a, &b);
        if(find_(a) == find_(b)) {
            cout << "Y" << endl;
        }
        else {
            cout << "N" << endl;
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/88735325