从源到DAG中某些节点之间的最长路径

时间:2009-02-28 15:43:35

标签: algorithm directed-acyclic-graphs

如何找到从单一来源到所有最终目的地的最长路径 即对于源i1,给出i1之间最长的路径 - > o1和i1 - > O 2。

alt text

上图中描述的图例如下:  (i1,i2)是起始节点  (o1,o2)是结束节点  (1-8)是子图  边可能有+ ive / -ive权重

此网络中最长的路径按以下顺序排列:

最差路径:i1 - > 1 - > 4 - > O1

然后,所有路径i1 ... - > ...... o1

然后i1 - > 5 - > 6 - > O2

需要一种方法来忽略(i1 - > 3)或(3 - > 4)子网的选择,即使它们比i1长 - > 5

2 个答案:

答案 0 :(得分:4)

Wikipedia救援!他们关于这个问题的页面表明,在一般情况下,你的问题是NP-Complete。但是,由于您有一个定向的非循环图形,您可以反转所有边缘权重并运行Bellman-Ford algorithm来解决它。 B-F算法通常在图中计算单源最短路径。使用反向边权重,它应该产生最长的路径。

答案 1 :(得分:0)

我相信以下内容将为您提供到达目的地的最大步骤数(不是实际路径,只是步数)。这不考虑边缘权重。这可以通过从src开始合并节点,直到除了目标节点之外没有剩下的邻居。

longestPath (src, dest) =
    if (neighbors(src) == [dest]) then 1
    else 1 + longestPath(newNode(concat (map neighbors (neighbors src))), dest)