我正在使用
调查Graphs / Graph Traversalscompile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.1.0'
使用下面的代码我可以创建一个简单的图表
final Graph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class);
directedGraph.addVertex("v1");
directedGraph.addVertex("v2");
directedGraph.addVertex("v3");
directedGraph.addVertex("v4");
directedGraph.addEdge("v1", "v4");
directedGraph.addEdge("v4", "v2");
directedGraph.addEdge("v2", "v3");
并遍历“前进”
TopologicalOrderIterator<String, DefaultEdge> topologicalOrderIterator = new TopologicalOrderIterator<>(directedGraph);
System.out.println("topologicalOrderIterator");
while (topologicalOrderIterator.hasNext()) {
System.out.println(topologicalOrderIterator.next());
}
然而,我还希望能够从任何顶点“回溯”我的步骤,并返回到图形的“开始”。
e.g。 topologicalOrderIterator.previous()
我在jgrapht-core
内看不到任何明显的方法?
是否可以进行反向图遍历? (逻辑?)
答案 0 :(得分:1)
TopologicalOrderIterator
没有previous()
方法。解决这个问题的一个简单方法是实现自己的迭代器,它扩展了TopologicalOrderIterator并维护了遇到的项目的内存。这是一个未经测试的,格式不佳的例子:
public class ReversibleTopoIterator extends TopologicalOrderIterator{
Stack<V> back=new ...
Stack<V> front=new ...
public V next(){
V v;
if(front.isEmpty())
v=super.next();
else
v=front.pop();
back.push(v);
return v;
}
public V previous(){
V v=back.pop();
front.push(v);
return v;
}
public boolean hasNext(){return !front.isEmpty() || super.hasNext()};
public boolean hasPrevious(){return !back.isEmpty()}
}
总之,您维护了2个堆栈back
和front
。如果您使用next()
方法继续前进,则先清空front
堆栈,然后向TopologicalOrderIterator
询问新元素。使用next()
获得的所有项目都会被推送到back
堆栈。同样,如果使用previous()
方法向后移动,则会弹出back
堆栈的项目。使用previous()
方法获得的所有项目都会被推送到front
堆栈。
答案 1 :(得分:1)
您可以使用 ptr.write
创建“边缘反转”视图(即源现在是目标,反之亦然),然后使用与普通图相同的迭代器。
https://jgrapht.org/javadoc/org.jgrapht.core/org/jgrapht/graph/EdgeReversedGraph.html
EdgeReversedGraph