HDU 1856 More is better

题解:用并查集将所有的朋友合并,最后记录最大的连通块即可:

#include <cstdio>

int f[10000010],max,sum[10000010],cnt;



int sf(int x){

    if(f[x]!=x)f[x]=sf(f[x]);

    return f[x];

}



int main(){

    int n,x,y;

    while(scanf("%d",&n)!=EOF){

        if(n==0){puts("1");continue;}

        for(int i=1;i<10000010;i++){f[i]=i;sum[i]=0;}

        cnt=0;

        for(int i=0;i<n;i++){

            scanf("%d%d",&x,&y);

            f[sf(x)]=sf(y);

            x=x>y?x:y;

            cnt=x>cnt?x:cnt;

        }

        max=0;

        for(int i=1;i<=cnt;i++)

        if ((++sum[sf(i)])>max) max=sum[f[i]];

        printf("%d\n",max);

    }

    return 0;

}



你可能感兴趣的:(more)