压缩路径之后,我的也终于0ms通过了! #include<stdio.h> #define max 30001 int stu[max]; int num[max]; int find(int v) { int b,x=v; while(x!=stu[x]) x=stu[x]; while(v!=stu[v]) { b=stu[v]; stu[v]=x; v=b; } return x; } void unio(int u,int v) { if(u==v) return; if(num[u]<num[v]) { stu[u]=v; num[v]+=num[u]; } else { stu[v]=u; num[u]+=num[v]; } } main() { int n,m; int i,k,a,b,f1,f2; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=0;i<=n;i++) { stu[i]=i; num[i]=1; } while(m--) { scanf("%d",&k); scanf("%d",&a); for(i=1;i<k;i++) { scanf("%d",&b); f1=find(a); f2=find(b); { unio(f1,f2); } } } printf("%d/n",num[find(0)]); } }