簡體   English   中英

jgrapht-獲取所有遍歷節點的列表

[英]jgrapht - get list of all traversed nodes

以下是使用Dijkstra算法查找最短路徑的示例代碼:

public static void main(String args[]) {
    SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> graph = new SimpleDirectedWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class);
    graph.addVertex("vertex1");
    graph.addVertex("vertex2");
    graph.addVertex("vertex3");
    graph.addVertex("vertex4");
    graph.addVertex("vertex5");

    DefaultWeightedEdge e1 = graph.addEdge("vertex1", "vertex2");
    graph.setEdgeWeight(e1, 5);

    DefaultWeightedEdge e2 = graph.addEdge("vertex2", "vertex3");
    graph.setEdgeWeight(e2, 3);

    DefaultWeightedEdge e3 = graph.addEdge("vertex4", "vertex5");
    graph.setEdgeWeight(e3, 6);

    DefaultWeightedEdge e4 = graph.addEdge("vertex2", "vertex4");
    graph.setEdgeWeight(e4, 2);

    DefaultWeightedEdge e5 = graph.addEdge("vertex5", "vertex4");
    graph.setEdgeWeight(e5, 4);

    DefaultWeightedEdge e6 = graph.addEdge("vertex2", "vertex5");
    graph.setEdgeWeight(e6, 9);

    DefaultWeightedEdge e7 = graph.addEdge("vertex4", "vertex1");
    graph.setEdgeWeight(e7, 7);

    DefaultWeightedEdge e8 = graph.addEdge("vertex3", "vertex2");
    graph.setEdgeWeight(e8, 2);

    DefaultWeightedEdge e9 = graph.addEdge("vertex1", "vertex3");
    graph.setEdgeWeight(e9, 10);

    DefaultWeightedEdge e10 = graph.addEdge("vertex3", "vertex5");
    graph.setEdgeWeight(e10, 1);

    System.out.println("Shortest path from vertex1 to vertex5:");
    List<DefaultWeightedEdge> shortest_path = DijkstraShortestPath.findPathBetween(graph,"vertex1", "vertex5");
    System.out.println(shortest_path);
}

是否有可能獲得已到達並被算法標記為已訪問節點的列表? 我已經看到有一個稱為TraversalListener的東西,但它看起來僅適用於迭代器,例如Br​​eadthFirstIterator。

使用DijkstraShortestPath類似乎對此沒有任何DijkstraShortestPath 這是因為遍歷偵聽器已添加到圖形迭代器,並且DijkstraShortestPath使用的迭代器無法訪問。

這樣,唯一的解決方案是將DijkstraShortestPath代碼復制到新類中(我們將其MyDijkstraShortestPath )並添加遍歷偵聽器。

首先,您需要創建一個繼承自TraversalListenerAdapter的類MyTraversalListener ,並覆蓋所需的方法。

class MyTraversalListener<V, E> extends TraversalListenerAdapter<V, E> {
     // override the method you want, like vertexTraversed and edgeTraversed
}

然后,在新的MyDijkstraShortestPath類的構造函數中,我們需要添加它:

ClosestFirstIterator<V, E> iter =
    new ClosestFirstIterator<V, E>(graph, startVertex, radius);
iter.addTraversalListener(new MyTraversalListener<V, E>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM