并查集

并查集

之前对并查集一直不太熟悉,这次做题遇到了,就做一个简单记录

并查集是什么

并查集是一种管理元素分组的数据结构,可以①查询两个元素是否属于同一组,也可以②合并两个元素所属组。为树形结构,但不是二叉树

并查集基本功能的实现

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;
}
posted @ 2018-04-01 14:13  __orange  阅读(142)  评论(0编辑  收藏  举报