function<void(int, int, int)> dfs;
dfs = [&](int u, int fa, int depth)
{
dep[u] = depth;
lca[u][0] = fa;
for (int i = 1; i < MAX_POW; i++)
{
lca[u][i] = lca[lca[u][i - 1]][i - 1];
}
for (auto v : edg[u])
{
//cout << "2222222\n";
if (v == fa)
continue;
dfs(v, u, depth + 1);
}
};
dep[0] = -1;
auto LCA = [&](int u, int v)
{
int i, len = 0;
//cout << "the dep is " << dep[u] << " " << dep[v] << endl;
if (dep[u] > dep[v])
swap(u, v);
for (i = MAX_POW - 1; i >= 0; i--)
{
if (dep[lca[v][i]] >= dep[u])
{
v = lca[v][i];
//cout << "v is " << v << endl;
len += (1 << i);
}
}
if (u == v)
return len;
for (int i = MAX_POW - 1; i >= 0; i--)
{
if (lca[u][i] != lca[v][i])
{
u = lca[u][i];
v = lca[v][i];
len += (1 << (i + 1));
}
}
return len + 2;
};
LCA
最新推荐文章于 2023-01-18 21:34:49 发布