倍增LCA

int lca(int u, int v) {
    if(dep[u] > dep[v]) swap(u, v);
    for(int i = 20; i >= 0; i--) {
        if(dep[fa[v][i]] >= dep[u]) {
            v = fa[v][i];
        }
    }
    if(u == v) return u;
    for(int i = 20; i >= 0; i--) {
        if(fa[u][i] == fa[v][i]) continue;
        u = fa[u][i];
        v = fa[v][i];
    }
    return fa[u][0];
}

 

posted @ 2020-08-24 14:16  Ruby·Z  阅读(44)  评论(0)    收藏  举报