LCA
倍增求LCA
错误的
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
dfs(v,u);
}
for(int i=1;(1<<i)<=dep[u];++i){
f[u][i]=f[f[u][i-1]][i-1];
}
}
正确的
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=1;(1<<i)<=dep[u];++i){
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa){
continue;
}
f[v][0]=u;
dfs(v,u);
}
}
唯一的区别在于什么时候处理数组,错误的码在叶子节点处理,但是显然叶子节点往上的节点都没有值,这样递推中应该大部分都是错误的(然而在一些小数据中体现的不明显,所以我一直这么错还一直怀疑数据的锅)
倍增求LCA
int Lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int len=dep[u]-dep[v],k=0;
while(len){
if(len&1){
u=f[u][k];
}
len>>=1;k++;
}
if(u==v)return u;
for(int i=20;i>=0;--i){
if(f[u][i]!=f[v][i]){
u=f[u][i];
v=f[v][i];
}
}
return f[u][0];
}
另外还有ST表RMQ,树链剖分的求法,请到其他大佬的博客学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了