并查集

动态维护若干个不相重的集合,支持合并与查询的数据结构
两个操作:
1、Get:查询元素属于哪一个集合
2、Merge:把两个集合合并成一个大集合

实现:通过代表-集合选择一个固定的元素作为代表

用f[x]保存代表

若直接合并需大量修改f[x]的值 所以并查集是树形结构 树上的节点都是元素 树根是集合的代表元素 那么整个并查集是一个森林 还是用f[x]维护 f[x]保存父节点

所以就有了
1、 路径压缩
每次执行Get 操作 把访问过的节点指向树根

2、 按秩合并(启发式合并)
将size小的往大的合并

同时采用的话 复杂度为O(α(n))
nlogn 已经够了 所以会一种就可以了

无向图中维护节点之间的连通性

并查集擅长维护许多具有传递关系

并查集还可以维护数组中“位置”的占用情况

***
扩展域 与 边带权
并查集就是森林
那么我们可以在树中每条边记录一个权值, 维护数组d, d[x]表示x到父亲的边权
路径压缩时直接更新 以后可以利用路径压缩来统计每个节点到树根的信息

*银河英雄传说 -> 让树上每条边权值都为1
用d数组记录x到父亲的权值(边带权)

* 值得注意一下
我认为并查集并不只是合并判环这么简单
只要有传递性的都可以用并查集维护得到你想的东西......qwq感觉好像一下说偏了......

*扩展 和 边带权的情况是指这种传递关系不只有一种,这些传递关系可以互相导出。

转载于:https://www.cnblogs.com/lanyangs/p/9772808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值