我正在尝试将此问题概念化,然后为其编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写出我的想法来重申这个问题,我希望得到你们的一些反馈。谢谢!
我的想法: 对于每个叶节点 找到从根节点到它的最长路径 对于所有路径 找到最大路径长度
然而,这不是简单的蛮力吗?对此有更优雅的解决方案吗?
我听说过使用带有负权重的Djikstra算法,但是在某些地方它说这只适用于指定的情况?我也看过贝尔曼福特算法的建议,但是不是用来找到最短的路径吗?
谢谢!
答案 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