src/work/marci/leda_bfs_dfs.cc
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
parent 181 96f647f568c7
child 921 818510fa3d99
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
     1 // -*- c++ -*-
     2 #include <iostream>
     3 #include <vector>
     4 #include <string>
     5 
     6 #include <LEDA/graph.h>
     7 
     8 #include <list_graph.h>
     9 #include <smart_graph.h>
    10 #include <bfs_iterator.h>
    11 #include <graph_wrapper.h>
    12 #include <leda_graph_wrapper.h>
    13 
    14 using namespace hugo;
    15 using std::cout; 
    16 using std::endl;
    17 using std::string;
    18 
    19 template <typename Graph, typename NodeNameMap>
    20 class EdgeNameMap {
    21   Graph& graph;
    22   NodeNameMap& node_name_map;
    23 public:
    24   EdgeNameMap(Graph& _graph, NodeNameMap& _node_name_map) : 
    25     graph(_graph), node_name_map(_node_name_map) { }
    26   string get(typename Graph::Edge e) const { 
    27     return 
    28       (node_name_map.get(graph.tail(e))+"->"+node_name_map.get(graph.head(e)));
    29   }
    30 };
    31 
    32 int main (int, char*[])
    33 {
    34   
    35 
    36   //typedef SmartGraph Graph;
    37   //typedef ListGraph Graph;
    38   typedef LedaGraphWrapper<leda::graph> Graph;
    39 
    40   typedef Graph::Node Node;
    41   typedef Graph::NodeIt NodeIt;  
    42   typedef Graph::Edge Edge;
    43   typedef Graph::EdgeIt EdgeIt;
    44   typedef Graph::OutEdgeIt OutEdgeIt;
    45   typedef Graph::InEdgeIt InEdgeIt;
    46 
    47  
    48   leda::graph g;
    49   Graph G(g);
    50 
    51   Node s=G.addNode();
    52   Node v1=G.addNode();
    53   Node v2=G.addNode();
    54   Node v3=G.addNode();
    55   Node v4=G.addNode();
    56   Node t=G.addNode();
    57   
    58   Graph::NodeMap<string> node_name(G);
    59   node_name.set(s, "s");
    60   node_name.set(v1, "v1");
    61   node_name.set(v2, "v2");
    62   node_name.set(v3, "v3");
    63   node_name.set(v4, "v4");
    64   node_name.set(t, "t");
    65 
    66   G.addEdge(s, v1);
    67   G.addEdge(s, v2);
    68   G.addEdge(v1, v2);
    69   G.addEdge(v2, v1);
    70   G.addEdge(v1, v3);
    71   G.addEdge(v3, v2);
    72   G.addEdge(v2, v4);
    73   G.addEdge(v4, v3);
    74   G.addEdge(v3, t);
    75   G.addEdge(v4, t);
    76 
    77   cout << "    /-->    ------------->            "<< endl;
    78   cout << "   / /-- v1 <-\\      /---- v3-\\      "<< endl;
    79   cout << "  / |          |    /  /->     \\     "<< endl;
    80   cout << " /  |          |   /  |    ^    \\  "<< endl;
    81   cout << "s   |          |  /   |    |     \\->  t "<< endl;
    82   cout << " \\  |          | /    |    |     /->  "<< endl;
    83   cout << "  \\ |       --/ /     |    |    /     "<< endl;
    84   cout << "   \\ \\-> v2 <--/       \\-- v4 -/      "<< endl;
    85   cout << "    \\-->    ------------->         "<< endl;
    86   
    87 //   typedef TrivGraphWrapper<const Graph> CGW;
    88 //   CGW wG(G);
    89 
    90 //   cout << "bfs and dfs demo on the directed graph" << endl;
    91 //   for(CGW::NodeIt n=wG.first<CGW::NodeIt>(); n.valid(); ++n) { 
    92 //     cout << n << ": ";
    93 //     cout << "out edges: ";
    94 //     for(CGW::OutEdgeIt e=wG.first<CGW::OutEdgeIt>(n); e.valid(); ++e) 
    95 //       cout << e << " ";
    96 //     cout << "in edges: ";
    97 //     for(CGW::InEdgeIt e=wG.first<CGW::InEdgeIt>(n); e.valid(); ++e) 
    98 //       cout << e << " ";
    99 //     cout << endl;
   100 //   }
   101 
   102   {
   103     typedef TrivGraphWrapper<const Graph> GW;
   104     GW wG(G);
   105 
   106     EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name);
   107     
   108     cout << "bfs and dfs iterator demo on the directed graph" << endl;
   109     for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { 
   110       cout << node_name.get(n) << ": ";
   111       cout << "out edges: ";
   112       for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) 
   113 	cout << edge_name.get(e) << " ";
   114       cout << "in edges: ";
   115       for(GW::InEdgeIt e=wG.first<GW::InEdgeIt>(n); wG.valid(e); wG.next(e)) 
   116 	cout << edge_name.get(e) << " ";
   117       cout << endl;
   118     }
   119 
   120     cout << "bfs from s ..." << endl;
   121     BfsIterator5< GW, GW::NodeMap<bool> > bfs(wG);
   122     bfs.pushAndSetReached(s);
   123     while (!bfs.finished()) {
   124       //cout << "edge: ";
   125       if (wG.valid(bfs)) {
   126 	cout << edge_name.get(bfs) << /*endl*/", " << 
   127 	  /*" aNode: " <<*/ node_name.get(wG.aNode(bfs)) << 
   128 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   129 	  /*" bNode: " <<*/ node_name.get(wG.bNode(bfs)) << 
   130 	  (bfs.isBNodeNewlyReached() ? ": is newly reached." : 
   131 	   ": is not newly reached.");
   132       } else { 
   133 	cout << "invalid" << /*endl*/", " << 
   134 	  /*" aNode: " <<*/ node_name.get(bfs.aNode()) << 
   135 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   136 	  /*" bNode: " <<*/ 
   137 	  "invalid.";
   138       }
   139       cout << endl;
   140       ++bfs;
   141     }
   142 
   143     cout << "    /-->    ------------->            "<< endl;
   144     cout << "   / /-- v1 <-\\      /---- v3-\\      "<< endl;
   145     cout << "  / |          |    /  /->     \\     "<< endl;
   146     cout << " /  |          |   /  |    ^    \\  "<< endl;
   147     cout << "s   |          |  /   |    |     \\->  t "<< endl;
   148     cout << " \\  |          | /    |    |     /->  "<< endl;
   149     cout << "  \\ |       --/ /     |    |    /     "<< endl;
   150     cout << "   \\ \\-> v2 <--/       \\-- v4 -/      "<< endl;
   151     cout << "    \\-->    ------------->         "<< endl;
   152 
   153     cout << "dfs from s ..." << endl;
   154     DfsIterator5< GW, GW::NodeMap<bool> > dfs(wG);
   155     dfs.pushAndSetReached(s);
   156     while (!dfs.finished()) {
   157       ++dfs;
   158       //cout << "edge: ";
   159       if (wG.valid(dfs)) {
   160 	cout << edge_name.get(dfs) << /*endl*/", " << 
   161 	  /*" aNode: " <<*/ node_name.get(wG.aNode(dfs)) << 
   162 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   163 	  /*" bNode: " <<*/ node_name.get(wG.bNode(dfs)) << 
   164 	  (dfs.isBNodeNewlyReached() ? ": is newly reached." : 
   165 	   ": is not newly reached.");
   166       } else { 
   167 	cout << "invalid" << /*endl*/", " << 
   168 	  /*" aNode: " <<*/ node_name.get(dfs.aNode()) << 
   169 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   170 	  /*" bNode: " <<*/ 
   171 	  "invalid.";
   172       }
   173       cout << endl;
   174     }
   175   }
   176 
   177 
   178   {
   179     typedef RevGraphWrapper<const Graph> GW;
   180     GW wG(G);
   181     
   182     EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name);
   183     
   184     cout << "bfs and dfs iterator demo on the reversed directed graph" << endl;
   185     for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { 
   186       cout << node_name.get(n) << ": ";
   187       cout << "out edges: ";
   188       for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) 
   189 	cout << edge_name.get(e) << " ";
   190       cout << "in edges: ";
   191       for(GW::InEdgeIt e=wG.first<GW::InEdgeIt>(n); wG.valid(e); wG.next(e)) 
   192 	cout << edge_name.get(e) << " ";
   193       cout << endl;
   194     }
   195 
   196     cout << "bfs from t ..." << endl;
   197     BfsIterator5< GW, GW::NodeMap<bool> > bfs(wG);
   198     bfs.pushAndSetReached(t);
   199     while (!bfs.finished()) {
   200       //cout << "edge: ";
   201       if (wG.valid(bfs)) {
   202 	cout << edge_name.get(bfs) << /*endl*/", " << 
   203 	  /*" aNode: " <<*/ node_name.get(wG.aNode(bfs)) << 
   204 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   205 	  /*" bNode: " <<*/ node_name.get(wG.bNode(bfs)) << 
   206 	  (bfs.isBNodeNewlyReached() ? ": is newly reached." : 
   207 	   ": is not newly reached.");
   208       } else { 
   209 	cout << "invalid" << /*endl*/", " << 
   210 	  /*" aNode: " <<*/ node_name.get(bfs.aNode()) << 
   211 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   212 	  /*" bNode: " <<*/ 
   213 	  "invalid.";
   214       }
   215       cout << endl;
   216       ++bfs;
   217     }
   218 
   219     cout << "    /-->    ------------->            "<< endl;
   220     cout << "   / /-- v1 <-\\      /---- v3-\\      "<< endl;
   221     cout << "  / |          |    /  /->     \\     "<< endl;
   222     cout << " /  |          |   /  |    ^    \\  "<< endl;
   223     cout << "s   |          |  /   |    |     \\->  t "<< endl;
   224     cout << " \\  |          | /    |    |     /->  "<< endl;
   225     cout << "  \\ |       --/ /     |    |    /     "<< endl;
   226     cout << "   \\ \\-> v2 <--/       \\-- v4 -/      "<< endl;
   227     cout << "    \\-->    ------------->         "<< endl;
   228     
   229     cout << "dfs from t ..." << endl;
   230     DfsIterator5< GW, GW::NodeMap<bool> > dfs(wG);
   231     dfs.pushAndSetReached(t);
   232     while (!dfs.finished()) {
   233       ++dfs;
   234       //cout << "edge: ";
   235       if (wG.valid(dfs)) {
   236 	cout << edge_name.get(dfs) << /*endl*/", " << 
   237 	  /*" aNode: " <<*/ node_name.get(wG.aNode(dfs)) << 
   238 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   239 	  /*" bNode: " <<*/ node_name.get(wG.bNode(dfs)) << 
   240 	  (dfs.isBNodeNewlyReached() ? ": is newly reached." : 
   241 	   ": is not newly reached.");
   242       } else { 
   243 	cout << "invalid" << /*endl*/", " << 
   244 	  /*" aNode: " <<*/ node_name.get(dfs.aNode()) << 
   245 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   246 	  /*" bNode: " <<*/ 
   247 	  "invalid.";
   248       }
   249       cout << endl;
   250     }
   251   }
   252 
   253   {
   254     typedef UndirGraphWrapper<const Graph> GW;
   255     GW wG(G);
   256     
   257     EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name);
   258     
   259     cout << "bfs and dfs iterator demo on the undirected graph" << endl;
   260     for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { 
   261       cout << node_name.get(n) << ": ";
   262       cout << "out edges: ";
   263       for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) 
   264 	cout << edge_name.get(e) << " ";
   265       cout << "in edges: ";
   266       for(GW::InEdgeIt e=wG.first<GW::InEdgeIt>(n); wG.valid(e); wG.next(e)) 
   267 	cout << edge_name.get(e) << " ";
   268       cout << endl;
   269     }
   270 
   271     cout << "bfs from t ..." << endl;
   272     BfsIterator5< GW, GW::NodeMap<bool> > bfs(wG);
   273     bfs.pushAndSetReached(t);
   274     while (!bfs.finished()) {
   275       //cout << "edge: ";
   276       if (wG.valid(GW::OutEdgeIt(bfs))) {
   277 	cout << edge_name.get(GW::OutEdgeIt(bfs)) << /*endl*/", " << 
   278 	  /*" aNode: " <<*/ node_name.get(wG.aNode(bfs)) << 
   279 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   280 	  /*" bNode: " <<*/ node_name.get(wG.bNode(bfs)) << 
   281 	  (bfs.isBNodeNewlyReached() ? ": is newly reached." : 
   282 	   ": is not newly reached.");
   283       } else { 
   284 	cout << "invalid" << /*endl*/", " << 
   285 	  /*" aNode: " <<*/ node_name.get(bfs.aNode()) << 
   286 	  (bfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   287 	  /*" bNode: " <<*/ 
   288 	  "invalid.";
   289       }
   290       cout << endl;
   291       ++bfs;
   292     }
   293 
   294     cout << "    /-->    ------------->            "<< endl;
   295     cout << "   / /-- v1 <-\\      /---- v3-\\      "<< endl;
   296     cout << "  / |          |    /  /->     \\     "<< endl;
   297     cout << " /  |          |   /  |    ^    \\  "<< endl;
   298     cout << "s   |          |  /   |    |     \\->  t "<< endl;
   299     cout << " \\  |          | /    |    |     /->  "<< endl;
   300     cout << "  \\ |       --/ /     |    |    /     "<< endl;
   301     cout << "   \\ \\-> v2 <--/       \\-- v4 -/      "<< endl;
   302     cout << "    \\-->    ------------->         "<< endl;
   303     
   304     cout << "dfs from t ..." << endl;
   305     DfsIterator5< GW, GW::NodeMap<bool> > dfs(wG);
   306     dfs.pushAndSetReached(t);
   307     while (!dfs.finished()) {
   308       ++dfs;
   309       //cout << "edge: ";
   310       if (wG.valid(GW::OutEdgeIt(dfs))) {
   311 	cout << edge_name.get(GW::OutEdgeIt(dfs)) << /*endl*/", " << 
   312 	  /*" aNode: " <<*/ node_name.get(wG.aNode(dfs)) << 
   313 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   314 	  /*" bNode: " <<*/ node_name.get(wG.bNode(dfs)) << 
   315 	  (dfs.isBNodeNewlyReached() ? ": is newly reached." : 
   316 	   ": is not newly reached.");
   317       } else { 
   318 	cout << "invalid" << /*endl*/", " << 
   319 	  /*" aNode: " <<*/ node_name.get(dfs.aNode()) << 
   320 	  (dfs.isANodeExamined() ? ": is examined, " : ": is not examined, ") << 
   321 	  /*" bNode: " <<*/ 
   322 	  "invalid.";
   323       }
   324       cout << endl;
   325     }
   326   }
   327 
   328   return 0;
   329 }