当前位置: 首页 > news >正文

PAT 甲级 1107 并查集

经典并查集,参加蓝桥杯的都做烂了hhhhh

v [ i ] 指向父节点,num [ i ] 记录喜欢这个hobby的人数(因为一个人算一次所以就加第一次)

路径压缩这么写比较方便:(因为find ( v [ x ] ) 返回的是v[x]=x 的终点情况,所以每一个路径上的节点都指向这个终点。)

int find(int x){
    if(v[x]!=x) v[x]=find(v[x]);
    return v[x];
}

接着就遍历一遍v [ i ] ,如果不是终点(v [ i ] != i)就把该点的人数 num [ i ] 传递给num [ v[ i ] ]

最后就是把 数组num 排序找到人数不是 0 的节点就可以啦~ 

#include<iostream>
using namespace std;
char s;
int v[1050]={0},num[1050]={0},ans,n,k,temp,first;
int find(int x){
    if(v[x]!=x) v[x]=find(v[x]);
    return v[x];
}
void merge(int a,int b){
    a=find(a);b=find(b);
    v[b]=a;
}
bool cmp(int a,int b){
    return a>b;
}
int main(){
    cin>>n;
    for(int i=0;i<=1000;i++)v[i]=i;
    for(int i=0;i<n;i++){
        cin>>k>>s>>first;
        for(int j=1;j<k;j++){
            cin>>temp;
            merge(first,temp);
        }
        num[v[first]]++;
    }
    for(int i=0;i<=1000;i++){
        if(v[i]!=i){
            num[v[i]]+=num[i];
            num[i]=0;
        }
    }
    sort(num,num+1001,cmp);
    for(int i=0;i<=1000;i++)if(num[i]!=0)ans++;
    cout<<ans<<endl;
    for(int i=0;i<ans;i++){
        if(i)cout<<" ";
        cout<<num[i];
    }
    return 0;
}

相关文章:

  • 国产编辑器EverEdit - 超多样式设置
  • go 分布式redis锁的实现方式
  • AI是否能真正理解人类情感?从语音助手到情感机器人
  • C 语 言 --- 经 典 习 题 2
  • 第一次执行GameObject.Instantiate时可能出现明显的卡顿 如何解决该问题?
  • TCP/IP四层模型:从入门到精通
  • NVIDIA(英伟达) GPU 芯片架构发展史
  • <Rust><iced>基于rust使用iced构建GUI实例:图片浏览器
  • Spark核心之02:RDD、算子分类、常用算子
  • 设计模式:记录所有设计模式方便后续复习
  • 小白向:如何使用dify官方市场“ECharts图表生成”工具插件——dify入门案例
  • Sat- nerf深度损失
  • RPA 职业前景:个人职场发展的 “新机遇”
  • DNS 详细过程 与 ICMP
  • 最节省成本的架构方案:无服务器架构
  • 基于vue3和flask开发的前后端管理系统(一):项目启动准备
  • 计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)
  • Ubuntu 20.04下配置VSCode以支持OpenCV库开发
  • [MySQL初阶]MySQL(1)MySQL的理解、库的操作、表的操作
  • 层次聚类R复现
  • 烈士沈绍藩遗孤、革命家帅孟奇养女舒炜逝世,享年96岁
  • 教育部答澎湃:2025世界数字教育大会将发布系列重磅成果
  • 中国驻美国大使馆发言人就中美经贸高层会谈答记者问
  • 外交部:印巴都表示不希望局势升级,望双方都能保持冷静克制
  • 哥伦比亚总统称将在访华期间签署“一带一路”倡议意向书,外交部回应
  • 上海明后天将迎强风大雨,陆地最大阵风7~9级