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()