以下是我正在处理的问题:
考虑有向加权图 所有边缘权重都在哪里 正。这个问题的目标是找到最短的路径 在 在两个预先指定的顶点之间 取值 和 吨 ,但有一个额外的扭曲:你可以改变重量 的 究竟 一个边缘(你的 选择)为零。
换句话说,你必须选择一个优势 设置为零,最小化最短 之间的路径 取值 和 吨 。 给出一个有效的算法来实现这个目标 0 ( Ë LG V )时间并分析算法的运行情况 时间。次优解决方案将获得较少的信用。
提示: 您可能必须反转边缘,运行a 熟悉的算法多次,加上做一些额外的工作
所以我尝试将Dijkstra从 s 运行到所有其他节点,然后我尝试反转边缘并再次从 s 运行到所有其他节点。但是,我发现我们必须从 s 运行Dijskstra到所有其他节点,然后反转边缘,然后从所有其他节点运行Dijkstra 到 t 。我不确定这有助于我们找到设置为零的边缘。根据我的直觉,我认为我们只需将最大权重边缘设置为零。扭转边缘有什么意义?
答案 0 :(得分:2)
我们需要运行Dijkstra算法两次 - 一次用于原始图形,s
作为源顶点,一次用反转图形和t
作为源顶点。我们将表示从第一次运行中s
和i
之间的距离D(i)
以及我们在顶点t
和i
之间得到的距离运行D_rev(i)
。
请注意,我们可以向后跟随反向边缘(即,沿原始方向跟随它们),因此D_rev(i)
实际上是来自顶点的最短距离 {{1 <}> 到 i
。同样,t
是遵循Dijkstra算法的从顶点D(i)
到s
的最短距离。
我们现在可以遍历所有边缘,对于连接i
和e
的每条边v1
,加起来v2
和D(v1)
对应于路径D_rev(v2)
的权重,其中s -> v1 -> v2 -> t
为零边,因为我们可以从e
转到s
,距离为v1
,设置为D(v1)
为0,从e
转到v1
,然后从v2
转到v2
,距离为t
。最低限度就是答案。
粗略的校对草图(以及重述):如果我们将边D_rev(v2)
设置为0,但不在路径中使用它,我们可以更好地设置路径中的边缘因此,我们只需要考虑包含归零边的路径。通过归零边e
的最短路径是首先采用从e
到s
的最短路径,然后选择从v1
到v2
的最短路径,这正是使用Dijkstra算法计算的,即t
和D
。
希望这个答案有所帮助!