#ifndef GRAPH_H_ #define GRAPH_H_ #include #include #include namespace graph { template class Graph { public: ~Graph(); // Add edge between v and u virtual void insert(const T& v, const T& u); // Number of vertices virtual std::uint16_t V(); // Number 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& v, const T& u) { Graph::vertices.insert(v); Graph::vertices.insert(u); Graph::adjMatrix[v].insert(u); } 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