首页 > 其他分享 >P3379 【模板】最近公共祖先(LCA)

P3379 【模板】最近公共祖先(LCA)

时间:2023-11-28 19:23:17浏览次数:39  
标签:int LCA back fa depth P3379 节点 模板

原题链接

非常详细的题解见洛谷,个人见解见代码

#include<bits/stdc++.h>
using namespace std;
#define N 500005

vector<int> G[N];//链树,以链上的元素为根节点的树
void add(int x,int y)
{
    G[x].push_back(y);
    G[y].push_back(x);
}

int fa[N][21]={0};
int depth[N]={0};
int n,m,s;

void proc()//预处理
{
    for(int k=1;k<=18;k++)//直接以最大常数算,反正也快不了多少
        for(int i=1;i<=n;i++)
            fa[i][k]=fa[fa[i][k-1]][k-1];//如果超过了,父节点就为零,即代表没有父节点
}

void build(int now,int fath)
{
    fa[now][0]=fath;
    for(int i=0;i<G[now].size();i++)
    {
        int next=G[now][i];
        if(next!=fath)//边不通来路
        {
            depth[next]=depth[now]+1;
            build(next,now);
        }
    }
}

int lca(int x,int y)
{
    if(depth[x]<depth[y])swap(x,y);

    for(int i=18;i>=0;i--)
        if(depth[fa[x][i]]>=depth[y])//最终得到的一定是相等的
            x=fa[x][i];//如果depth为零,代表该节点不存在

    //printf("%d,%d\n",x,y);
    if(x==y)return x;//如果不加这个就会返回他们的父节点,就不是最近祖先了
    //任意两个节点的父节点至少是s,所以fa[s]可以不用管
    for(int i=18;i>=0;i--)
        if(fa[x][i]!=fa[y][i])
        {
            x=fa[x][i];
            y=fa[y][i];
        }//上浮到离lca最近的点

    return fa[x][0];
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);

    for(int i=1;i<=n-1;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
    }

    depth[s]=1;//要与不存在的节点分开来
    build(s,0);
    proc();

    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}

标签:int,LCA,back,fa,depth,P3379,节点,模板
From: https://www.cnblogs.com/pure4knowledge/p/17862745.html

相关文章

  • 实验4 现代C++标准库与类模板
    实验任务5:1.代码:textcoder.hpp:1#pragmaonce23#include<iostream>4#include<vector>5#include<array>6#include<string>7usingnamespacestd;89classTextCoder10{11private:12stringtext;13......
  • 模板的导入和继承
    1模板的导入 -第一步:新建一个xx.html,把好看的模板写入<divclass="panelpanel-danger"><divclass="panel-heading"><h3class="panel-title">重金求子</h3></div><......
  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......
  • 实验4 现代C++标准库与类模板
    实验任务5TextCoder.hpp#pragmaonce#include<iostream>#include<string>usingnamespacestd;classTextCoder{public:TextCoder(stringtext0):text{text0}{};stringget_ciphertext();stringget_deciphertext();private:s......
  • IT 运维服务规范(模板)
    一、总则本部分规定了IT运维服务支撑系统的应用需求,包括IT运维服务模型与模式、IT运维服务管理体系、以及IT运维服务和管理能力评估与提升途径。二、参考标准下列文件中的条款通过本部分的引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内......
  • 实验4 现代C++标准库与类模板
    实验任务5#pragmaonce#include<iostream>#include<string>usingnamespacestd;classTextCoder{public:TextCoder()=default;TextCoder(stringstr);stringget_ciphertext();stringget_deciphertext();~TextCoder()=de......
  • PIP换源_Pycharm快捷键_自定义文件头模板
    【一】PIP更换国内源永久换源打开控制台或终端,并输入以下命令:pipconfigsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/更改pip源后,可以通过以下命令验证:pipconfiggetglobal.index-url如果返回值为https://mirrors.aliyun.com/pypi/simple/,则表......
  • 实验4 现代C++标准库与类模板
    实验任务5TextCoder.hpp源码1#include<iostream>2#include<string>34usingstd::string;56classTextCoder{7private:8stringtext;9voidencoder();10voiddecoder();11public:12TextCod......
  • #P1042. 静态RMQ[ST表模板]
    题意是:给定一个长度为N的数列,和M次询问,求出每一次询问的区间内数字的最大值。ST表的基本功能是对区间进行查询,其核心使用的是倍增的思想f[i][k]:意思是从第i个数开始往后2^k个数f[i][k]=max(f[i][k-1],f[i+2^k-1][k-1])求【l,r】区间max(f[i][k],f[r-2^k+1][k])#define......
  • Flask 使用Jinja2模板引擎
    Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本文中,我们将深入探讨Jinja2的特性、语法以及如何在Flask应用中使用......