并查集c++实现

并查集种数据结构用来表示集合信息,用以实现如确定某个集合含有哪些元素、判断某两个元素是否存在同一个集合中、求集合中元素的数量等问题。

其内部用一颗树来实现,其中每个结点记录其父节点编号,根节点的父节点编号为-1,

【例】

1234
3-122

判断两个元素是否处于同一棵树时可以判断其根节点是否相同,若相同则处于同一集合


对于集合A,B的合并,我们使树B的根节点指向A的根节点作为A的孩子之一。


同时为了节省查找时间,我们对其进行优化,使查找中尽量多的结点指向根节点,这样会极大地缩短查找时间


具体代码如下

查找函数(迭代+优化)

int Tree[N];

int findRoot(int x) {
	int ret;
	int tmp = x;
	while (Tree[x] != -1)
		x = Tree[x];
	ret = x;
	x = tmp;
	while (Tree[x] != -1) {
		int t = Tree[x];
		Tree[x] = ret;
		x = t;
	}
	return ret;
}


树的合并

a = findRoot(a);
b = findRoot(b);
if (a != b) Tree[a] = b;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值