1.倍增
找两个点的LCA,先让它们深度相同,然后倍增向上跳跃,跳到使他们的值不相同的最浅层的点,那么此点的上方即是LCA。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#define in(x) scanf("%d",&x);
using namespace std;
int n,m,rt,d[500007],fa[500007][22];
int heade[1000007],nexte[1000007],cnt=0,to[1000007];
void build_tree(int x,int father)
{
int k=log(d[x])/log(2);
for(int j=1;j<=19;++j)
fa[x][j]=fa[fa[x][j-1]][j-1];
for(int i=heade[x];i;i=nexte[i])
{
int u=to[i];
if(u!=father)
{
d[u]=d[x]+1;
fa[u][0]=x;
build_tree(u,x);
}
}