POJ2524+并查集
题意简单。
询问n个人的宗教关系。
1 #include<stdio.h> 2 3 const int maxn = 50005; 4 5 int fa[ maxn ]; 6 int vis[ maxn ]; 7 8 void init( int n ){ 9 for( int i=1;i<=n;i++ ) 10 {fa[i] = i;vis[i] = 0;} 11 } 12 int find( int x ){ 13 if( x==fa[x] ) 14 return x; 15 return fa[x] = find( fa[x] ); 16 } 17 void union_ab( int a,int b ){ 18 int fa_a = find(a); 19 int fa_b = find(b); 20 if( fa_a == fa_b ) return ; 21 if( fa_a<fa_b ) fa[ fa_b ] = fa_a; 22 else fa[ fa_a ] = fa_b; 23 return ; 24 } 25 26 int main(){ 27 int n,m; 28 int Case = 1; 29 //freopen("in.txt","r",stdin); 30 while( scanf("%d%d",&n,&m)==2 ){ 31 if( n+m ==0 ) break; 32 init(n); 33 int x,y; 34 while( m-- ){ 35 scanf("%d%d",&x,&y); 36 if( x==y ) continue; 37 union_ab( x,y ); 38 } 39 int ans = 0; 40 for( int i=1;i<=n;i++ ){ 41 find(i); 42 } 43 /* 44 这里需要重新更新每个节点的父子关系。 45 比如: 46 5 4 47 1 2 48 5 3 49 4 5 50 1 4 51 */ 52 for( int i=1;i<=n;i++ ){ 53 vis[ fa[i] ] = 1; 54 } 55 for( int i=1;i<=n;i++ ){ 56 ans += vis[ i ]; 57 //printf("fa[%d] = %d\n",i,fa[i]); 58 } 59 printf("Case %d: %d\n",Case++,ans); 60 } 61 return 0; 62 }
keep moving...