模板 最近公共祖先(LCA)
void dfs(int u, int v) {//求出每个结点的深度1
dep[u] = dep[p] + 1;
fa[u][0] = p;
for(int i = 1; (1 << i) <= dep[u]; i++) {
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for(int v : adj[u]) {
if(v == p) continue;
dfs(v, u);
}
}
int lca(int u, int v) {//求出lca
if(dep[u] < dep[v]) swap(u, v);
for(int i = 19; i >= 0; i--) {//i的初始值由节点数确定
if(dep[u] - (1 << i) >= dep[v]) {
u = fa[u][i];
}
}
if(u == v) return u;
for(int i = 19; i >= 0; i--) {
if(fa[u][i] != fa[v][i]) {
u = fa[u][i];
v = fa[v][i];
}
}
return fa[u][0];
}