#pragma once #include <vector> #include <iostream> #include <cs35/edge.h> using std::vector; using std::ostream; /** * Graph is a class representing directed or undirected, weighted graphs. * @tparam V a type to represent the vertex labels * @tparam E a type to represent the edge labels * @tparam W a type to represent the weight (usually an int, float, or double) */ template <typename V, typename E, typename W> class Graph { public: virtual ~Graph() {} /** * Retrieves all vertices in the graph. * @return The vertices in this graph. */ virtual vector<V> getVertices() = 0; /** * Adds a vertex to this graph. * @param v The vertex to add. */ virtual void insertVertex(V v) = 0; /** * Removes a vertex from the graph. * @param v The vertex to remove. * @throws runtime_error If the provided vertex is not in the graph. */ virtual void removeVertex(V v) = 0; /** * Determines if a vertex is in this graph. * @param v The vertex to check. * @return true if the vertex is in the graph; false if it is not. */ virtual bool containsVertex(V v) = 0; /** * Adds a edge to this graph. * @param source The source vertex for the edge. * @param destination The destination vertex for the edge. * @param label The label of the edge to add. * @param weight The weight of the edge to add. * @throws runtime_error If an edge already exists between the given source * and target. */ virtual void insertEdge(V src, V dest, E label, W weight) = 0; /** * Removes an edge from this graph. * @param source The source vertex for the edge. * @param destination The destination vertex for the edge. * @throws runtime_error If the edge does not exist. */ virtual void removeEdge(V src, V dest) = 0; /** * Determines if this graph contains an edge. * @param source The source vertex for the edge. * @param destination The destination vertex for the edge. * @return true if the graph contains that edge; false if it does not. */ virtual bool containsEdge(V source, V destination) = 0; /** * Retrieves an edge from this graph. * @param source The source vertex for the edge. * @param destination The destination vertex for the edge. * @return The edge. * @throws runtime_error If the edge does not exist. */ virtual Edge<V,E,W> getEdge(V source, V destination) = 0; /** * Retrieves all edges from this graph. * @return A vector containing every edge in this graph. */ virtual vector<Edge<V,E,W> > getEdges() = 0; /** * Retrieves all edges with a common source. * @param source The source vertex. * @return All edges in the graph which leave that source vertex. */ virtual vector<Edge<V,E,W> > getOutgoingEdges(V source) = 0; /** * Retrieves all edges with a common destination. * @param destination The destination vertex for the edge. * @return All edges in the graph which enter that destination vertex. */ virtual vector<Edge<V,E,W> > getIncomingEdges(V destination) = 0; /** * Retrieves all vertices which are reachable by an edge with the provided * source vertex. * @param source The source vertex. * @return All vertices in the graph which are a destination for an edge * that has the given source. */ virtual vector<V> getNeighbors(V source) = 0; // You can safely ignore the following code. This eliminates some default // class routines, preventing you from using them accidentally. // Specifically, we are disabling the use of the copy constructor and the // copy assignment operator. You can read more here: // http://www.cplusplus.com/articles/y8hv0pDG/ public: Graph() { } private: Graph(const Graph& other) = delete; Graph& operator=(const Graph& other) = delete; };