HDU 1856

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1856相关的知识,希望对你有一定的参考价值。

并查集基本应用、

题意:有编号为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 }

 

以上是关于HDU 1856的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1856

hdu 1856 More is better(并查集)

HDU 1856 More is better

hdu--1856 More is better

More is better HDU - 1856 ?

HDU 1856 More is better