社区讨论

警示后人

P5344【XR-1】逛森林参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m54p8uxs
此快照首次捕获于
2024/12/26 10:23
去年
此快照最后确认于
2025/11/04 12:21
4 个月前
查看原帖
倍增跳跃的过程中,一定要特别注意特殊情况的处理,多连几条边也不少连,有以下几种可能出错的特殊情况:
  1. u=vu=v,这时候必须用原图上的点 u,vu,v 连边。
  2. u,vu, v 同步深度后,如果 u=vu=v,直接退出,不要在 u,vu, v 的倍增虚拟节点上连边。
  3. u,vu, v 同步深度后,如果 LCA 就是它们的直接父亲,不能只在原图上它们的父亲节点上连边,否则不会包含 u,vu, v,应该连接 u,vu, v 的倍增虚拟节点 fa[ ][0]fa[\ ][0]
    注意,如果上述情况下一开始就有 u,vu, v 深度相同,那么 u,vu, v 同时不被包含。
原错误代码:
CPP
if(in) add_edge(to, fa[u][0].to);
else add_edge(fa[u][0].to, to);
更正后代码:
CPP
if(in){
	add_edge(to, fa[u][0].in);
	add_edge(to, fa[v][0].in);
}else{
	add_edge(fa[u][0].out, to);
	add_edge(fa[v][0].out, to);
}

Hack 数据

输入 #1

PLAIN
3 2 1
2 1 2 100
1 2 2 3 3 2

输出 #1

PLAIN
0 100 102

输入 #2

PLAIN
4 2 2
2 1 2 100
1 1 1 3 3 2

输出 #2

PLAIN
100 0 102 -1

输入 #3

PLAIN
4 3 1
2 1 2 100
2 2 3 20
1 2 3 4 4 3

输出 #3

PLAIN
0 100 120 103

输入 #4

PLAIN
4 3 4
2 1 2 100
2 1 3 20
1 2 3 4 4 3

输出 #4

PLAIN
3 3 3 0

回复

3 条回复,欢迎继续交流。

正在加载回复...