Source Code Problem: 1611 User: zhouxc Memory: 2904K Time: 32MS Language: G++ Result: Accepted Source Code #include "iostream" using namespace std; int n,m,k,group[1000][30001]; int a,b,p[30001],number[30001]; void make_set(int a) { for(int i=0;i<a;i++) { p[i]=i; number[i]=1; } } int find_set(int a) { if(p[a]!=a) p[a]=find_set(p[a]); return p[a]; } void Union(int a,int b) { // cout<<a<<number[a]<<" "<<b<<number[b]<<endl; a=find_set(a); b=find_set(b); if(a!=b) { if(number[a]>=number[b]) { p[b]=a; number[a]+=number[b]; } else { p[a]=b; number[b]+=number[a]; } } } int main() { // freopen("data.in","r",stdin); while(cin>>n>>m&&(n!=0||m!=0)) { make_set(n); for(int i=0;i<m;i++) { scanf("%d",&k); for(int j=0;j<k;j++) { scanf("%d",&group[i][j]); Union(group[i][0],group[i][j]); } } cout<<number[find_set(0)]<<endl; } // while(1); return 0; }