并查集模板
本来以为还挺简单的
结果发现连题都读不懂
暗自下定决心:一定要让陈越姥姥提供样例解释
好了,我们来读一下题吧
其实就是说有相同爱好的两个人就在一个小组嘛
难道是个map?
但是一看样例,明显不对啊
其实后来才发现这个题意思是,如果a与b有共同爱好,c与b也有,那a,b,c就是一个小组的
这样子的话让course[h]来记录一下这个小组的代表人物,然后找这个人的father合并就行
#include<vector>
#include<iostream>
#include <algorithm>
#include <cmath>
#include<map>
#include <queue>
#include <stack>
using namespace std;
//course[i]记录任意一个喜欢活动i的人的编号,findfather(course[i])
//要注意findfather(i)和father[i]的区别
int father[1010]={0};
int is_root[1010]={0};
int course[1010]={0};
int n;
void init(){
for (int i = 1; i <= n; ++i) {
father[i]=i;
//cout<<"father"<<father[i]<<endl;
is_root[i]=0;
}
}
int findfather(int a){
if(father[a]==a) return a;
else{
int F=findfather(father[a]);
father[a]=F;
return F;
}
}
bool cmp(int a,int b){
return a>b;
}
void u(int a,int b){
int fa=findfather(a);
int fb=findfather(b);
//cout<<"fab"<<fa<<" "<<fb<<endl;
if(fa!=fb){
father[fa]=fb;
//cout<<"fb"<<fb<<endl;
}
}
int main(){
cin>>n;
init();
for (int i = 1; i <= n ; ++i) {
int num;
scanf("%d: ",&num);
//cout<<"num:"<<num<<endl;
for (int j = 0; j < num; ++j) {
int h;
cin>>h;
if(course[h]==0){
course[h]=i;//每个hobby找个人做代表
}
u(i,father[course[h]]);
}
}
for (int i = 1 ;i <=n ; ++i) {
is_root[findfather(i)]++;//看每个组有几个人
//cout<<is_root[findfather(i)]<<endl;
}
int num1=0;
for (int i = 1; i <= n ; ++i) {
if(is_root[i]!=0)
num1++;
}
cout<<num1<<endl;
sort(is_root+1,is_root+1+n,cmp);
for (int i = 1; i <= num1; ++i) {
cout<<is_root[i];
if(i!=num1){
cout<<" ";
}
}
}