题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805053141925888
题意:给定n个人,以及每个人的兴趣,把有相同兴趣的人并成一个社交集群,问有多少个群,并以非递增方式输出所有群的人数。
思路:如果合并人的话,会复杂许多,这里我们可以合并兴趣,并用每个人的第一个兴趣表示其兴趣,将每个人的所有兴趣合并起来,之后遍历n个人,要统计人的群和群的人数,与将其第一兴趣的祖先所在的群的操作一致。说的有点绕,直接看代码吧,模拟模拟就懂了。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 int n,k,q,root[maxn],res[maxn],a[maxn]; 6 7 bool cmp(int x,int y){ 8 return x>y; 9 } 10 11 int getr(int kk){ 12 if(root[kk]==kk) return kk; 13 else return root[kk]=getr(root[kk]); 14 } 15 16 void Union(int x,int y){ 17 int xr=getr(x),yr=getr(y); 18 if(xr!=yr) 19 root[yr]=xr; 20 } 21 22 int main(){ 23 scanf("%d",&n); 24 for(int i=1;i<=1000;++i) 25 root[i]=i; 26 for(int i=1;i<=n;++i){ 27 int t; 28 scanf("%d",&k); 29 getchar(); 30 scanf("%d",&t); 31 a[i]=t,--k; 32 while(k--){ 33 scanf("%d",&t); 34 Union(a[i],t); 35 } 36 } 37 for(int i=1;i<=n;++i) 38 ++res[getr(a[i])]; 39 for(int i=1;i<=1000;++i) 40 if(res[i]) ++q; 41 sort(res,res+maxn,cmp); 42 printf("%d ",q); 43 printf("%d",res[0]); 44 for(int i=1;i<q;++i) 45 printf(" %d",res[i]); 46 printf(" "); 47 return 0; 48 }