Next: SSSP and MST, Up: Graphs
#ifndef GRAPH_H #define GRAPH_H #includetypedef int vertex; struct edge { vertex nock; // Nock (archery equipment) - The notch at the rear end of an arrow vertex tip; // Tip (archery equipment) - The front end of an arrow; also known as the arrowhead, head or point //double weight; // a value associated with an edge edge(vertex a, vertex b) : nock(a), tip(b) {} edge(){} edge(const edge& e) : nock(e.nock), tip(e.tip){} }; typedef std::vector edge_list; typedef std::vector graph; #define for_each_vertex(v, G) for (v = 0; v < (G).size(); ++v) // v must be the name of a vertex variable, G a graph #define for_each_neighbor(v, u, G) for (int i = 0; i < (G)[u].size() and 0 <= (v = ((G)[u][i]).tip); ++i) // hide the i more... // edge e = (G)[u][i]; v = e.tip; //w = e.weight; // v must be vertex variable name, u a vertex in G, a graph. //#define end_for_each_neighbor } #define for_each_out_edge_ptr(ep, v, G) for ( ep = (G)[v].begin(); ep != (G)[v].end(); ++ep) // vertex w = ep->tip; double wt = ep->weight, etc. // v and u must be vertex variable names, w a double variable name. bool read_graph(graph& G){ // read graph data from stdin int n; // number of vertices int e; // number of edges scanf("%d", &n); //printf("n %d\n", n); G.resize(0); G.resize(n); //for (graph::iterator p = G.begin(); p != G.end(); ++p) p->resize(0); scanf("%d", &e); //printf("e %d\n", e); for (int i = 0; i < e; ++i) { vertex u, v; scanf("%d", &u); scanf("%d", &v); //printf("u %d\n", u); //printf("v %d\n", v); edge e(u, v); G[u].push_back(e); } return true; } bool is_edge(vertex a, vertex b, const graph &G) { // true iff (a,b) is an edge of G. vertex c; for_each_neighbor(c, a, G) { if (c == b) return true; } return false; } bool is_undirected(const graph &G) { // true iff, for every edge (u,v), (v,u) is also an edge. vertex u, v; for_each_vertex(v, G) { for_each_neighbor(u, v, G) { if (not is_edge(u, v, G)) return false; }//end_for_each_neighbor } return true; } #endif // GRAPH_H