NIKKEI Programming Contest 2019-2 Task D. Shortest Path on a Line

Observations


\(1\)\(N\) 的最短路一定是不走回头路的。所谓走回头路是指从序号大的点走到序号小的点。

证明:首先,任意从 \(1\)\(N\) 的路径的最后一步一定不是回头路。假设存在一条从 \(1\)\(N\) 的最短路走了回头路,并设这条路最后一次回头是从 \(u\)\(v\) 且从 \(v\) 开始直到终点经过的点依次是 \(v = v_0, v_1, \dots v_k = N\)。我们有 \(v < u < N\)\(v = v_0 < v_1 < v_2 <\dots < v_k = N\)\(v_i \ne u\)。设 \(v_i < u\)\(v_{i+1} > u\) 则必然存在边 \((u, v_{i+1})\) 和边 \((v_i, v_{i+1})\) 长度相等,因此走 \(u, v_{i+1}, \dots, v_{k}\) 更优。矛盾!

为了便于描述,以下用 \((u, v, C)\) 表示连接 \(u, v\),长为 \(C\) 的无向边,用 \((u \to v, C)\) 表示从 \(u\)\(v\) 长为 \(c\) 的有向边。

从上述证明可以得出推论:将原无向图按下述方式改造成有向图,从 \(1\)\(N\) 的最短路长度不变:
以下设 \(1 \le u < v \le N\)。将原图中的无向边 \((u, v, C)\) 删除,加入有向边 \((u \to v, C)\)
再任意加入长度非负的回头边。

考虑上述有向图的一种特殊情形:对于 \(i = i, 2, \dots, N\),加上长度为 \(0\) 的回头边 \((i \to i - 1, 0)\)
注意到此时对于一组有向边 \((s \to t, C_i)\)\(L_i \le s < t \le R_i\),只保留 \((L_i \to R_i, C_i)\) 仍能保持从 \(1\)\(N\) 的最短路长度不变。

posted @ 2019-11-10 03:14  Pat  阅读(416)  评论(5编辑  收藏  举报