这题题意就是只要两个人有共同的兴趣爱好就可以把他们放到一个集合里面,问你有多少个人数不同的集合。
简单并查集,多一步集合计数,详见代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <vector> #define maxn 1005 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,m,q,p,flag; int a[maxn],b[maxn],fa[maxn]; vector<int> ve[maxn]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void init() { for(int i=0;i<maxn;i++) fa[i]=i; } bool cmp(int a,int b) { return a>b; } int main() { init(); cin>>n; q=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=1;i<=n;i++) { int ti=find(i); scanf("%d: ",&m); for(int j=0;j<m;j++) { cin>>p; if(a[p]) { int ta=find(a[p]); if(ti!=ta) fa[ta]=ti; } a[p]=i; } } int cnt=0; for(int i=1;i<=n;i++) { int id=find(fa[i]); b[id]++; } for(int i=1;i<=n;i++) { if(b[i]) cnt++; } sort(b+1,b+1+n,cmp); cout<<cnt<<endl; cout<<b[1]; for(int i=2;i<=cnt;i++) cout<<" "<<b[i]; cout<<endl; return 0; }