并查集知识点总结

并查集

何为并查集? 从字面意思上我们就可以看出并查集这种数据结构的功能就是合并和查询。 “并”也就是说把直接相关或者间接相关的一类事物连接起来, 而查询就是确定两个人是否有关系, 或许他们之间很陌生, 但是他们的朋友的朋友的朋友可能就是朋友, 这样也是存在关系。

 

学习并查集, 主要是学习其中的两个函数,

(a):  void Find(int a) { }  此函数的功能有两个, 一个是前面说的查询功能, 另一个就是压缩路径, 何为压缩路径:看图:

                                    pic 1                pic 2

pic 1 中9的父节点为10 , 经压缩路径后9 和 10 都成为了根节点6的儿子, 这就是路径压缩。

压缩路径代码有两种写法:

① 非递归路径压缩

int find(int a)
{    
    int r, j, k ;
     r = a;
     while(r != father[r])
        r = father[r];
    j = a;
     while(j != r)
    {
        k = father[j];
        father[j] = r;
        j = k;
    }
    return r;
}

 

这种压缩路径方法也不是很复杂, 推荐使用;

② 递归路径压缩, 可能会爆栈。

int find(int a)
{
    if(a == father[a])
        return a;
    else
        return father[a] = find(father[a]);
}

 

这种写法较为简单, 节点数不是很多使用较为方便。这种方法压缩路径时利用回溯。 举个例子从父节点出发, 所有节点都在一条路径上 10—>2—>1—>5—>9—>3. ,       压缩路径时在回溯过程中各子节点连到父节点上顺序为 21593 ;理解了这些, 并查集也就差不多了, 本来也不是很复杂。

(b): void mercy(int a, int b) {}  函数功能不可能唯一, 主要功能是合并节点。直接上代码了。

void mercy(int a, int b)
{
    int q = find(a);
    int p = find(b);    
    if(q != p)
    {
        father[q] = p;
        //return true;  
    }
    //return false;
}

 

知道了并查集的合并, 查询, 基础并查集题目就可以尽情水了。 更高深的东西还得要自己去探索。 第一次写总结, 感觉还kuo yi.

 

转载于:https://www.cnblogs.com/soTired/p/4764582.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值