#include <cstddef>
#include <vector>
#include <map>
#include <utility>
template<class Vertex>
class DataClass {
 public:
  ~DataClass() {
    delete distance;
    delete parents;
  }
  int count = 0;
  std::map<Vertex, int> *distance = new std::map<Vertex, int>;
  std::map<Vertex, Vertex> *parents = new std::map<Vertex, Vertex>;;
  Vertex current_vertex = -1;
};
template<class Vertex>
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<Vertex> *data_class_ = new DataClass<Vertex>();
};