#include template class BfsVisitor { public: void ExamineVertex(const Vertex& vertex) { current_vertex_ = vertex; } void DiscoverVertex(const Vertex& vertex) { if (!root_is_found_) { root_is_found_ = true; current_vertex_ = vertex; } parent_[vertex] = current_vertex_; } size_t DistanceTo(const Vertex& target) const { size_t counter = 0; Vertex current_target = target; while (true) { Vertex parent_of_target = parent_[current_target]; if (parent_of_target == current_target) { return counter; } else { ++counter; current_target = parent_of_target; } } } Vertex Parent(const Vertex& vertex) const { return parent_[vertex]; } private: map parent_; Vertex current_vertex_; bool root_is_found_ = false; }