1107. Social Clusters (30) 搜索

#include<bits/stdc++.h>

using namespace std;
vector<int>rel[1010];
vector<int>hob[1010];
bool bok[1010];
int cnt;
void dfs(int s);
void dfs2(int s){
	for(int i=0;i<rel[s].size();i++){
		int t = rel[s][i];
		if(!bok[t]){
			cnt++;
			bok[t]=1;
			dfs(t);
		}
	}
}
void dfs(int s){
	for(int i=0;i<hob[s].size();i++){
		dfs2(hob[s][i]);	
	}
}
int main()
{
	int n,k;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d:",&k);
		while(k--){
			int t;
			scanf("%d",&t);
			hob[i].push_back(t);
			rel[t].push_back(i);
		}
	}
	int fa=0;
	priority_queue<int,vector<int>,less<int> >ans;
	for(int i=1;i<=n;i++){
		if(!bok[i]){
			fa++;
			cnt=1;
			bok[i]=1;
			dfs(i);	
			ans.push(cnt);		
		}
	}
	cout<<ans.size()<<endl;
	while(!ans.empty())
	{
		cout<<ans.top();ans.pop();
		if(!ans.empty())cout<<" ";
	} 
	
	return 0;
}


题意有点绕 首先给出每个人的爱好 而每个爱好必定有部分人都有这个爱好 然后让我们根据不同爱好所组成的网络 统计一共有多少个网络 每个网络的成员数量 

不是很好统计这个信息 因为一个人可以有一些爱好 而每个爱好下还有一些不同的人 但是一个网络中的人 必定能够通过爱好相连

可以建立两层映射关系 双层dfs 

首先hobby表里存每个人有哪些爱好  然后从一个人后找到某爱好再到rel表找这个相同爱好下不同的人 这个人又有很多爱好然后再到hobby表中去找不同的人

不断互相调用 期间整个过程能跑到的点(人..嗯)都是这个网络中的 记录人数

最后枚举一遍搜索一遍 就能得到解


猜你喜欢

转载自blog.csdn.net/qq_33859479/article/details/79592231
今日推荐