题意
给出每个人的爱好,如果某些人有相同的爱好,那么他们属于相同的cluster
这里需要注意朋友的朋友也是朋友,见样例的第3,5,7个人
题解
分别将每个人的爱好,进行并查集操作,合并至同一棵树上
然后再查询每个人属于哪一棵树(cluster)从而得到题目所求
(这里是记录了每个人的一个爱好可用于查询根节点)
源码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int f[1005];
int num[1005];
bool cmp(int x,int y){
return x>y;
}
int myfind(int x){
if(f[x]!=x){
return myfind(f[x]);
}
return x;
}
void myunion(int x,int y){
int fx=myfind(x);
int fy=myfind(y);
if(fx==fy) return;
else{
f[fx]=fy;
}
}
int a[1005];
int main(){
for(int i=0;i<1005;i++){
f[i]=i;
num[i]=0;
}
int n;
cin>>n;
for(int i=0;i<n;i++){
int u,v,len; char temp;
cin>>len;
cin>>temp;
cin>>u;
a[i]=u;
while(--len){
cin>>v;
myunion(u,v);
}
}
for(int i=0;i<n;i++){
int fa=myfind(a[i]);
num[fa]++;
}
sort(num,num+1005,cmp);
int counter=0;
vector<int>res;
for(int i=0;i<1005;i++){
if(num[i]!=0){
//cout<<i<<" "<<num[i]<<endl;
res.push_back(num[i]);
counter++;
}
}
cout<<counter<<endl;
for(int i=0;i<res.size()-1;i++){
cout<<res[i]<<" ";
}
cout<<res[res.size()-1]<<endl;
return 0;
}