解题思路:并查集思想
#include <stdio.h> int f[10001]; void Init(int n) { int i; for(i=0; i<n; i++) { f[i]=i; } } int getf(int x) { if(f[x]==x) return x; return f[x]=getf(f[x]); } int check(int x,int y) { if(getf(x)==getf(y)) return 1; return 0; } void Union(int x,int y) { int f1=getf(x); int f2=getf(y); f[f2]=f1; } int main() { int n; scanf("%d",&n); int i,j; Init(10001); int max=0; for(i=0; i<n; i++) { int m; scanf("%d",&m); int x[m]; for(j=0; j<m; j++) { scanf("%d",&x[j]); if(x[j]>max) max=x[j]; } for(j=1; j<m; j++) { Union(x[j-1],x[j]); } } int cnt=0; for(i=1; i<=max; i++) { if(f[i]==i) cnt++; } printf("%d %d ",max,cnt); int k; scanf("%d",&k); int a,b; for(j=0; j<k; j++) { scanf("%d %d",&a,&b); if(check(a,b)) printf("Y "); else printf("N "); } }