社区讨论
告诫后人
学术版参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @locl1qp6
- 此快照首次捕获于
- 2023/10/30 15:32 2 年前
- 此快照最后确认于
- 2023/11/05 02:44 2 年前
如果您使用和我一样的倍增 LCA 写法
CPPvoid dfs(int f, int u, int d) {
fa[u][0]=f; dep[u]=d;
for(auto& x:edge[u]) if(x!=f) dfs(u, x, d+1);
}
void init() {
f(T,1,19) f(i,1,n) fa[i][T]=fa[fa[i][T-1]][T-1];
}
int lca(int x, int y) {
if(x==y) return x;
if(dep[x]<dep[y]) swap(x, y);
d(i,0,19) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
//printf("x=%d, y=%d\n", x, y);
if(x==y) return x;
d(i,0,19) if(fa[x][i]!=fa[y][i]) x=fa[x][i], y=fa[y][i];
return fa[x][0];
}
请注意不要使用 调了一周的线段树合并发现是这个错了 = =
dfs(0, 1, 0), 即把 dep[1] 设为 0. 这会导致在查询某节点和 1 的 LCA 时得到错误的答案 0. 回复
共 4 条回复,欢迎继续交流。
正在加载回复...