PTA 1107 Social Clusters (30 分)

PAT原题
想看题目描述的点上面链接进入,这里就不再贴题目描述了。

我的思路:
题目意思是只要有相同习惯就放入一个集合,但是没说集合中所有人都必须要有相同的习惯,所以测试样例中编号为3,5,7(也就是第3,5,7行)的人是同一个集合。这一点一定要特别注意理解。
很明显是并查集题,由题目描述能感觉到合并集合应该是要抓住每个人都有许多习惯和每个习惯都有很多人有,所以我用两个vector储存这两个信息。
主函数里我遍历所有习惯,然后递归先遍历这个习惯的所有人,针对每个人都遍历他的习惯,继续递归下去,注意递归之前要标记好已经访问过了,无论是人的习惯还是有这个习惯的人。我是用book标记:book[x][0]表示x这个人访问过了,book[x][1]表示x这个习惯已经访问过了。
具体细节看代码,注释得很详细了。

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,k;
vector<int> hs[1002],ms[1002];
int book[1002][2],ans[1002],flag,s=0,m,num;//book数组标记人和习惯是否访问过,s储存现在访问的集合里的人数 
//flag为目前已经访问过的人数,作为程序结束标志 num储存有几个集合 
void dfs(vector<int> hss,int x){
   
	if(hss.size()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值