1107 Social Clusters
原题链接:https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805361586847744
题目大意:有n个人,每个人都喜欢若干种活动,只要两个人喜欢的是同一种活动,就属于同一个社交群体,求有多少个群体,每个群体有多少人。
题目思路:并查集
1.定义一个course数组,代表喜欢这个课程的人,遇到也喜欢这个课程的人就合并在一起,属于同一个群体。
2.定义一个flag数组,记录每个群体有多少人。
注意点:经常将find(i)找根节点,写成fa[i]父节点,并查集里一定要注意。
解题代码:
#include<bits/stdc++.h>
using namespace std;
int course[1005]={0};
int fa[1005];
int flag[1005]={0};
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void unionAB(int x,int y){
fa[find(x)]=find(y);
}
int cmp(int a,int b){
return a>b;
}
main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
int h;
scanf("%d:",&h);
for(int j=0;j<h;j++){
int x;
scanf("%d",&x);
if(course[x]==0){
course[x]=i;
}
unionAB(i,find(course[x]));
}
}
for(int i=1;i<=n;i++){
flag[find(i)]++;
}
int ans=0;
for(int i=1;i<=n;i++){
if(flag[i]!=0){
ans++;
}
}
cout<<ans<<endl;
sort(flag+1,flag+n,cmp);
for(int i=1;i<=ans;i++){
cout<<flag[i];
if(i<ans) cout<<" ";
}
}