前置知识
蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C++)-优快云博客
可撤销并查集
关键注意
- 可撤销并查集的撤销功能如何实现
- 可撤销并查集能不能用路径压缩
可撤销并查集(Reversible Union-Find)是一种扩展了标准并查集(Union-Find)数据结构的数据结构,它允许在进行连接(union)和查询(Find)操作的同时,能够回退(Undo)或者撤销之前的操作。这种数据结构通常用于支持一些需要回滚操作的应用,比如在离线算法中或者需要进行回退的决策问题中。当然主要是应用于在线算法,因为离线算法反悔可以完全输入后在一起处理。
举例
在蓝桥王国中有n个城市,王国经常会发生地震,会导致道路塌方,好在王国科技水平比较高也就只有刚修建好的道路会塌方,王国的人们出行前会询问两个地点是否连通。所以,你需要维护一棵动态森林,初始时包含n个散点,每个点代表一个独立的集合。然后,有m个操作,支持以下三种操作:连接操作(类型1):执行操作“1 u v”,将点u和点v连接起来,形成一个道路。这表示两个点之间有一条路。
查询操作(类型2):执行操作“2 u v”,用来査询点u和点v之间是否连通。如果它们在联通,输出"Yes",否则输出“NO"
撤销操作(类型3):执行操作"3",用于撤销上一个操作。这个操作需要保证存在被撤销的操作,即必须有之前的连接操作被撤销。
分析
我们采用并查集来表示联通,类似于最小生成树Kruskal算法,这样我们很容易就能完成op1和op2这两个操作。
但是第三个操作,如何去处理呢,怎么撤回呢,我们先不考虑路径压缩和启发式合并的情况下。并查集的合并为:
Fa[Find(i)]=j,我们只需要用变量记录t=Find(i)和m=Fa[Find(i)]即可。当反悔的时候我们直接Fa[t]=m即可。

但是既没有做路径压缩,又没有做启发式合并,那么查询效率是非常低的,所以我们很难通过一些复杂的题目。
所以我们还是需要去再去考虑优化办法。
路径压缩
我们考虑可不可以使用路径压缩来优化并查集。核心在于能够

本文介绍了可撤销并查集的数据结构,重点讨论了其撤销功能的实现,路径压缩的适用性,以及为何选择启发式合并而非路径压缩。通过蓝桥杯问题实例,展示了如何维护动态森林并支持连接、查询和撤销操作。
最低0.47元/天 解锁文章
754





