根本不明白下标有什么作用?
从0开始和从1开始有什么区别?
/*
放入并查集的还是人而不是课程,
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> ans,father;
bool cmp1(int a,int b){
return a>b;
}
int find(int x){
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y){
int a=find(x);
int b=find(y);
if(a==b)
return;
father[a]=b;
}
int main() {
int a,b,n,t,k;
int course[1001]={0};
scanf("%d",&n);
father.resize(n+1);
ans.resize(n+1); //重要,别忘了分配一个恰当的空间;
for(int i=1;i<=n;i++)
father[i] = i;
for(int i=1;i<=n;i++){
scanf("%d:",&k);
for(int j=0;j<k;j++){
cin>>t;
if(course[t]==0)
course[t]=i;
Union(i,find(course[t]));
}
}
int cnt=0;
for(int i=1;i<=n;i++)
ans[find(i)]++;
for(int i=1;i<=n;i++) {
if(ans[i]!= 0)
cnt++;
}
cout<<cnt<<endl;
sort(ans.begin(),ans.end(),cmp1);
for(int i=0;i<cnt;i++){
cout<<ans[i];
if(i!=cnt-1)
cout<<" ";
}
return 0;
}