C++ 并查集代码

class unionFindSet 
{
private:
	vector<int> parent;
public:
	unionFindSet(int eleNums)          // 构造函数
	{
		parent.resize(eleNums + 1, 0); //用零做初始化,代表刚开始所有元素各自都是一个集合,同时零表示该集合的秩;
	}                                  //不使用索引为0的元素,因为合并使用了秩合并


	int setFind(int index)             //查找操作,查找的同时进行路径压缩,完全压缩
	{
		if (parent[index] <= 0)        // 小于等于零的元素都是根节点,其值代表该集合的秩;不是根节点的元素,其值表示其父节点的索引
			return index;
		else
			return parent[index] = setFind(parent[index]); // 路径进行了完全压缩
	}

	void setUnion(int index_1, int index_2)           // 合并操作,按秩合并
	{
		int root_1 = setFind(index_1);                //查找其集合的根节点索引
		int root_2 = setFind(index_2);
		if (root_1 != root_2)                         // 两个元素不在同一个集合中,则进行合并操作
		{
			if (parent[root_1] < parent[root_2])      //根的值越小,则秩越大
				parent[root_2] = root_1;              // 秩大的作为根,形成的新集合,秩不变
			else
			{
				if (parent[root_1] == parent[root_2]) // 秩相等的情况,合并后,新集合的秩会加一
					parent[root_2]--;                 // 但是,这里用秩的负数来表示,所以变成了减一
				parent[root_1] = root_2;			  // 秩大的作为根,形成的新集合,秩不变,但如果秩相等,新集合的秩会变化
			}
		}
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值