#include template class BfsVisitor { public: BfsVisitor() { parents_.clear(); } void ExamineVertex(const Vertex& vertex) { current_vertex_ = vertex; } void DiscoverVertex(const Vertex& vertex) { if (parents_.empty()) { current_vertex_ = vertex; parents_.insert({vertex, current_vertex_}); } else if (parents_.find(vertex) == parents_.end()) { parents_.insert({vertex, current_vertex_}); } } size_t DistanceTo(const Vertex& target) const { size_t counter = 0; Vertex current_target = target; while (true) { Vertex parent_of_target = parents_.at(current_target); if (parent_of_target == current_target) { return counter; } ++counter; current_target = parent_of_target; } } Vertex Parent(const Vertex& vertex) const { return parents_.at(vertex); } private: static std::unordered_map parents_; Vertex current_vertex_; }; template std::unordered_map BfsVisitor::parents_ = std::unordered_map();