我有一个有权重的有向图(所有权重均为正数)。
现在,我正在寻找一种高效的算法或代码(特别是C#),以找到两个给定顶点之间的最长路径。
现在,我正在寻找一种高效的算法或代码(特别是C#),以找到两个给定顶点之间的最长路径。
这与一个具有所有负权重的最短路径算法完全相同。为了做到这一点,您需要验证是否存在负权重环(在您的原始情况下,这可能等价于验证是否存在正权重环)。最好的方法是取权重的加法逆元并运行Bellman-Ford算法,然后取结果的加法逆元。
David Berger的回答是正确的,除非您指的是一条简单路径,在这种情况下,Bellman-Ford算法将无法给出最长路径。由于您说权重为正,当图形具有循环(可从源到达)时,最长路径不存在,除非您指的是简单路径。最长简单路径问题是NP完全问题。请参见Wikipedia。
因此,假设您指的是有向无环图(DAG)。在线性时间内,您可以计算从起始顶点s到每个顶点v的最长路径,前提是您知道从s-> *u到每个u的最长路径,其中u-> v直接。这很容易 - 您可以在有向图上进行深度优先搜索,并按访问它们的相反顺序计算顶点的最长路径。您还可以使用3色标记(已打开但未完成的顶点为灰色)在DFS期间检测回边。再次参见Wikipedia以获取更多信息。在DAG上查找最长/最短路径有时称为维特比算法(尽管它是假定特定类型的DAG而给出的)。如果有人需要的话,我分享一下我的经验。我曾经花了很长时间寻找解决方案,但最终找到了QuickGraph。我用它来解决一个问题,即查找符合某个规则的最长路径。虽然我在得到第一个结果后采用了一些暴力方法,但这并不是非常优雅的解决方案。以下是我的具体做法。
为了获得最长路径,您可以使用算法来查找长度为-1的最短路径。然后,为了找到后续的最长路径,我开始从该最长路径中删除边缘,以查看是否能够获得“更好”的(基于问题条件)最长路径。