union find算法 c++

news/2024/12/18 6:55:05/

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/news/1556061.html

相关文章

STM32F407+LAN8720A +LWIP +FreeRTOS 实现TCP服务器

STM32F407LAN8720A LWIP FreeRTOS UDP通讯 上一篇实现了UDP通讯 本篇实现TCP服务器 实现如下功能&#xff1a; TCP服务器接收数据并把数据发送回去&#xff0c;实现回环。 1.代码 STM32CUBEIDE配置方式和udp相同&#xff0c;只是代码不同。 TCP服务器实现的代码如下&#…

请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配

vs版本升级时&#xff0c;编译时会出现上述问题&#xff0c;如原来在2017下编译的程序&#xff0c;后来改用2019&#xff0c;出现上述问题。需要在解决方案-通用属性-调试源文件下变更相应设置。

Windows server服务器之网络按管理(创建IPsec保护网络安全)

14.2 任务&#xff1a;创建IPsec保护网络安全 对IPsec 两个方面的作用。&#xff08;必须清楚&#xff09; 任务实施的步骤&#xff1a; 1.创建本地安全策略 2.创建管理IP筛选器列表和筛选器操作 3.打开IP地址添加向导 4.筛选器列表和筛选向导中的内容要对应 5.完成IP筛…

探索 Cesium 的未来:3D Tiles Next 标准解析

探索 Cesium 的未来&#xff1a;3D Tiles Next 标准解析 随着地理信息系统&#xff08;GIS&#xff09;和 3D 空间数据的快速发展&#xff0c;Cesium 作为领先的开源 3D 地球可视化平台&#xff0c;已成为展示大规模三维数据和进行实时渲染的强大工具。近年来&#xff0c;随着…

练习题:一维数组

练习题 第一题 键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 代码 #include <stdio.h>int arr_home01() {int arr[10];int i,j,temp;printf("请输入10个测试整数&#xff1a;\n");int len sizeof(arr) / sizeof(arr[0]);for(i 0;i < …

《统计方形(数据加强版)》

题目背景 1997年普及组第一题 题目描述 有一个 nmnm 方格的棋盘&#xff0c;求其方格包含多少正方形、长方形&#xff08;不包含正方形&#xff09;。 输入格式 一行&#xff0c;两个正整数 n,mn,m&#xff08;n≤5000,m≤5000n≤5000,m≤5000&#xff09;。 输出格式 一…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

Linux系统 —— 进程系列 - 程序地址空间:虚拟地址空间

接前文&#xff1a; Linux系统 —— 进程系列 - 进程优先级与进程切换-CSDN博客https://blog.csdn.net/hedhjd/article/details/144404639?spm1001.2014.3001.5502 目录 前言 1. 虚拟地址空间和进程地址空间 1.1 什么是虚拟地址空间&#xff1f; 结论 1.2 虚拟地址空间的结…