#ifndef MT4Q3_H #define MT4Q3_H /////////////////////////////////////////////////////////////// // MT4Q3.h - Graph Iterator // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2012 // /////////////////////////////////////////////////////////////// /* * To Do: * - add markings for vertices * - Depth First Search * - Strong Components, Topological Sorting * - Find disconnected graph partitions */ #include /////////////////////////////////////////////////////////////// // Vertex class template // not required for answer class Vertex { public: typedef std::pair Edge; Vertex(V v) : _v(v), _id(count++) {} void add(Edge& edge) { edges.push_back(edge); } Vertex(const Vertex& v) { edges = v.edges; _v = v._v; _id = v._id; } Vertex& operator=(const Vertex& v) { if(this == &v) return *this; edges = v.edges; _v = v._v; _id = v._id; return *this; } Edge& operator[](size_t i) { return edges[i]; } Edge operator[](size_t i) const { return edges[i]; } V& value() { return _v; } size_t id() { return _id; } size_t size() { return edges.size(); } private: std::vector edges; V _v; size_t _id; static size_t count; }; template size_t Vertex::count = 0; /////////////////////////////////////////////////////////////// // Graph class template class Graph { public: // next three lines satisfy first requirement typename typedef std::vector< Vertex >::iterator iterator; iterator begin() { return adj.begin(); } iterator end() { return adj.end(); } Vertex& operator[](size_t i) { return adj[i]; } Vertex operator[](size_t i) const { return adj[i]; } void addVertex(Vertex v) { adj.push_back(v); } void addEdge(E eval, Vertex& parent, Vertex& child); size_t findVertexById(size_t id); size_t size() { return adj.size(); } private: std::vector< Vertex > adj; }; template typename size_t Graph::findVertexById(size_t id) { for(size_t i=0; i void Graph::addEdge(E eVal, Vertex& parent, Vertex& child) { size_t childIndex = findVertexById(child.id()); if(childIndex == adj.size()) throw std::exception("no edge child"); size_t parentIndex = findVertexById(parent.id()); if(parentIndex == adj.size()) throw std::exception("no edge parent"); Vertex::Edge e; e.first = childIndex; e.second = eVal; adj[parentIndex].add(e); } /////////////////////////////////////////////////////////////// // Display class template class Display { public: typedef Graph graph; typedef Vertex vertex; typedef std::pair edge; // this function satisfies second requirement static std::vector< Vertex > vertsWithNoParents(graph& g) { std::vector parentCount; graph::iterator iter = g.begin(); while(iter != g.end()) { parentCount.push_back(0); ++iter; } iter = g.begin(); while(iter != g.end()) { vertex v = *iter; for(size_t i=0; i noParents; for(size_t j=0; j