如何在有向加权图中准确地将一条边设置为零,以便找到最短路径?

时间:2017-12-15 16:54:37

标签: algorithm shortest-path dijkstra directed-graph weighted-graph

以下是我正在处理的问题:

  

考虑有向加权图      所有边缘权重都在哪里   正。这个问题的目标是找到最短的路径   在      在两个预先指定的顶点之间   取值   和      ,但有一个额外的扭曲:你可以改变重量   的   究竟   一个边缘(你的   选择)为零。

     

换句话说,你必须选择一个优势      设置为零,最小化最短   之间的路径   取值   和      。   给出一个有效的算法来实现这个目标    0   (   Ë   LG   V   )时间并分析算法的运行情况   时间。次优解决方案将获得较少的信用。

     

提示:   您可能必须反转边缘,运行a   熟悉的算法多次,加上做一些额外的工作

所以我尝试将Dijkstra从 s 运行到所有其他节点,然后我尝试反转边缘并再次从 s 运行到所有其他节点。但是,我发现我们必须从 s 运行Dijskstra到所有其他节点,然后反转边缘,然后从所有其他节点运行Dijkstra t 。我不确定这有助于我们找到设置为零的边缘。根据我的直觉,我认为我们只需将最大权重边缘设置为零。扭转边缘有什么意义?

1 个答案:

答案 0 :(得分:2)

我们需要运行Dijkstra算法两次 - 一次用于原始图形,s作为源顶点,一次用反转图形和t作为源顶点。我们将表示从第一次运行中si之间的距离D(i)以及我们在顶点ti之间得到的距离运行D_rev(i)

请注意,我们可以向后跟随反向边缘(即,沿原始方向跟随它们),因此D_rev(i)实际上是来自顶点的最短距离 {{1 <}> i 。同样,t是遵循Dijkstra算法的从顶点D(i)s的最短距离。

我们现在可以遍历所有边缘,对于连接ie的每条边v1,加起来v2D(v1)对应于路径D_rev(v2)的权重,其中s -> v1 -> v2 -> t为零边,因为我们可以从e转到s,距离为v1,设置为D(v1)为0,从e转到v1,然后从v2转到v2,距离为t。最低限度就是答案。

粗略的校对草图(以及重述):如果我们将边D_rev(v2)设置为0,但不在路径中使用它,我们可以更好地设置路径中的边缘因此,我们只需要考虑包含归零边的路径。通过归零边e的最短路径是首先采用从es的最短路径,然后选择从v1v2的最短路径,这正是使用Dijkstra算法计算的,即tD

希望这个答案有所帮助!