LCA模板

来源:互联网 发布:手机阅读软件排行 编辑:程序博客网 时间:2024/06/16 01:57
#include<bits/stdc++.h>using namespace std;vector<int>g[M];//图的邻接表表示int root;int parent[20][M];int dep[M];int n, q;void dfs(int v, int p, int d){    parent[0][v] = p;    dep[v] = d;    for(int i=0; i<g[v].size(); ++i)    {        if(g[v][i]!=p) dfs(g[v][i], v, d+1);    }}void init(){    for(int k = 0; k < 20-1; ++ k)    {        for(int v = 1; v <= n; ++ v)        {            if(parent[k][v] < 0) parent[k+1][v] = -1;            else            {                parent[k+1][v] = parent[k][parent[k][v]];            }        }    }}int getlca(int u, int v){    if(dep[u] > dep[v]) swap(u, v);    int ans = 0;    for(int k = 0; k < 20; ++ k)    {        if((dep[v] - dep[u]) >> k & 1)        {            v = parent[k][v];        }    }    if(u != v)    {        for(int k = 20 - 1; k >= 0; -- k)        {            if(parent[k][u] != parent[k][v])            {                u = parent[k][u], v = parent[k][v];            }        }        u = parent[0][u];        return u;    }    return u;}int main(){    dfs(1, -1, 1);    init();    return 0;}
原创粉丝点击