Dijkstra算法是解决最短路径问题的最快算法之一。在我的情况下,网络由节点组成,其中边缘的权重是我获得的利润。我想知道我是否可以逆转Dijkstra的算法来解决这个问题,但我意识到如果我们在一个闭环中运行会是什么(因为成本会越来越多,它会永远持续下去)。我知道如何解决它作为一个整数编程问题所以我可以验证算法的正确性(不幸的是不正确)。这是我一直在使用的Dijkstra的伪代码。什么是正确的修改?
ln=∞ for all n∈N∖{s}, ls=0
N′={s}, N′′=∅
repeat
n=argminn′∈N′ln′ N′=N′∖{n}, N′′=N′′∪{n}
for all (n,m)∈A with m∈N∖N′′ do
if lm>ln+cn,m then
lm=ln+cn,m N′=N′∪{m}
end if
end for until (N′=∅ or t∈N′′)
答案 0 :(得分:3)
这属于Longest Path Problem的问题。换句话说,没有有效的方法可以在未加权图形结构中查找最大路径(在您的情况下,最大利润)。 然而,您提到它是一个加权图表,因此您仍然可以仍然有效地执行此操作如果您的图表是非循环的:
“加权图G中两个给定顶点s和t之间的最长路径与图G中的最短路径相同 - 通过将每个权重改为其否定来从G导出。因此,如果最短路径可以在-G中找到,然后最长的路径也可以在G中找到。对于大多数图形,此变换无用,因为它在-G中创建负长度的循环。但是如果G是a有向无环图,那么就不能创建负循环,并且通过在-G中对最短路径应用线性时间算法,可以在线性时间中找到G中的最长路径,这也是有向无环图。“ as见wiki article。
因此,如果您的图表是非循环的,您确实可以使用有效的算法来解决您的问题。但是,如果您的图表不是非循环的,那么就没有已知的有效算法。
答案 1 :(得分:3)
图表中最长的路径对应于负图中的最短路径,其中所有边权重都被否定,因此您可以使用Bellman-Ford来查找最长路径。
也可以修改Bellman-Ford以检查是否存在正循环:最后,再做一次迭代。如果一个节点放松,它可以从一个正循环中到达,你可以在最长的路径树中进行反向DFS来找到循环。
当然,如果你想找到一个最长的简单路径(没有边缘/节点重复),问题是NP难的,正如Rocks25指出的那样。