LCA(Lowest Common Ancestor): 树中两个节点深度最大的公共祖先.
思想: 类似ST表,打倍增。预处理出每个节点的深度后,不是一个个跳,而是跳着跳。一次跳2的k次方. 核心: f[i][j]表示i向上跳2^j的父节点。 f[i][j] = f[f[i][j-1]][j-1] 时间复杂度: 预处理O(nlogn),单次查询O(logn)
fa[i][j]:节点i向上跳2^j的父节点 lg[i]:log(i)+1 dep[i]:深度
写法: 1.dfs预处理深度和fa数组,预处理lg数组,lg[x]表示log(x)+1 2.求LCA(x,y) [1] 不妨假设x的深度 >= y的深度,不是则交换 [2] 让x向上跳,跳到和y同一深度。用到二进制拆位的思想,从最大的能跳的k开始枚举。 [3] x、y一起跳,若fa[x][k] == fa[y][k],是公共祖先,但是不一定是LCA。所以我们为了避免误判,跳到LCA下边一层,避免误判。
例题
模板:
#include
using namespace std;
const int N = 5e5+10;
int n,m,k,T;
int e[N
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?