Graph 具有一条负边的最短路径

Graph 具有一条负边的最短路径,graph,dijkstra,directed-graph,Graph,Dijkstra,Directed Graph,设G(V,E)是一个无负圈的有向连通图。除一条边外,所有边都具有非负权重。从V中的s,t中找到一条简单的最短路径 我的想法- 在图上做一个BFS,找到具有负权重的边 将此负权重添加到所有边,以便消除负权重 做Dijkstra算法 我的想法行不通 你能帮我找出原因吗 谢谢。您的方法不起作用的原因是它不公平地惩罚具有更多边的路径 设想从源节点到目标节点的两条路径,一条具有更多边但权重较低,另一条具有更少边且权重较高。假设添加到每条边上的权重为3 原始路径: S -> 1 -> 1 -&g

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

我的想法-

  • 在图上做一个BFS,找到具有负权重的边
  • 将此负权重添加到所有边,以便消除负权重
  • 做Dijkstra算法
  • 我的想法行不通

    你能帮我找出原因吗


    谢谢。

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

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

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

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

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

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

    您的方法的问题是,如果一条负边具有较大的负值,它可能会创建更多的负边

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

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

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

    3) 此步骤报告图表中是否存在负权重循环。对每个u-v边执行以下操作 ……如果距离[v]>距离[u]+边缘uv的权重,则“图形包含负权重循环”
    第3步的思想是,如果图不包含负权重循环,第2步保证最短距离。如果我们再次迭代所有边,并为任何顶点获得较短的路径,则存在负权重循环

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

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

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

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

    3) 此步骤报告图表中是否存在负权重循环。对每个u-v边执行以下操作 ……如果距离[v]>距离[u]+边缘uv的权重,则“图形包含负权重循环” 第3步的思想是,如果图不包含负权重循环,第2步保证最短距离。如果我们在所有边上再迭代一次,得到任何顶点的较短路径,则存在负权重循环