zoukankan      html  css  js  c++  java
  • 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...
  • 相关阅读:
    喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库
    maven jdbc 驱动安装
    SpringIoC和SpringMVC的快速入门
    再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心
    LRU设计
    二叉搜索树转换成双向链表
    快速排序
    二叉搜索树的先序中序后序非递归遍历代码
    EM算法
    模型调优
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2602401.html
Copyright © 2011-2022 走看看