是否有任何算法可以找到DAG中的所有关键路径?

时间:2013-08-26 17:55:39

标签: algorithm directed-acyclic-graphs

我正在写一篇关于某些图算法(在CPM中使用)的论文,我需要一些算法的名称,它可以找到DAG中的所有关键路径。我看过Floyd - Warshall算法,我不知道它是否有助于找到DAG中的所有关键路径。如果关键路径和最长路径是相同的,那么Floyd - Warshall算法可以通过查找图中所有最长而非最短路径的方式进行修改。即使它可以被修改,有没有更好的方法来找到所有关键路径?

2 个答案:

答案 0 :(得分:2)

为了找到一条关键路径,Floyd - Warshall的负权重明显低于以下民俗(?)算法,该算法以线性时间计算每个顶点最长路径的长度。

for vertices v in topological order (sinks before sources):
    set longest-path(v) := the maximum of 0 and length(v->w) + longest-path(w) for all arcs v->w

Floyd - Warshall版本会在计算longest-path(v) := the maximum of -distance(v, w) for all vertices w数组后设置distance

要查找关键路径的所有,请计算longest-path数组,并仅保留v->w这样的弧longest-path(v) = length(v->w) + longest-path(w),枚举其中的所有路径使用递归的残差DAG。

答案 1 :(得分:1)

这可以通过消除所有权重来完成Floyd Warshall(因为它是DAG,不会有任何负循环)。但是,Floyd Warshall是O(n^3),而存在更快的线性时间算法。

来自Wikipedia

  

加权图中两个给定顶点s和t之间的最长路径   G与图G中的最短路径相同,G是从G得到的   将每一个重量都改为否定。因此,如果路径最短   可以在-G中找到,然后在G中也可以找到最长的路径。[4]对于   大多数图表,这种转换因其创建而无用   -G中负长度的循环。但如果G是有向无环图,   那么就不能创建负循环,G中的最长路径也可以   通过应用最短的线性时间算法找到线性时间   -G中的路径,也是有向无环图。[4]例如,   对于给定DAG中的每个顶点v,最长路径的长度   以v结尾可以通过以下步骤获得:

     

找一个拓扑   给定DAG的排序。对于DAG的每个顶点v,在   拓扑排序,计算以...结尾的最长路径的长度   v通过查看其传入的邻居并将其添加到最大值   为这些邻居记录的长度。如果v没有传入的邻居,   将以v结尾的最长路径的长度设置为零。在任何一个   case,记录这个数字,以便算法的后续步骤可以   访问它。

     

完成此操作后,整个DAG中的最长路径   可以通过从具有最大记录的顶点v开始来获得   值,然后反复踩到它的传入邻居   具有最大记录值,并逆转序列   以这种方式找到的顶点。

请注意,查找所有最长路径更有问题,因为它们可能存在指数级数。因此,没有最坏情况下有效的列出它们的方法,尽管它们可以很容易地被枚举或隐式表示。