倍增求lca的,一定要这么写
int fa[N][20], dep[N];
void dfs(int u, int f = 0) {
fa[u][0] = f, dep[u] = dep[f] + 1;
for (int i = 1; i <= 19; i++)
fa[u][i] = fa[fa[u][i - 1]][i - 1];
for (int i = head[u]; ~i; i = nxt[i])
if (to[i] != f)
dfs(to[i], u);
}
不要像这样
dfs(1);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= 19; j++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
即要把倍增的过程放 dfs 里面。否则会有更新顺序的问题。
应该只有我会错这种地方,对吧