void dfs(long u,long father){
dep[u]=dep[father]+1;//只在这里初始化dep
for(long i=1;(1<<i)<=dep[u];i++)
fa[u][i]=fa[fa[u][i-1]][i-1];//只这里用的倍增
for(long i=head[u];~i;i=edge[i].next){
long v=edge[i].to;
if(v==father)continue;
fa[v][0]=u;
dfs(v,u);
}
}
long lca(long x,long y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--){//跳到同一个深度
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
}
for(int i=20;i>=0;i--){
if(fa[x][i]!=fa[y][i]){//一起跳
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
【图论】倍增与lca
arin8762025-07-25 10:50
相关推荐
RTC老炮8 分钟前
webrtc降噪-WienerFilter源码分析与算法原理hweiyu0038 分钟前
数据结构:数组无限进步_1 小时前
C语言单向链表实现详解:从基础操作到完整测试初夏睡觉1 小时前
循环比赛日程表 题解派大星爱吃鱼1 小时前
素数检验方法Greedy Alg2 小时前
LeetCode 72. 编辑距离(中等)xinxingrs2 小时前
贪心算法、动态规划以及相关应用(python)秋邱2 小时前
驾驭数据洪流:Python如何赋能您的数据思维与决策飞跃侯小啾2 小时前
【23】C语言 左移(<<) 与 右移(>>) 位运算符在处理像素中的应用搂鱼1145143 小时前
(dp 优化)洛谷 P14460 寻雾启示 题解