并查集的启发式合并
2017-10-16 21:01
316 查看
在原来刚接触并查集的时候,感觉确实很方便,也是认为并查集就那么点东西,简单方便,但是后来无意间发现了一个并查集的启发式合并,可以对并查集进行优化,它优化的理论是用一个数组来记录每个节点的深度,每一次合并都把节点向深度(高度)大的节点上进行合并,从而对最后的“生成树”深度进行了优化。受益匪浅,好长时间没写过博客了。。。emmm。。。
下面附带一个递归压缩路径找父节点的函数(其实很简单的那个)
rank 数组并没有给出,自己建立一个清零即可使用
int getf(int v) //查找他的父节点
{
if(v == f[v])
return f[v];
else
{
f[v] =getf(f[v]);
}
}
//下面为启发式合并的核心代码,增加一个rank数组来储存每个节点的深度,总是把节点并在深度大的节点上
//这样做的好处是在后来查找时可以节省很多时间
void Merge(int u, int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
if(rank[t1] > rank[t2])
{
f[t2] = t1;
}
else if(rank t1 < rank[t2])
{
f[t1] = t2;
}
else
{
f[t2] = t1;
rank[t1]++;
}
}
}
下面附带一个递归压缩路径找父节点的函数(其实很简单的那个)
rank 数组并没有给出,自己建立一个清零即可使用
int getf(int v) //查找他的父节点
{
if(v == f[v])
return f[v];
else
{
f[v] =getf(f[v]);
}
}
//下面为启发式合并的核心代码,增加一个rank数组来储存每个节点的深度,总是把节点并在深度大的节点上
//这样做的好处是在后来查找时可以节省很多时间
void Merge(int u, int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
if(rank[t1] > rank[t2])
{
f[t2] = t1;
}
else if(rank t1 < rank[t2])
{
f[t1] = t2;
}
else
{
f[t2] = t1;
rank[t1]++;
}
}
}
相关文章推荐
- 并查集路径压缩与启发式合并
- [后缀数组][trie合并][启发式合并][并查集] LOJ #6198. 谢特
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
- [并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks
- CDOJ1927 爱吃瓜的伊卡洛斯(2) 【并查集】启发式合并+set
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
- POJ 1611 The Suspects 并查集(代码带启发式合并)
- COCI 2017/2018 Round #3,November 25th,2017 Pictionary [带权并查集+启发式合并]
- BZOJ.3673/3674.可持久化并查集(可持久化线段树 按秩合并/启发式合并)
- BZOJ 4668 冷战 [并查集][按秩合并&启发式合并]
- 【pb_ds】【平衡树启发式合并】【并查集】bzoj2733 [HNOI2012]永无乡
- 【AGC014E】Blue and Red Tree 并查集 启发式合并
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
- 51nod 1515 明辨是非 并查集 + set + 启发式合并
- 并查集的启发式合并 和 路径压缩
- 并查集的优化---路径压缩与启发式合并
- CodeForces 827D Best Edge Weight (倍增 启发式合并 链剖 并查集)
- 并查集——启发式合并,路径压缩