Featured image of post [模板]LCA

[模板]LCA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void dfs(int x, int d) {
    dep[x] = d;
    for (int i = 0; i < g[x].size(); i++) {
        if (g[x][i] != fa[x][0]) {
            fa[g[x][i]][0] = x;
            dfs(g[x][i], d + 1);
        }
    }
}

void lca_init() {
    for (int j = 1; j <= 20; j++)
        for (int i = 1; i <= n; i++)
            if (fa[i][j - 1] && fa[fa[i][j - 1]][j - 1])
                fa[i][j] = fa[fa[i][j - 1]][j - 1];
}

int lca(int x, int y) {
    if (dep[x] < dep[y]) swap(x, y);
    for (int i = 20; i >= 0; i--)
        if (fa[x][i] && dep[fa[x][i]] >= dep[y]) x = fa[x][i];
    if (x == y) return x;
    for (int i = 20; i >= 0; i--)
        if (fa[x][i] && fa[y][i] && fa[x][i] != fa[y][i])
            x = fa[x][i], y = fa[y][i];
    return fa[x][0];
}
本站已安全运行
总访问量 次 | 访客 人 | 共 27 篇文章
Built with Hugo
主题 StackJimmy 设计