警示后人
查看原帖
警示后人
1119066
MarsCheng楼主2024/11/29 16:06

倍增求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 里面。否则会有更新顺序的问题。

应该只有我会错这种地方,对吧

2024/11/29 16:06
加载中...