并查集

动态维护若干个不相重的集合,支持合并与查询的数据结构
两个操作:
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感觉好像一下说偏了......

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

posted @ 2018-10-11 15:41  aha浮云  阅读(194)  评论(0编辑  收藏  举报