【模板】lca

我是研究僧i 提交于 2019-11-30 00:58:18
int lca(int u, int v){

    if(dep[u] < dep[v]) swap(u, v);
    for(int i = 20; i >= 0; --i){

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

        if(fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
    }
    return fa[u][0];
}

dep用dfs处理,dfs中顺便处理f数组

fa[u][0] = f, dep[u] = dep[f] + 1;
for(int i = 1; i <= 20; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!