dfs序+RMQ求LCA详解
首先安利自己 倍增求LCA的博客 ,前置 (算不上) 知识在此。 LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca( 什么时候会了树链剖分再说。 ),还有,标题。 是的你也来和我一起学习这个了qwq。 开始吧。 众所周知,每当你dfs时,你都能产生一棵dfs树,可以根据你的dfs序来构建。 such as( 丑陋的画风 ): 一个dfs的顺序。 以这个为例: 那么我们写出他的遍历顺序: 假如我们要求3,8(wtf?)的LCA, 那么我们首先写出他的bfs序: 123432565217871。 然后留意一下我们要求的两个数的位置。 12 3 4 3 2565217 8 71。 我们发现这样一个事情 : 两个数的LCA,一定在前一个数最后一次出现的位置(在bfs序中)。 感性 证明 : 对于前一个数最后一次出现的位置,他的意义就是 当前节点的子树已经遍历完了,并且正在进行回溯 !( 拍桌,划重点! )。 也就是说,他要回溯到他的祖先了,而它的祖先同样也是后一个节点的祖先,一定在后一个节点遍历前,前一个节点回溯后。 前一个节点<lca<后一个节点。 证毕。 那么,我们只要找到dfs遍历顺序中的 “前一个数最后一次出现的位置,后一个数第一次出现的位置”,这个区间取出区间最小值,即是两个节点的lca。 或许有人会说:为什么最小值一定是lca呢? 又需要证明了。