hdu1856

#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日:

重写本题

并查集基本的应用已经明白了。。。

View Code
 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 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2602401.html