/* * description: 图的ADT实现(邻接矩阵) * writeby: Nick * date: 2012-10-25 23:32 * */ #include <iostream> #include <vector> using namespace std; struct Edge { int v, w; Edge(int v=-1, int w=-1) : v(v), w(w) {} }; class Graph { private: int vcount, ecount; //记录顶点总数,边总数 bool digraph; //标记是否有向图 vector <vector <bool> > adj; //邻接矩阵数组 public: Graph(int V, bool di = false) : adj(V), vcount(V), digraph(di) { for(int i=0; i<V; i++) adj[i].assign(V, false); // V * V 临接矩阵的大小 } //~Graph(); int V() const {return vcount;} int E() const {return ecount;} bool directed() const { return digraph; } int insert(Edge e) { int v=e.v, w=e.w; if(adj[v][w] == false) ecount++; adj[v][w] = true; // v-w 做标记 if(!digraph) adj[w][v] = true; //无向图中 w-v 也做标记 } int remove(Edge e) { int v=e.v, w=e.w; if(adj[v][w]==true) ecount--; adj[v][w] = false; if(!digraph) adj[w][v] = false; } bool edge(int v, int w) const { return adj[v][w]; } class adjIterator; friend class adjIterator; }; class Graph::adjIterator //临接矩阵表示的迭代器 { private: const Graph &G; int i, v; public: adjIterator(const Graph& G, int v) : G(G), v(v), i(-1) {} int begin() { i=-1; return next(); } int next() { for(i++; i<G.V(); i++) if(G.adj[v][i] == true) return i; //adj[v][0..v-1] 记录着 v 到 0..v 各点是否相连 return -1; //没有找到 } int end() { return i>=G.V(); } }; int main() { return 0; }
转载于:https://www.cnblogs.com/wouldguan/archive/2012/10/25/2740404.html