标签:
并查集基本应用、
题意:有编号为1到10^7的男生在一个房间,现在给出n组数据,每组数据包括两个编号,且这两个编号的人是朋友,如果A和B是朋友,B和C是朋友,那么A,B,C三人都是朋友,哪一个朋友圈中人数最多,输出这个朋友圈的人数
思路:因为编号是1到10^7所以,每次都要求出最大的编号数,如果每次都循环到10^7的话是会超时的,最后利用路径压缩,记录和的话是用的寻找根节点然后++
(提醒一下:如果数据很多的话用scanf输入比较好,cin的话会很慢)
1 #include<cstdio> 2 #include<cmath> 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<sum[i]) 50 mmax=sum[i]; 51 printf("%d\n",mmax); 52 } 53 }
标签:
原文地址:http://www.cnblogs.com/sasuke-/p/5164560.html