并查集训练2.0
顺利通过了
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
#include <map>
using namespace std;
int n,m;
int maxb = -1;
int sum;
int ans[11000];
int fa[11000];
int find(int r){
return fa[r]==r?r:fa[r]=find(fa[r]);
}
void join(int x,int y){
int a = find(x);
int b = find(y);
if(a!=b) fa[b] = a;
}
int main()
{
cin >> n;
for(int i=1; i<=11000; i++) fa[i] = i;
for(int i=0; i<n; i++){
int k;
cin >> k;
vector<int> cnt(k);
for(int j=0; j<k; j++){
cin >> cnt[j];
if(cnt[j]>maxb) maxb = cnt[j];
if(j==0) continue;
else join(cnt[j-1],cnt[j]);
}
}
for(int i=1; i<=maxb; i++){
ans[find(i)]++;
}
for(int i=1; i<=maxb; i++){
if(ans[i]!=0) sum++;
}
cout <<sum << " "<< maxb << endl;
cin >> m;
for(int i=0; i<m; i++){
int a,b;
cin >> a >> b;
if(find(a)==find(b)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}