C++--数据结构--并查集--高阶0711

news2025/1/19 2:30:44

1. 并查集

在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。

某公司有10人,A地招4人,B地招3人,C地招3人,10个人起先互不相识,每个都是一个独立的小团体。现给这些人进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};进行映射。

给以下数组用来存储该小集体,数组中的数字代表:该小集体中具有成员的个数。(-1代表的意义就是有一个人,负号的作用下文会体现)

后来自统一地区的人互相熟悉,建立小团体。

 我们如何进行集合合并操作呢?

1.2原理

  1. 数组的下标对应集合中元素的编号

  2. 数组中如果为负数,负号代表根,数字代表该集合中元素个数

  3. 数组中如果为非负数,代表该元素父亲在数组中的下标

以编号0和6为例,我们选0作为父节点,将6编号的集合中的数加给0编号的在集合中的数。再让编号6在集合中的值存放父节点的下标。

 综上 我们把三个集合表示完毕

 1.2.2 合并的代码

	size_t FindRoot(int x)
	{
        int root=x;
       	while (_ufs[root] >= 0)
		{
			root = _ufs[root];
		}

		// 路径压缩
		while (_ufs[x] >= 0)
		{
			int parent = _ufs[x];
			_ufs[x] = root;
			x = parent;
		}

		return root;

	}

	void Union(int x1, int x2)
	{
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);

		// 控制数据量小的往大的集合合并
		if (abs(_ufs[root1]) < abs(_ufs[root2]))
			swap(root1, root2);

		if(root1 != root2)
		{
			_set[root1] += _set[root2];
			_set[root2] = root1;
		}
	}

1.3相关练习

力扣

省份的数量

class Solution {
public:
    int findroot(vector<int>&ufs,int n)
    {
        while(ufs[n]>=0)
        {
            n=ufs[n];
        }
        return n;
    }
    int findCircleNum(vector<vector<int>>& isConnected)
    {
        vector<int>ufs(isConnected.size(),-1);
        for(int i=0;i<isConnected.size();i++)
        {
            for(int j=0;j<isConnected[i].size();j++)
            {
                if(isConnected[i][j]==1)
                {
                    int root1=findroot(ufs,i);
                    int root2=findroot(ufs,j);
                    if(root1!=root2)
                    {
                        ufs[root1]+=ufs[root2];
                        ufs[root2]=root1;
                    }
                }
            }
        }
        int n=0;
        for(auto& e:ufs)
        {
            if(e<0) n++;
        }
        return n;
    }
};

力扣

等式方程的可满足性

class Solution {
public:
    int findroot(int n,vector<int>& ufs)
    {
        while(ufs[n]>=0)
        {
            n=ufs[n];
        }
        return n;
    }
    bool equationsPossible(vector<string>& equations) 
    {
        vector<int>ufs(26,-1);//每个字母都建立映射关系 a映射0 b映射1

        //第一遍 遍历将相同的元素放到同一个集合
        for(auto& str:equations)
        {
            if(str[1]=='=') //两个字母是相等关系
            {
                int r1=findroot(str[0]-'a',ufs);
                int r2=findroot(str[3]-'a',ufs);
                if(r1!=r2)
                {
                    ufs[r1]+=ufs[r2];
                    ufs[r2]=r1;
                }
            }
        }
        for(auto& str:equations)
        {
            if (str[1]=='!') //两个字母是不等关系
            {
                int r1=findroot(str[0]-'a',ufs);
                int r2=findroot(str[3]-'a',ufs);
                if(r1==r2)
                {
                    return false;
                }
            }
        }
    return true;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用Python批量化处理Excel——零基础入门指南

本教程旨在帮助零编程基础&#xff0c;但是又有“批量化处理Excel表”这种需求的大家。 在进入教程时&#xff0c;请确保你具有以下资质&#xff1a; 1、 并非工作压到头上了&#xff0c;急需解决一批表所以想过来速成&#xff0c;而是愿意耐心花上几个小时学习来获得一项长久…

Redis之相关拓展(事务、监控、Jedis)

Redis之相关拓展一、事务1、介绍2、流程3、shell命令3.1 开启事务3.2 放弃事务3.3 编译型异常&#xff08;代码有问题&#xff0c;命令有错&#xff09;3.4 运行时异常二、监控&#xff08;watch&#xff09;1、锁1.1 悲观锁1.2 乐观锁2、注意2.1 原理2.2 流程三、Jedis1、简介…

学习Opencv不得不掌握的操作

OpenCV基本操作 1 图像的IO操作 这里我们会给大家介绍如何读取图像&#xff0c;如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread() 参数&#xff1a; 要读取的图像读取方式的标志cv.IMREAD*COLOR&#xff1a;以彩色模式加载图像&#xff0c;任何图像的透明度都将…

C++ Primer笔记——explicit、string流、vector比较、emplace

目录 一.P265 抑制构造函数定义的隐式转换 二.P287 string流 三.P304 vector的比较 四.P307 在容器中特定位置添加元素 一.P265 抑制构造函数定义的隐式转换 举个例子&#xff0c;如果构造函数参数是string类型&#xff0c;那么当使用赋值符号进行初始化操作时&#xff0c…

leetcode -- ⽤最少数量的箭引爆⽓球(452)

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

数据模型篇之阿里巴巴数据整合及管理体系

第9章 阿里巴巴整合及管理体系 OneData的设计是为了建设统一的、规范化的数据接人层&#xff08; ODS &#xff09;和数据中间层&#xff08; DWD和DWS &#xff09;&#xff0c;通过数据服务和数据产品&#xff0c;完成服务于阿里巴巴的大数据系统建设 &#xff0c;即数据公共…

2022 年 11 月区块链操作系统的开发回顾

查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在寻找区块链操作系统组件的最新进展&#xff1f;你找对地方了&#xff01;正如在我们的路线图文章中所描述的那样&#xff0c;我们一直在朝着定期且频繁的更新方向发展着&#xff0c;以便让我们的社区能够及时的了解…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.1 导入商品案例【MySQL环境准备】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.1 导入商品案例【MySQL环境准备】46.1.1 导入商品管理案例46 JVM 进程缓存 用于在T…

新冠疫情下免疫的重要性以及肠道菌群在其中的作用

今年是新冠病毒影响的第三年了&#xff0c;在病毒的影响下&#xff0c;我们的生活方式发生了很大的变化。近日&#xff0c;多地政府颁布了疫情防控的新政策&#xff0c;除了一些特殊场所&#xff0c;出入其他场所不用扫场所码了。 从一方面说&#xff0c;这样的情况方便了我们日…

DAP数据分析平台可视化组件开发

企业信息化建设会越来越完善&#xff0c;越来越体系化&#xff0c;当今数据时代背景下更加强调、重视数据的价值&#xff0c;以数据说话&#xff0c;通过数据为企业提升渠道转化率、改善企业产品、实现精准运营、有效运营&#xff0c;用数据来指引企业的发展。 组件使用是在DA…

第一章:Pytorch简介和其三大核心概念

文章目录一&#xff1a;什么是Pytorch二&#xff1a;Pytorch优势三&#xff1a;Pytorch三大核心概念&#xff08;1&#xff09;tensor&#xff08;张量&#xff09;&#xff08;2&#xff09;autograd&#xff08;自动微分-变量&#xff09;&#xff08;3&#xff09;nn.Module…

java计算机毕业设计基于安卓Android的校园安保巡查系统APP

项目介绍 校园安保巡查系统APP管理是校园安保巡查系统管理中对学生必不可少的一个部分。在人们校园安保巡查系统管理的整个过程中,校园安保巡查系统APP管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类校园安保巡查系统APP管理程序也在不断改进。本课题所设计的校园…

精华推荐 |【Redis技术探索】「底层架构原理」帮你彻底搞定Sentinel的实现原理运作机制

&#x1f46e;‍每日一句 最美好的生活方式是和一群志同道合的人&#xff0c;一起奔跑在理想的路上&#xff0c;回头有一路的故事&#xff0c;低头有坚定的脚步&#xff0c;抬头有清晰的远方&#xff01; &#x1f46e;‍ Sentinel存在的意义 &#x1f46e;‍ Sentinel出现的前…

如何快速传输大文件,介绍大文件快速方法

现在&#xff0c;企业比以往任何时候都面临着一个重大挑战&#xff1a;需要一个快速共享文件的解决方案。但是&#xff0c;并非所有快速文件传输解决方案都以相同的速度传输文件。文件大小、端点位置、路径、设备、防火墙、网络系统和加密需求都会限制文件的传输速度。 什么是快…

[附源码]Python计算机毕业设计个人相册管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Java中的String类

一、String类的体系图 简单解释&#xff1a;1、String类实现了Serializable接口&#xff0c;说明String类可以串行化&#xff0c;可以进行网络传输。2、String类实现了Comparable接口&#xff0c;说明String对象可以进行比较。 二、String类介绍 String类是lang包中的类&…

【LeetCode每日一题】——337.打家劫舍 III

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 树 二【题目难度】 中等 三【题目编号】 337.打家劫舍 III 四【题目描述】 小偷又发现了一个…

数据指标体系的建设思考(三)

一、数据指标体系搭建流程 01、如何搭建数据指标体系 ▶ “德勤”的数据指标体系方法论 首先&#xff0c;我们先来学习一下优秀的数据指标体系搭建方法论。数据指标体系搭建方法论有不少优秀的方案&#xff0c;大部分都大同小异&#xff0c;在这里我们来聊一下“德勤”推荐的…

论文投稿指南——中国(中文EI)期刊推荐(第7期)

&#x1f384;&#x1f384; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xff0c;中文期刊的…

Opencv(C++)笔记--形态学操作之开、闭操作、基本梯度计算、顶帽和黑帽操作

目录 1--开操作 2--闭操作 3--基本梯度计算 4--顶帽操作 5--黑帽操作 6--代码实例 1--开操作 ① 原理&#xff1a;先进行腐蚀操作&#xff0c;再进行膨胀操作&#xff1b; ② 作用&#xff1a;消除值高于邻近点的孤立点&#xff0c;达到去除图像中噪声的作用&#xff0…