最近公共祖先(LCA)模板

最近公共祖先(LCA)模板

第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。

接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。

 

输出格式:

 

输出包含M行,每行包含一个正整数,依次为每一个询问的结果。

输入样例#1:

5 5 4

3 1

2 4

5 1

1 4

2 4

3 2

3 5

1 2

4 5

输出样例#1:

4

4

1

4

4

 

模板:时间复杂度nlogn

 

#include<iostream>
#include<cstdio>
using namespace std;
struct yyy{
       int t,
       nex;
}e[2 * 500001];
int deepth[500001], fa[500001][22], lg[500001], head[500001];
int tot;
void add(int x, int y) //邻接表存树
{
       e[++tot].t = y;
       e[tot].nex = head[x];
       head[x] = tot;
}
void dfs(int f, int fath)
{
       deepth[f] = deepth[fath] + 1;
       fa[f][0] = fath;
       for (int i = 1; (1 << i) <= deepth[f]; i++)
              fa[f][i] = fa[fa[f][i - 1]][i - 1];
       for (int i = head[f]; i; i = e[i].nex)
       if (e[i].t != fath)
              dfs(e[i].t, f);
}
int lca(int x, int y)
{
       if (deepth[x]<deepth[y])
              swap(x, y);
       while (deepth[x]>deepth[y])
              x = fa[x][lg[deepth[x] - deepth[y]] - 1];
       if (x == y)
              return x;
       for (int k = lg[deepth[x]]; k >= 0; k--)
       if (fa[x][k] != fa[y][k])
              x = fa[x][k], y = fa[y][k];
       return fa[x][0];
}
int n, m, s;//n节点,m查询,s边数
void init()
{
       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); add(y, x);
       }
       dfs(s, 0);
       for (int i = 1; i <= n; i++)
              lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
}
 
int main()
{
       init();
       for (int i = 1; i <= m; i++)
       {
              int x, y;  scanf("%d%d", &x, &y);
              printf("%d\n", lca(x, y));
       }
 
       return 0;
}

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/9643481.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101426.html原文链接:https://javaforall.net

(0)
上一篇 2021年6月12日 下午9:00
下一篇 2021年6月12日 下午10:00


相关推荐

  • github开源项目地址「建议收藏」

    github开源项目地址「建议收藏」github开源项目地址

    2022年7月16日
    32
  • Python3 :PyCharm + Qt designer 学习 + 实例[通俗易懂]

    Python3 :PyCharm + Qt designer 学习 + 实例[通俗易懂]python3PyQt5pycharm环境搭建PyQt官网PyQt5简单介绍PyQt是由PhilThompson开发Qt库是目前最强大的库之一PyQt是一个创建GUI应用程序的工具包它是Python编程语言和Qt库的成功融合Qtdesigner可视化拖动生成界面,然后利用pycharm进行转换.py文件,再编写槽函数,实现进一步的功能,不…

    2025年5月31日
    4
  • java单例指令重排_java实现数组去重

    java单例指令重排_java实现数组去重java指令重排案例。

    2022年10月17日
    4
  • idea 2021.8激活码-激活码分享

    (idea 2021.8激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    61
  • 从MVC框架看MVC架构的设计

    从MVC框架看MVC架构的设计尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点。本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些问题的,揭示其中所折射出的设计思想与设计理念。MVC回顾作为一种经典到不能再经典的架构模式,MVC的成功有其必然的道理,这个道理不同的人会有不同的解读,笔者最认同的一种观

    2022年4月7日
    38
  • Linux 环境变量配置汇总

    Linux 环境变量配置汇总Linux环境变量配置汇总01、Linux环境变量配置02、Linux读取环境变量03、Linux环境变量配置方法一:exportPATH或者把PATH放在前面04、Linux环境变量配置方法二:vim~/.bashrc在最后一行加上05、Linux环境变量配置方法三:vim~/.bash_profile06、Linux环境变量配置方法四:vim/etc/bashrc07、Linux环境变量配置方法五:vim/etc/profile在最后一行加上08、Linux环境变量配置方法六:vim/et

    2022年5月30日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号