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<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; }