【C++算法模板】并查集详解,一种处理不相交集合的合并与查询的数据结构

文章目录

0)概述

  • 并查集是用于处理不相交集合的合并与查询的树形数据结构

1)数据结构

  • 准备一个数组用于存储所有点的连通分量(父节点)
c 复制代码
const int maxn=2e5+5;
int fa[maxn];

2)核心函数

1:find函数

  • 用于查询某个顶点的父节点
c 复制代码
int find(int x) {
    if(x==fa[x])
        return x; // 如果本身就是父节点,返回本身
    else
        return fa[x]=find(fa[x]); // 递归压缩路径来查找父节点(降低时间复杂度)
}

2:join函数

  • 用于连接两个并查集
c 复制代码
void join(int a,int b) {
    fa[find(a)]=find(b); // b的父节点作为a原本的父节点的父节点
}

3)模板

  • 下列案例中:输入 1 1 2 1\ 1\ 2 1 1 2 表示把并查集 1 1 1 和 2 2 2 连接起来,输入 2 1 2 2\ 1\ 2 2 1 2 表示判断 1 1 1 和 2 2 2 是否属于同一并查集
  • 关键点:1)初始化时将每个节点的父节点初始化为自己;2)如果 a a a 和 b b b 的父节点相同,则表明二者处于同一并查集中
c 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+4;
int fa[maxn]; // 记录每个节点的父节点
int find(int x) {
	if(x==fa[x]) 
		return x;
	else
		// 路径压缩
		return fa[x]=find(fa[x]);
}
void join(int l,int r) {
	fa[find(l)]=find(r); // x的父节点的父节点变为y的父节点(合并)
}
int main() {
	int n,m;
	cin>>n>>m;
	int op,l,r; // op是操作,l和r是合并或判断关系的两个并查集
	// 1. 初始化每个结点的父节点都是自己
	for(int i=1;i<=n;i++) 
		fa[i]=i;
	while(m--) {
		cin>>op>>l>>r;
		if(op==1)
			join(l,r);
		else if(op==2) {
			if(find(l)==find(r)) // 在同一并查集中
				cout<<"Y\n";
			else
				cout<<"N\n";
		}
	}
	return 0;
}
  • 需要维护特定分量的并查集将在以后的博客中讲解
相关推荐
leoufung4 小时前
LeetCode 135. Candy:从直觉到最优解的完整推导
算法·leetcode·职场和发展
WHS-_-20224 小时前
Tensor-Based Target Sensing for Resource-Irregular ISAC Systems
linux·人工智能·算法
成都易yisdong5 小时前
高程异常计算器:一款集成Geoid、重力场与地磁场的专业工具
算法
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【反悔贪心】:种树
c++·算法·贪心·反悔贪心·csp·信奥赛·种树
南宫萧幕5 小时前
基于 PSO 的 HEV 能量管理策略:从联合仿真建模到排错实战
开发语言·python·算法·matlab·控制
c++之路5 小时前
C++ 高频易错点
java·jvm·c++
wuminyu5 小时前
专家视角看Java多态性的底层基石vtable(虚函数表)构建过程解析
java·linux·c语言·jvm·c++
charlie1145141915 小时前
现代Qt开发教程(新手篇)1.10——进程
开发语言·c++·qt·学习
生物信息与育种5 小时前
全基因组重测序及群体遗传与进化分析技术服务指南
人工智能·深度学习·算法·数据分析·r语言
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第23题:ConcurrentHashMap的底层原理是什么
java·开发语言·算法·哈希算法·散列表·hash