/** Recursive template method for a generic DFS traversal. * @param v Start vertex of the traversal * @return result of the traversal */ protected Object dfsTraversal(Vertex v) { initResult(); if (!isDone()) startVisit(v); if (!isDone()) { visit(v); for (Iterator inEdges = G.incidentEdges(v); inEdges.hasNext(); ) { Edge nextEdge = (Edge) inEdges.next(); 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()) break; visitResult = dfsTraversal(w); if (isDone()) break; } else { // w is explored, this is a back edge traverseBack(nextEdge, v); if (isDone()) break; } } } } if(!isDone()) finishVisit(v); return result(); }