这是道并查集的题目。
注意输入0的时候是输出1。
跟UVA 10608 Friends 并查集差不多。
#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; }