我知道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)
有点困惑,真的很感激一些反馈
答案 0 :(得分:6)
longest path problem为NP-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
没有变化,因此您将得出结论:从A
到C
的最长路径长度为2,而路径{{1更长。