我正在写一篇关于某些图算法(在CPM中使用)的论文,我需要一些算法的名称,它可以找到DAG中的所有关键路径。我看过Floyd - Warshall算法,我不知道它是否有助于找到DAG中的所有关键路径。如果关键路径和最长路径是相同的,那么Floyd - Warshall算法可以通过查找图中所有最长而非最短路径的方式进行修改。即使它可以被修改,有没有更好的方法来找到所有关键路径?
答案 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)
,而存在更快的线性时间算法。
加权图中两个给定顶点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开始来获得 值,然后反复踩到它的传入邻居 具有最大记录值,并逆转序列 以这种方式找到的顶点。
请注意,查找所有最长路径更有问题,因为它们可能存在指数级数。因此,没有最坏情况下有效的列出它们的方法,尽管它们可以很容易地被枚举或隐式表示。