1: // Example 6.2: Firetruck
2:
3: // Treat the map as a graph, where corners are nodes and streets are edges.
4: // Read in all streets, building adjacency lists for each corner.
5: // Then do a DFS for all paths from 1 to destination that do not contain
6: // a loop (use mark seen nodes to prevent loops).
7:
8: #include <iostream.h>
9: #include <stdio.h>
10:
11: struct {
12: int taint;
13: int adj[20];
14: int nadj;
15: } corner[20];
16: int paths;
17: int path[20];
18: int npath;
19:
20: void print_paths(int a, int b) {
21: if (corner[a].taint) return;
22: if (a==b) {
23: for (int i=0; i<npath; i++)
24: printf("%-4d", path[i]+1);
25: printf("%d\n", b+1);
26: paths++;
27: return;
28: }
29: corner[a].taint = 1;
30: path[npath++] = a;
31: for (int i=0; i<corner[a].nadj; i++)
32: print_paths(corner[a].adj[i], b);
33: npath--;
34: corner[a].taint = 0;
35: }
36:
37: int main() {
38: int dest, count=1;
39: while (cin >> dest) {
40: dest--;
41: int i;
42: for (i=0; i<20; i++) corner[i].taint = corner[i].nadj = 0;
43: int a, b;
44: while (cin >> a >> b && a && b) {
45: a--, b--;
46: corner[a].adj[corner[a].nadj++] = b;
47: corner[b].adj[corner[b].nadj++] = a;
48: }
49: paths = npath = 0;
50: cout << "CASE " << count++ << ":" << endl;
51: print_paths(0, dest);
52: if (paths == 1)
53: cout << "There is 1 route from the firestation to streetcorner " <<
54: dest+1 << "." << endl;
55: else
56: cout << "There are " << paths <<
57: " routes from the firestation to streetcorner " << dest+1 << "." <<
58: endl;
59: }
60: return 0;
61: }