Next: , Up: Graphs


7.1 adjacency list representation

#ifndef GRAPH_H
#define GRAPH_H
#include 
typedef 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