并查集简述

并查集运用在一些连结点问题中 以目前我的理解 用于一些寻找连接点的问题中 

比如给你一些前后连接的点 让你判断这些点可以分成几个相互连接的部分

下面来看一下程度的实现

int pre[1000 ];         


int find(int x)                                                                                                         //查找根节点

    int r=x;

    while ( pre[r ] != r )                                                                                              //返回根节点 r

          r=pre[r ];

  return r ;

}

根节点特点r=pre[r]    根据这个特征可以找出根节点 判断一共有多少根节点就能知道有多少个部分  或者多少个图

这种一般是边查找根节点 一边进行关系赋值

void unio(int x,int y)
{
    int i,j;
    i=fin(x);
    j=fin(y);
    if(i!=j)
        pre[x]=y;
}

可以这样实现 

  

在并查集的基础上可以进行缩短路径的算法 把原来多层的关系变成二层关系

代码实现如下

int pre[1000 ];

int find(int x)                                                                                                         //查找根节点

    int r=x;

    while ( pre[r ] != r )                                                                                              //返回根节点 r

          r=pre[r ];

 

    int i=x , j ;

    while( i != r )                                                                                                        //路径压缩

    {

         j = pre[ i ]; // 在改变上级之前用临时变量  j 记录下他的值 

         pre[ i ]= r ; //把上级改为根节点

         i=j;

    }

    return r ;


}

这样能把路径压缩成简单的二层关系  查找是会简单的多


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值