这是道并查集的题目。
注意输入0的时候是输出1。
#include <stdio.h>
int fa[10000001],tot[10000001];
int find(int u)
{
int s=u;
while (fa[u]!=u) u=fa[u];
while (fa[s]!=s) {fa[s]=u;s=fa[s];}
return u;
}
int main()
{
int n,i,x,y,u,v,maxx;
while(scanf("%d",&n)!=EOF)
{
maxx=1;
if (n>0)
{
for (i=1;i<=10000000;i++) {fa[i]=i,tot[i]=0;}
for (i=1;i<=n;i++)
{
scanf("%d%d",&u,&v);
x=find(u);y=find(v);
if (x!=y) fa[x]=y;
}
for (i=1;i<=10000000;i++) tot[find(i)]++;
maxx=tot[1];
for (i=2;i<=10000000;i++) if (tot[i]>maxx) maxx=tot[i];
}
printf("%d\n",maxx);
}
return 0;
}
优化:
先将所有数据的输入,然后再做并查操作,目的是减少运算量。
#include <stdio.h>
#define max1 100001
#define max2 10000001
int fa[max2],num[max2],u[max1],v[max1];
int find(int u)
{
int s=u;
while (fa[u]!=u) u=fa[u];
while (fa[s]!=s) {fa[s]=u;s=fa[s];}
return u;
}
int main()
{
int n,i,x,y,ans;
while(scanf("%d",&n)!=EOF)
{
ans=1;
if (n>0)
{
for (i=1;i<=n;i++) scanf("%d%d",&u[i],&v[i]);
for (i=1;i<=n;i++)
{
fa[u[i]]=u[i];
fa[v[i]]=v[i];
num[u[i]]=1;
num[v[i]]=1;
}
for (i=1;i<=n;i++)
{
x=find(u[i]);y=find(v[i]);
if (x!=y)
{
fa[x]=y;
num[x]+=num[y];
num[y]=num[x];
if (num[y]>ans) ans=num[y];
}
}
}
printf("%d\n",ans);
}
return 0;
}