/****************************************************************************** * Compilation: javac NonrecursiveDFS.java * Execution: java NonrecursiveDFS graph.txt s * Dependencies: Graph.java Queue.java Stack.java StdOut.java * Data files: https://algs4.cs.princeton.edu/41graph/tinyCG.txt * https://algs4.cs.princeton.edu/41graph/tinyG.txt * https://algs4.cs.princeton.edu/41graph/mediumG.txt * * Run nonrecurisve depth-first search on an undirected graph. * Runs in O(E + V) time using O(V) extra space. * * Explores the vertices in exactly the same order as DepthFirstSearch.java. * * % java Graph tinyG.txt * 13 vertices, 13 edges * 0: 6 2 1 5 * 1: 0 * 2: 0 * 3: 5 4 * 4: 5 6 3 * 5: 3 4 0 * 6: 0 4 * 7: 8 * 8: 7 * 9: 11 10 12 * 10: 9 * 11: 9 12 * 12: 11 9 * * % java NonrecursiveDFS tinyG.txt 0 * 0 1 2 3 4 5 6 * * % java NonrecursiveDFS tinyG.txt 9 * 9 10 11 12 * ******************************************************************************/ import java.util.Iterator; /** * The {@code NonrecursiveDFS} class represents a data type for finding * the vertices connected to a source vertex s in the undirected * graph. *
* This implementation uses a nonrecursive version of depth-first search * with an explicit stack. * See {@link DepthFirstSearch} for the classic recursive version. * The constructor takes Θ(V + E) time in the worst * case, where V is the number of vertices and E is the * number of edges. * The {@link #marked(int)} instance method takes Θ(1) time. * It uses Θ(V) extra space (not including the graph). *
* For additional documentation,
* see Section 4.1
* of Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne.
*
* @author Robert Sedgewick
* @author Kevin Wayne
*/
public class NonrecursiveDFS {
private boolean[] marked; // marked[v] = is there an s-v path?
/**
* Computes the vertices connected to the source vertex {@code s} in the graph {@code G}.
* @param G the graph
* @param s the source vertex
* @throws IllegalArgumentException unless {@code 0 <= s < V}
*/
public NonrecursiveDFS(Graph G, int s) {
marked = new boolean[G.V()];
validateVertex(s);
// to be able to iterate over each adjacency list, keeping track of which
// vertex in each adjacency list needs to be explored next
Iterator