#ifndef GRAPH_H_ #define GRAPH_H_ #include #include #include namespace graph { template class Graph { public: ~Graph(); // Add edge e(u,v) virtual void insert(const T& u, const T& v); // Return true if e(u,v) exists virtual bool contains(const T& u, const T& v); // Remove edge e(u,v) virtual void remove(const T& u, const T& v); // Return num. of vertices virtual std::uint16_t V(); // Return num. of edges virtual std::uint16_t E(); // Output graph virtual void output(); // Adjacency matrix representation std::set vertices; std::map> adjMatrix; }; template Graph::~Graph() { vertices.clear(); adjMatrix.clear(); } template inline void Graph::insert(const T& u, const T& v) { Graph::vertices.insert(u); Graph::vertices.insert(v); Graph::adjMatrix[u].insert(v); } template bool Graph::contains(const T& u, const T& v) { return adjMatrix[u].contains(v); } template void Graph::remove(const T& u, const T& v) { adjMatrix[u].erase(v); } template std::uint16_t Graph::V() { return static_cast(vertices.size()); } template std::uint16_t Graph::E() { std::uint16_t edges = 0; for (const auto& v : vertices) { edges += static_cast(adjMatrix[v].size()); } return static_cast(edges); } template void Graph::output() { for (const auto& v : vertices) { for (const auto& u : adjMatrix[v]) { std::cout << v << "->" << u << '|'; } std::cout << '\n'; } std::cout << '\n'; } } // namespace graph #endif