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 }

 

你可能感兴趣的:(HDU)