赤裸裸的并查集,数据较水,不过太大,注意超时,建立并查集一定要
遵循多包少,这样简化下一次的查找,缩短时间,还有,应该一边输入
关系,一边刷新元素最大值,这样之后就不用额外加个循环。总结还是
数据的处理能力吖......
#include<iostream> int bin[10000002]; int flag[10000002]; int max; int find(int x) { while(bin[x]!=x) x=bin[x]; return x; } int merge(int x,int y) { int fy,fx; fy=find(y); fx=find(x); if(fy!=fx) { if(flag[fx]>=flag[fy]) { bin[fy]=fx; flag[fx]+=flag[fy]; if(max<flag[fx]) max=flag[fx]; } else { bin[fx]=fy; flag[fy]+=flag[fx]; if(max<flag[fy]) max=flag[fy]; } } return 0; } int main(){ int i,x,y; int n; while(scanf("%d",&n)!=EOF) { max=1; for(i=1;i<=10000000;i++) { bin[i]=i; flag[i]=1; } for(i=0;i<n;i++) { scanf("%d %d",&x,&y); merge(x,y); } printf("%d\n",max); } return 0; }
转载于:https://blog.51cto.com/8590696/1358849