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