1#include"../../../kyopro_library/template.hpp"
6 LCA(
const vector<vector<
int>>& g,
int root=0) {
9 par=vector<vector<
int>>(k,vector<
int>(n,-1)),dep=vector<
int>(n);
11 for(
int i=0; i<k-1; i++)
for(
int j=0; j<n; j++) par[i+1][j]=(par[i][j]==-1?-1:par[i][par[i][j]]);
14 int lca(
int u,
int v) {
15 if(dep[u]<dep[v]) swap(u,v);
17 for(
int i=0; i<k; i++)
if((dep[u]-dep[v])>>i&1) u=par[i][u];
19 for(
int i=k-1; i>=0; i--)
if(par[i][u]!=par[i][v]) u=par[i][u], v=par[i][v];
23 int distance(
int u,
int v) {
return dep[u]+dep[v]-2*dep[lca(u,v)]; }
29 for(
int i=k-1; i>=0; i--)
if(d>>i&1) u=par[i][u];
37 void dfs(
const vector<vector<
int>>& g,
int now,
int pre) {
38 par[0][now]=pre; dep[now]=(pre==-1 ? 0 : dep[pre]+1);
39 for(
int nxt: g[now])
if(nxt!=pre) dfs(g,nxt,now);
LCA verify: https://onlinejudge.u-aizu.ac.jp/status/users/Today03/submissions/1/GRL_5_C/judge/1057284...
int distance(int u, int v)
vector< vector< int > > par
bool is_on_path(int u, int v, int x)
LCA(const vector< vector< int > > &g, int root=0)