#pragma once #include #include #include namespace std{ template<> struct hash>{ size_t operator()(const std::pair& p) const{ return (std::hash()(p.first)<<1) ^ std::hash()(p.second); } }; } class DirectedGraph{ private: std::unordered_set _vertices; std::unordered_map> _inbounds; std::unordered_map> _outbounds; std::unordered_map,int> _weights; public: DirectedGraph(); ~DirectedGraph(); DirectedGraph(const DirectedGraph& g); DirectedGraph operator=(const DirectedGraph& g); DirectedGraph reindex() const; int numVertices() const; int numEdges() const; std::unordered_set vertices() const; std::unordered_map,int> edges() const; bool isEdge(int v1, int v2) const; int inDegree(int v) const; int outDegree(int v) const; std::unordered_set inbounds(int v) const; std::unordered_set outbounds(int v) const; int weight(int v1, int v2) const; void weight(int v1, int v2, int w); void addVertex(int v); void removeVertex(int v); void addEdge(int v1, int v2, int w); void removeEdge(int v1, int v2); }; DirectedGraph read_from_file(std::string filename); void write_to_file(const DirectedGraph& g, std::string filename); DirectedGraph random_graph(int num_vertices, int num_edges);