http://acm.hdu.edu.cn/showproblem.php?pid=1856 其实点最多只有200000个,在这里就可以进行离散化。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,father[10000001],rank[10000001],ans,sum,v[10000001],st[200001]; int max(int a,int b) { return a>b?a:b; } int find(int x) { while(x!=father[x]) x=father[x]; return x; } void con(int x,int y) { int fx=find(x); int fy=find(y); if(rank[fy]>rank[fx]){father[fx]=fy;rank[fy]+=rank[fx];} else {father[fy]=fx;rank[fx]+=rank[fy];} } int main() { while(scanf("%d",&n)!=EOF) { ans=sum=0; if(n==0) {printf("1/n");continue;} memset(v,0,sizeof(v)); memset(st,0,sizeof(st)); int i,j,a,b; for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); if(!v[a]) father[a]=a,rank[a]=1,st[++sum]=a; if(!v[b]) father[b]=b,rank[b]=1,st[++sum]=b; v[a]=v[b]=1; if(find(a)!=find(b)) con(a,b); } for(i=1;i<=sum;i++) if(father[st[i]]==st[i]) ans=max(ans,rank[st[i]]); printf("%d/n",ans); } return 0; }