[模板]LCA:倍增

 1 void dfs(int p){
 2     for(int i=1;i<=12;++i)f[p][i]=f[f[p][i-1]][i-1];
 3     for(int i=fir[p];i;i=l[i])if(to[i]!=f[p][0])f[to[i]][0]=p,dep[to[i]]=dep[p]+1,dfs(to[i]);
 4 }
 5 int lca(int a,int b){
 6     if(dep[a]<dep[b])res=a,a=b,b=res;
 7     for(int dt=dep[a]-dep[b];dt;dt-=dt&-dt)a=f[a][lwb[dt&-dt]];
 8     if(a==b)return a;
 9     for(int i=12;i>=0;--i)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
10     return f[a][0];
11 }
View Code

 

posted @ 2019-07-07 06:23  DeepinC  阅读(78)  评论(0编辑  收藏  举报