主要内容是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类节点中
标签:查集,访问,回溯,向上,节点,LCA 来源: https://www.cnblogs.com/22222222STL/p/16156673.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。