DFS序求LCA
DFS序求LCA
介绍
欧拉序求LCA 的数组总是会忘记开两倍,并且预处理的常数较大。用 DFS序求LCA 可以解决这些问题。
欧拉序:进节点和出节点会重复记录节点。
DFS序:深度优先搜索的顺序,不会重新记录。
假设要求
那么
其中包括
这样就找到了
说明: 找
还有一种不用记录
struct LCA{
struct node{
int v, ne;
}e[N << 1];
int first[N], idx = 0;
int dep[N], fa[N], dfn[N], rev[22][N], cnt = 0;
void add(int x, int y){
e[++ idx] = (node){y, first[x]};
first[x] = idx;
}
void dfs(int u, int f){
fa[u] = f;
dep[u] = dep[f] + 1;
dfn[u] = ++ cnt;
rev[0][cnt] = u;
for(int i = first[u]; i; i = e[i].ne){
int v = e[i].v;
if(v == f) continue;
dfs(v, u);
}
}
int cmin(int x, int y){
if(dep[x] < dep[y]) return x;
return y;
}
int getlca(int x, int y){
if(x == y) return x;
if((x = dfn[x]) > (y = dfn[y])) swap(x, y);
int t = __lg(y - x++);
return fa[cmin(rev[t][x], rev[t][y - (1 << t) + 1])];
}
void init(){
dfs(root, 0);
F(j, 1, 20) F(i, 1 , n - (1 << j) + 1) rev[j][i] = cmin(rev[j - 1][i], rev[j - 1][i + (1 << (j - 1))]);
}
}lca;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】