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

数据结构——

1. 什么是并查集?

在计算机科学中,并查集(英文:Disjoint-set data structure,直译为不数据结构交集)是一种数据结构,用于处理一些不交集(Disjoint sets,一系列没有重复元素的集合)的合并及查询问题。

举个简单的例子

一个组织里来个10个新人,它们的编号为从1~10,假设此时它们根据彼此的老家而互相亲近(即形成一个小团体),我们要将这10个人划分成不同的小团体,这样划分后形成的结果就是并查集。

接下来我们就来模拟这10个人的划分过程,首先我们可以将每个人的初始值设置为-1,当两个人都属于同一个小团体时,将其中一个人的-1加到另一个人身上,自己的值指向另一个人的下标, 此时另一个人就作为这一个小团体的,这之后如果有新的人进入这个团体,将新人的-1加到根上,再让新人指向根的下标。这样操作后,所有人中只要自己的值<0,则表明自己是一个团队的根,绝对值表示团队人数,而团体中的其他人均指向这个根。

2. 并查集的常见操作

我们通过上面的模拟,我们可以发现并查集的主要操作主要是:合并查找根查看团队个数

我们使用C++实现这个数据结构有

#pragma once
#include <vector>using namespace std;class UnionFindSet
{
public:// 将并查集中的所有元素初始化为-1UnionFindSet(size_t n):_ufs(n, -1){}// 查找根int FindRoot(int x);// 合并void Union(int x1, int x2);// 查看集合个数size_t UnionCount(int x);private:vector<int> _ufs; 
};

1. 查找根

// 查找根
int FindRoot(int x)
{if (x >= _ufs.size()){throw invalid_argument("无效参数!");return -1;}int root = x;while (_ufs[root] >= 0) // 不为根就向上查找{root = _ufs[root];}return root;
}

2. 合并

在合并时,有可能会出现两个团队互相合并的情况,此时我们只需要将其中一个团队的根的值加到另一个团队的根上,再让自己指向另一个团队的根即可,即

// 合并
void Union(int x1, int x2)
{int root1 = FindRoot(x1);int root2 = FindRoot(x2);// 两个人属于不同的集合时,才需要进行合并if (root1 != root2){_ufs[root1] += _ufs[root2];_ufs[root2] = root1;}
}

3. 查看集合个数

// 查看集合个数
size_t UnionCount()
{size_t ret = 0;for (auto& e : _ufs){if (e < 0) ret++;}return ret;
}

3. 并查集的实际应用

1. 省份数量

题目链接:LCR 116. 省份数量 - 力扣(LeetCode)

解析:分析题目,如果这道题使用并查集就没有那么难,整体思路就是如果两个城市相连就将他们合并为一个省份,最终返回省份个数即可

解法一:使用并查集数据结构

class UnionFindSet
{
public:// 将并查集中的所有元素初始化为-1UnionFindSet(size_t n):_ufs(n, -1){}// 查找根int FindRoot(int x){if (x >= _ufs.size()){throw invalid_argument("无效参数!");return -1;}int root = x;while (_ufs[root] >= 0) // 不为根就向上查找{root = _ufs[root];}return root;}// 合并void Union(int x1, int x2){int root1 = FindRoot(x1);int root2 = FindRoot(x2);// 两个人属于不同的集合时,才需要进行合并if (root1 != root2){_ufs[root1] += _ufs[root2];_ufs[root2] = root1;}}// 查看集合个数size_t UnionCount(){size_t ret = 0;for (auto& e : _ufs){if (e < 0) ret++;}return ret;}private:vector<int> _ufs;
};class Solution
{
public:int findCircleNum(vector<vector<int>>& isConnected){UnionFindSet ufs(isConnected.size());for (int i = 0; i < isConnected.size(); i++)for (int j = 0; j < isConnected[i].size(); j++)if (isConnected[i][j] == 1){ufs.Union(i, j);}return ufs.UnionCount();}
};

 解法二:直接运用并查集思想

2. 等式方程的可满足性

题目链接:990. 等式方程的可满足性 - 力扣(LeetCode)

相关文章:

数据结构——

1. 什么是并查集&#xff1f; 在计算机科学中&#xff0c;并查集&#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不数据结构交集&#xff09;是一种数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint sets&#xff0c;一系列没有重复元…...

微信小程序建议录音机

在小程序中实现录音机功能&#xff0c;可以通过使用小程序提供的wx.getRecorderManager() API来获取录音管理对象&#xff0c;然后使用这个对象的start()方法来开始录音&#xff0c;使用stop()方法来停止录音&#xff0c;并使用onStop()方法来监听录音的结束。以下是一个简单的…...

双指针:移动零

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 乍一看有点难度&#xff0c;但也是快慢指针的模板。和26. 删除有序数组中的重复项类似&#xff0c;只不过多了一步填充0。 class Solution {public int removeDuplicates(int[] nums) {int fast 1,slow 1;wh…...

图像亮度和对比度的调整

在网上找了很多图像亮度的调整算法&#xff0c;下面是其中一种&#xff0c;可以通过条形框进行调整&#xff0c;并实时的查看对应参数值后的效果。 图像亮度处理公式: y [x - 127.5 * (1 - B)] * k 127.5 * (1 B); x 是输入像素值 y 是输出像素值 B 是亮度值&#xff0c; …...

Linux加固-权限管理_chattr之i和a参数

一、参数i i:如果对文件设置了i属性&#xff0c;不允许对文件进行删除、改名&#xff0c;也不能添加和修改数据&#xff1b;如果对目录设置了i属性&#xff0c;那么只能修改目录下文件的数据&#xff0c;但不允许建立和删除文件。&#xff08;相当于把文件给锁住了&#xff0c;…...

windows10/win11截图快捷键 和 剪贴板历史记录 快捷键

后知后觉的我今天又学了两招&#xff1a; windows10/win11截图快捷键 按 Windows 徽标键‌ Shift S。 选择屏幕截图的区域时&#xff0c;桌面将变暗。 默认情况下&#xff0c;选择“矩形模式”。 可以通过在工具栏中选择以下选项之一来更改截图的形状&#xff1a;“矩形模式”…...

上海计算机考研避雷,25考研慎报

上大计算机一直很热 408考研er重来没有让我失望过&#xff0c;现在上大的专业课是11408&#xff0c;按理说&#xff0c;这个专业课的难度是很高的&#xff0c;但是408er给卷出了新高度&#xff0c;大家可以去上大官网看看今年最新的数据&#xff0c;我也帮大家统计了24年最新的…...

第九次作业

BookInfoMapper.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.rabbite…...

A股探底回升,跑出惊天大阳,你们知道为什么吗?

今天的A股&#xff0c;探底回升&#xff0c;让人惊呆了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现3个重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股市场炸锅了&#xff0c;AI人工智能、国产软件、存储芯片迎来了涨停潮&#xff0c;惊呆了&#xff0c;科技…...

jenkins nginx自动化部署 php项目

在当今快速发展的IT领域&#xff0c;自动化部署已成为提高工作效率和减少错误的关键。Jenkins作为持续集成/持续部署&#xff08;CI/CD&#xff09;的佼佼者&#xff0c;结合Docker容器技术和PHP编程语言&#xff0c;以及Ansible自动化工具&#xff0c;可以实现高效、可靠的自动…...

海外代理IP哪个可靠?如何测试代理的稳定性?

在数字化时代&#xff0c;互联网已成为我们日常生活的重要组成部分。然而&#xff0c;随着网络活动的增加&#xff0c;我们面临的安全威胁也随之增加。 黑客攻击、数据泄露、网络钓鱼等安全事件频发&#xff0c;严重威胁着我们的个人隐私和网络安全。代理服务器在当今的互联网世…...

MySQL之可扩展性(四)

可扩展性 向外扩展 分片?还是不分片&#xff1f; 这是一个问题&#xff0c;对吧&#xff1f;答案很简单:如非必要&#xff0c;尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片&#xff0c;也许可以直接购买更大地服…...

JupyterLab使用指南(三):JupyterLab的Cell详细介绍

JupyterLab Cell 使用教程 JupyterLab 的 cell 是一种强大的工具&#xff0c;提供了编写、执行、展示和记录的全方位支持&#xff0c;使得复杂的计算任务变得简单直观。通过熟练掌握 cell 的各种操作和快捷键&#xff0c;用户可以显著提高工作效率&#xff0c;专注于解决实际问…...

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整&#xff0c;主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…...

关于Vue2的生命周期会问到哪些面试题?

在Vue2的面试中&#xff0c;关于生命周期的问题通常会涉及以下几个方面&#xff1a; 一、Vue2的生命周期概述 Vue2的生命周期是什么&#xff1f; Vue2的生命周期是指从Vue实例的创建、初始化数据、编译模板、挂载Dom、渲染、更新、卸载等一系列过程。 二、生命周期钩子函数 …...

尚品汇-(七)

&#xff08;1&#xff09;在网关中实现跨域 全局配置类实现 包名&#xff1a;com.atguigu.gmall.gateway.config 创建CorsConfig类 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsWebFilter(){// cors跨域配置对象CorsConfiguration configuration…...

【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间

文章目录 前言一、datetime模块简介二、常用类和方法三、date类四、time类五、datetime类六、timedelta类七、常用的函数和属性八、代码及其演示 前言 Python的datetime模块提供了日期和时间的类&#xff0c;用于处理日期和时间的算术运算。这个模块包括date、time、datetime和…...

keepalived 服务高可用(简约版)

本文基于centos 7记述如何使用keepalived 背景 为生产环境准备一台备机是极其必要的&#xff0c;防止主机宕掉无服务可用的情况出现。但是同一局域网内每台主机都分配了一个唯一IP&#xff0c;这些IP既然相互不同&#xff0c;那么服务请求的时候岂不是要切换IP地址&#xff1f…...

【前端】Vue项目和微信小程序生成二维码和条形码

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享Vue项目和微信小程序如何生成二维码和条形码&#xff0c;介绍了JsBarcode、wxbarcode等插件&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01…...

同时使用接口文档swagger和knife4j

项目场景&#xff1a; springboot项目中同时使用接口文档swagger和knife4j 问题描述 在实体类中设置了字段必填的属性&#xff0c;在访问接口文档时出现异常 实体类关键代码片段 /*** 部门表 sys_dept*/ public class SysDept extends BaseEntity {private static final lo…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...