您当前的位置: 首页 > 

先求一个导

暂无认证

  • 2浏览

    0关注

    291博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LCA模板(倍增)

先求一个导 发布时间:2021-09-23 23:21:48 ,浏览量:2

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            
关注
打赏
1662037414
查看更多评论
0.0372s