我有一个带加权边的有向图(权重都是正数)。
现在,我正在寻找一种有效的算法或代码(特别是C#)来找到两个给定顶点之间的最长路径。
答案 0 :(得分:7)
这完全等同于具有所有负权重的最短路径算法。要做到这一点,你需要验证没有负重量循环(在你的原始情况下可能相当于验证没有正重量循环)。最好的办法是采用权重的加法逆运算并运行Bellman-Ford,然后取结果的加法逆。
答案 1 :(得分:3)
因此,我们假设您的意思是有向无环图(DAG)。在线性时间内,您可以计算从起始顶点到每个顶点v的最长路径,假设您知道每个u的最长路径,对于每个u,其中u-> v直接。这很简单 - 您可以在有向图上进行深度优先搜索,并以与访问它们相反的顺序计算顶点的最长路径。您还可以使用3色标记检测整个DFS的后边缘(已打开但未完成的顶点为灰色)。有关详细信息,请再次参阅Wikipedia。 DAG上的最长/最短路径查找有时被称为维特比算法(即使假定特定类型的DAG给出它)。
我首先尝试线性时间动态编程解决方案。如果你确实有周期,那么Bellman-Ford无论如何都无法解决你的问题。
答案 2 :(得分:2)
请参考QuickGraph project,因为它提供了实现图形的.NET数据结构,并提供了对这些数据结构进行操作的算法。我确定您要查找的算法是在库中实现的。
答案 3 :(得分:0)
以防它帮助任何人,因为我正在寻找这一段时间但却找不到它,我使用QuickGraph解决了一个问题,我必须找到一条也符合条件的最长路径某种规则。它不是很优雅,因为我在得到第一个结果后对蛮力做了一点,但现在就是。
要获得最长路径,请使用算法查找长度为lenghts = -1的最短路径。然后找到后续最长的路径,我开始从那个最长的路径中删除边缘,看看我是否设法得到一个“更好”(基于问题的条件)最长的路径。