算法题,c++,数据结构,判断组内成员关系,是否同组,华为试题1
一、题目:
1、输入人数和行数,
2、一次输入带有编号的人的编号和判断标志judge,judge为1表示判断二者组关系,为0表示将二者归为一组,组员关系有传递性,比如1和2是组员,1和3是组员,2和3就是组员
3、组员关系判断输出两种消息,是组员则输出“we are a team”,不是组员则输出“we are not a team”,输入人员不存在或者行数超过时输出“da pian zi”
二、输入输出示例:
输入:
5 7
1 2 0
1 2 1
3 4 1
3 4 0
3 4 1
1 3 0
2 4 1
输出:
we are a team
we are not a team
we are a team
we are a team
三、分析:
1、这道题考的不是算法而是数据结构,
2、每个人员编号和组有对应关系,组在同组人员中必须为共有以方便同步组员
3、为了方便在组中查找人员编号,设计组数据结构为set,语句typedef set group;
4、组信息包括人员与组的对应关系需要使用关联式容器map,为了使组信息可以共享,使用组指针而不是组对象,因此组消息的数据结构设计为map<int, group*> groupinfo;
四、注意点
1、没有组的时候使用new新建组,并将组成组的成员编号加入到组,再将编号人员和组的对应关系写入组信息groupinfo
2、查询组关系可以使用groupinfo[num].second->find(num2)直接查询,因为组的成员信息group*基于浅拷贝,所以这里的num1和num2可以倒过来。
3、合并组的时候需要先判断两个组是否本来指向同一片组信息内存,否则会自己与自己合并导致浪费时间,第二组的编号人员全部进入第一组,第二组的编号人员与组的对应关系更新到groupinfo中,记得使用delete删除原先的一个组避免内存泄漏。
五、代码
typedef set<int> group;
map<int, group*> groupinfo;
void Juidge(int num1, int num2, int juidge)
{
if (juidge != 0 && juidge != 1)
{
cout << "da pian zi" << endl;
return;
}
//两个团队中的每一位成员彼此都成为团队
if (juidge == 0)
{
map<int,group*>::iterator ret1 = groupinfo.find(num1);
map<int,group*>::iterator ret2 = groupinfo.find(num2);
if (ret1 != groupinfo.<