poj 1611The Suspects(并查集)
题目:http://poj.org/problem?id=1611
并查集问题,rank[]记录与根节点的关系,num[]记录树的节点数
View Code
1 #include <iostream> 2 #include<cstdio> 3 4 using namespace std; 5 int set[30010]; 6 int rank[30010]; 7 int num[30010]; 8 int find(int x) 9 { 10 if(x!=set[x]) 11 { 12 set[x]=find(set[x]); 13 } 14 return set[x]; 15 } 16 void merge(int a,int b) 17 { 18 a=find(a); 19 b=find(b); 20 if(a==b) 21 { 22 return ; 23 } 24 if(rank[a]>rank[b]) 25 { 26 set[b]=a; 27 num[a]+=num[b]; 28 } 29 else 30 { 31 set[a]=b; 32 if(rank[a]==rank[b]) 33 { 34 rank[a]++; 35 num[b]+=num[a]; 36 } 37 } 38 return ; 39 } 40 int main() 41 { 42 int n,m; 43 while(scanf("%d%d",&n,&m)!=EOF) 44 { 45 if(n==0&&m==0) 46 break; 47 int t; 48 int i,j; 49 int a,b; 50 for(i=0;i<n;i++) 51 { 52 set[i]=i; 53 rank[i]=0; 54 num[i]=1; 55 } 56 for(i=0;i<m;i++) 57 { 58 cin>>t; 59 cin>>a; 60 for(j=1;j<t;j++) 61 { 62 cin>>b; 63 a=find(a); 64 b=find(b); 65 merge(a,b); 66 } 67 } 68 cout<<num[find(0)]<<endl; 69 } 70 return 0; 71 }