码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1856

时间:2016-01-27 22:54:57      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

并查集基本应用、

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

标签:

原文地址:http://www.cnblogs.com/sasuke-/p/5164560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!