#include <iostream> using namespace std; #define SAFEDELETE_ARRAY(p) / {if(p) { delete p; p=NULL;} } //-------------------- typedef struct ufset { int *parent; int *root; }*UFSet; int Find(int e,UFSet U) { int i,j=e; while(U->root[j]!=-1) j=U->parent[j]; while(j!=e) { i=U->parent[e]; U->parent[e]=j; e=i; } return e; } int Union(int i,int j,UFSet U) { int p1=Find(i,U); int p2=Find(j,U); if(p1!=p2) { if(U->parent[p1]>U->parent[p2]) { U->parent[p2]+=U->parent[p1]; U->root[p1]=0; U->parent[p1]=p2; return p2; } else { U->parent[p1]+=U->parent[p2]; U->root[p2]=0; U->parent[p2]=p1; return p1; } } else return p1; } UFSet Init(int n,int m) { UFSet U=new ufset; int a,b; int num; U->parent=new int[n]; U->root=new int [n]; for(int i=0;i<n;i++) { U->parent[i]=-1; U->root[i]=-1; } for(int i=0;i<m;i++) { cin >> num; cin >> a; for(int j=1;j<num;j++) { cin >> b; Union(a,b,U); } } return U; } int main() { int n,m; int num=0; while(1) { int count=1; cin >> n >> m; if(m==0 && n!=0) { cout << count << endl; continue; } if(n==0 && m==0) return 0; UFSet U=Init(n,m); int temp=Find(0,U); for(int i=1;i<n;i++) if(Find(i,U)==temp) count++; cout << count << endl; SAFEDELETE_ARRAY(U->parent); SAFEDELETE_ARRAY(U->root); } return 0; } /*#include <iostream> using namespace std; #define SAFEDELETE_ARRAY(p) / {if(p) { delete p; p=NULL;} } //-------------------- typedef struct ufset { int *parent; }*UFSet; int Find(int e,UFSet U) { int i,j=e; while(U->parent[j]!=-1) j=U->parent[j]; while(j!=e) { i=U->parent[e]; U->parent[e]=j; e=i; } return e; } int Union(int i,int j,UFSet U) { int p1=Find(i,U); int p2=Find(j,U); if(p1!=p2) U->parent[p2]=p1; return p1; } UFSet Init(int n,int m) { UFSet U=new ufset; int a,b; int num; U->parent=new int[n]; for(int i=0;i<n;i++) { U->parent[i]=-1; } for(int i=0;i<m;i++) { cin >> num; cin >> a; for(int j=1;j<num;j++) { cin >> b; Union(a,b,U); } } return U; } int main() { int n,m; int num=0; while(1) { int count=1; cin >> n >> m; if(m==0 && n!=0) { cout << count << endl; continue; } if(n==0 && m==0) return 0; UFSet U=Init(n,m); int temp=Find(0,U); for(int i=1;i<n;i++) if(Find(i,U)==temp) count++; cout << count << endl; SAFEDELETE_ARRAY(U->parent); } return 0; } */