题解翻译
首先我们判断Levko是否能赢。
把所有可改变权值的道路权值都改成r[i],然后从以s1,s2为起点做两次Dijkstra算法。令d1[i]为s1到i的距离,d2[i]为s2到i的距离。考虑一条连接a和b,可以改变权值的道路。如果d1[a]
如果最终d1[f]
如果我们将上面的条件d1[a]
证明
我们把Levko能改变权值的道路叫做“边”。当进行Dijkstra算法时,我们不仅使用了边,也使用了所有道路。
1.
我们证明,如果存在让Levko获胜的一组边权值,那么存在一组边权值,使得Levko获胜,而且所有边权值为l[i]或r[i]。考虑对于两名玩家的最短路。
如果仅有Levko走一条从a到b的边,我们可以将其权值设为l[i]。证明:必有d1[a]
如果仅有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]
如果对于边(a1,b1)有d1[a1]=d2[a1],d1[a2]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]
(d)
我们证明如果好边的任意子集满足权值等于l[i]和d1[a]
3.
我们证明对所有边权(不一定仅仅是l[i]或r[i]),所有坏边(a,b)都有d1[a]>=d2[a]成立。
假设我们有这样一条边。考虑s1到该边起点的最短路。如果该路径上存在坏边(a1,b1),那么必然满足不等式d1[a1]
(译者注:不知道这是什么意思……或许作者的本意是把终点从a开始一步一步挪到f,同时保持结论成立?)
4.
这意味着如果Levko走任意一条坏边,他就输了。所以我们可以将所有这样的边权设为r[i]。所以我们可以将一些好边的边权设为l[i]。由(d),如果满足d1[f]
5.
在判断Levko是否能平局时,结论仍然成立。