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

jgrapht库中有向无环图的最长路径

许胡非
2023-03-14

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

DirectedAcyclicGraph graph = new DirectedAcyclicGraph<Integer, DefaultEdge>(DefaultEdge.class);
graph.addVertex(1);
graph.addVertex(2);
graph.addVertex(3);
graph.addVertex(4);
graph.addVertex(5);
graph.addVertex(6);
graph.addVertex(7);
graph.addVertex(8);
try {
    graph.addDagEdge(1, 2);
    graph.addDagEdge(2, 3);
    graph.addDagEdge(3, 4);
    graph.addDagEdge(5, 6);
graph.addDagEdge(2, 7);
graph.addDagEdge(7, 8);
} catch(Exception e) {

}
//????????????????

假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。

共有2个答案

石超
2023-03-14

您可以使用AllDirectedPaths算法解析所有路径,按路径长度按相反顺序对结果排序,并获得第一个:

    AllDirectedPaths<String, DefaultEdge> paths = new AllDirectedPaths<String, DefaultEdge>(graph);
    GraphPath<String, DefaultEdge> longestPath = paths.getAllPaths(source, target, true, null)
        .stream()
        .sorted((GraphPath<String, DefaultEdge> path1, GraphPath<String, DefaultEdge> path2)-> new Integer(path2.getLength()).compareTo(path1.getLength()))
        .findFirst().get();
    System.out.println(longestPath.getLength() +  " " + longestPath);
曹旭东
2023-03-14

我正在寻找一个类似问题的答案,以从Git存储库的DAG计算Jenkins中的并行构建分组。为了解决这个问题,我应用了这里和这里描述的算法。下面的代码是用Groovy编写的,所以你必须转换为Java。结果是顶点到其各自最大深度的映射。从中,您可以获得单个最大值。相反,如果您想知道图形中特定顶点的最大深度,则可以先将图形修剪为以所需源顶点为基础的子图,然后在子图上运行下面的方法。

def calcDepths(g) {    

    Map<String, Integer> vertexToDepthMap = new HashMap<>()

    Iterator<String> iterator = new TopologicalOrderIterator<String, DefaultEdge>(g)
    iterator.each { v ->

        Set<String> predecessors = Graphs.predecessorListOf(g, v).toSet()
        Integer maxPredecessorDepth = -1
        predecessors.each { predecessor ->

            maxPredecessorDepth = Math.max(maxPredecessorDepth, vertexToDepthMap.get(predecessor))
        }

        vertexToDepthMap.put(v, maxPredecessorDepth + 1)
    }

    return vertexToDepthMap
}
 类似资料:
  • 我试图将这个问题概念化,然后为它编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写下我的想法来重申这个问题,我希望从你们那里得到一些反馈。谢谢 我的想法:对于每个叶节点,找到从根节点到它的最长路径。对于所有路径,找到最大路径长度 然而,这不就是蛮力吗,对此还有更优雅的解决方案吗? 我听说过使用Djikstra的负权重算法,但在某些地方它说这只适用于特定情况?我也看到了关

  • 我需要为一组有向无环图找到从节点 0 开始的最长路径。我正在使用维基百科中的最长路径问题算法。我已经让算法适用于大多数图形,但对于其他图形,它没有给出正确的结果。算法为: 图形实现使用邻接列表来存储图形。如果我传递一个图,例如: 我得到的答案5,这是正确的。但是,如果我通过图表: 然后我得到2,而正确答案应该是3。 我使用的TopSort2算法是: DFS 算法包括:

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

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

  • 我是OGDF库的新手,需要在无环有向图中找到最长的路径(我想使用函数中内置的OGDF)。我知道,用负权值的最短路径算法可以找到最长的路径,但也找不到合适的函数。OGDF是否有特定的功能来做到这一点?如果是,我如何使用它?

  • 给出了一个边上具有任意权的有向无环图和两个特定结点s和t,其中s的内度和t的外度为0。如何确定成本为正的s到t的最短路径?