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