您的位置:首页 > 其它

1856 More is better

2015-07-29 21:50 218 查看

More is better

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)

Total Submission(s): 18729    Accepted Submission(s): 6881

[align=left]Problem Description[/align]
Mr Wang wants some boys to help him with a project. Because the project is rather complex,
the more boys come, the better it will be. Of course there are certain requirements.

Mr Wang selected a room big enough to hold the boys. The boy who are not been chosen has to leave the room immediately. There are 10000000 boys in the room numbered from 1 to 10000000 at the very beginning. After Mr Wang's selection any two of them who are
still in this room should be friends (direct or indirect), or there is only one boy left. Given all the direct friend-pairs, you should decide the best way.

 

[align=left]Input[/align]
The first line of the input contains an integer n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs. The following n lines each contains a pair of numbers A and B separated by a single space that suggests A and B are direct friends.
(A ≠ B, 1 ≤ A, B ≤ 10000000)
 

[align=left]Output[/align]
The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.

 

[align=left]Sample Input[/align]

4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8

 

[align=left]Sample Output[/align]

4
2

Hint
A and B are friends(direct or indirect), B and C are friends(direct or indirect),
then A and C are also friends(indirect).

In the first sample {1,2,5,6} is the result.
In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers.

题意:

相互有特殊关系的同学分在一组,否则都是单个一组,求出分完之后,所有小组里的最多有几个人,也就是统计每个集合中的元素个数,并找出最大值.......

分析:

首先,关键知识是并查集的理论,判断连通性,把元素分开在不同的集合中,便于处理,

其次,需要统计最大的个数,那么完全可以用个数组来实现排序功能(不懂得自己搜索一下,桶排序哦..),其实也不需要排序,只是一直在更新最大值而已,这样很巧妙,

最后输出那个对应的值,注意一个小问题,如果 n 是 0 的话,那么每个组都是一个人,那么就是说,输出值是 1 !注意就行......

#include<stdio.h>
#include<string.h>
#define max(x,y) (x)>(y)?(x):(y)
int per[10000005],s[10000005],len;
void init()
{
for(int i=1;i<=10000004;++i)//初始化函数
{
per[i]=i;
}
}

int find(int x)//查询
{
int r=x;
while(per[r]!=r)
{
r=per[r];
}
per[x]=r;
return r;
}
void join(int x, int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)//合并
{
per[fy]=fx;
}
}

int main()
{
int n,m,i,j,a,b,c,maxx;
while(~scanf("%d",&n))
{
init();len=1;
memset(s,0,sizeof(s));
while(n--)
{
scanf("%d%d",&a,&b);
len=max(max(len,a),b);//找最大区间....
join(a,b);
}
maxx=0;
for(i=1;i<=len;++i)
{
a=find(i);//这一步可以即实现压缩路径,又能找到需要的根节点
++s[a];//实现统计功能
maxx=max(maxx,s[a]);//更新最大值
}
printf("%d\n",maxx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: