LCA 2


主要内容是LCA的板子

1.倍增LCA

原理:尝试法,二进制划分和倍增

打法:

1.首先预处理每个节点在整棵树中的深度和关键信息

2.对于节点x,预处理每个2的j次方所能到达的点,这里递归变递推

3.询问lca的时候,首先调整节点的深度,较深的节点走到与较浅节点同深度位置

4.如果y走到x的位置,那么返回x即可,否则尝试同时向上走2的j次方步数

4.1.如果在尝试过程中相遇了,那必定是公共祖先,但可能不是LCA所以不走

4.2 如果没有相遇那就直接向上走即可

5.走完这些步以后必然还差一步相会,所以返回x父节点即可

2.离线LCA

感谢Tarjan

基本原理:使用并查集实现对暴力的优化

实现原理:

在DFS执行的任一阶段,可将节点分为3类:

1.访问完毕,向上回溯的2类节点

2.正在访问该节点未向上回溯的1类节点

3.未访问的0类节点

对于1类节点来说,以它为根的子树上的任意不同的2类节点,其根节点就是这个1类节点

使用并查集优化,当某个节点完成访问成为2类节点时,接下来回去的是父节点,但是父节点在回溯时是1类节点,因此可以将2类节点合并到1类节点中

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/245395.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论