有10000000个同学,他们之间可能是直接朋友或者间接朋友,问最大的朋友圈有多少人。
一直觉得10000000的数组开不了,用map优化了一下,结果能开,且10000000也不会超时。。。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<map> using namespace std; #define N 200005 int father[N]; int number[N]; int findFa(int num) { if(father[num]!=num) father[num]=findFa(father[num]); return father[num]; } void Merge(int a,int b) { int fa=findFa(a); int fb=findFa(b); if(fa!=fb) { father[fa]=fb; number[fb]+=number[fa]; } } map<int,int> ma; int size; int main() { int n; while(scanf("%d",&n)!=EOF) { size=1; ma.clear(); for(int i=0; i<=N; i++) { father[i]=i; number[i]=1; } for(int i=0; i<n; i++) { int a,b; scanf("%d%d",&a,&b); if(ma[a]==0) ma[a]=size++; if(ma[b]==0) ma[b]=size++; Merge(ma[a],ma[b]); } int res=0; for(int i=1; i<=N; i++) { //if(i<10) // cout<<number[i]<<" "; if(father[i]==i) res=max(res,number[i]); } printf("%d\n",res); } return 0; }