hdu 1856

#include<stdio.h>
#include<string.h>
#define  N 10000000
int pre[N+10],h[N+10],dis[N+10];
int find(int n ){
return pre[n]=n==pre[n]?n:find(pre[n]);
}
int main() {
int sum,cnt,a,b,f1,f2,n,i,max,min;
while(scanf("%d",&n)!=EOF) {
if(n==0) {//刚开始题意没看清错了一次没有一个朋友对的话输出1
printf("1\n");
continue;
}
for(i=1;i<=N;i++)
pre[i]=i;
min=1000000000;max=0;
while(n--) {
scanf("%d%d",&a,&b);
f1=find(a);
f2=find(b);
if(f1!=f2)
pre[f2]=f1;
dis[a]=dis[b]=1;
min=min<a?min:a;
min=min<b?min:b;
max=max>a?max:a;
max=max>b?max:b;
}
cnt=0;
memset(h,0,sizeof(h));
for(i=min;i<=max;i++)
if(dis[i]) 
h[find(i)]++;
for(i=min;i<=max;i++) 
if(cnt<h[i])
cnt=h[i];
printf("%d\n",cnt);
}
return 0;

}

一个更简单的代码

#include<stdio.h>
#include<string.h>
#define N 10000001
int pre[N+10],sum[N];
int find(int a) {
    if(pre[a]==a)
        return a;
    pre[a]=find(pre[a]);
    return pre[a];
}
int main() {
    int a,n,b,f1,f2,max,i;
    while(scanf("%d",&n)!=EOF) {
        for(i=1;i<=N;i++) {
            sum[i]=1;
            pre[i]=i;
        }
        max=1;
        while(n--) {
            scanf("%d%d",&a,&b);
            a=find(a);
            b=find(b);
            if(a!=b) {
                pre[b]=a;
                sum[a]+=sum[b];
                if(sum[a]>max)
                    max=sum[a];
            }
        }
printf("%d\n",max);
    }
    return 0;
}






posted @ 2013-10-30 17:37  HYDhyd  阅读(123)  评论(0编辑  收藏  举报