版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}