template <typename Graph>
class DFS {
protected: // local types
typedef typename Graph::Vertex Vertex;
typedef typename Graph::Edge Edge;
typedef typename Graph::VertexIterator VertexIterator;
typedef typename Graph::EdgeIterator EdgeIterator;
protected: // member data
const Graph& G; // the graph
Object *visited, *unvisited; // decorator values
public:
DFS(const Graph& g) : G(g) // constructor
{ visited = new Object; unvisited = new Object; }
void initialize() { // initialize a new DFS
VertexIterator V = G.vertices(); // unmark everything
while (V.hasNext()) markUnvisited(V.nextVertex());
EdgeIterator E = G.edges();
while (E.hasNext()) markUnvisited(E.nextEdge());
}
virtual ~DFS()
{ delete visited; delete unvisited; } // destructor
protected: // marking utilities
void dfsTraversal(const Vertex& v) { // generic DFS search
startVisit(v); // visit v
markVisited(v); // mark v visited
EdgeIterator inEdges = G.incidentEdges(v);
while (inEdges.hasNext()) { // try all its edges
Edge e = inEdges.nextEdge();
if (!isVisited(e)) { // new edge?
markVisited(e); // mark it visited
Vertex w = G.opposite(v, e); // get next vertex
if (!isVisited(w)) { // unexplored?
traverseDiscovery(e, v); // let's discover it
if (!isDone())
dfsTraversal(w); // continue traversal
}
else // explored
traverseBack(e, v); // process back edge
}
}
finishVisit(v); // all done
}
// ... (insert overriden functions and marking utilities here)
};