protected: // overridden functions
virtual void startVisit(const Vertex& v) { } // first visit to v
virtual void finishVisit(const Vertex& v) { } // finished with v
// discover edge e
virtual void traverseDiscovery(const Edge& e, const Vertex& from) { }
// back edge e
virtual void traverseBack(const Edge& e, const Vertex& from) { }
virtual bool isDone() const { return false; } // done early?
protected: // marking utilities
void markVisited(const Vertex& v) { v.set("status", visited); }
void markVisited(const Edge& e) { e.set("status", visited); }
void markUnvisited(const Vertex& v) { v.set("status", unvisited); }
void markUnvisited(const Edge& e) { e.set("status", unvisited); }
bool isVisited(const Vertex& v) { return v.get("status") == visited; }
bool isVisited(const Edge& e) { return e.get("status") == visited; }