树上倍增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;
}

 

posted @ 2016-08-18 09:36  可能是轩轩叭  阅读(511)  评论(0编辑  收藏  举报