pta l3-3(社交集群)

题目链接: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\n",q);
43     printf("%d",res[0]);
44     for(int i=1;i<q;++i)
45         printf(" %d",res[i]);
46     printf("\n");
47     return 0;
48 }

 

posted @ 2019-03-27 20:21  Frank__Chen  阅读(289)  评论(0编辑  收藏  举报