#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>();
};