并查集的理解与相关代码

本文介绍了并查集这一数据结构,包括其基本概念、初始化、查找和按秩合并操作。并查集常用于处理不相交集合的问题,文中通过示例展示了如何使用并查集解决实际问题,如洛谷1551题。同时提供了C++实现的代码示例,帮助读者理解和应用并查集。
摘要由CSDN通过智能技术生成

并查集

应用场景:将有关系的元素放在一个集合中。
参考文章并查集
相关例题:洛谷1551
相关代码

> // @ Time: 21/2/24 21:01
// @ Author: A Fei

//并查集
const int N = 5001;
int fa[N], rank[N];
//初始化 
void init(int n)
{
   for(int i=1; i<=n; i++)
   {
   	fa[i] = i;//初始每个元素的父节点都是自己 
   	rank[i] = 1;// 记录每个节点的子树深度   初始每个元素父节点是自己,那么深度就为1. 
   }
} 

//查找x的父节点,并将该元素的父节点变成对应的根节点(路径压缩) 
int find(int x)
{
   return fa[x]==x ? x : (fa[x] = find(fa[x]));//这里三元 ? 的优先级高于赋值号 = 所以要加括号! 
}

//按秩合并 将深度小的合并到深度大的上面(rank[i] < rank[m]), 深度相等就任意,此时深度要加一 
void merge(int n, int m)
{
   int x = find(n), y = find(m);
   if(rank[x] <= rank[y])
   	fa[x] = y;
   else
   	fa[y] = x;
   if(rank[x] == rank[y] && x != y)
   	rank[y]++;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值