【问题标题】:Shortest Paths with One negative edge具有一个负边缘的最短路径
【发布时间】:2018-06-15 06:44:59
【问题描述】:

令 G(V,E) 是一个没有负环的有向连通图。除 ONE 边外,所有边都具有非负权重。从 s,t 在 V 中找到一条简单的最短路径。

我的想法——

  1. 在图上做 BFS,找到负权重的边。
  2. 将此负权重添加到所有边缘,因此我们消除了负权重。
  3. 做 Dijkstra 算法。

我的想法行不通。

你能帮我找出原因吗?

谢谢。

【问题讨论】:

    标签: graph dijkstra directed-graph


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      您的方法的问题在于,如果一个负边缘具有较大的负值,它可能会产生更多的负边缘。

      你可以研究一下 Bellman-Ford 最短路径算法来解决这个问题:

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

      2) 这一步计算最短距离。执行 |V|-1 次 where |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 步保证最短距离。如果我们再次遍历所有边并为任何顶点获得更短的路径,则存在负权重循环

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多