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...