#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表中去找不同的人
不断互相调用 期间整个过程能跑到的点(人..嗯)都是这个网络中的 记录人数
最后枚举一遍搜索一遍 就能得到解