1、概念
并查集(Disjoint Set Union, DSU)是一种树型数据结构,用于处理一些不交集的合并(Union)与查询(Find)问题。每个集合用一棵树来表示,树的每个节点表示集合中的一个元素,树的根节点被当作是这个集合的代表(或称“父”)。
2、实战代码
给定n个不交集的数,进行合并和查询两种操作。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10; // 定义最大可能的元素数量
int q[N]; // 并查集的父节点数组
// 查找函数:找到元素x的根节点(集合代表),并进行路径压缩
int find(int x)
{
if(q[x] == x) return q[x]; // 如果x是根节点,直接返回
if(q[x] != x) q[x] = find(q[x]); // 否则递归查找,并进行路径压缩
return q[x]; // 返回根节点
}
int main()
{
int n, m; // n: 元素数量,m: 操作次数
cin >> n >> m;
// 初始化并查集,每个元素的父节点指向自己
for (int i = 1; i <= n; i++)
q[i] = i;
// 处理m个操作
while(m --)
{
char op; // 操作类型:'M'合并,'Q'查询
int a, b; // 操作涉及的两个元素
cin >> op >> a >> b;
if(op == 'M')
{
// 合并操作:将a所在集合的根节点指向b所在集合的根节点
q[find(a)] = find(b);
}
else if(op == 'Q')
{
// 查询操作:检查a和b是否属于同一集合
if (find(a) == find(b))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}