[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)
[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?
以下是我正在研究的问题:
考虑一个有向加权图G ,其中所有边缘权重均为正。 这个问题的目的是在两个预先指定的顶点s和t之间找到G的最短路径,但要增加一点扭曲:允许将(选择的)一条边的权重更改为零。
换句话说,您必须在G中选择一个边沿以将其设置为零,以最小化s和t之间的最短路径。 给出一种有效的算法,以在O(E lg V)时间内实现此目标,并分析算法的运行时间。 次优解决方案将获得较少的信誉。
提示:您可能需要反转边缘,多次运行熟悉的算法,并做一些额外的工作
所以,我试图运行从s Dijkstra的所有其他节点,然后我试图逆转的边缘,从s再次运行到所有其他节点。 但是,我发现我们必须将Dijskstra从s运行到所有其他节点 ,然后反转边,然后再将Dijkstra从所有其他节点运行到t 。 我不确定这如何帮助我们找到要设置为零的边。 根据我的直觉,我认为我们可以将最大重量边设置为零。 反转边缘的意义何在?
我们需要运行Dijkstra的算法两次-一次是使用s
作为源顶点的原始图,一次是使用反向图并且t
作为源顶点的图。 我们将表示从第一次运行得到的顶点s
和i
之间的距离为D(i)
,从第二次运行得到的顶点t
与i
之间的距离为D_rev(i)
。
请注意,我们可以向后跟随反向边(即,沿原始方向跟随它们),因此D_rev(i)
实际上是从顶点i
到t
的最短距离。 同样, D(i)
是遵循Dijkstra算法的从顶点s
到i
的最短距离。
现在我们可以遍历所有边缘,对于连接v1
和v2
每个边缘e
,将D(v1)
和D_rev(v2)
,这对应于路径s -> v1 -> v2 -> t
的权重s -> v1 -> v2 -> t
D_rev(v2)
s -> v1 -> v2 -> t
以e
为零边,因为我们可以从s
到v1
且距离为D(v1)
,所以将e
设置为0,从v1
到v2
,然后从v2
到t
的距离为D_rev(v2)
。 这些最小的答案。
粗略的证明草图(以及重述):如果将边e
设置为0,但不在路径中使用它,则最好将路径中的边设置为0。因此,我们只需要考虑包括归零边缘的路径。 通过零边e
的最短路径是首先采用从s
到v1
的最短路径,然后采用从v2
到t
的最短路径,这正是使用Dijkstra算法(即D
和D_rev
计算D_rev
。
希望这个答案有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.