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 }
View Code

 

posted @ 2013-08-23 21:54  xxx0624  阅读(223)  评论(0编辑  收藏  举报