首页 > 其他 > 详细

并查集板子

时间:2020-10-05 11:18:45      阅读:42      评论:0      收藏:0      [点我收藏+]

操作:

1. 查询a与b是否属于同一组

2. 合并a与b所在的组

 

复杂度:

均摊复杂度优于O(log(n))

 

代码:(改了码风有点不习惯qaq

int f[maxn],h[maxn];//每个结点的父亲及树高

//初始化n个元素
void init(int n)
{
    for(int i = 0; i < n; ++i)
    {
        f[i] = i;
        h[i] = 0;
    }
}

//查询树的根
int find(int x)
{
    if(f[x] == x) return x;
    else return f[x] = find(f[x]);//路径压缩
}

//合并x和y所属的集合
void unite(int x, int y)
{
    x = find(x);
    y = find(y);
    if(x == y) return;
    //树高优化,由于find后已经路径压缩,所以x与y的高度差最多为1
    if(h[x] < h[y]) f[x] = y;//这里树高相差1(一个为1,一个为0),合并后x与y的高度都不变
    else
    {
        f[y] = x;
        if(h[x] == h[y]) h[x]++;//这里树高相等,合并后父亲高度加1
    }
}

 

并查集板子

原文:https://www.cnblogs.com/Maxx-el/p/13769503.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!