LCA(Lowest Common Ancestor): 树中两个节点深度最大的公共祖先.
思想: 类似ST表,打倍增。预处理出每个节点的深度后,不是一个个跳,而是跳着跳。一次跳2的k次方. 核心: f[i][j]表示i向上跳2^j的父节点。 f[i][j] = f[f[i][j-1]][j-1] 时间复杂度: 预处理O(nlogn),单次查询O(logn)
fa[i][j]:节点i向上跳2^j的父节点 lg[i]:log(i)+1 dep[i]:深度
写法: 1.dfs预处理深度和fa数组,预处理lg数组,lg[x]表示log(x)+1 2.求LCA(x,y) [1] 不妨假设x的深度 >= y的深度,不是则交换 [2] 让x向上跳,跳到和y同一深度。用到二进制拆位的思想,从最大的能跳的k开始枚举。 [3] x、y一起跳,若fa[x][k] == fa[y][k],是公共祖先,但是不一定是LCA。所以我们为了避免误判,跳到LCA下边一层,避免误判。
例题
模板:
#include
using namespace std;
const int N = 5e5+10;
int n,m,k,T;
int e[N
关注
打赏