#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); // Return true if vertex u exists virtual bool contains(const T& u); // 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::map> adjMatrix; }; template Graph::~Graph() { adjMatrix.clear(); } template inline void Graph::insert(const T& u, const T& v) { Graph::adjMatrix[u].insert(v); Graph::adjMatrix[v]; } template bool Graph::contains(const T& u, const T& v) { return adjMatrix[u].contains(v); } template bool Graph::contains(const T& u) { return adjMatrix.contains(u); } template void Graph::remove(const T& u, const T& v) { adjMatrix[u].erase(v); } template std::uint16_t Graph::V() { return static_cast(adjMatrix.size()); } template std::uint16_t Graph::E() { std::uint16_t edges = 0; for (const auto& v : adjMatrix) { edges += static_cast(v.second.size()); } return static_cast(edges); } template void Graph::output() { for (const auto& v : adjMatrix) { for (const auto& u : v.second) { std::cout << v.first << "->" << u << '|'; } std::cout << '\n'; } std::cout << '\n'; } } // namespace graph #endif