Adding DAG implementation

This commit is contained in:
Ian Roddis
2021-06-02 13:57:11 -03:00
parent 44585ed339
commit 08f80a3113

View File

@@ -0,0 +1,59 @@
template<typename T>
void DAG<T>::addVertex(T id) {
if (vertices.find(id) != vertices.end())
throw std::runtime_error("Vertex already exists in graph");
vertices.emplace(id, Vertex{});
roots.insert(id);
}
template<typename T>
void DAG<T>::dropVertex(const T & id) {
auto it = vertices.find(id);
auto vert = vertices.extract(id);
for (auto cid : vert.children) dropEdge(id, cid);
for (auto pid : vert.parents) dropEdge(pid, id);
// Remove anything
roots.extract(id);
}
template<typename T>
void DAG<T>::dropEdge(const T & from, const T & to) {
auto & src = vertices.at(from);
auto & dst = vertices.at(to);
src.children.extract(to);
dst.parents.extract(from);
roots.extract(to);
}
template<typename T>
void DAG<T>::addEdge(const T & from, const T & to) {
auto & src = vertices.at(from);
auto & dst = vertices.at(to);
// Add the edge
src.children.insert(to);
dst.parents.insert(from);
}
template<typename T>
std::deque<T> DAG<T>::shortest_path(const T & from, const T & to) {
std::deque<T> subpath;
if (from == to) return {to};
auto & src = vertices.at(from);
for (const auto & cid : src.children) {
auto pth = shortest_path(cid, to);
if (subpath.size() == 0 or subpath.size() > pth.size())
subpath.swap(pth);
}
subpath.push_front(from);
return subpath;
}