union find算法 c++

server/2024/12/17 2:10:07/

1.原理参考

labuladong-fucking-algorithm/算法思维系列/UnionFind算法详解.md at master · jiajunhua/labuladong-fucking-algorithm · GitHub

2.初级模式

#include <iostream>class UF {public:// 记录连通分量/* 构造函数,n 为图的节点总数 */UF(int n) {count = n;//    int arr[n];parent_arr = new int[n]; for(int i=0; i<n; i++){parent_arr[i] = i;}};/* 其他函数 */~UF(){delete[] parent_arr;}void union_func(int p, int q);int find(int x);int getCount();bool connect(int p, int q);private:int count;// 节点 x 的节点是 parent[x]//  int[] parent;int* parent_arr; };void UF::union_func(int p, int q)
{int rootP = find(p);int rootQ = find(q);if(rootQ == rootP)return;parent_arr[rootQ] = rootP;count--;}int UF::find(int x)
{while (parent_arr[x] != x){x = parent_arr[x];}return x;
}int UF::getCount()
{return count;
}bool UF::connect(int p, int q)
{int rootP = find(p);int rootQ = find(q);return rootP == rootQ;
}int main()
{UF union_find(7);union_find.union_func(0, 1);union_find.union_func(0, 2);union_find.union_func(0, 3);union_find.union_func(2, 4);union_find.union_func(2, 5);union_find.union_func(3, 6);std::cout << union_find.getCount() << std::endl;return 0;
}

3. 进阶模式

   3.1 平衡性优化 

   3.2  路径压缩

   

#include <iostream>class UF {public:// 记录连通分量/* 构造函数,n 为图的节点总数 */UF(int n) {count = n;//    int arr[n];parent_arr = new int[n]; size_arr = new int[n];for(int i=0; i<n; i++){parent_arr[i] = i;size_arr[i] = i;}};/* 其他函数 */~UF(){delete[] parent_arr;}void union_func(int p, int q);int find(int x);int getCount();bool connect(int p, int q);private:int count;int* parent_arr;int* size_arr; };void UF::union_func(int p, int q)
{int rootP = find(p);int rootQ = find(q);// 小树接到大树下面,较平衡if (size_arr[rootP] > size_arr[rootQ]) {parent_arr[rootQ] = rootP;size_arr[rootP] += size_arr[rootQ];} else {parent_arr[rootP] = rootQ;size_arr[rootQ] += size_arr[rootP];}count--;}int UF::find(int x)
{while (parent_arr[x] != x){// 进行路径压缩parent_arr[x] = parent_arr[parent_arr[x]];x = parent_arr[x];}return x;
}int UF::getCount()
{return count;
}bool UF::connect(int p, int q)
{int rootP = find(p);int rootQ = find(q);return rootP == rootQ;
}int main()
{UF union_find(7);union_find.union_func(0, 1);union_find.union_func(0, 2);union_find.union_func(0, 3);union_find.union_func(2, 4);union_find.union_func(2, 5);union_find.union_func(3, 6);std::cout << union_find.getCount() << std::endl;return 0;
}


http://www.ppmy.cn/server/150776.html

相关文章

Jenkins容器使用宿主机Docker(五)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装&#xff08;三&#xff09; Harbor镜像仓库介绍&安装 &#xff08;四&#xff09; Jenkins容器使用宿主机Docker&#xff08;五&#xff09; Jenkins流水线初体验&#xff08;六&#…

02. Docker:安装和操作

目录 一、Docker的安装方式 1、实验环境准备 1.1 关闭防火墙 1.2 可以访问网络 1.3 配置yum源 2、yum安装docker 2.1 安装docker服务 2.2 配置镜像加速 2.3 启动docker服务 3、二进制安装docker 3.1 下载或上传安装包并解压 3.2 配置使用systemctl管理 3.3 配置镜像…

SpringBoot 手动实现动态切换数据源 DynamicSource (中)

大家好&#xff0c;我是此林。 SpringBoot 手动实现动态切换数据源 DynamicSource &#xff08;上&#xff09;-CSDN博客 在上一篇博客中&#xff0c;我带大家手动实现了一个简易版的数据源切换实现&#xff0c;方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源…

QTreeView 与 QTreeWidget 例子

1. 先举个例子 1班有3个学生&#xff1a;张三、李四、王五 4个学生属性&#xff1a;语文 数学 英语 性别。 语文 数学 英语使用QDoubleSpinBox* 编辑&#xff0c;范围为0到100,1位小数 性别使用QComboBox* 编辑&#xff0c;选项为&#xff1a;男、女 实现效果&#xff1a; 2…

Scala的正则表达式3

贪婪模式与非贪婪模式 object test { //正则表达式 def main(args: Array[String]): Unit { // 贪婪模式 // 正则匹配默认是贪婪模式的 // ? 非贪婪模式,加在量词的后面 //在如下字符串中 查找 满足正则表达式要求的内容 // 找全部的手机号 // 规则&#xff1a; // 1.11位数…

scala列表

1 不可变 List 说明 &#xff08;1&#xff09;List 默认为不可变集合 &#xff08;2&#xff09;创建一个 List&#xff08;数据有顺序&#xff0c;可重复&#xff09; &#xff08;3&#xff09;遍历 List &#xff08;4&#xff09;List 增加数据 &#xff08;5&#…

数据库系统原理 第六章 关系数据库的规范化理论

文章目录 1.问题的提出1.1概念回顾1.2.关系模式的形式化定义1.3.什么是数据依赖1.4.数据依赖对关系模式的影响 2.规范化2.1函数依赖2.2码2.3.范式(Normal-Form) 3.数据依赖的公理系统3.1ArmStrong公理系统3.2闭包3.3计算关系R的属性集X的闭包的步骤如下3.4候选码求解理论与算法…

20分钟入门solidity(1)

1. Solidity简介 Solidity是一种静态类型编程语言&#xff0c;专门用于在以太坊区块链上编写智能合约。它借鉴了JavaScript、Python和C的语法&#xff0c;非常适合开发在以太坊虚拟机&#xff08;EVM&#xff09;上运行的应用程序。 智能合约&#xff1a;表达商业、法律关系的…