/** Generic depth first search traversal of a graph using the template method 
  * pattern. A subclass should override various methods to add functionality. */
public abstract class DFS {
  protected Graph G;                 // The graph being traversed
  protected Object visitResult;      // The result of the traversal
  protected static Object STATUS = new Object();    // The status attribute
  protected static Object VISITED = new Object();   // Visited value
  protected static Object UNVISITED = new Object(); // Unvisited value
  /** Execute a depth first search traversal on graph g, starting
    * from a vertex v, optionally passing in an information object (info) 
    */
  public abstract Object execute(Graph g, Vertex start, Object info);
  /** Initialize the graph g for a traversal. */
  protected void init(Graph g) {
    G = g;
    for(Iterator vertices = g.vertices(); vertices.hasNext(); )
      unVisit((DecorablePosition)vertices.next());
    for(Iterator edges = g.edges(); edges.hasNext(); )
      unVisit((DecorablePosition)edges.next());    
  }