并查集

并查集
先来个容易理解的并查集,特别容易理解 http://blog.csdn.net/dellaserss/article/details/7724401/
总结一下:
并查集其实就是维护了几个动态的集合,集合中的每一个元素都标记了一个父节点,同一个集合的父节点是相同的。当一个元素的父节点就是它本身时,它就是这个集合的代表。
并查集有三种操作:
1<make(x)  用于初始化集合,将每个元素的父节点设置为它本身,即每一个元素都为一个集合,互相没有联系。
2<find(x)  找到x所在集合的父节点即代表。
3<join(x,y) 合并x和y所在的集合,即把y的代表设置为x所在集合的代表。

这里用数组实现,pre[i]的值就是i的父节点
初始化 (假设有t个元素):把每一个元素的父节点都设置为它自己
void make(int t)//初始化
{
    for(int i=1;i<=t;i++)
        pre[i]=i;
}

寻找x的父节点
int Find(int x)
{
    int r=x;
    while(r!=pre[r])//找到x的父节点
        r=pre[r];
    int i=x,j;
    while(i!=r)//缩短路径,把x的上级的父节点都设为pre[r]
    {
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}

合并:把x的父节点设置为y所在集合的父节点
void join(int x,int y)//合并
{
    int fx=Find(x),fy=Find(y);
    if(fx!=fy)
        pre[fx]=fy;
}

并查集的上手题   hdu1232
链接: http://blog.csdn.net/blesslzh0108/article/details/53636311
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值