/* DepthFirstDirectedGraphTraversal - Decompiled by JODE
 * Visit http://jode.sourceforge.net/
 */
package salvo.jesus.graph.algorithm;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;

import salvo.jesus.graph.DirectedEdge;
import salvo.jesus.graph.DirectedGraph;
import salvo.jesus.graph.Vertex;
import salvo.jesus.graph.Visitor;

public class DepthFirstDirectedGraphTraversal extends GraphTraversal
{
    Stack stack;
    DirectedGraph dgraph;
    
    public DepthFirstDirectedGraphTraversal(DirectedGraph directedgraph) {
	super((salvo.jesus.graph.Graph) directedgraph);
	dgraph = directedgraph;
	stack = new Stack();
    }
    
    public int traverse(Vertex vertex, Vector vector, Visitor visitor) {
	stack.push(vertex);
	do {
	    Vertex vertex_0_ = (Vertex) stack.pop();
	    vector.add(vertex_0_);
	    if (!visitor.visit(vertex_0_))
		return -1;
	    Vector vector_1_ = dgraph.getOutgoingEdges(vertex_0_);
	    Iterator iterator = vector_1_.iterator();
	    while (iterator.hasNext()) {
		DirectedEdge directededge = (DirectedEdge) iterator.next();
		Vertex vertex_2_ = directededge.getOppositeVertex(vertex_0_);
		if (!vector.contains(vertex_2_) && !stack.contains(vertex_2_))
		    stack.push(vertex_2_);
	    }
	} while (!stack.isEmpty());
	return 1;
    }
    
    public Vector traverse(Vertex vertex) {
	return traverse(vertex, new Visitor());
    }
    
    public Vector traverse(Vertex vertex, Visitor visitor) {
	Vector vector = new Vector();
	traverse(vertex, vector, visitor);
	return vector;
    }
}
