最近公共祖先(lca)倍增算法【模板】

P3379 【模板】最近公共祖先(LCA) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

复制代码
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N=5e5+100;
const int inf=0x3f3f3f;
int n,m,s;
vector<int>g[N];
int dep[N];//存u点的深度
int fa[N][20];//存从u点向上跳2^i层的祖先节点
void dfs(int u,int father)
{
    dep[u]=dep[father]+1;//该点深度为他的父节点深度加1
    fa[u][0]=father;//当前节点向上跳一步就是他的父节点
    for(int i=1;i<=19;i++)
        fa[u][i]=fa[fa[u][i-1]][i-1];//递推点的所有能跳到的祖先节点,越界为0
    for(auto i:g[u])
        if(i!=father)
            dfs(i,u);
}
int lca(int u,int v)
{
    if(dep[u]<dep[v])//让u点跳
        swap(u,v);
    /*for(int i=19;i>=0;i--)//先让两点到达同一层
    {
        if(dep[fa[u][i]]>=dep[v])//u节点跳到祖先节点后的深度大于v点的深度
            u=fa[u][i];//u点变到其祖先节点处
    }*/
    int dx=dep[u]-dep[v];
    for(int i=0;dx>0;i++,dx=dx/2)
    {
        if(dx&1)
        {
            u=fa[u][i];
        }
    }
    //两种写法,让两点到达同一层
    
    if(u==v)//特判,v点为u的祖先节点
        return v;
    for(int i=19;i>=0;i--)
    {
        if(fa[u][i]!=fa[v][i])//两点跳后的祖先节点的父节点是否相等,不相等i-1
            u=fa[u][i],v=fa[v][i];
        //停在最近公共祖先的下层的儿子节点(此时两点的父节点就是公共最近祖先)
    }
    return fa[u][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);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(s,0);//从根节点遍历树
    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",lca(a,b));
    }
    return 0;
}
相关推荐
历程里程碑2 分钟前
二叉树---二叉树的最大深度
大数据·数据结构·算法·elasticsearch·搜索引擎·全文检索·深度优先
自我意识的多元宇宙3 分钟前
树与二叉树--树的基本概念
数据结构·算法
吃着火锅x唱着歌4 分钟前
LeetCode 678.有效的括号字符串
算法·leetcode·职场和发展
音视频牛哥1 小时前
鸿蒙 NEXT RTSP/RTMP 播放器如何回调 RGB 数据并实现 AI 视觉算法分析
人工智能·算法·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
飞Link1 小时前
掌控 Agent 的时空法则:LangGraph Checkpoint (检查点) 机制深度实战
开发语言·python·算法
乐迪信息1 小时前
智慧港口中AI防爆摄像机的船舶越线识别功能
大数据·人工智能·物联网·算法·目标跟踪
F_D_Z1 小时前
扩散模型快速采样:从渐进蒸馏到并行推理
人工智能·算法·加速采样
睡一觉就好了。2 小时前
哈希表(一)
算法·散列表
輕華2 小时前
Word2Vec与CBOW算法实战:从词向量到上下文感知
人工智能·算法·word2vec
Matlab程序猿小助手2 小时前
【MATLAB源码-第315期】基于matlab的䲟鱼优化算法(ROA)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab