diff --git a/examples/city_visitor.cpp b/examples/city_visitor.cpp new file mode 100644 index 00000000..4c729c27 --- /dev/null +++ b/examples/city_visitor.cpp @@ -0,0 +1,138 @@ +// +//======================================================================= +// Copyright 1997, 1998, 1999, 2000 University of Notre Dame. +// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek +// +// This file is part of the Generic Graph Component Library +// +// You should have received a copy of the License Agreement for the +// Generic Graph Component Library along with the software; see the +// file LICENSE. If not, contact Office of Research, University of Notre +// Dame, Notre Dame, IN 46556. +// +// Permission to modify the code and to distribute modified code is +// granted, provided the text of this NOTICE is retained, a notice that +// the code was modified is included with the above COPYRIGHT NOTICE and +// with the COPYRIGHT NOTICE in the LICENSE file, and that the LICENSE +// file is distributed with the modified code. +// +// LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. +// By way of example, but not limitation, Licensor MAKES NO +// REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY +// PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS +// OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS +// OR OTHER RIGHTS. +//======================================================================= +// + +#include +#include +#include +#include +#include +#include +#include + + +/* + Example of using a visitor with the depth first search + and breadth first search algorithm + + Sacramento ---- Reno ---- Salt Lake City + | + San Francisco + | + San Jose ---- Fresno + | + Los Angeles ---- Los Vegas ---- Pheonix + | + San Diego + + + The visitor has three main functions: + + discover(u) is invoked when the algorithm first arrives at the + vertex u. This will happen in the depth first or breadth first + order depending on which algorithm you use. + + process(e) is invoked when the algorithm first checks an edge to see + whether it has already been there. Whether using BFS or DFS, all + the edges of vertex u are examined immediately after the call to + visit(u). + + finish(u) is called when after all the vertices reachable from vertex + u have already been visited. + + */ + +using namespace std; +using namespace boost; + +struct city_visitor + : public null_visitor +{ + + city_visitor(string* n) : names(n) { } + + template + inline void discover(Vertex u) { + cout << endl << "arriving at " << names[u] << endl + << " neighboring cities are: "; + } + + template + inline void process(Edge e, Graph& g) { + cout << names[ target(e,g) ] << ", "; + } + + template + inline void finish(Vertex u) { + cout << endl << "finished with " << names[u] << endl; + } + + string* names; +}; + + + +int main(int argc, char* argv[]) +{ + + enum { SanJose, SanFran, LA, SanDiego, Fresno, LosVegas, Reno, + Sacramento, SaltLake, Pheonix, N }; + + string names[] = { "San Jose", "San Francisco", "San Jose", + "San Francisco", "Los Angeles", "San Diego", + "Fresno", "Los Vegas", "Reno", "Sacramento", + "Salt Lake City", "Pheonix" }; + + typedef std::pair E; + E edge_array[] = { E(Sacramento, Reno), E(Sacramento, SanFran), + E(Reno, SaltLake), + E(SanFran, SanJose), + E(SanJose, Fresno), E(SanJose, LA), + E(LA, LosVegas), E(LA, SanDiego), + E(LosVegas, Pheonix) }; + + /* Create the graph type we want. */ + typedef adjacency_list Graph; + Graph G(N, edge_array, edge_array + sizeof(edge_array)/sizeof(E)); + + /* DFS and BFS need to "color" the vertices */ + typedef vector colors_t; + colors_t colors(N); + + cout << "*** Depth First ***" << endl; + depth_first_search(G, city_visitor(names), colors.begin()); + cout << endl; + + /* Get the source vertex */ + boost::graph_traits::vertex_descriptor + s = vertex(SanJose,G); + + cout << "*** Breadth First ***" << endl; + breadth_first_search(G, s, city_visitor(names), colors.begin()); + + //end + return 0; +}