Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 5725 Accepted Submission(s): 2127
Statistic | Submit | Discuss | Note
//因为A,B比较大,所以数据要进行处理,因为n在100000以内,所以开个200000左右的数组,将A,B进行从新编号,然后再进行并查集处理,求最大连通块
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 200003
using namespace std;
struct node
{
int a,b;
};
node te[100003];
int n,m,Max;
int f[N],t[N],r[N];
int st[N];
int bf(int x)
{
int l=1,r=m,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(st[mid]>x) r=mid-1;
else if(st[mid]<x) l=mid+1;
else
return mid;
}
}
int find_f(int x)
{
if(x!=f[x])
{
return f[x]=find_f(f[x]);
}
return x;
}
void union_set(int x,int y)
{
x=find_f(x);
y=find_f(y);
if(x==y) return;
if(r[x]>r[y])
{
f[y]=x;
t[x]+=t[y];
if(t[x]>Max) Max=t[x];
}
else if(r[x]<r[y])
{
f[x]=y;
t[y]+=t[x];
if(t[y]>Max) Max=t[y];
}
else
{
f[y]=x;
r[x]++;
t[x]+=t[y];
if(t[x]>Max) Max=t[x];
}
}
int main()
{
int i,j,a,b;
while(scanf("%d",&n)!=EOF)
{
if(n==0) //开始这里没有处理,WA一次
{printf("1\n");continue;}
j=1;Max=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&te[i].a,&te[i].b);
st[j]=te[i].a;j++;
st[j]=te[i].b;j++;
}
j=2*n;
sort(st+1,st+j+1);//调试时这里写了东西忘记删除、WA一次、悲剧
m=1;
for(i=2;i<=j;i++)
{
if(st[i]!=st[i-1])
st[++m]=st[i];
}
for(i=1;i<=m;i++)
f[i]=i,r[i]=0,t[i]=1;
for(i=1;i<=n;i++)
{
a=bf(te[i].a);
b=bf(te[i].b);
union_set(a,b);
}
printf("%d\n",Max);
}
return 0;
}