LCA模板

#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;
}
發佈了54 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章