zoukankan      html  css  js  c++  java
  • 求lca

    lca模板

    也就是求树上两点的最近公共祖先。

    我们采用树上倍增。

    将两点跳至同一高度。

    一起向上跳。

    bfs(或dfs)预处理节点深度及节点的2的几次方的父亲。

    代码:

    #include <cstdio>
    #include <queue>
    #include <cmath>
    
    using namespace std;
    
    typedef long long int ll;
    const int maxn=100005;
    int n,m,s,tot,head[maxn],d[maxn],f[maxn][35],w;
    struct node{
        int to,nxt;
    }t[maxn];
    inline void add(const int x,const int y){
        t[++tot].to=y;t[tot].nxt=head[x];
        head[x]=tot;
    }
    queue<int>q;
    inline void bfs(const int s){
        q.push(s);
        d[s]=1;
        while(q.size()){
            int x=q.front();q.pop();
            for(int i=head[x];i;i=t[i].nxt){
                int y=t[i].to;
                if(d[y])continue;
                d[y]=d[x]+1;
                f[y][0]=x;
                for(int j=1;j<=w;j++){
                    f[y][j]=f[f[y][j-1]][j-1];
                }
                q.push(y);
            }
        }
    }
    inline int lca(int x,int y){
        if(d[y]>d[x])swap(x,y);
        for(int i=w;i>=0;i--){
            if(d[f[x][i]]>=d[y]){
                x=f[x][i];
            }
        }
        if(x==y)return x;
        for(int i=w;i>=0;i--){
            if(f[x][i]!=f[y][i]){
                x=f[x][i];
                y=f[y][i];
            }
        }
        return f[x][0];
    }
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);
            add(y,x);
        }
        w=(int)(log(n)/log(2))+1;
        bfs(s);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d
    ",lca(x,y));
        }
        return 0;
    }
  • 相关阅读:
    第一章 操作系统引论
    程序流程结构
    IE网页cab插件无法安装
    Java面试题整理(题目内容非原创)
    linux下安装字体
    博客园使用Silence主题装饰
    编码问题总结
    JUnit 4.10 新功能简介——RuleChain 和TemporaryFolder的应用
    Usage and Idioms——Rules
    Usage and Idioms——Theories
  • 原文地址:https://www.cnblogs.com/weijianzhen/p/13542440.html
Copyright © 2011-2022 走看看