并查集的简单应用
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int maxn = 1e4 + 5;
int fa[maxn];
void init() {
for (int i = 0; i < maxn; i++) {
fa[i] = i;
}
}
int findfather(int v) {
if (v == fa[v]) return v;
return fa[v] = findfather(fa[v]);
}
void Union(int a, int b) {
fa[findfather(a)] = findfather(b);
}
int main() {
init();
int n;
cin >> n;
int cnt = -1;
while (n--) {
int k;
cin >> k;
int a[maxn];
for (int i = 0; i < k; i++) {
cin >> a[i];
cnt = max(cnt, a[i]);
if (i) Union(a[i - 1], a[i]);
}
}
int rec[maxn] = {};
for (int i = 1; i <= cnt; i++) {
rec[findfather(i)]++;
}
int num = 0;
for (int i = 1; i <= cnt; i++) {
if (rec[i]) num++;
}
cout << num << " " << cnt << endl;
int q;
cin >> q;
while (q--) {
int x, y;
cin >> x >> y;
cout << (fa[x] == fa[y] ? "Yes" : "No") << endl;
}
return 0;
}