1: #include <iostream.h>
2:
3: #define MAX 100 // maximum number of vertices
4: #define INF 10000 // must be bigger than any shortest-path
5:
6: class vertex {
7: public:
8: int adj[MAX]; // vertices adjacent to this one
9: int nadj; // # of vertices adjacent to this one
10:
11: // these fields are undefined until graphsearch() is called
12: int pred; // previous hop on path from source to here
13: int cost; // cost (number of hops) to get here from source
14:
15: vertex() { nadj = 0; }
16: void push(int neighbor) {
17: adj[nadj++] = neighbor;
18: }
19: };
20:
21: // find shortest paths from source to all other nodes
22: // variations on this function are possible: returning the entire cost
23: // array, taking a dest argument and returning cost[dest], etc. this
24: // variation fills in the 'pred' field and 'cost' of each node so
25: // that path and cost cost can be determined trivially after
26: // graphsearch returns.
27: void graphsearch(vertex *v, int size, int source) {
28: int *queue = new int[size];
29: int qhead = 0, qtail = 0;
30: for (int i=0; i<size; i++) v[i].pred = -1; // no path
31: v[source].cost = 0;
32: queue[qtail++] = source;
33: while (qhead != qtail) {
34: int u = queue[qhead++];
35: for (int j=0; j<v[u].nadj; j++) {
36: int av = v[u].adj[j];
37: if (v[av].pred == -1) {
38: v[av].pred = u;
39: v[av].cost = v[u].cost + 1;
40: queue[qtail++] = av;
41: }
42: }
43: }
44: delete[] queue;
45: }
46:
47: // print the path from source to dest
48: // important: you must have already called graphsearch(..., source)
49: void print_path(vertex *v, int source, int dest, char *sep) {
50: if (source == dest)
51: cout << dest;
52: else {
53: print_path(v, source, v[dest].pred, sep);
54: cout << sep << dest;
55: }
56: }
57:
58: // some examples
59: int main() {
60: vertex v[MAX];
61:
62: // ... make up a graph (from CLR p.471)
63: v[0].push(1);
64: v[0].push(4);
65: v[1].push(0);
66: v[1].push(5);
67: v[2].push(3);
68: v[2].push(5);
69: v[2].push(6);
70: v[3].push(2);
71: v[3].push(7);
72: v[4].push(0);
73: v[5].push(1);
74: v[5].push(2);
75: v[5].push(6);
76: v[6].push(2);
77: v[6].push(5);
78: v[6].push(7);
79: v[7].push(3);
80: v[7].push(6);
81: graphsearch(v, 8, 1); // calculate paths from 1->everywhere
82: print_path(v, 1, 3, ", "); // print path from 1->3 (1 5 2 3)
83: cout << endl;
84: print_path(v, 1, 4, ", "); // print path from 1->4 (1 0 4)
85: cout << endl;
86: cout << v[4].cost << endl; // print cost of path from 1->4 (2)
87:
88: //print_path(v, 2, 4, ", ");// INVALID!
89: // You must call graphsearch(..., 2) first
90: }