zoukankan      html  css  js  c++  java
  • 倍增法lca

    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;
    }
     
     
  • 相关阅读:
    ThinkPHP
    ThinkPHP
    静态化
    静态化
    静态化
    设计模式
    sublime
    静态化
    OPTIMIZE TABLE 小解
    information_schema系列八(事物,锁)
  • 原文地址:https://www.cnblogs.com/tun117/p/5304650.html
Copyright © 2011-2022 走看看