并查集路径压缩
2014-02-22 14:57
155 查看
之前在博客上写过一篇并查集的文章,当时并没有用到路径压缩,效率较低,今天做到一道题发现使用朴素的并查集方案超时了,之后改用路径压缩通过了;因此在这里再讨论下使用路径压缩的并查集。
这是最朴素的并查集代码:
int find(int r)
{
while(r!=bin[r])
{
r=bin[r];
}
return r;
}
这是使用了路径压缩的代码:
int find(int r)
{
if(r!=bin[r])
{
bin[r]=find(bin[r]);
}
return bin[r];
}
由于使用了递归方式来查找,数量级比较大的时候可能会出现栈溢出,所以还是会出现问题。
下面给出非递归的方式:
int find(int x)
{
int k, j, r;
r = x;
while(r != parent[r]) //查找跟节点
r = parent[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j = parent[k]; //用j暂存parent[k]的父节点
parent[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}
这是最朴素的并查集代码:
int find(int r)
{
while(r!=bin[r])
{
r=bin[r];
}
return r;
}
这是使用了路径压缩的代码:
int find(int r)
{
if(r!=bin[r])
{
bin[r]=find(bin[r]);
}
return bin[r];
}
由于使用了递归方式来查找,数量级比较大的时候可能会出现栈溢出,所以还是会出现问题。
下面给出非递归的方式:
int find(int x)
{
int k, j, r;
r = x;
while(r != parent[r]) //查找跟节点
r = parent[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j = parent[k]; //用j暂存parent[k]的父节点
parent[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}
相关文章推荐
- 并查集 压缩路径
- 并查集 路径压缩
- poj1703Find them, Catch them(并查集以及路径压缩)
- 并查集(两个优化—按秩合并、路径压缩) poj2492
- 【转】并查集算法和路径压缩
- hdu 1856 并查集(很裸)(路径压缩)
- 【转】并查集算法和路径压缩
- 并查集——路径压缩
- 并查集的启发式合并 和 路径压缩
- HDU 3635 Dragon Balls(并查集:路径压缩)
- 并查集 路径压缩
- 数据结构实现之并查集(使用按秩合并和路径压缩)
- 图论算法----并查集中的路径压缩
- 暑假集训 8.17 数据结构实验:连通分量个数(并查集判断连通分量个数 路径压缩)sdutoj1488
- POJ 2912 Rochambeau(路径压缩并查集)
- poj 1182 食物链(数据结构:并查集+路径压缩)
- 【模板】并查集 两种路径压缩写法
- hdu 3635 Dragon Balls (并查集,路径压缩应用)
- 并查集 路径压缩
- HDU 1856 More is better(并查集路径压缩+剪枝优化+暴力枚举)