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