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

Java jgrapht库中有向无环图的最长路径,java,graph,shortest-path,jgrapht,longest-path,Java,Graph,Shortest Path,Jgrapht,Longest Path,我想在有向(非循环)图中找到最长路径。假设我知道开始节点-接收器。路径应该从此点开始。 我想我可以将边的权重设置为-1。有很多方法可以找到所有最短路径,但你必须通过终点。是否有可能获得最短路径(无论终点节点如何) directedacycgraph图形=新的directedacycgraph(DefaultEdge.class); 图.addVertex(1); 图.添加顶点(2); 图.添加顶点(3); 图.添加顶点(4); 图.添加顶点(5); 图.添加顶点(6); 图.添加顶点(7); 图

我想在有向(非循环)图中找到最长路径。假设我知道开始节点-接收器。路径应该从此点开始。 我想我可以将边的权重设置为-1。有很多方法可以找到所有最短路径,但你必须通过终点。是否有可能获得最短路径(无论终点节点如何)

directedacycgraph图形=新的directedacycgraph(DefaultEdge.class);
图.addVertex(1);
图.添加顶点(2);
图.添加顶点(3);
图.添加顶点(4);
图.添加顶点(5);
图.添加顶点(6);
图.添加顶点(7);
图.添加顶点(8);
试一试{
图1.addDagEdge(1,2);
图1.addDagEdge(2,3);
图3,4;
图5,6;
图2,7;
图7,8;
}捕获(例外e){
}
//????????????????
假设我想为节点nr1(sink)找到最长路径。所以这个算法应该给我1-2-3-4-5-6

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

    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);
AllDirectedPaths=新的AllDirectedPaths(图形);
GraphPath longestPath=path.GetAllPath(源、目标、真、空)
.stream()
.sorted((GraphPath path1,GraphPath path2)->新整数(path2.getLength()).compareTo(path1.getLength())
.findFirst().get();
System.out.println(longestPath.getLength()+“”+longestPath);

我在寻找一个类似问题的答案,从大量Git回购计算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
}
def calcDepths(g){
Map vertexdepthmap=newhashmap()
迭代器迭代器=新拓扑排序器(g)
迭代器.each{v->
Set preferences=Graphs.predecessorListOf(g,v).toSet()
整数maxPredecessorDepth=-1
Preferences.each{Preferences->
maxPredecessorDepth=Math.max(maxPredecessorDepth,VertextdepthMap.get(前置))
}
垂直深度贴图放置(v,最大前置深度+1)
}
返回顶点深度图
}

这让我想到,对于大型图形来说,这是多么低效……是的,此解决方案只能应用于短深度图形。
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
}