题目

题解思路

这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个。这样贪心就能保证使用的染色最少。
时间复杂度为On,看起来这样复杂很高,实际上每个点之会属于一个集合,所以每个点只走了一次。

两端代码的不同让我找了好久的bug。

        if ( a[i] == i ){vector <int> pk ; vis[i] = cnt ;pk.push_back(b[i]) ; cnt ++ ; head.push_back(pk) ; }
        if ( find(i) == i ){vector <int> pk ; vis[i] = cnt ;pk.push_back(b[i]) ; cnt ++ ; head.push_back(pk) ; }

当验证父节点关系的时候必须用find函数,不能直接判断。
因为

这种情况下2号节点根本来不及路径压缩,所以当验证父节点的时候必须用find函数来验证

之前想过这种情况,因为在uio()加个find(y)就行,这里只想了2连3,却没想到1连3这种情况。

AC代码

#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long longusing namespace std;const  int  INF =  0x3f3f3f3f;
const  int N = 200100 ; int n , m , k ;
int a[N] ;
int b[N] ;
vector <vector <int> >head ;
int vis[N] ;
int find(int x )
{if ( x != a[x] )return a[x] = find(a[x]) ; return a[x] ;
}
void uio(int x , int y )
{int fx = find(x) ;int fy = find(y) ;if (fx != fy ){a[fy] = fx ; find(y) ; }
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m >> k ; for (int i = 1 ; i <= n ; i++ )a[i] = i ; for (int i = 1 ; i <= n ; i++ )cin >> b[i] ; for (int i = 1 ; i <= m ; i++ ){int t1 , t2 ;cin >> t1 >> t2 ;uio( t1 , t2 ) ;}int cnt = 0 ; for (int i = 1 ; i <= n ; i++ ){if ( find(i) == i ){vector <int> pk ; vis[i] = cnt ;pk.push_back(b[i]) ; cnt ++ ; head.push_back(pk) ; }}for (int i = 1 ; i <= n ; i++ ){if (find(i) != i ){head[vis[a[i]]].push_back(b[i]) ; }}int ans = 0 ; /*for (int i = 0 ; i < head.size() ; i++ ) {for (int j = 0 ; j < head[i].size() ; j++ )cout << head[i][j] << " " ;cout << "\n" ; }*/for (int i = 0 ; i < head.size() ; i++ ){int ma = 0 ; unordered_map <int ,int > mp ; for (int j = 0 ; j < head[i].size() ; j++ ){mp[head[i][j]]++ ;}for (int j = 0 ; j < head[i].size() ; j++ ){ma = max(ma , mp[head[i][j]] );}if (head[i].size()){int sz = head[i].size() ; ans += sz - ma ; }}cout << ans << "\n" ; return 0 ;
}

4075. 染色 并查集的运用 并查集运用的小细节相关推荐

  1. 树形结构 —— 并查集 —— 带权并查集

    [概述] 定义:带权并查集即是结点存有权值信息的并查集. 适用:当两个元素之间的关系可以量化,并且关系可以合并时,可以使用带权并查集来维护元素之间的关系. 权值:带权并查集每个元素的权通常描述其与并查 ...

  2. 简单易懂的并查集算法以及并查集实战演练

    文章目录 前言 一.引例 二.结合引例写出并查集 1. 并查集维护一个数组 2. 并查集的 并 操作 3. 并查集的 查 操作 4. 基本并查集模板代码实现--第一版(有错误后面分析) 4.1 Jav ...

  3. 学习笔记——拓展域并查集和带权并查集

    1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...

  4. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...

  5. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[前端篇] 后端篇 前端篇 创建vue项目 安装所需工具 开始编码 1.在根目录下添加vue.config.js文件 2.编写main.js 3.编写App.vue 4.编写ax ...

  6. php正则表达式正向预查,javascript正则表达式-----正向预查

    前几篇有用到过, 但是未做深入学习,发现一篇很好的博文 转载自 javascript--正向预查 什么是正向预查?这里有腾讯招聘的一个例子: 如何给一串数字用千分制表示?比如9999999999变成9 ...

  7. 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码

    集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码 系统简介 一.包裹管理 扫描入库 未入库包裹 已入库包裹 待认领包裹订单 已创建订单包裹 二.订单管理 全部订单 已付款 待付款 ...

  8. 什么是训练集、验证集和测试集?

    在机器学习中,训练集.验证集和测试集是数据集的三个重要部分,用于训练.评估和测试机器学习模型的性能.它们的定义和作用如下: 什么是训练集.验证集和测试集? 训练集:训练集是机器学习模型用于训练和学习的 ...

  9. rabbitmq基础5——集群节点类型、集群基础运维,集群管理命令,API接口工具

    文章目录 一.集群节点类型 1.1 内存节点 1.2 磁盘节点 二.集群基础运维 2.1 剔除单个节点 2.1.1 集群正常踢出正常节点 2.1.2 服务器异常宕机踢出节点 2.1.3 集群正常重置并 ...

  10. 机器学习典型步骤以及训练集、验证集和测试集概念

    1. 机器学习典型步骤 数据采集和标记 数据清洗 特征选择 如房子的面积.地理位置.朝向.价格等. 模型选择 有监督还是无监督,问题领域.数据量大小.训练时长.模型准确度等多方面有关. 模型训练和测试 ...

最新文章

  1. centos命令大全
  2. Win2008远程多用户登陆的配置方法
  3. AI一分钟 | 黎曼猜想已被证明?对错有待同行评议;讯飞与发帖质疑同传译员达成谅解...
  4. cookie获取java_java中如何获取cookie
  5. spring原始注解开发-01
  6. GPU Gems2 - 4 分段缓冲(Segment Buffering)
  7. 版式设计与创意 pdf_恋爱与版式
  8. Spring JPA数据+Hibernate+ MySQL + Maven
  9. impala和mysql语法,impala CREATE TABLE语句
  10. centos7下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named ‘_ctypes‘的解决办法
  11. 深度解析容器化技术在广发证券交易系统的应用【转】
  12. jquery滑动效果及事件切换
  13. C++编程语言中const关键字介绍
  14. 安装CAD2006出现html,win10系统安装cad2006出现已终止CAd2006-simplifieng安装的设置教程...
  15. oracle 独占更新,Oracle的共享封锁 独占封锁和共享更新封锁 (3)
  16. 线性光耦(PC817)工作的分析
  17. 播放器实战07 av_read_frame与av_seek_frame
  18. MIT与Facebook提出SLAC:用于动作分类和定位的稀疏标记数据集
  19. 数字校园php,利用PHP技术加强高校数字化校园的信息资源建设
  20. linux卸载先驱的命令是,【单选题】在Linux中,若要在同一行书写多条命令,命令之间应使用符号()分隔A. 转义字符\\ B. 分号; C. , D. 空格...

热门文章

  1. EIDE助手插件 快速定位
  2. access前端连接mysql_用javascript连接access数据库的方法
  3. 高四物理满分小鬆君的独孤九剑:做物理笔记时的注意事项
  4. ps入门教程零基础视频 小鱼老师美工PS教程
  5. 支付宝支付的实现【沙箱】(学习笔记)
  6. 酷家乐招聘 | 遇见offer之就要圆你的大厂梦
  7. LM7815TO263封装三端稳压器
  8. dubbo_rpc显露服务和引用服务简析
  9. Arduino 太阳能MPPT控制器设计参考
  10. P2615神奇的幻方