发现最终答案一定是一段非 0,一段 0 再一段非 0,军可能为空。因为如果有多段 0 却不连续,那么前一段的结尾 X 和后一段的开头 Y 一定都在 S 到 T 的最短路上,所以一定可以用中间的 0 补起来,一定较优。
但是暴力枚举 0 的两端 A,B 会产生 O(n^2) 的时间复杂度,寄。考虑优化,把 S 到 T 的最短路树建出来,一定是以 S 为源点的 DAG。在上面跑拓扑排序以求出 U 到每个点的最短距离,初始化为原来的最短距离,对于每个 v 更新 dis_v=\min(dis_v,dis_u),也就是走了一条 0。最后用 dis_i+dis_{i,V} 更新即可。由于可能以最短路的反向经过最短路,还要建反图再跑一遍。