一 概念
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
操作:
初始化
把每个点所在集合初始化为其自身。 通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。查找所属集合
查找元素所在的集合,即根节点。
合并
将两个元素所在的集合合并为一个集合。
二 实现
/* *
* 并查集的实现
* date: 2012.5.6 20:16
*
* */
#define maxsize 50000
int rank[maxsize];
int p[maxsize];
//每棵树的节点个数
int num[maxsize];
//初始化并查集
void init()
{
int i;
for (i = 0; i < maxsize; ++i)
{
p[i] = i;
rank[i] = 0;
num[i] = 1;
}
memset(rank, 0, sizeof(rank));
}
// 查找x所属集合
int find_set(int x)
{
if (x != p[x])
p[x] = find_set(p[x]);//递归过程中进行路径压缩
else
return p[x];
}
// 合并a和b所在集合
void _union(int a, int b)
{
int root1 = find_set(a);
int root2 = find_set(b);
if (root1 == root2)
return;
if (rank[root1] > rank[root2])
{
p[root2] = root1;
num[root1] += num[root2];
}
else
{
p[root1] = p[root2];
if (rank[root1] = rank[root2])
rank[root2]++;
num[root2] += num[root1];
}
}