并查集

并查集是一种用于处理不相交集合的数据结构,通过查找和合并操作高效地管理元素分组。其核心操作包括初始化、查找根节点和合并两个集合。在实现中,使用路径压缩和秩优化提升查找效率,保持树的平衡,从而在大型数据集上表现良好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并查集的概念

并查集是通过将具有连接关系的元素合并成为一个组,这个组里面所有的元素有公共的祖先。

这样最终只会形成一个个小组的形式。这样对于很多分组问题都能得到很好的解决。

基本操作

init初始化

用来初始化fa数组,以及子数组的深度rank数组,初始化的时候会有n个组,每个组的根节点是本身,同时组内连接数深度都为1。


vector<int> fa;
vector<int> rank;

void init(int n)
{
    for (int i = 0; i < n; i++)
    {
      fa[i] = i;
      rank[i] = 1;
    }
}

find操作

寻找组内元素的根节点,利用递归的思想直到寻找到fa[x] ==x为止。

int find(int x)
{
 
return fa[x] == x? x:(fa[x] = find(fa[x]));
}

merge操作

加入新的元素后进行合并到连接树种。

void merge(int i, int j)
{
  int x = find(i);
  int y = find(j);

  if (rank[x] <= rank[y])
  {
      fa[x] = y;
  }
  else
  {
      fa[y] =x;
  }

  if (rank[x] == rank[y] && x != y)
   {
     rank[y]++
   }

}

这里加入rank的目的是为了使得连接树的深度尽量低,使得查找的时候效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值