并查集裸题。
const int N=10010;
int p[N];
int n,m,maxid;
int find(int x)
{
if(x != p[x]) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n;
for(int i=1;i<N;i++) p[i]=i;
while(n--)
{
int k;
cin>>k;
vector<int> a(k);
for(int i=0;i<k;i++) cin>>a[i],maxid=max(maxid,a[i]);
for(int i=0;i<k-1;i++)
{
int pa=find(a[i]),pb=find(a[i+1]);
if(pa != pb)
p[pa]=pb;
}
}
int group=0;
for(int i=1;i<=maxid;i++)
if(p[i] == i)
group++;
cout<<maxid<<' '<<group<<endl;
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa != pb) puts("N");
else puts("Y");
}
//system("pause");
return 0;
}