#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;
}
LCA模板
最新推荐文章于 2024-02-29 12:44:11 发布