https://pintia.cn/problem-sets/994805342720868352/problems/994805354108403712
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int p[N],n,q;
unordered_map<int,int>cnt;
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(void)
{
cin>>n;
for(int i=0;i<N;i++) p[i]=i;
for(int i=0;i<n;i++)
{
int m; cin>>m;
int a[105];
for(int j=0;j<m;j++)
{
cin>>a[j];
if(j) p[find(a[j])]=find(a[j-1]);
cnt[a[j]]++;
}
}
int ans1=0,ans2=0;
for(int i=0;i<N;i++)
{
if(cnt[i]&&i==p[i]) ans1++;//点存在,且是根节点
if(cnt[i]) ans2++;
}
cout<<ans1<<" "<<ans2<<endl;
cin>>q;
while(q--)
{
int a,b; cin>>a>>b;
if(find(a)!=find(b)) puts("No");
else puts("Yes");
}
return 0;
}