思路解析
与上题的关键区别
本题允许重复经过节点和边(非简单路径),只要求路径总长度严格大于最短路径的最短路径。这使得解法完全不同——不需要枚举删边,而是用改进的 Dijkstra 同时维护最短和次短距离。
核心思路:双距离 DIJKSTRA
对每个节点同时维护两个值:
* d1[v]:从起点到 v 的最短距离
* d2[v]:从起点到 v 的严格次短距离
在 Dijkstra 松弛时,新距离 nd 有三种情况:
情况 操作 nd < d1[v] 原 d1 被挤到 d2,nd 成为新 d1 d1[v] < nd < d2[v] nd 更新 d2 其他 不更新
最终 d2[N] 即为答案。
复杂度
* 时间:O((N+R)logN)O((N + R) \log N)O((N+R)logN),一次改进 Dijkstra
* 空间:O(N+R)O(N + R)O(N+R)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
逐行注释代码