【发布时间】:2018-06-15 06:44:59
【问题描述】:
令 G(V,E) 是一个没有负环的有向连通图。除 ONE 边外,所有边都具有非负权重。从 s,t 在 V 中找到一条简单的最短路径。
我的想法——
- 在图上做 BFS,找到负权重的边。
- 将此负权重添加到所有边缘,因此我们消除了负权重。
- 做 Dijkstra 算法。
我的想法行不通。
你能帮我找出原因吗?
谢谢。
【问题讨论】:
标签: graph dijkstra directed-graph
令 G(V,E) 是一个没有负环的有向连通图。除 ONE 边外,所有边都具有非负权重。从 s,t 在 V 中找到一条简单的最短路径。
我的想法——
我的想法行不通。
你能帮我找出原因吗?
谢谢。
【问题讨论】:
标签: graph dijkstra directed-graph
您的方法不起作用的原因是它不公平地惩罚了具有更多边缘的路径。
想象从源节点到目的地的两条路径,一条边多但权重较低,另一条边少但权重较高。假设添加到每条边的权重为 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[]除了 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 步保证最短距离。如果我们再次遍历所有边并为任何顶点获得更短的路径,则存在负权重循环
【讨论】: