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 }

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10610235.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值