深度优先搜索问题

时间:2016-05-04 15:07:20

标签: java algorithm graph

我目前正在学习算法,并试图通过Robert Sedgewick的算法调整一些代码。以下是我遇到问题的代码部分的链接:http://algs4.cs.princeton.edu/44sp/DirectedCycle.java.html。 对于我的代码,依赖项是一个Vertex类,其构造函数只接受一个顶点数。我还有一个DirectedEdge类,它有一个fromVertex,一个toVertex和一个权重。最后,我有一个EdgeWeightedDigraph类,它有一个图表中的顶点列表和一个DirectedEdge邻接列表,它包含一个与特定顶点相邻的边的列表和一个测试类,它只是用数据初始化各种实例变量执行DirectedCycle.java程序。代码编译并运行,但使用书籍提供的数据(http://algs4.cs.princeton.edu/42digraph/tinyDG.txt)返回错误的循环。该书指定了一个有向周期:3 5 4 3但我的代码返回3 2 3。我注意到代码运行正常,直到遇到已标记的顶点和onStack else-if代码执行。由于某种原因,包含对dfs()的第一次调用的循环仅针对index = 0迭代一次,因此在遇到标记的顶点之后,它不会回溯其步骤并继续下一个顶点,因为它应该使用深度优先搜索。不知道我错过了什么,但任何帮助将不胜感激。如果您需要我包含上面列出的依赖类的其他代码,请告诉我。

这是我自己的代码:

import java.util.Stack;

public class DirectedCycle {

    private boolean[] marked;
    private Vertex[] edgeTo;
    private Stack<Vertex> cycle;
    private boolean[] onStack;

    public DirectedCycle(EdgeWeightedDigraph graph) {
        onStack = new boolean[graph.getNumOfVertices()];
        edgeTo = new Vertex[graph.getNumOfVertices()];
        marked = new boolean[graph.getNumOfVertices()];

        for (int index = 0; index < graph.getVertices().size(); index++) {
            if (!marked[index] && cycle == null) {
                dfs(graph, graph.getVertex(index));

            }
        }

    }

    private void dfs(EdgeWeightedDigraph graph, Vertex vertex) {

        onStack[vertex.getVertexNumber()] = true;
        marked[vertex.getVertexNumber()] = true;

        for (DirectedEdge w : graph.adjacent(vertex)) {

            if (this.hasCycle()) {
                return;
            }
            else if (!marked[w.toVertex().getVertexNumber()]) {

                edgeTo[w.toVertex().getVertexNumber()] = vertex;
                dfs(graph, w.toVertex());

            }
            else if (onStack[w.toVertex().getVertexNumber()]) {

                cycle = new Stack<>();

                for (Vertex v = vertex; 
                         v.getVertexNumber() != w.toVertex().getVertexNumber(); 
                         v = edgeTo[v.getVertexNumber()]) {

                    cycle.push(v);
                }

                cycle.push(w.toVertex());
                cycle.push(vertex);
            }

        }

        onStack[vertex.getVertexNumber()] = false;

    }


    public boolean hasCycle() {
        return cycle != null;
    }

    public Iterable<Vertex> cycle() {
        return cycle;
    }

}

0 个答案:

没有答案