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