题解翻译
首先我们判断Levko是否能赢。
把所有可改变权值的道路权值都改成r[i],然后从以s1,s2为起点做两次Dijkstra算法。令d1[i]为s1到i的距离,d2[i]为s2到i的距离。考虑一条连接a和b,可以改变权值的道路。如果d1[a]<d2[a],我们就将该道路的权值设为l[i],然后重新做两次Dijkstra。我们不断进行这一过程,直到不再有道路改变权值。
如果最终d1[f]<d2[f]那么Levko就赢了。
如果我们将上面的条件d1[a]<d2[a]改成d1[a]<=d2[a],我们就可以判断Levko是否能以平局结束。
证明
我们把Levko能改变权值的道路叫做“边”。当进行Dijkstra算法时,我们不仅使用了边,也使用了所有道路。
1.
我们证明,如果存在让Levko获胜的一组边权值,那么存在一组边权值,使得Levko获胜,而且所有边权值为l[i]或r[i]。考虑对于两名玩家的最短路。
如果仅有Levko走一条从a到b的边,我们可以将其权值设为l[i]。证明:必有d1[a]<d2[a],因为Levko走到了这里然后获胜。这一条件在改变权值后仍然满足。如果Zenyk走了这条边,他就输了,因为d1[f]<=d1[a]+d(a,b)+d(b,f)<d2[a]+d(a,b)+d(b,f)=d2[f]。如果Zenyk不走这条边,他也输了,因为Levko的最短路变得更短(d(x,y)代表从x到y的最短路)。
如果仅有Zenyk走从a到b的边,我们可以将其权值设为r[i]。证明:Levko的最短路不变,而Zenyk的最短路只会变大(也可能不变)。
如果没有人走这条边,我们就将其权值设为r[i]。证明:两人的最短路均不变。
如果两人都走了这条边,我们可以将其权值设为l[i]。证明:两人的最短路都减少了(原先权值-l[i])。
在所有这种操作之后,Levko仍然获胜,而且所有边的权值变成了l[i]或r[i]。
2.
考虑算法的结果。在所有操作结束后,如果一条边的权值为l[i],我们就称之为“好的”,否则若为r[i],就称之为“坏的”。
(a)
我们证明在所有操作结束后,对所有好边(a,b)有d1[a]<d2[a]。
如果对于边(a1,b1)有d1[a1]<d2[a1],而在修改边(a2,b2)的权值后这一不等式不再成立。我们有d1[a1]>=d2[a1],d1[a2]<d2[a2]。我们只改一条边的权值,而s2到f的最短路变得更短,这就意味着边(a2,b2)在该最短路上。d2[a1]=d2[a2]+d(a2,b2)+d(b2,a1)>d1[a2]+d(a2,b2)+d(b2,a1)>=d1[a1]。
矛盾。
(译者注:不知道这里想表达什么……如果(a1,b1)是好边,那它一定在s1~f的最短路上,那么讨论几种操作,稍有常识的人都会看出修改(a2,b2)是阻挡不了结论成立的)
(b)
我们证明在所有操作结束后,对所有坏边(a,b)有d1[a]>=d2[a]。证明是:如果结论不成立,我们就能继续算法。
(c)
我们证明如果对某条边有d1[a]<d2[a]成立,但我们在一次迭代中未处理这条边(处理了另外一条边),那么该条件在此次迭代后依然成立。证明同(a).
(d)
我们证明如果好边的任意子集满足权值等于l[i]和d1[a]<d2[a],那么我们在把所有好边的权值都变成l[i]后,这一结论仍然成立。证明是:模拟算法的所有操作,同时使用(c)。
3.
我们证明对所有边权(不一定仅仅是l[i]或r[i]),所有坏边(a,b)都有d1[a]>=d2[a]成立。
假设我们有这样一条边。考虑s1到该边起点的最短路。如果该路径上存在坏边(a1,b1),那么必然满足不等式d1[a1]<d2[a1]。考虑这些坏边中的第一条(a,b)。那么从s1到a的最短路不包含任何坏边。考虑另一个问题,其中m和我们的问题相等,但终点在a。那么好边和坏边也将相同。我们像在1中一样修改所有边的权值。注意到所有坏边的权值都为r[i]。所以仅有好边才能满足l[i]和d1[a1]<d2[a1]。由(d),我们可以将所有好边的权值设为l[i],而且满足d1[a1]<d2[a1]。这和这条边是坏边矛盾。
(译者注:不知道这是什么意思……或许作者的本意是把终点从a开始一步一步挪到f,同时保持结论成立?)
4.
这意味着如果Levko走任意一条坏边,他就输了。所以我们可以将所有这样的边权设为r[i]。所以我们可以将一些好边的边权设为l[i]。由(d),如果满足d1[f]<d2[f],如果我们将所有好边的边权设为l[i],该等式仍然成立。
5.
在判断Levko是否能平局时,结论仍然成立。