1118 Birds in Forest (25 分)
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#define rep(i,j,k) for(int i=j;i<k;i++)
using namespace std;
const int maxn=1e4+10;
int fa[maxn];
int find(int x){
int a = x;
while(x != fa[x]){
x = fa[x];
}
while(a != fa[a]){
int z = a;
a = fa[a];
fa[z] = x;
}
return x;
}
void uni(int a,int b){
int faa=find(a);
int fab=find(b);
if(faa < fab)
fa[fab] = faa;
else if(faa > fab)
fa[faa] = fab;
}
int main(){
int n,m,k,a,b;
cin>>n;
rep(i,0,10000){
fa[i] = i;
}
set<int> st,ma;
rep(i,0,n){
cin>>k>>a;
st.insert(a);
rep(j,1,k){
cin>>b;
st.insert(b);
uni(a,b);
}
}
for(set<int>::iterator it=st.begin();it!=st.end();it++){
ma.insert(fa[*it]);
}
printf("%d %d\n",ma.size(),st.size());
cin>>m;
rep(i,0,m){
cin>>a>>b;
printf("%s\n",find(a)==find(b)?"Yes":"No");
}
return 0;
}