标准的并查集模版题!自己看吧!
const int MAX=100010; int fa[MAX]; int vis[MAX]; int vis1[MAX]; int find(int x){ if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void add(int x,int y){ int xx=find(x); int yy=find(y); if(xx==yy) return; fa[yy]=xx; } int n; set<int>st; int main(){ cin>>n; for(int i=0;i<100010;i++){ fa[i]=i; } while (n--) { int k; cin>>k; int x; cin>>x; st.insert(x); vis[x]=1; for(int i=0;i<k-1;i++){ int y; cin>>y; vis[y]=1; st.insert(y); add(x,y); } } set<int>st2; // for(int i=1;i<=10;i++){ // cout<<find(i)<<" "; // } // cout<<endl; for(int i=1;i<=st.size();i++){ if(vis[i]) st2.insert(find(i)); } cout<<st.size()<<" "<<st2.size()<<endl; int k; cin>>k; while (k--) { int a,b; cin>>a>>b; if(find(a)==find(b)) cout<<"Y"<<endl; else cout<<"N"<<endl; } }