社区讨论

关于本题或许正确的做法

P3238[HNOI2014] 道路堵塞参与者 9已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@lo8kdbad
此快照首次捕获于
2023/10/27 20:02
2 年前
此快照最后确认于
2023/10/27 20:02
2 年前
查看原帖
RT。
注意:仅是讨论而不是讨论区题解。
能够通过BZOJ的 hack\text{hack} 数据。
借用 CF1163F Indecisive Taxi Fee 的做法,由于本题转化为无向图,从 nn11sufsuf 时使用原图的反图(即 uvu \rightarrow v 的边转化为 vuv \rightarrow u 的边。
在线段树维护 min\min 时由于边是单向边,只能加入 uvu\rightarrow v 的贡献,即对原链上 (LuRu](L_u \sim R_u] 的点与 dis(1,u)+w+dis(v,n)\text{dis}(1,u)+w+\text{dis}(v,n)min\min
统计答案时特判无解即可。
然而这样做无法通过下面的数据:
CPP
4 7 2
1 2 1
2 4 1
2 3 1
3 1 1
4 2 1
1 3 100
3 4 100
1 2
答案为
CPP
200
102
而输出为
CPP
-1
102
考虑为什么会判为无解。
尝试去掉边 3 1 13 \ 1 \ 1,发现答案正确。
通过遍历中间值发现在求解 R3R_3 时出错,原因在于在反图上跑 dijkstra\text{dijkstra}nn 更新了 11 后,11 通过边 1 3 11\ 3\ 1 更新了 33,导致 33RR 计算错误
而这就直接导致在更新 1 3 1001\ 3\ 100 的贡献时什么都没有更新。考虑在原图上产生了什么影响。
事实上,我们更新 RR 的意义是在不经过某些边的情况下辅助求解最短路,然而在更新 R3R_3 的时候 nn 却提前到达了 11
在下面我的代码中,在 dijkstra\text{dijkstra} 中从 disx\text{dis}_x 更新到 disv\text{dis}_v 后若 vv 已经到达终点,强制 vv 不能进行下一步的转移。
欢迎 hack

回复

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

正在加载回复...