关于本题或许正确的做法
查看原帖
关于本题或许正确的做法
172370
fzj2007楼主2022/7/16 15:07

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

统计答案时特判无解即可。

然而这样做无法通过下面的数据:

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

答案为

200
102

而输出为

-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

2022/7/16 15:07
加载中...