您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: