/** 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();
}