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;
}
相关文章推荐
- 感知器算法+C代码
- 指针和引用的区别(More Effective c++ )
- 笔试题做题笔记
- 应用Session变量控制用户登录时间
- MATLAB view函数详解
- ZoomButton与ZoomControls学习笔记
- [iOS]UILable文字如何在顶部
- MySQL的查询缓存
- centos下的svn安装(服务端)
- java编程思想恶心的enum状态机示例
- Ajax案例(使用ajax进行加法运算)
- JQPAGINATION分页插件实践
- HDU 5316 Magician(线段树区间合并, 子序列最值 多校2015啊)
- Ancient Cipher
- hdu4800_Josephina and RPG(二维状态dp)
- source sh执行脚本的区别
- CentOS下使用yum安装Git具体步骤
- Edit Distance
- HDU 3498 whosyourdaddy
- php设计模式入门-单例模式