diff --git a/include/algorithm/decremental_reachability.h b/include/algorithm/decremental_reachability.h index 1258a6c..c09ffcb 100644 --- a/include/algorithm/decremental_reachability.h +++ b/include/algorithm/decremental_reachability.h @@ -8,7 +8,7 @@ namespace algo { template class DecrementalReachability { public: - virtual ~DecrementalReachability() {}; + virtual ~DecrementalReachability() = default; // This method is implemented and executed by all roditty and zwick // algorithms, it constructs the data structures used in other operations diff --git a/include/algorithm/frigioni.h b/include/algorithm/frigioni.h index bd5102f..933c42e 100644 --- a/include/algorithm/frigioni.h +++ b/include/algorithm/frigioni.h @@ -6,8 +6,6 @@ #include -using namespace graph; - namespace algo { template @@ -15,7 +13,7 @@ class Frigioni : public DecrementalReachability { public: Frigioni() = default; - Frigioni(Digraph G) { this->G = G; } + explicit Frigioni(graph::Digraph G) { this->G = G; } // Initialize the decremental maintenance data structure for general graphs void init() override; diff --git a/include/algorithm/henzinger_king.h b/include/algorithm/henzinger_king.h index 2fd5c2d..95031a8 100644 --- a/include/algorithm/henzinger_king.h +++ b/include/algorithm/henzinger_king.h @@ -4,8 +4,6 @@ #include "algorithm/dynamic_reachability.h" #include "algorithm/frigioni.h" -using namespace graph; - constexpr int threshold = 5; namespace algo { @@ -15,7 +13,7 @@ class HenzingerKing : public DynamicReachability { public: HenzingerKing() = default; - HenzingerKing(Digraph G) { this->G = G; } + explicit HenzingerKing(graph::Digraph G) { this->G = G; } // Initialize decremental maintenance data structure and the empty set S void init() override; @@ -57,7 +55,7 @@ bool HenzingerKing::query(const T& u, const T& v) { if (frigioni.query(u, v)) return true; - return std::any_of(S.begin(), S.end(), + return std::ranges::any_of(S.begin(), S.end(), [&](const T& w) { return In[w].adjList.contains(u) && Out[w].adjList.contains(v); diff --git a/include/algorithm/italiano.h b/include/algorithm/italiano.h index fc16aa0..ad6083d 100644 --- a/include/algorithm/italiano.h +++ b/include/algorithm/italiano.h @@ -6,8 +6,6 @@ #include -using namespace graph; - namespace algo { template @@ -15,7 +13,7 @@ class Italiano : public DecrementalReachability { public: Italiano() = default; - Italiano(Digraph G) { this->G = G; } + explicit Italiano(graph::Digraph G) { this->G = G; } // Initialize the decremental maintenance data structure for DAGs void init() override; diff --git a/include/algorithm/king.h b/include/algorithm/king.h index 12040d3..8681253 100644 --- a/include/algorithm/king.h +++ b/include/algorithm/king.h @@ -4,8 +4,6 @@ #include "algorithm/dynamic_reachability.h" #include "algorithm/italiano.h" -using namespace graph; - namespace algo { template @@ -13,7 +11,7 @@ class King : public DynamicReachability { public: King() = default; - King(Digraph G) { this->G = G; } + explicit King(graph::Digraph G) { this->G = G; } // Initialize decremental maintenance data structures for DAGs for each // vertex's in and out reachability trees @@ -50,7 +48,7 @@ void King::init() { template bool King::query(const T& u, const T& v) { - return std::any_of(this->G.vertices().begin(), this->G.vertices().end(), + return std::ranges::any_of(this->G.vertices().begin(), this->G.vertices().end(), [&](const T& w) { return In[w].query(w, u) && Out[w].query(w, v); }); diff --git a/include/algorithm/roditty_zwick.h b/include/algorithm/roditty_zwick.h index 7e71e33..e6f1b67 100644 --- a/include/algorithm/roditty_zwick.h +++ b/include/algorithm/roditty_zwick.h @@ -5,8 +5,6 @@ #include "algorithm/tarjan.h" #include "graph/breadth_first_tree.h" -using namespace graph; - namespace algo { template @@ -14,7 +12,7 @@ class RodittyZwick : public DecrementalReachability { public: RodittyZwick() = default; - RodittyZwick(Digraph G) { this->G = G; } + explicit RodittyZwick(graph::Digraph G) { this->G = G; } // void init() override; diff --git a/include/algorithm/tarjan.h b/include/algorithm/tarjan.h index 018a8c8..9501548 100644 --- a/include/algorithm/tarjan.h +++ b/include/algorithm/tarjan.h @@ -7,8 +7,6 @@ #include #include -using namespace graph; - namespace algo { template @@ -16,7 +14,7 @@ class Tarjan { public: Tarjan() = default; - Tarjan(std::unordered_map> adjList) : adjList(adjList) {} + explicit Tarjan(std::unordered_map> adjList) : adjList(adjList) {} // auto execute(); @@ -27,7 +25,7 @@ private: std::unordered_map> adjList; std::stack S; std::int16_t index = 0; - std::vector> SCCs; + std::vector> SCCs; T cid; struct Vertex { diff --git a/include/graph/digraph.h b/include/graph/digraph.h index 4c2689e..371659a 100644 --- a/include/graph/digraph.h +++ b/include/graph/digraph.h @@ -11,7 +11,7 @@ class Digraph : public Graph { public: Digraph() = default; - Digraph(std::unordered_map> G); + explicit Digraph(std::unordered_map> G); // Return true if there is a path from u to v bool contains(const T& u, const T& v); diff --git a/include/graph/graph.h b/include/graph/graph.h index 3968c8d..c30462b 100644 --- a/include/graph/graph.h +++ b/include/graph/graph.h @@ -15,7 +15,7 @@ template std::ostream& operator<<(std::ostream& os, Graph& G); template class Graph { public: - ~Graph(); + virtual ~Graph() = default; // Return true if there is a path from u to v virtual bool contains(const T& u, const T& v) =0; @@ -41,11 +41,6 @@ public: friend std::ostream& operator<<<>(std::ostream& os, Graph& G); }; -template -Graph::~Graph() { - adjList.clear(); -} - template auto Graph::vertices() { return std::views::keys(adjList); @@ -62,7 +57,7 @@ std::uint16_t Graph::E() { for (const auto& u : vertices()) { edges += static_cast(adjList[u].size()); } - return static_cast(edges); + return edges; } template