加权有向无环图的最长路径

时间:2012-12-05 11:31:37

标签: graph directed-acyclic-graphs longest-path

我正在尝试将此问题概念化,然后为其编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写出我的想法来重申这个问题,我希望得到你们的一些反馈。谢谢!

我的想法: 对于每个叶节点     找到从根节点到它的最长路径 对于所有路径     找到最大路径长度

然而,这不是简单的蛮力吗?对此有更优雅的解决方案吗?

我听说过使用带有负权重的Djikstra算法,但是在某些地方它说这只适用于指定的情况?我也看过贝尔曼福特算法的建议,但是不是用来找到最短的路径吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你应该做的是计算根到叶子的所有最短路径,然后取最长的计算路径。一般来说,这将是一个难题,但幸运的是,您使用的是有向无环图。在实践中,由于这种限制,算法将表现得非常好。以下代码可能对您有所帮助,它是使用yWorks开发的,并取自此site

// To hold an edge list for every path. 
YList allShortestPaths = new YList();

// The actual number of proper shortest paths is unknown, so we start with a really great value for 'k'. 
YCursor pathCursor = ShortestPaths.kShortestPathsCursor(graph, edgeCostsDP, startNode, endNode, Integer.MAX_VALUE);
if (pathCursor.ok())
{
  // The first path between the two nodes having least costs. 
  final EdgeList firstPath = (EdgeList)pathCursor.current();
  final double costsOfFirstPath = calculateCostsForPath(firstPath, edgeCostsDP);

  allShortestPaths.add(firstPath);
  pathCursor.next();

  // Look further. 
  while (pathCursor.ok())
  {
    EdgeList currPath = (EdgeList)pathCursor.current();
    double currCosts = calculateCostsForPath(currPath, edgeCostsDP);
    // If the current path is also a proper shortest path with costs equal to those 
    // of the first path, then add it to the list. 
    if (!(currCosts > costsOfFirstPath))
    {
      allShortestPaths.add(currPath);
      pathCursor.next();
    }
    else
      break;
  }
}

答案 1 :(得分:2)

我们可以进行拓扑排序以获得有向无环图(DAG)的顶点的排序。一旦我们得到拓扑排序,我们就可以应用动态编程来获得DAG中最长的路径。

让toposort之后的顶点索引为0,1,2,....,n-1(图中总n个顶点)

设F [i]是在顶点i处结束的最长路径的值。

然后对于从i到j的每个输出边缘,我们可以将F [j]更新为F [j] = max(F [j],F [i] +1)

我们可以从将所有F [i]初始化为零开始 然后从i = 1循环到n-1

最终答案是max {F [i]} 0< = i< = n-1