当前位置: 首页 > 知识库问答 >
问题:

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

于飞飙
2023-03-14

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

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

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

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

谢谢

共有2个答案

何峰
2023-03-14

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

让拓扑排序后顶点的索引为 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

南门正业
2023-03-14

我认为你应该做的是计算一个根到一片叶子的所有最短路径,然后取计算出的最长路径。一般来说,这将是一个困难的问题,但幸运的是,你使用的是有向无环图。实际上,由于这种限制,该算法将执行得非常好。下面的代码可能对你有所帮助,它是用yWorks开发的,取自这个网站:

// 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;
  }
}
 类似资料:
  • 我能够使用这个算法在一个加权DAG中找到最长的路径(使用拓扑排序,然后放松每个边)。我现在的问题是,是否有一个算法来找到DAG的前3个最长的路径?或者,有没有实现这种算法的javascript或java库?

  • 我知道Bellman Ford算法使用负权值,但我希望我可以修改我现有的最短路径方法。

  • 我需要找到图中最长的路径基于边权值。对于图像上的图,它应该是4,5,3,2,1(顺序无关紧要),最好的算法是什么?如果您知道,在您的图中,每个节点都有一个对图中任何其他节点的引用(边)。算法应该改变吗?

  • 我遇到了一个问题,我必须找出给定图形中的最长路径。我有一个边列表(例如,{AB,BC}),它表明在顶点/节点(A,B,C)之间有一条边。现在我想计算出可能的最长路径(不重复顶点),这样它可以覆盖从任何顶点/节点开始的最大节点。 解决这个问题的最佳方法是什么?我必须把它作为一个计划来实施。 我在谷歌上查找最小生成树、Dijkstra的算法等等。但我想不出什么最适合解决这个问题。 任何帮助或阅读参考资

  • 我想在有向(无环)图中找到最长的路径。假设我知道起始节点-汇。路径应该从这一点开始。我在想我可以将边的权重设置为-1。有很多方法可以找到所有最短的路径,但你必须通过终点。有没有可能得到最短的路径(无论最终节点如何)? 假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。

  • 给出了一个图G=(V,E),它是正加权的,有向的,无圈的。我设计了一个在O(k(m+n))中运行的算法,用于报告从s到T的k-边最短路径。k-边最短路径定义为从s到t的具有k条边的路径,并且对于从s到t的所有路径,该路径的总权也必须是最小的。 由于BFS不能单独用于寻找最短路径(除非权重相等),我认为运行时间意味着使用BFS寻找具有k条边的路径。让我感到困惑的是k,因为我认为它意味着表演BFS k