具有一个负边缘的最短路径

时间:2018-06-15 06:44:59

标签: graph dijkstra directed-graph

  

设G(V,E)为有向连通图,其中没有负循环。所有边缘都具有非负重量,除了一个边缘。在V中找到s,t的简单最短路径。

我的想法 -

  1. 在图表上做一个BFS,找到负重的边缘。
  2. 将此负重量添加到所有边缘,因此我们消除负重量。
  3. 做Dijkstra算法。
  4. 我的想法不起作用。

    你能帮我找出原因吗?

    谢谢。

2 个答案:

答案 0 :(得分:1)

你的方法不起作用的原因是它不公平地惩罚具有更多边缘的路径。

想象一下从源节点到目的地的两条路径,一条路径边缘较多,但权重较低,另一条路径边缘较重,权重较高。让我们假设添加到每个边缘的权重是3。

原始路径:

S -> 1 -> 1 -> 1 -> 1 -> 1 -> T    wt = 5
S -> 4 -> 3 -> T                   wt = 7

增加体重后的路径:

S -> 4 -> 4 -> 4 -> 4 -> 4 -> T    wt = 20
S -> 7 -> 6 -> T                   wt = 13

如您所见,第二条路径现在被错误地识别为较短路径。

答案 1 :(得分:0)

您的方法存在的问题是,如果一个负边缘具有较大的负值,则可能会创建更多负边缘。

您可以研究Bellman-Ford最短路径算法来解决此问题:

1)第一步是将从源到所有顶点的距离初始化为无穷大,并将到源自身的距离初始化为0。创建大小为| V |的数组dist []。除dist [src](其中src是源顶点)之外的所有值都为无穷大。

2)此步骤计算最短距离。跟随| V | -1次,其中| V |是给定图中顶点的数量。 …..a)对每个边u-v进行跟随 ………………如果dist [v]> dist [u] +边缘uv的权重,则更新dist [v] ………………….dist [v] = dist [u] +边缘uv的权重

3)此步骤报告图表中是否存在负重量循环。跟随每个边缘u-v ……如果dist [v]> dist [u] +边缘uv的权重,则“图形包含负权重周期” 第3步的想法是,如果图表不包含负权重循环,则第2步可确保最短距离。如果我们再遍历所有边缘一次并为任何顶点获得一条较短的路径,那么负周期就会变负