如何计算方向非循环图的关键路径?

时间:2008-09-20 08:48:05

标签: algorithm graph-theory

当图的节点具有权重时,计算方向非循环图的关键路径的最佳(关于性能)方法是什么?

例如,如果我有以下结构:

            Node A (weight 3)
               /            \
     Node B (weight 4)      Node D (weight 7)
     /               \
Node E (weight 2)   Node F (weight 3)

关键路径应为A-> B-> F(总重量:10)

5 个答案:

答案 0 :(得分:5)

我会用动态编程解决这个问题。要查找从S到T的最大成本:

  • 拓扑将图的节点排序为S = x_0,x_1,...,x_n = T.(忽略任何可以到达S或从T到达的节点。)
  • 从S到S的最大成本是S的重量。
  • 假设您已计算出所有i <1的最大成本从S到x_i。 k,从S到x_k的最大成本是x_k的成本加上边缘为x_k的任何节点的最大成本。

答案 1 :(得分:2)

我对“关键路径”一无所知,但我认为你的意思是this

只能通过遍历整个树然后比较长度来查找带有权重的非循环图中的最长路径,因为您从未真正知道树的其余部分是如何加权的。您可以在Wikipedia找到有关树遍历的更多信息。我建议你进行预订遍历,因为它很容易直接实现。

如果您要经常查询,您可能还希望在插入时增加节点之间的边缘,并提供有关其子树权重的信息。这是相对便宜的,而重复遍历可能非常昂贵。

但是,如果你不这样做,没有什么可以真正拯救你完全遍历。只要您执行遍历并且永远不会两次使用相同的路径,顺序并不重要。

答案 2 :(得分:2)

有一篇论文声称有一个算法:“活动网络中有时间限制的关键路径”。可悲的是,我找不到免费副本的链接。除此之外,我只能提出修改http://en.wikipedia.org/wiki/Dijkstra%27s_algorithmhttp://en.wikipedia.org/wiki/A *

的想法

更新:我为糟糕的格式道歉 - 服务器端降价引擎显然已经坏了。

答案 3 :(得分:1)

我的第一个答案,请原谅堆栈溢出文化中的任何非标准事物。

我认为解决方案很简单。只需否定权重并运行DAG的经典最短路径(当然为顶点权重修改)。它应该运行得相当快。 (O(V + E)的时间复杂度可能)

我认为它应该起作用,当你否定权重时,最大的一个将变得最小,第二个最小的将是第二小的,依此类推a > b然后-a < -b。然后运行DAG应该足够了,因为它将找到被否定的最小路径的解决方案,从而找到原始路径的最长路径

答案 4 :(得分:0)

尝试A *方法。

A* Search Algorithm

最后,为了对付树叶,只需将它们全部引导到最后一点,然后设定为目标。