const int maxh=30;
vector<int> g[N];
int dep[N],anc[N][maxh],s[N];
void dfs(int now){//预处理深度dep和倍增数组anc
if(now==1){ //1为根节点
dep[now]=1;
for(int i=0;i<maxh;i++)
anc[now][i]=now;
}
else{
for(int i=1;i<maxh;i++){
int y=anc[now][i-1];
anc[now][i]=anc[y][i-1];
}
}
for(int it:g[now]){
if(it!=anc[now][0]){
dep[it]=dep[now]+1;
anc[it][0]=now;
dfs(it);
}
}
}
void swim(int &x,int h){
for(int i=0;h>0;i++){
if(h&1) x=anc[x][i];
h/=2;
}
}
int lca(int x,int y){
int i;
if(dep[x]>dep[y]) swap(x,y);
swim(y,dep[y]-dep[x]);
if(x==y) return x;
for(;;){
for(i=0;anc[x][i]!=anc[y][i];i++);
if(i==0) return anc[x][0];
x=anc[x][i-1];
y=anc[y][i-1];
}
}
模板-倍增法求LCA(邻接表)
最新推荐文章于 2022-10-25 15:21:16 发布