并查集之寻找某元素所在集合的元素个数----the suspects
另外建立一个数组NUM[],每次FIND(x)如果相等之后都将NUM[X]++,简单题。。。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 #define N 40000 6 int pre[N]; 7 int num[N]; 8 int rank[N]; 9 10 void init() 11 { 12 for(int i=0; i<N; i++) 13 { 14 num[i]=1; 15 pre[i]=i; 16 rank[i]=0; 17 } 18 } 19 20 int find(int x) 21 { 22 int r=x; 23 while(r!=pre[r]) 24 r=pre[r]; 25 int i=x,j; 26 while(i!=r) 27 { 28 j=pre[i]; 29 pre[i]=r; 30 i=j; 31 } 32 return r; 33 } 34 void merge(int x,int y) 35 { 36 int fx=find(x); 37 int fy=find(y); 38 if(fy==fx) return; 39 if(rank[fx]>rank[fy]) 40 { 41 pre[fy]=fx; 42 num[fx]+=num[fy]; 43 } 44 else 45 { 46 pre[fx]=fy; 47 if(rank[fx]==rank[fy]) 48 rank[fy]++; 49 num[fy]+=num[fx]; 50 } 51 } 52 int main() 53 { 54 55 int n,m; 56 while(~scanf("%d%d",&n,&m)) 57 { 58 init(); 59 if(n==0&&m==0) break; 60 if(m==0) 61 { 62 printf("1\n"); 63 continue; 64 } 65 while(m>0) 66 { 67 m--; 68 int t,first,next; 69 cin>>t>>first; 70 for(int i=1; i<t; i++) 71 { 72 scanf("%d",&next); 73 merge(first,next); 74 first=next; 75 } 76 } 77 int x=find(0); 78 cout<<num[x]<<endl; 79 } 80 return 0; 81 }