代码之家  ›  专栏  ›  技术社区  ›  Assaf

具有一条负边的最短路径

  •  0
  • Assaf  · 技术社区  · 7 年前

    设g(v,e)是无负圈的有向连通图。除一条边外,所有边都具有非负权重。从v中的s,t找到一个简单的最短路径。

    我的想法——

    1. 在图上做一个bfs,找到带负重的边。
    2. 把这个负重加到所有的边上,这样我们就消除了负重。
    3. 做dijkstra算法。

    我的想法行不通。

    你能帮我找出原因吗?

    谢谢您。

    1 回复  |  直到 7 年前
        1
  •  1
  •   beaker    7 年前

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

    假设从源节点到目标节点有两条路径,一条具有更多边,但权重较低,另一条具有较少边且权重较高。假设每个边上的权重是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
    

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