/** Generic depth first search traversal of a graph using the template
* method pattern. A subclass should override various methods to add
* functionality to this traversal. */
public abstract class DFS {
/** The graph being traversed. */
protected InspectableGraph G;
/** The result of the traversal. */
protected Object visitResult;
/** Perform a depth first search traversal.
* @param g Input graph.
* @param start Start vertex of the traversal.
* @param info Auxiliary information (to be used by subclasses).
*/
public Object execute(InspectableGraph g, Vertex start, Object info) {
G = g;
for (PositionIterator pos = G.positions(); pos.hasNext(); )
unVisit(pos.nextPosition());
return null;
}
/**
* Recursive template method for a generic DFS traversal.
* @param v Start vertex of the traversal.
*/
protected Object dfsTraversal(Vertex v) {
initResult();
startVisit(v);
visit(v);
for (EdgeIterator inEdges = G.incidentEdges(v); inEdges.hasNext(); ) {
Edge nextEdge = inEdges.nextEdge();
if (!isVisited(nextEdge)) { // found an unexplored edge, explore it
visit(nextEdge);
Vertex w = G.opposite(v, nextEdge);
if (!isVisited(w)) { // w is unexplored, this is a discovery edge
traverseDiscovery(nextEdge, v);
if (!isDone())
visitResult = dfsTraversal(w);
}
else // w is explored, this is a back edge
traverseBack(nextEdge, v);
}
}
finishVisit(v);
return result();
}