class DirectedGraph{ public: addVertex(v, ...) addEdge(src, dst, ..) remove containsEdge(src, dst) containsVertex(v) getInNeighbors(vertex) getOutNeighbors(vertex) getInEdges(vertex) getOutEdges(vertex) isConnected(v1, v2) getPath(v1, v2) getVertices() getEdges() } template V class SimpleGraph : DirectedGraph{ private: vector vertices; vector< pair > edges; } template V class AdjacencyListGraph: DirectedGraph{ private: vector vertices; vector< vector< pair > > edges; }