如何遍历图表“前进”和“后退”?

时间:2018-04-11 14:51:25

标签: java graph-traversal jgrapht

我正在使用

调查Graphs / Graph Traversals
compile 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内看不到任何明显的方法?

是否可以进行反向图遍历? (逻辑?)

2 个答案:

答案 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个堆栈backfront。如果您使用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