首页 > 其他 > 详细

倍增法lca

时间:2016-03-22 08:57:47      阅读:103      评论:0      收藏:0      [点我收藏+]
int dep[N],rt[25][N],siz[N];//rt数组需要在dfs之前置-1。

void dfs(int pos,int deep){
    dep[pos]=deep;
    siz[pos]=1;
    for(edge *it=adj[pos];it;it=it->next){
        if(!dep[it->id]){
            rt[0][it->id]=pos;
            dfs(it->id,deep+1);
            siz[pos]+=siz[it->id];
        }
    }
}

void prelca(){
    for(int i=1;i<=20;i++){
        for(int j=1;j<=n;j++){
            rt[i][j]=rt[i-1][j]==-1?-1:rt[i-1][rt[i-1][j]];
        }
    }
}

int LCA(int u,int v){//查询u和v的lca
    if(dep[u]<dep[v])swap(u,v);
    for(int i=0;i<21;i++){
        if((dep[u]-dep[v])>>i&1){
            u=rt[i][u];
        }
    }
    if(u==v)return u;
    for(int i=19;i>=0;i--){
        if(rt[i][u]!=rt[i][v]){
            u=rt[i][u];
            v=rt[i][v];
        }
    }
    return rt[0][u];
}

int jump(int pos,int num){//查询节点pos的第num个父亲
    for(int i=0;i<21;i++){
        if(num>>i&1){
            pos=rt[i][pos];
        }
    }
    return pos;
}

 

 
 

倍增法lca

原文:http://www.cnblogs.com/tun117/p/5304650.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!