#include #include #include #include template class DataClass { public: ~DataClass() { delete distance; delete parents; } int count = 0; std::map *distance = new std::map; std::map *parents = new std::map;; Vertex current_vertex = -1; }; template class BfsVisitor { public: void ExamineVertex(const Vertex &vertex) { data_class_->current_vertex = vertex; void DiscoverVertex(const Vertex &vertex) { if (data_class_->current_vertex == -1) { data_class_->parents->insert(std::make_pair(vertex, vertex)); data_class_->distance->insert(std::make_pair(vertex, 0)); } else { data_class_->parents->insert(std::make_pair (vertex, data_class_->current_vertex)); data_class_->distance->insert(std::make_pair (vertex, data_class_->distance->at (data_class_->current_vertex) + 1)); } } size_t DistanceTo(const Vertex &target) const { return data_class_->distance->at(target); } Vertex Parent(const Vertex &vertex) const { return data_class_->parents->at(vertex); } ~BfsVisitor() { data_class_->count++; if (data_class_->count == 2) delete data_class_; } private: DataClass *data_class_ = new DataClass(); }