#include <cstddef>
#include <vector>
#include <map>
#include <utility>

template<class Vertex>
class DataClass {
public:
    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);
    }

private:
    DataClass<Vertex>* data_class_ = new DataClass<Vertex>();
};