zoukankan      html  css  js  c++  java
  • 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
    ",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 }
  • 相关阅读:
    小三学算术
    The Balance
    扫描线
    2019牛客暑期多校训练营(第九场)
    后缀数组
    Manacher
    局部变量和全局变量的区别
    2386:Lake Counting-poj
    简单背包问题(0032)-swust oj
    编程中易犯错误集锦-持续更新。。。。。
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10610235.html
Copyright © 2011-2022 走看看