社区讨论
如果你被hack数据hack
P2149[SDOI2009] Elaxia的路线参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhz4afn8
- 此快照首次捕获于
- 2025/11/15 01:13 4 个月前
- 此快照最后确认于
- 2025/11/16 13:49 4 个月前
hack数据如下
input
CPPinput
8 9
1 6 7 8
1 2 5
2 3 3
3 4 4
4 5 3
5 6 5
7 3 4
7 5 4
2 8 3
4 8 3
output
CPP6
第一条最短路为 1−2−8−4−5−6,第二条为 7−5−4−8 时,公共路径长度最大,为 6 。

你WA的原因大概率是方向一致性处理不当,导致了方向不一致的边被错误连接
一种合理的做法:
CPPfor (int d1 = 0; d1 < 2; d1++) { // 第一条路径方向
for (int d2 = 0; d2 < 2; d2++) { // 第二条路径方向
// 只连接在当前方向组合下方向一致的边
if ((d1==0 && in1_uv && d2==0 && in2_uv) ||
(d1==0 && in1_uv && d2==1 && in2_vu) ||
(d1==1 && in1_vu && d2==0 && in2_uv) ||
(d1==1 && in1_vu && d2==1 && in2_vu)) {
// 建图...
}
}
}
通过枚举4种方向确保边不重复
事实上
设公共路径为P = {e₁, e₂, ..., eₖ},其中eᵢ = (uᵢ, uᵢ₊₁)
对于路径1,要么:
CPP所有eᵢ都是uᵢ→uᵢ₊₁(正向)
要么
CPP所有eᵢ都是uᵢ₊₁→uᵢ(反向)
对于路径2,同样要么全部正向,要么全部反向。
因此只有四种可能的组合:
1.路径1正向 + 路径2正向
2.路径1正向 + 路径2反向
3.路径1反向 + 路径2正向
4.路径1反向 + 路径2反向
因此枚举四个方向可以得到正确答案。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...