以下是使用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的东西,但它看起来只适用于迭代器,比如BreadthFirstIterator。
答案 0 :(得分:1)
使用DijkstraShortestPath
类看起来没有设施。这是因为遍历侦听器被添加到图迭代器中,并且DijkstraShortestPath
使用的迭代器无法访问。
因此,唯一的解决方案是将DijkstraShortestPath
代码复制到一个新类(让我们称之为MyDijkstraShortestPath
)并添加遍历监听器。
首先,您需要创建一个继承自MyTraversalListener
的类TraversalListenerAdapter
,并覆盖您想要的方法。
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>());