并查集,cluster[i] 记录hobby为i的人数,在union parent[]的时候把cluster也一同union
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <cstdio> #include <cstdlib> int cluster[1001],parent[1001]; int n,count; int find(int i){ //collapsing rule int rt,fa; for(rt=i;parent[rt]>=0;rt=parent[rt]) ; for(fa=parent[i];i!=rt;i=fa,fa=parent[fa]) parent[i]=rt; return rt; } void union1(int i,int j){ //weighting rule if(i==j) return; if(parent[i]>parent[j]){ int t=i;i=j;j=t; } parent[i]+=parent[j]; parent[j]=i; cluster[i]+=cluster[j]; //cluster union cluster[j]=0; } int cmp(const void *a1,const void *a2){ return *(int *)a2-*(int *)a1; } int main(){ scanf("%d",&n); for(int i=1;i<=1000;i++){ parent[i]=-1; cluster[i]=0; } count=0; for(int i=1;i<=n;i++){ int m,h1,h2; scanf("%d: %d",&m,&h1); h1=find(h1); if(cluster[h1]==0) count++; for(int j=2;j<=m;j++){ scanf("%d",&h2); h2=find(h2); if(cluster[h2]==0) count++; if(h1!=h2){ union1(h1,h2); count--; } } h1=find(h1); cluster[h1]++; } qsort(cluster+1,1000,sizeof(int),cmp); printf("%d\n",count); printf("%d",cluster[1]); for(int i=2;i<=count;i++) printf(" %d",cluster[i]); return 0; } |