最近公共祖先 LCA (Lowest Common Ancestor)

【题目描述】
在有根树中,两个节点 u 和 v 的公共祖先中距离最近的被称为最近公共祖先LCA。
给出一棵有根树,有 M 对查询,求每一对 u 和 v 的LCA。
【输入格式】
第一行,N,表示这棵树有 N 个节点。
第二行~第 N 行,x 和 y,表示 x 是 y 的祖先。
第 N+1 行,M。
第 N+2 行~第 N+M+1行,u 和 v。
【输出格式】
对于每组 u 和 v,输出它们的LCA。
每组对应的输出单独占一行。

一、朴素算法

先让 u 和 v 中深度较深的上升到与较浅的持平,在一起一步步向上走,走到同一个节点为止。
所以该算法每次查询的时间复杂度是 O(n)。

二、二分搜索

对于任意顶点 v,若 parent[0][v] 为它的父亲节点,则 parent[1][v]=parent[0][parent[0][v]] 就是 v 向上走两步到的顶点,继续推,可得 parent[2][v]=parent[1][parent[1][v]] 即为 v 向上走四步到的顶点,以此类推,就能得到其向上走2^k步所到的顶点parent[k][v]。由此就能二分搜索了。
预处理 parent[k][v] 的时间复杂度为 O(NlogN),每次查询的复杂度是O(logN)。

三、RMQ

(略,有时间再补)

你可能感兴趣的:(二分搜索,LCA)