并查集原理和操作


//并查集
const int maxn = 100000;
int N = 10;
int father[maxn];
//father[i]=i:父节点是自己,即i为根节点
//father[i]=j:i节点的父节点是j
//初始化。
void init() {
	for (int i = 0; i <= N; i++) {
		father[i] = i;
	}
}

//查找
int findFather(int x) {
	while (x != father[x]) {//不是根节点
		x = father[x];//获取根节点
	}
	return x;
}
//递归查找
int findFatherD(int x) {
	if (father[x] == x) return x;
	else return findFatherD(father[x]);
}
//合并两个集合
void Union(int a, int b) {
	int faA = findFather(a);//查找a的根节点
	int faB = findFather(b);//查找b的
	if (faA != faB) {
		//不属于同一集合
		father[faA] = faB;
	}
}

//路径压缩,把同一个根节点的节点指向一个根节点
int findFatherAll(int x) {
	int a = x;//暂存
	while (x != father[x]) {
		x = father[x];
	}
	//这里x是根节点了
	while (a != father[a]) {
		int z = a;
		a = father[a];
		father[z] = x;//将之前节点a的父节点改为根节点x
	}
	return x;
}

猜你喜欢

转载自blog.csdn.net/weixin_42189888/article/details/106602974
今日推荐