#include using std::map; template class BfsVisitor { private: static bool first_vertex; static Vertex current_vertex; static map dist; static map parent; public: BfsVisitor() { dist = map(); parent = map(); first_vertex = true; } void ExamineVertex(const Vertex& vertex) { if (first_vertex) { first_vertex = false; dist[vertex] = 0; parent[vertex] = vertex; current_vertex = vertex; return; } current_vertex = vertex; } void DiscoverVertex(const Vertex& vertex) { dist[vertex] = dist[current_vertex]+1; parent[vertex] = current_vertex; } size_t DistanceTo(const Vertex& target) const { return dist.at(target); } Vertex Parent(const Vertex& vertex) const { return parent.at(vertex); } }; template map BfsVisitor::dist = map(); template map BfsVisitor::parent = map(); template bool BfsVisitor::first_vertex = true; template T BfsVisitor::current_vertex = T();