首页 > 编程语言 >最近公共祖先(lca)倍增算法【模板】

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

时间:2024-03-28 13:31:32浏览次数:28  
标签:dep int father fa 祖先 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点变到其祖先节点处
    }
    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;
}

标签:dep,int,father,fa,祖先,lca,倍增,节点,模板
From: https://blog.csdn.net/2302_77047789/article/details/137108120

相关文章

  • Floyd算法 【多源最短路】模板
    B3647【模板】Floyd-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;constintN=1e2+10;constintinf=0x3f3f3f;intn,m;intg[N][N];voidfloyd(){for(intk=1;k<=n;k++){for(inti=1;i<=n;i++)......
  • 泛型编程之模板
    1.函数模板重要行:template<typenameT,typenameT1>关键值class和typename含义相同,那么我们以后就使用typename即可。 一般情况下的格式:template<模板参数列表>返回值类型函数名(函数参数) 模板参数列表的理解:函数参数列表在运行时调用者用实参来初始化形参而......
  • 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设
    消息sms邮箱/手机号/push发送的方案&定时任务xxlJob灵活度&泛型和发送的模板类设计1.消息sms邮箱/手机号/push发送的方案1.判断收件人地址是否为空,不为空则发送邮件。为空则不发送。可以通过该方法终止一些消息的发送。2.收件人的地址可以配置在Apollo中,直接删除该key......
  • Kruskal最小生成树【详细解释+动图图解】&【sort中的cmp函数】& 【例题:洛谷P3366 【模
    文章目录Kruskal算法简介Kruskal算法前置知识sort中的cmp函数算法思考样例详细示范与解释kruskal模版code↓例题:洛谷P3366【模板】最小生成树code↓完结撒花QWQKruskal算法简介Kr......
  • 代码模板
    manacharvoidinit(){ cnt=1; ss[0]='!'; ss[cnt]='#'; len=strlen(s); for(inti=0;i<len;i++) { ss[++cnt]=s[i]; ss[++cnt]='#'; }}intmanachar(){ d[1]=1; for(inti=2,l,r=1;i<=cnt;i++) { if(i<r)d[i]=m......
  • react零基础到精通-1|基础概念,主要特性,s6语法,react相关的开发环境和工具,react简介,箭头
    致力于解决复杂视图层开发我呢提,全新的ui组件的开发理念,1.1React简介前端UI的本质问题是如何将来源于服务器端的动态数据和用户的交互行为高效地反映到复杂的用户界面上。React另辟蹊径,通过引入虚拟DOM、状态、单向数据流等设计理念,形成以组件为核心,用组件搭建UI的开发......
  • 洛谷 P8306 【模板】字典树
    写模板:1确定树的节点指针数量2确定起始字符3实现插入方法4根据题目编写求解方法,或者添加计数元素到节点中structNode{array<int,100>next{};intcnt=0;};classTrie{public:Trie(charstart):start_(start),root_(0){trie_.resize(1)......
  • [普及+] 模板口胡
    差分约束系统省流:给出\(n\)个数,\(m\)个不等式,每个形如\(x_a-x_b\lew\),求通解。转化一下,\(x_a\lex_b+w\)这不就是图论点转移吗,连一条\(x_b\tox_a\)权值为\(w\)的边,最后要求通解即求当前点集权值满足所有边。不妨这样想,确定一个点,再更新其它点。这不就是最短路吗......
  • 算法模板收集 (截至2024.3.26)
    准备线下比赛用的模板,会一直更新,但更新频率不高。找个代码托管平台放一下或许更合适,不过暂时没心思做这个。小提示:点击任意标题旁边的“显示目录导航”,再点击右上角的图钉可以固定目录。约定:所有区间操作都是在闭区间上进行的。编译器要支持gnu++11标准基本框......
  • VUE3.0(一):模板语法及指令介绍
    模板语法Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。Vue的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进DOM的系统。结合响应系统,在应用状态改变时,Vue能够智能地计算出重新渲染组件的最小代价并应用到DOM......