主要内容是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