lca:
在树上的两节点都向上走最先找到的公共祖先。
倍增:
fa[x][i]表示x节点的第2^i个祖先(fa[x][0]就表示父节点),deep[x]表示节点的深度。
大致思路:
1.dfs建树,同时确定每个节点的父节点,更新deep数组,x节点的deep值为其父节点的deep值+1。
2.由fa数组定义可得,fa[x][j]=fa[fa[x][j-1]][j-1],即第2^(j-1)个祖先的第2^(j-1)个祖先,因为2^(j-1)+2^(j-1)=2^j。所以我们用此性质准备好fa数组以及deep数组(prepare函数)。
3.lca函数,对于查询的两个点x,y。如果x==y直接返回x。继续,令x为deep值大的点。说不清具体看代码解释。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;