More is better(并查集问题)
2016-01-23 10:26
369 查看
More is better
Time Limit:1000MS Memory Limit:102400KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
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.
Input
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)
Output
The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
Sample Input
Sample Output
Hint
#include<stdio.h>
const int N=10000000;
typedef struct
{
int num,root;
}Node;
Node node
;
void Init()
{
for(int i=1;i<=N;i++)
{
node[i].num=1; //开始时数量为1
node[i].root=i;
}
}
int Find_root(int x)
{
if(node[x].root!=x)
return node[x].root=Find_root(node[x].root);
return node[x].root;
}
void join(int x,int y)
{
int fx=Find_root(x),fy=Find_root(y);
if(fx!=fy)
{node[fx].root=fy;
node[fy].num+=node[fx].num; //合并集合中的元素个数
}
}
int main()
{
int a,b,n,max,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
printf("1\n");
continue;
}
max=0; //max记录节点最大值,便于后面查找
Init();
for(int i=0;i<n;i++)
{scanf("%d%d",&a,&b);
if(a>max)
max=a;
if(b>max)
max=b;
join(a,b);
}
int Max=0;
for(int i=1;i<=max;i++) //查找num最大值
if(node[i].num>Max)
Max=node[i].num;
printf("%d\n",Max);
}
return 0;
}
Time Limit:1000MS Memory Limit:102400KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
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.
Input
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)
Output
The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
Sample Input
4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
Sample Output
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.
#include<stdio.h>
const int N=10000000;
typedef struct
{
int num,root;
}Node;
Node node
;
void Init()
{
for(int i=1;i<=N;i++)
{
node[i].num=1; //开始时数量为1
node[i].root=i;
}
}
int Find_root(int x)
{
if(node[x].root!=x)
return node[x].root=Find_root(node[x].root);
return node[x].root;
}
void join(int x,int y)
{
int fx=Find_root(x),fy=Find_root(y);
if(fx!=fy)
{node[fx].root=fy;
node[fy].num+=node[fx].num; //合并集合中的元素个数
}
}
int main()
{
int a,b,n,max,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
printf("1\n");
continue;
}
max=0; //max记录节点最大值,便于后面查找
Init();
for(int i=0;i<n;i++)
{scanf("%d%d",&a,&b);
if(a>max)
max=a;
if(b>max)
max=b;
join(a,b);
}
int Max=0;
for(int i=1;i<=max;i++) //查找num最大值
if(node[i].num>Max)
Max=node[i].num;
printf("%d\n",Max);
}
return 0;
}
相关文章推荐
- POJ 1753(DFS+枚举||BFS+位运算)
- Java enum(枚举)小结
- javascript、jquery、AJAX总结
- jsonp处理方法
- Mybatis与Hibernate的区别
- LeetCode 172 Factorial Trailing Zeroes(阶乘后的零)(*)
- 批处理一些实用的命令
- 数据结构基础(3)---C语言实现单链表
- SetTimer 计时器是不精确的(WIN32 计时器)
- C++内联函数(inline)的工作原理与例子
- 28 找出不存在的数字
- Tableview显示 老少一行解决了
- php输出文件,数组
- 最小生成树
- 压力测试攻击 http_load
- HTML、XML、XHTML的对比区分
- 路由与多视图在AnjualrJS中的应用
- Number Sequence
- ViewDidLoad和ViewWillAppear两者的区别
- 关于类加载器(ClassLoader)