最短路 + 贪心.
有一张 $n$ 个点, $m+k$ 条边的有向图,可能存在重边与自环.
前 $m$ 条边的长度是给定的,你需要为后 $k$ 条边分别钦定长度,其中第 $i$ 条边的长度必须在区间 $[l_i,r_i]$ 中.
给出三个点 $s_1,s_2,f$ ,求一种钦定的方案,使得 $s_1\to f$ 的最短路长度小于 $s_2\to f$ 的最短路长度.
如果不能达到上述要求,就给出一种使两者相等的钦定方案.
若两个要求都无法达到,输出 LOSE .
首先可以确定,对于这 $k$ 条边,每条边的权值只可能是 $l_i$ 或者 $r_i$ .
因为权值取在中间时,可以往两边调整,至少有一边不会更劣.
于是可以先将它们的权值都设为 $r_i$ ,分别以 $s_1,s_2$ 作为起点跑一遍 $Dijkstra$ .
对于一条可以改的边 $u\to v$ ,若 $dis(s_1,u)\le dis(s_2,u)$ ,就把它的权值改为 $l_i$ .
因为它更可能出现在 $s_1\to f$ 的最短路上.
最简单的想法是,每次改了一条边之后,重新计算一遍距离,再去找需要改的边.
但实际上可以一次将所有的边改完,再去重新计算距离,这样做是等价的.
用三角形不等式,可以证明每次修改后,没有 $dis(s_1,u)\le dis(s_2,u)$ 变成 $dis(s_1,u)>dis(s_2,u)$ 的情况.
时间复杂度 $O(k(m+k)\log n)$.
用链表删掉已经改过的边,否则复杂度会退化.
1 | //%std |