#include<stdio.h>
#define N 10000000+5
int father[N],sum[N];
int ans;
int find_father(int x){
if(father[x]==x){
return x;
}
else{
father[x]=find_father(father[x]);
}
return father[x];
}
int fmax(int i,int j){
return i>j?i:j;
}
void u(int x,int y){
int fax,fay;
fax=find_father(x);
fay=find_father(y);
if(fax==fay)
return ;
if(sum[fax]>=sum[fay]){//y的这棵树的节点数少
father[fay]=fax;//把y的根节点加到x的根节点上,即y的根节点的父亲为x的根节点
sum[fax]+=sum[fay];
ans=fmax(ans,sum[fax]);
}
else{
father[fax]=fay;//把y的根节点加到x的根节点上,即y的根节点的父亲为x的根节点
sum[fay]+=sum[fax];
ans=fmax(ans,sum[fay]);
}
return;
}
int main(){
int i,n,tp1,tp2;
while(scanf("%d",&n)==1){
ans=1;
for(i=1;i<=N;i++){
father[i]=i;
sum[i]=1;
}
for(i=0;i<n;i++){
scanf("%d%d",&tp1,&tp2);
u(tp1,tp2);
}
printf("%d\n",ans);
}
return 0;
}
并查集的使用。。。初次使用。。。参照了别人的代码。。
2013年3月12日:
重写本题
并查集基本的应用已经明白了。。。


1 /* 2 并查集 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<math.h> 11 using namespace std; 12 const int maxn = 10000005; 13 const int inf = 0x7fffffff; 14 const double pi=acos(-1.0); 15 const double eps = 1e-8; 16 int fa[ maxn ],sum[ maxn ]; 17 int ans ; 18 void init( ){ 19 ans = 0; 20 for( int i=1;i<maxn;i++ ){ 21 sum[ i ]=1; 22 fa[ i ]=i; 23 } 24 } 25 int find( int x ){ 26 if( fa[ x ]==x ) return x; 27 fa[ x ] = find( fa[ x ] ); 28 return fa[ x ]; 29 } 30 void union_xy( int x,int y ){ 31 int fa_x,fa_y; 32 fa_x = find( x ); 33 fa_y = find( y ); 34 if( fa_x==fa_y ) return ; 35 if( sum[ fa_x ]<sum[ fa_y ] ){ 36 fa[ fa_x ]=fa_y; 37 sum[ fa_y ]+=sum[ fa_x ]; 38 ans = max( ans,sum[ fa_y ] ); 39 } 40 else{ 41 fa[ fa_y ]=fa_x; 42 sum[ fa_x ]+=sum[ fa_y ]; 43 ans = max( ans,sum[ fa_x ] ); 44 } 45 } 46 47 int main(){ 48 int t; 49 while( scanf("%d",&t)!=EOF ){ 50 if( t==0 ){ 51 printf("1\n"); 52 continue; 53 } 54 init(); 55 int a,b; 56 //int max_num = 0; 57 while( t-- ){ 58 scanf("%d%d",&a,&b); 59 union_xy( a,b ); 60 //max_num = max( a,max( b,max_num ) ); 61 } 62 63 //for( int i=1;i<maxn/*=max_num*/;i++ ) 64 //ans = max( ans,sum[ i ] ); 65 66 printf("%d\n",ans); 67 } 68 return 0; 69 }