LCA

简介:                      LCA是用来求解一棵树或图中两点的最近公共祖先 LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。

                     LCA是用来求解一棵树或图中两点的最近公共祖先

LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。


1:如果读入的树,那么应该有固定的根节点我们只要对根节点LCA即可。

2:如果读入的是无向图,那么选择1作为根节点进行LCA即可。

所以应该要注意题目读入的是树还是无向图,已经的根节点是否固定。



1Tarjan离线算法

1:Tarjan算法基于深度优先搜索的框架,对于新搜索到的一个结点,首先创建由这个结点构成的集合,用到dfs+并查集

2:再对当前结点的每一个子树进行搜索,每搜索完一棵子树,则可确定子树内的LCA询问都已解决。

3:其他的LCA询问的结果必然在这个子树之外,这时把子树所形成的集合与当前结点的集合合并,并将当前结点设为这个集合的祖先。

4:之后继续搜索下一棵子树,直到当前结点的所有子树搜索完。

5:这时把当前结点也设为已被检查过的,同时可以处理有关当前结点的LCA询问,如果有一个从当前结点到结点v的询问,且v已被检查过,则由于进行的是深度优先搜索,当前结点与v的最近公共祖先一定还没有被检查,而这个最近公共祖先的包涵v的子树一定已经搜索过了,那么这个最近公共祖先一定是v所在集合的祖先。

举例说明(非证明):
假设遍历完10的孩子,要处理关于10的请求了
取根节点到当前正在遍历的节点的路径为关键路径,即1-3-8-10
集合的祖先便是关键路径上距离集合最近的点
比如此时:
    1,2,5,6为一个集合,祖先为1,集合中点和10的LCA为1
    3,7为一个集合,祖先为3,集合中点和10的LCA为3
    8,9,11为一个集合,祖先为8,集合中点和10的LCA为8
    10,12为一个集合,祖先为10,集合中点和10的LCA为10
你看,集合的祖先便是LCA吧,所以第3步是正确的
道理很简单,LCA(u,v)便是根至u的路径上到节点v最近的点

6时间复杂度o(n+m);n是数据规模,m是询问的次数,核心如下

/*这个u是根节点*/
void LCA(int u){
     ancestor[u] = u;/*建立一个集合*/
     for(int i = first[u] ; i != -1 ; i = next[i]){
        LCA(i);
        union_Set(i , u);
        ancestor[find_Set(i)] = u;
     }
     vis[u] = 1;/*把这个点标记为已经求过和它有关的LCA问题都可以知道*/
     for(int i = 0 ; i < v[u].size() ; i++){
        if(vis[v[u][i]]){ 
          int tmp = father[find_Set(v[u][i])];
          for(int j = 0 ; j < m ; j++){/*找到是那一条边询问*/
             if(e[j].x == u && e[j].y == v[u][i] || e[j].y == u && e[j].x == v[u][i])
                e[j].ans = tmp;
          }
        }
     }
}





目录
相关文章
【java】poi 设置允许西文在单词中间换行
【java】poi 设置允许西文在单词中间换行
|
5G 索引
频域结构 | 带你读《5G 空口设计与实践进阶 》之十九
在频域,为满足多样带宽需求,NR 支持灵活可扩展的 Numerology。这相应也决定了 NR 在频域资源上的物理量度是可变的。
频域结构 | 带你读《5G 空口设计与实践进阶 》之十九
|
存储 关系型数据库 PostgreSQL
PostgreSQL中的full_page_writes的理解
1. full_page_writes的作用 PostgreSQL中的full_page_writes参数用来防止部分页面写入导致崩溃后无法恢复的问题。手册中的相关描述如下: http://postgres.cn/docs/9.3/runtime-config-wal.html#GUC-FULL-PAGE-WRITES full_page_writes (boolean)  打开这个选项的时候,PostgreSQL服务器在检查点之后对页面的第一次写入时将整个页面写到 WAL 里面。
1852 0
【原创】Magisk+Shamiko过APP ROOT检测
【原创】Magisk+Shamiko过APP ROOT检测
1899 0
【原创】Magisk+Shamiko过APP ROOT检测
|
移动开发 前端开发 API
本周推荐 | 基于 canvas 实现 H5 丝滑看图体验
推荐语:随着机器算力及性能的提升,基于原生Web体系的富交互体验也可以媲美原生,本文作者通过Canvas + Web手势从零实现了大图浏览的交互效果,并在体验上不输Native,是一次不错的技术尝试,欢迎阅读。 ——大淘宝技术客户端开发工程师 楚奕
514 0
本周推荐 | 基于 canvas 实现 H5 丝滑看图体验
|
消息中间件 Kafka RocketMQ
Kafka vs RocketMQ——单机系统可靠性
引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准——软件可靠性。 何为“可靠性”? 先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区均能很好应对泥泞的路况。当一同开去穿越西藏,A车会因为西藏本地的汽油不达标,导致油路受阻无
8153 89
|
机器学习/深度学习 人工智能 自然语言处理
真实世界的人工智能应用落地——OpenAI篇 ⛵
本文介绍大名鼎鼎的 OpenAI!概述其发展历程,并介绍几款已经实际落地的 AI 应用:GPT3、CLIP、DALL·E 2、Whisper、Codex、ChatGPT。
2089 0
真实世界的人工智能应用落地——OpenAI篇 ⛵
|
前端开发 Java 关系型数据库
JavaWeb用户登录注册实例(mybatis、maven、mysql、tomcat、servlet)
JavaWeb用户登录注册实例(mybatis、maven、mysql、tomcat、servlet)
JavaWeb用户登录注册实例(mybatis、maven、mysql、tomcat、servlet)
|
SQL 芯片
数字式秒表电路设计
数字式秒表电路设计
396 1
数字式秒表电路设计
|
机器学习/深度学习 人工智能 大数据
从计算机网络五层架构理解工业互联网体系架构
从计算机网络五层架构理解工业互联网体系架构
585 0
从计算机网络五层架构理解工业互联网体系架构