并查集的基本知识

对不相交集合进行俩种操作:

1.  检索某元素属于哪个集合

2.  合并两个集合

我们最常用的数据结构是并查集的森林实现,也就是说,在森林中,每棵树代表一个集合,用树根来标识一个集合,树的形态不重要,重要的是每棵树有哪些元素。

查找操作

查找一个元素v很简单,只需要顺着叶子到根节点的路径找到u所在的根节点,然后把vu的路径上面的结点的父节点都设置为根节点,这样减少了查找的次数(路径压缩)

合并操作

为了把两个集合s1s2并起来,只需要把s1的根的父亲设置为s2的根节点,我们可以做一个优化,将深度小的合并成为深度大的子树,这样子查找的次数少些。

/* 初始化集合*/
 void Make_Set(int x)
 
 {
      father[x] = x; //根据实际情况指定的父节点可变化
      rank[x] = 0;   //根据实际情况初始化秩也有所变化
 

/* 查找x元素所在的集合,回溯时压缩路径*/

 int Find_Set(int x)
{

     if (x != father[x])

     {

       father[x] = Find_Set(father[x]); //这个回溯时的压缩路径是精华
 
    }
     
return
 father[x];
 }
//将秩小的合并到秩大的集合中

 
void Union(int x, int y)
 
{
     x = Find_Set(x);
     y = Find_Set(y);
     
if (x == y) return;
     if
 (rank[x] > rank[y]) 
 
    {
         father[y] = x;
     }
     
else
     {
         
if (rank[x] == rank[y])
 
        {
             rank[y]++;
         }
         father[x] = y;
     }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值