Dijkstra的算法修改

时间:2012-10-12 17:00:26

标签: algorithm graph graph-algorithm dijkstra

我知道Dijkstra的最短路径算法。但是,如果我要对其进行修改,以便不使用贪婪算法找到最短路径,而是找到最长路径。我需要对以下代码做些什么:

以下是我使用的内容:

作为比较函数,在最短路径版本中选择正确的节点:

 if (Cost(potential_node) > Cost(current_node) + cost(source , current_node)) then
 cost (potential_node) = cost(current_node) + cost (source, current_node)

然而,为了达到另一方面,这是行不通的:

 if (Cost(potential_node) < Cost(current_node) + cost(source , current_node)) then
 cost (potential_node) = cost(current_node) + cost (source, current_node)

有点困惑,真的很感激一些反馈

1 个答案:

答案 0 :(得分:6)

longest path problemNP-Hard,因此没有已知的多项式解。

建议的修改不起作用,因为当dijkstra的算法将节点标记为“已关闭”时,它意味着 - 它将永远不会有更短的路径。如果您关闭一个节点,那么在尝试将其用于最长路径时,声明并非如此 - 这并不意味着它不再有路径。

回想一下,这正是我们在每一步中对Dijkstra算法的证明(更多“松弛”将找不到任何更短的路径),但如果你找到使用中间化的当前最长的顶点路径 - 它并不意味着它确实是最长的 - 可能还有一条尚未探索的最长路径。


编辑 - 当它不起作用的反例时(原谅我,我是一个可怕的ascii艺术家)

        A
      /   \
     /     \
    1       2  
   /         \
  B-----5---> C
V = {A,B,C} ;  E = { (A,B,1), (A,C,2), (B,C,5) }

现在,从A开始,此方法首先会找到C作为“最长路径”并关闭它。从现在开始 - 根据Dijkstra的算法,C没有变化,因此您将得出结论:从AC的最长路径长度为2,而路径{{1更长。