LCA 1
主要内容是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类节点中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具