算法题,c++,数据结构,判断组内成员关系,是否同组,华为试题1

该博客介绍了华为的一道算法题,涉及C++编程和数据结构的应用。题目要求根据输入的人数和行数,判断不同编号的人是否属于同一组。博主分析了问题关键在于数据结构的选择,推荐使用`set`作为组数据结构和`map`存储人员与组的关系。代码实现中需注意组信息的共享、查找效率以及防止内存泄漏。
摘要由CSDN通过智能技术生成

算法题,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.<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值