4075. 染色 并查集的运用 并查集运用的小细节
题目
题解思路
这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个。这样贪心就能保证使用的染色最少。
时间复杂度为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. 并查集的 并 操作 3. 并查集的 查 操作 4. 基本并查集模板代码实现--第一版(有错误后面分析) 4.1 Jav ...
- 学习笔记——拓展域并查集和带权并查集
1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...
- SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...
- SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
前后端分离项目快速搭建[前端篇] 后端篇 前端篇 创建vue项目 安装所需工具 开始编码 1.在根目录下添加vue.config.js文件 2.编写main.js 3.编写App.vue 4.编写ax ...
- php正则表达式正向预查,javascript正则表达式-----正向预查
前几篇有用到过, 但是未做深入学习,发现一篇很好的博文 转载自 javascript--正向预查 什么是正向预查?这里有腾讯招聘的一个例子: 如何给一串数字用千分制表示?比如9999999999变成9 ...
- 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码
集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码 系统简介 一.包裹管理 扫描入库 未入库包裹 已入库包裹 待认领包裹订单 已创建订单包裹 二.订单管理 全部订单 已付款 待付款 ...
- 什么是训练集、验证集和测试集?
在机器学习中,训练集.验证集和测试集是数据集的三个重要部分,用于训练.评估和测试机器学习模型的性能.它们的定义和作用如下: 什么是训练集.验证集和测试集? 训练集:训练集是机器学习模型用于训练和学习的 ...
- rabbitmq基础5——集群节点类型、集群基础运维,集群管理命令,API接口工具
文章目录 一.集群节点类型 1.1 内存节点 1.2 磁盘节点 二.集群基础运维 2.1 剔除单个节点 2.1.1 集群正常踢出正常节点 2.1.2 服务器异常宕机踢出节点 2.1.3 集群正常重置并 ...
- 机器学习典型步骤以及训练集、验证集和测试集概念
1. 机器学习典型步骤 数据采集和标记 数据清洗 特征选择 如房子的面积.地理位置.朝向.价格等. 模型选择 有监督还是无监督,问题领域.数据量大小.训练时长.模型准确度等多方面有关. 模型训练和测试 ...
最新文章
- centos命令大全
- Win2008远程多用户登陆的配置方法
- AI一分钟 | 黎曼猜想已被证明?对错有待同行评议;讯飞与发帖质疑同传译员达成谅解...
- cookie获取java_java中如何获取cookie
- spring原始注解开发-01
- GPU Gems2 - 4 分段缓冲(Segment Buffering)
- 版式设计与创意 pdf_恋爱与版式
- Spring JPA数据+Hibernate+ MySQL + Maven
- impala和mysql语法,impala CREATE TABLE语句
- centos7下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named ‘_ctypes‘的解决办法
- 深度解析容器化技术在广发证券交易系统的应用【转】
- jquery滑动效果及事件切换
- C++编程语言中const关键字介绍
- 安装CAD2006出现html,win10系统安装cad2006出现已终止CAd2006-simplifieng安装的设置教程...
- oracle 独占更新,Oracle的共享封锁 独占封锁和共享更新封锁 (3)
- 线性光耦(PC817)工作的分析
- 播放器实战07 av_read_frame与av_seek_frame
- MIT与Facebook提出SLAC:用于动作分类和定位的稀疏标记数据集
- 数字校园php,利用PHP技术加强高校数字化校园的信息资源建设
- linux卸载先驱的命令是,【单选题】在Linux中,若要在同一行书写多条命令,命令之间应使用符号()分隔A. 转义字符\\ B. 分号; C. , D. 空格...