并查集基本应用、
题意:有编号为1到10^7的男生在一个房间,现在给出n组数据,每组数据包括两个编号,且这两个编号的人是朋友,如果A和B是朋友,B和C是朋友,那么A,B,C三人都是朋友,哪一个朋友圈中人数最多,输出这个朋友圈的人数
思路:因为编号是1到10^7所以,每次都要求出最大的编号数,如果每次都循环到10^7的话是会超时的,最后利用路径压缩,记录和的话是用的寻找根节点然后++
(提醒一下:如果数据很多的话用scanf输入比较好,cin的话会很慢)
1 #include2 #include 3 const int qq=1e7+1; 4 int par[qq],sum[qq]; 5 int n; 6 void handle() 7 { 8 for(int i=1;i<=1e7;++i){ 9 par[i]=i;10 sum[i]=0;11 }12 }13 int find(int x)14 {15 while(x!=par[x])16 x=par[x];17 return x; 18 }19 void unio(int x,int y)20 {21 int fx=find(x);22 int fy=find(y);23 par[fy]=fx;24 int t;25 while(x!=fx){26 t=par[x];27 par[x]=fx;28 x=t;29 }30 }31 int main()32 {33 while(scanf("%d",&n)!=EOF)34 {35 handle();36 int x,y;37 int Max=0;38 for(int i=1;i<=n;++i){39 scanf("%d%d",&x,&y);40 if(x>Max) Max=x;41 if(y>Max) Max=y;42 if(find(x)!=find(y))43 unio(x,y);44 }45 int mmax=1;46 for(int i=1;i<=Max;++i)47 sum[find(i)]++;48 for(int i=1;i<=Max;++i)49 if(mmax