mty的考验题解(并查集)
2016-06-07 22:40
260 查看
题目描述
啊!几经周折.mty终于找到了他的偶像.他就是....fyc!
可是fyc这样的高级人士可不喜欢一个人总是缠着他.于是他出了一道难题想考考mty.fyc有几个手下:陈乐天,舒步鸡,胡巍......现在fyc要去和别人fight,需要组建一值军队.军队的士兵在fyc的手下里选.
要组建一个军队,必修满足军队中的每个人之间都有直接或间接的朋友关系.
那么mty现在需要组建一支在满足上述情况下的人数最多的军队.
问题规模:
对于100%的数据,1<=n<=1000,1<=m<=500.
输入格式
第一行,两个数,n,m.(n表示fyc有几个手下m表示有m对朋友关系).
一下m行,每行两个数.x[i],y[i].表示编号为x[i],y[i]的人是朋友.
输出格式
一个数,表示人数最多的军队的人数.
样例输入
5 3
1 2
2 3
3 4
样例输出
4
解题思路:
并查集的思想,将所有有关系的元素合并到一个集合。然后在对集合中的所有元素进行一遍遍历,去找到每个元素的根节点。由于并查集使用的是父节点表示法,那么所有有关系的元素的父节点一定相同。使用一个一位数组cnt表示每个父节点下的所有子节点。通过遍历找到父节点中存在的最多的子节点数目,此数目即为本题的解!
AC代码:
#include<iostream>
using namespace std;
int n,m; //人数关系数
int set[1001]; //集合
int cnt[1001]; //每种关系的最大人数
void init()
{
for(inti=1;i<=n;++i)
{
set[i]=i;
cnt[i]=0;
}
}
int Find(int x)
{
if(x==set[x])
returnx;
returnset[x]=Find(set[x]);
}
void merge_set(int x,int y)
{
inta=Find(x);
intb=Find(y);
set[a]=b;
}
int main()
{
cin>>n>>m;
init();
inta,b;
for(inti=0;i<m;++i)
{
cin>>a>>b;
merge_set(a,b);
}
intmax=0;
for(inti=1;i<=n;++i)
{
intindex=Find(set[i]); //搜索到根节点
cnt[index]++;
if(cnt[index]>max)
max=cnt[index];
}
cout<<max<<endl;
return0;
}
啊!几经周折.mty终于找到了他的偶像.他就是....fyc!
可是fyc这样的高级人士可不喜欢一个人总是缠着他.于是他出了一道难题想考考mty.fyc有几个手下:陈乐天,舒步鸡,胡巍......现在fyc要去和别人fight,需要组建一值军队.军队的士兵在fyc的手下里选.
要组建一个军队,必修满足军队中的每个人之间都有直接或间接的朋友关系.
那么mty现在需要组建一支在满足上述情况下的人数最多的军队.
问题规模:
对于100%的数据,1<=n<=1000,1<=m<=500.
输入格式
第一行,两个数,n,m.(n表示fyc有几个手下m表示有m对朋友关系).
一下m行,每行两个数.x[i],y[i].表示编号为x[i],y[i]的人是朋友.
输出格式
一个数,表示人数最多的军队的人数.
样例输入
5 3
1 2
2 3
3 4
样例输出
4
解题思路:
并查集的思想,将所有有关系的元素合并到一个集合。然后在对集合中的所有元素进行一遍遍历,去找到每个元素的根节点。由于并查集使用的是父节点表示法,那么所有有关系的元素的父节点一定相同。使用一个一位数组cnt表示每个父节点下的所有子节点。通过遍历找到父节点中存在的最多的子节点数目,此数目即为本题的解!
AC代码:
#include<iostream>
using namespace std;
int n,m; //人数关系数
int set[1001]; //集合
int cnt[1001]; //每种关系的最大人数
void init()
{
for(inti=1;i<=n;++i)
{
set[i]=i;
cnt[i]=0;
}
}
int Find(int x)
{
if(x==set[x])
returnx;
returnset[x]=Find(set[x]);
}
void merge_set(int x,int y)
{
inta=Find(x);
intb=Find(y);
set[a]=b;
}
int main()
{
cin>>n>>m;
init();
inta,b;
for(inti=0;i<m;++i)
{
cin>>a>>b;
merge_set(a,b);
}
intmax=0;
for(inti=1;i<=n;++i)
{
intindex=Find(set[i]); //搜索到根节点
cnt[index]++;
if(cnt[index]>max)
max=cnt[index];
}
cout<<max<<endl;
return0;
}
相关文章推荐
- Java\Scala\Python三种语言求解经典编程实例(三)—— 不重复的3位数
- BZOJ 1070: [SCOI2007]修车 费用流
- 函数指针传递
- 双系统Ubuntu 14.04+Cuda7.5+Theano+OpenBLAS+cuDNN v5 全配置
- 一维数组的开辟 赋值 应用
- Handler的一个图片轮播程序
- 团队项目失败总结
- 支付宝支付源码
- 愚蠢的宠物图解(并查集父思想节点表示法)
- 图片屏幕满天飞
- interview-prepare
- 使用C#向Sql Sever中存取网络图片和本地图片(二进制流的形式)
- java异常体系
- 【java并发】线程同步工具Semaphore的使用
- 浅谈测试驱动开发(TDD)
- 认识Zygote
- Java内存模型
- 粗浅看 java反射机制
- 感觉这里才是github比较全面通俗易懂的讲解,一看就明白怎么回事
- 水塘抽样 - Reservoir Sampling