template <typename Graph>
class FindPathDFS : public DFS<Graph> { // find a path by DFS
protected: // local types
typedef typename Graph::Vertex Vertex;
typedef typename Graph::VertexSequence VertexSequence;
private: // local data
Vertex target; // the target vertex
bool pathDetected; // is target found?
VertexSequence path; // path storage
protected: // overridden functions
virtual void startVisit(const Vertex& v) { // visit vertex
path.insertLast(v); // insert into path
if (v == target) // target vertex seen?
pathDetected = true; // path is detected
}
virtual void finishVisit(const Vertex& v) { // done with vertex
if (!pathDetected)
path.remove(path.last()); // remove if not on path
}
virtual bool isDone() const // are we done yet?
{ return pathDetected; }
public:
FindPathDFS(const Graph& g) // constructor
: DFS<Graph>(g), path() { }
// find path from s to t
VertexSequence run(const Vertex& s, const Vertex& t) {
initialize(); // initialize DFS
target = t; // t is the target
path = VertexSequence(); // reset path sequence
pathDetected = false;
dfsTraversal(s); // do the search
return path; // return the path
}
};