并查集
之前对并查集一直不太熟悉,这次做题遇到了,就做一个简单记录
并查集是什么
并查集是一种管理元素分组的数据结构,可以①查询两个元素是否属于同一组,也可以②合并两个元素所属组。为树形结构,但不是二叉树
并查集基本功能的实现
int par[maxn]; //父亲
int rk[maxn]; //树的高度
void init(int n) //初始化n个元素
{
int i;
for (i = 0; i < n; ++i)
{
par[i] = i; //初始化都让父亲指向自己
}
return;
}
int find(int x) //找根
{
if (par[x] == x) //意味着找到根
return x;
else
{
return par[x] = find(par[x]); //找到根后将叶子直接指向根,以优化查询效率
}
}
void unite(int x, int y) //合并x,y所属的集合
{
x = find(x);
y = find(y);
if (x == y) //如果x,y本就属于同一个集合,则不做操作
return;
if (rk[x] < rk[y]) //如果x所属树的高度小于y的,那么把根x的父亲指向y;反之,则根y的父亲指向x;
par[x] = y;
else
{
par[y] = x;
if (rk[x] == rk[y]) //如果两棵树原高度相同,则合并后高度+1
rk[x]++;
}
return;
}