#pragma once #include template class BfsVisitor { public: BfsVisitor() { distance.clear(); parent.clear(); is_start = true; } void ExamineVertex(const Vertex& vertex) { current_v = vertex; } void DiscoverVertex(const Vertex& vertex) { parent[vertex] = is_start ? vertex : current_v; distance[vertex] = is_start ? 0 : distance[current_v] + 1; is_start = false; } size_t DistanceTo(const Vertex& target) const { return distance[target]; } Vertex Parent(const Vertex& vertex) const { return parent[vertex]; } private: static bool is_start; static Vertex current_v; static std::map parent; static std::map distance; }; template std::map BfsVisitor::distance = std::map(); template std::map BfsVisitor::parent = std::map(); template bool BfsVisitor::is_start = true; template Vertex BfsVisitor::current_v = Vertex();