1. 简述
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
需要实现的操作有:合并两个集合,判断两个元素是否属于一个集合。
这里介绍的主要是普通的并查集,很多情况下使用的并查集是需要扩展的,根据使用情况的不同,有很多差别,这里仅仅是最基本的算法。
2. 复杂度
T=O(n*α(n)) , 其中α(x),对于x=宇宙中原子数之和,α(x)不大于4。事实上,路经压缩后的并查集的复杂度是一个很小的常数。
3. 伪代码
//初始化
void init(int n)
{
for(i=1;i<=n;i++) father[i]=i;
}
//寻找根节点编号并压缩路径
int find(int x)
{
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
//合并两个集合
void unionn(int x,int y)
{
x=find(x);y=find(y);
father[y]=x;
}
//判断元素是否属于同一个集合
bool same(int x,int y)
{
return find(x)==find(y);
}
练习题目: