树上倍增LCA模版
void dfs(int u){ for(int i = head[u];i!=-1;i = edge.next){ int to = dege[i].to; if(to == p[u][0]) continue; d[to] = d[u]+1; dis[to] = dis[u]+edge[i].w; p[to][0] = u; dfs((to)); } } void init(){ for(int j = 1;(1<<j)<=n;j++) for(int i = 1;(1<<i)<=n;i++){ p[i][j] = p[p[i][j-1]][j-1]; } } int lca(int a,int b){ if(d[a]>d[b]) swap(a,b);//b在下面; int f = d[b]-d[a];//f是高度差; for(int i = 0;(1<<i)<=f;i++) if(((1<<i))&f) b = p[b][i]; if(a!=b){ for(int i = (int lomg2(n));i>=0;i--) if(p[a][i]!= p[b][i])//从最大的祖先开始,判断a,b的祖先是否相同 a = p[a][i],b = p[b][i];//如果不相同,a和b同时向上移动2^j a = p[a][0]; } return a; }