More is better
2015-07-09 09:33
246 查看
More is better
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 327680/102400K (Java/Other)Total Submission(s) : 1 Accepted Submission(s) : 1
[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. [/hint]
思路:加一个数组记录数的元素个数;剩下的并差集解决;
代码:
#include<stdio.h> int relate[10000010],num[10000010];//num[]记录个数; int min; int find(int x){ int r=x; while(r!=relate[r])r=relate[r]; int i=x,j; while(i!=r)j=relate[i],relate[i]=r,i=j; return r; } void initial(){ for(int i=1;i<=10000000;++i)relate[i]=i,num[i]=1; } void merge(int x,int y){ int f1,f2; f1=find(x);f2=find(y); if(f1!=f2)relate[f1]=f2,num[f2]+=num[f1]; min=min>num[f2]?min:num[f2]; } int main(){ int n,temp1,temp2; while(~scanf("%d",&n)){ min=1;initial(); while(n--){ scanf("%d%d",&temp1,&temp2); merge(temp1,temp2); } printf("%d\n",min); } return 0; }
相关文章推荐
- diff
- 静态代码检查工具PC-Lint(一)
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层
- 关于jqury兼容问题
- [Phonegap+Sencha Touch] 移动开发55 百度4种坐标系,bd09ll、bd09mc、gcj02、wgs84的详细解释
- ON DUPLICATE KEY UPDATE
- 在我程序员生涯里,我学到了不少有用的东西。下面是我这些年积累的经验精华。
- 孰能生巧
- redis.h
- Java集合的小抄 Java初学者必备
- 建用户
- SSH整合遇到的一些问题
- 解决找不到okio.buffer.writeUTF8CodePoint 的方法
- dede 列表页 上右 精彩部分
- 在AHK窗体上使用 Windows Aero 效果
- java类的生命周期
- 代理传值与属性传值简单描述
- jsrender-for循环中访问父属性
- EF 分离实体
- GNU make 总结 (四)