我目前正在学习算法,并试图通过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;
}
}