#ifndef GRAPH_H_ #define GRAPH_H_ #include #include #include #include namespace graph { // Forward declerations template class Graph; template std::ostream &operator<<(std::ostream &os, Graph &G); template class Graph { public: virtual ~Graph() = default; // Return true if there is a path from u to v virtual bool contains(const T &u, const T &v) = 0; // Add edge e(u,v) virtual void insert(const T &u, const T &v) = 0; // Remove edge e(u,v) virtual void remove(const T &u, const T &v) = 0; // Return graph vertices auto vertices() const; // Return num. of vertices std::uint16_t V(); // Return num. of edges std::uint16_t E(); // Adjacency matrix representation std::unordered_map> adjList; }; template auto Graph::vertices() const { return std::views::keys(adjList); } template std::uint16_t Graph::V() { return static_cast(adjList.size()); } template std::uint16_t Graph::E() { std::uint16_t edges = 0; for (const auto &u : vertices()) { edges += static_cast(adjList[u].size()); } return edges; } } // namespace graph #endif