首页 > 其他分享 >LCA

LCA

时间:2024-10-09 22:23:58浏览次数:8  
标签:int back dfs dep maxn vec LCA

\(\color{purple}{1.暴力}\)

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
const int maxn = 5e5 + 10;

vector <int> vec[maxn];

int f[maxn];
int dep[maxn];

void dfs(int now, int fa);
int gt(int a, int b);

int main()
{
    int n, m, s;
    cin >> n >> m >> s;
    
    for (int i = 1; i < n; ++i)
    {
        int x, y;
        cin >> x >> y;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }

    dfs(s, 0);

    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        cin >> x >> y;
        cout << gt(x, y) << '\n';
    }
    return 0;
}

void dfs(int now, int fa)
{
    dep[now] = dep[fa] + 1;
    f[now] = fa;

    for (auto i : vec[now])
    {
        if (i != fa)
            dfs(i, now);
    }
}

int gt(int a, int b)
{
    if (a == b)
    {
        return a;
    }

    if (dep[a] > dep[b])
    {
        swap(a, b);
    }

    while (dep[a] != dep[b])
    {
        b = f[b];
    }

    if (a == b)
        return a;

    while (f[a] != f[b])
    {
        a = f[a];
        b = f[b];
    }

    return f[a];
}

\(\color{purple}{2.倍增}\)

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
const int maxn = 5e5 + 10;

vector<int> vec[maxn];

int f[maxn][25];
int dep[maxn];

void dfs(int now, int fa);
int gt(int a, int b);

int main()
{
    int n, m, s;
    cin >> n >> m >> s;

    for (int i = 1; i < n; ++i)
    {
        int x, y;
        cin >> x >> y;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }

    dfs(s, 0);

    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        cin >> x >> y;
        cout << gt(x, y) << '\n';
    }
    return 0;
}

void dfs(int now, int fa)
{
    dep[now] = dep[fa] + 1;
    f[now][0] = fa;

    for (int i = 1; i <= 20; ++i)
    {
        f[now][i] = f[f[now][i - 1]][i - 1];
    }

    for (auto i : vec[now])
    {
        if (i != fa)
            dfs(i, now);
    }
}

int gt(int x, int y)
{
    if (dep[x] < dep[y])
        swap(x, y);
    for (int i = 20; i >= 0; --i)
    {
        if (dep[f[x][i]] >= dep[y])
            x = f[x][i];
        if (x == y)
            return x;
    }
    for (int i = 20; i >= 0; --i)
    {
        if (f[x][i] != f[y][i])
        {
            x = f[x][i];
            y = f[y][i];
        }
    }
    return f[x][0];
}

标签:int,back,dfs,dep,maxn,vec,LCA
From: https://www.cnblogs.com/xu-jh2024/p/18455304

相关文章

  • 倍增求 LCA
    1.树上倍增——倍增求LCA    LCA指的是最近的公共祖先,倍增法求解LCA的步骤如下。(1)预处理    a.求深度:对于每个节点dfs预处理处节点深度;    b.  求倍增祖先:计算出每个节点向父元素跳  步所到达的节点(在这里 大于整棵树的最大深度) ......
  • Volcano新版本发布:10大功能提升统一调度和细粒度资源管理能力
    本文分享自华为云社区《Volcanov1.10.0版本正式发布!10大功能全面提升统一调度和细粒度资源管理能力》,作者:云容器大未来 近日,Volcano社区v1.10.0版本[1]正式发布(Branch:release-1.10[2]),此次版本增加了以下新特性:新增队列优先级设置策略支持细粒度的GPU资源共享与回收支持Po......
  • DFS序求LCA
    DFS序求LCA介绍欧拉序求LCA的数组总是会忘记开两倍,并且预处理的常数较大。用DFS序求LCA可以解决这些问题。欧拉序:进节点和出节点会重复记录节点。DFS序:深度优先搜索的顺序,不会重新记录。假设要求\(lca(u,v)\),且\(dfn[u]<dfn[v]\)。那么\(dfn[u]\simdfn[v]\)的......
  • 【Unity】CinemachineVirtualCamera:实现第一人称视角控制
    相机视角的控制,利用CinemachineVirtualCamera插件(在packageManager中下载)实现键盘和鼠标控制第一人称视角。WASD前进后退向左向右,QE左右旋转;鼠标滚轮控制远近、俯仰和升降。另外还支持鼠标靠近边缘移动、鼠标拖拽等控制方式。成果展示Scene部分主相机增加CinemachineBrain组......
  • 树上差分+lca 黑暗的锁链
    //**太久不写了,感觉很难受。。。比赛最近打得也不好,课内任务又重,还要忙着做项目。何去何从。今天又写了一题,用了树上差分的知识。下面来整理整理。1.首先让我们学一下lca(最小公共父节点) 我用的是倍增来求的。总共其实就是两步:dfs打ST表预处理每个点的上面节点 lca求两......
  • 【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学
    您的学术研究值得被更多人看到!在这里,我为您提供精准的会议推荐,包括水利土木工程、计算机科学、地球科学、机械自动化、材料与制造技术、经管金融、人文社科等主流学科相关领域的国际会议。快速的稿件录用和高效的检索服务将确保您的研究成果迅速传播。关注我,寻找与您研究......
  • [学习笔记]树链剖分(简易版) 及其LCA
    树链剖分先讲解一下一些基础定义(都是在树上)重儿子:一个节点中所有儿子中子树大小最大的一个儿子(每个节点最多有一个重儿子)轻儿子:一个节点除重儿子外所有的节点重链:若干个重儿子组成的链链顶:一条链中深度最小的节点以下图为例子(红色连续线段为重链)对于节......
  • UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛
    本文记录一个UNO已知问题,在UNO里面可以利用SKXamlCanvas对接Skia绘制到应用里面。如果此时在后台线程里面调用SKXamlCanvas的Invalidate触发界面的重新刷新,但在具体的执行绘制PaintSurface事件里面对外抛出异常,将会导致应用炸掉背景:我准备在UNO里面将Microsoft......
  • 学习笔记:LCA,最近公共祖先
    定义最近公共祖先(LowestCommonAncestor),简称LCA,是算法竞赛中常用的、用以查找树上两个结点中,距离根结点最远的结点的算法。实现朴素算法过程每次找深度比较大的那个点,让它向上跳。显然在树上,这两个点最后一定会相遇,相遇的位置就是想要求的LCA。或者先向上调整深度较大的......
  • 【算法笔记】最近公共祖先(LCA)问题求解——倍增算法
    0.前言最近公共祖先简称LCA(LowestCommonAncestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。这种算法应用很广泛,可以很容易解决树上最短路等问题。为了方便,我们记某点集\(S=\{v_1,v_2,\ldots,v_n\}\)的最近公共祖先为\(\text{LCA}(v_1,v_2,\ld......