Dijkstra的最短路径算法不起作用

时间:2013-09-21 19:05:59

标签: algorithm graph graph-algorithm dijkstra

我有一个具有正边缘权重和正节点权重的图表。路径的长度定义为沿路径的所有边缘权重的总和,加上沿路径遇到的最大节点权重。

我最初认为修改过的Dijkstra会起作用,但我找到了一个测试用例,它会失败。我该如何解决这个问题?我应该看一下标准算法吗?

我修改过的Dijkstra如下:在每个节点,我记录到目前为止的最短路径,以及我到目前为止看到的最大节点权重,并使用它来计算相邻节点的长度。有关详细信息,请参阅我的评论。

这是Dijkstra失败的图表: http://i.imgur.com/FQhRzXV.jpg 绿色数字是节点标签。蓝色的一切都是权重(节点和边缘权重)。假设我想计算节点1和7之间的最短路径(标记为绿色)。 Dijkstra的问题在于节点4总是记录路径1-8-9-4,因为它比路径1-2-3-4短(前一长度9对后一长度13)。但要到达节点7,路径1-8-9-4-5-6-7比1-2-3-4-5-6-7更长。

2 个答案:

答案 0 :(得分:0)

如果你可以原谅一个更大的多项式时间,那么相当简单的算法:

ModifiedShortestPath(u, v, G) {
  X = StandardardShorestPath(u, v, G);
  E = heaviest edge in X
  F = all edges in G of weight >= E
  Y = ModifiedShortestPath(u, v, G - F); // recur here on G without the F edges
  return Min(X, Y);
}

这是| E |的运行时间超过标准最短路径的时间。

答案 1 :(得分:0)

您的图表一开始就不清楚(蓝色的值太多,角色不清楚),这使答案更加困难。一个更好的问题,一个更简单的图形和一些直接的答案in this post

让我明白并允许我纠正实现并获得正确结果的是,在循环的每个重复结束时,是时候选择下一个未访问邻居的节点/顶点了我应该检查一下,我必须从整个未访问的顶点池中选取,而不仅仅是从当前检查的节点的未访问的邻居中选取。我给人的印象是错误的,一旦您在十字路口选择了一条路径,因为算法的贪婪性将您带到了那里,您只能将其一直走到最后,在未访问节点之后不被访问。不会。您每次都根据最小的暂定值选择下一个全局未访问的节点,而不管其在图形中的位置或是否已连接到当前节点。

我希望这消除了像我这样的其他人所经历并导致他们来到这里的困惑。