并查集以及我的理解

初始化:

for(int i=1;i<=n;i++)
a[i]=i;

每个节点的上级是自己。

 

关键模板:

int find(int x)
{
if(a[x]!=x) a[x]=find(a[x]);
return a[x];
}

我的理解:其中a[x]为x的上位节点,如果x的上位节点与x不相同,就继续顺着向上判断以上节点是否与x相同,当找到与x相同的节点时return a[x],意为将x并入其最上位节点,并且同时将x与其所在集合直接相连,方便再次查找(O(1))。

合并两个元素:

a[find(x)]=find(y);

意为令x的最上位节点连在y的最上位节点下面,即让x所在的集合成为y所在的集合的子集,从而实现x与y的合并。

如果两个元素在同一集合:

find(x)==find(y)

即判断两个元素的最上位节点是否相同。

-----------------------------------------------------------------------

我认为并查集顾名思义就是对多个元素、多个集合的合并以及对其中元素,子集的查寻。

其中最大的区别是由于每个元素经处理后都与根节点直接相连,所以查找某一元素所在集合或判断某两个元素是否在同一集合时所需时间大大减少,几乎都是O(1)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值