src/work/marci/experiment/bfs_iterator.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
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 #ifndef HUGO_BFS_ITERATOR_H
     3 #define HUGO_BFS_ITERATOR_H
     4 
     5 #include <queue>
     6 #include <stack>
     7 #include <utility>
     8 #include <graph_wrapper.h>
     9 
    10 namespace hugo {
    11 
    12 //   template <typename Graph>
    13 //   struct bfs {
    14 //     typedef typename Graph::Node Node;
    15 //     typedef typename Graph::Edge Edge;
    16 //     typedef typename Graph::NodeIt NodeIt;
    17 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
    18 //     Graph& G;
    19 //     Node s;
    20 //     typename Graph::NodeMap<bool> reached;
    21 //     typename Graph::NodeMap<Edge> pred;
    22 //     typename Graph::NodeMap<int> dist;
    23 //     std::queue<Node> bfs_queue;
    24 //     bfs(Graph& _G, Node _s) : G(_G), s(_s), reached(_G), pred(_G), dist(_G) { 
    25 //       bfs_queue.push(s); 
    26 //       for(NodeIt i=G.template first<NodeIt>(); i.valid(); ++i) 
    27 // 	reached.set(i, false);
    28 //       reached.set(s, true);
    29 //       dist.set(s, 0); 
    30 //     }
    31     
    32 //     void run() {
    33 //       while (!bfs_queue.empty()) {
    34 // 	Node v=bfs_queue.front();
    35 // 	OutEdgeIt e=G.template first<OutEdgeIt>(v);
    36 // 	bfs_queue.pop();
    37 // 	for( ; e.valid(); ++e) {
    38 // 	  Node w=G.bNode(e);
    39 // 	  std::cout << "scan node " << G.id(w) << " from node " << G.id(v) << std::endl;
    40 // 	  if (!reached.get(w)) {
    41 // 	    std::cout << G.id(w) << " is newly reached :-)" << std::endl;
    42 // 	    bfs_queue.push(w);
    43 // 	    dist.set(w, dist.get(v)+1);
    44 // 	    pred.set(w, e);
    45 // 	    reached.set(w, true);
    46 // 	  } else {
    47 // 	    std::cout << G.id(w) << " is already reached" << std::endl;
    48 // 	  }
    49 // 	}
    50 //       }
    51 //     }
    52 //   };
    53 
    54 //   template <typename Graph> 
    55 //   struct bfs_visitor {
    56 //     typedef typename Graph::Node Node;
    57 //     typedef typename Graph::Edge Edge;
    58 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
    59 //     Graph& G;
    60 //     bfs_visitor(Graph& _G) : G(_G) { }
    61 //     void at_previously_reached(OutEdgeIt& e) { 
    62 //       //Node v=G.aNode(e);
    63 //       Node w=G.bNode(e);
    64 //       std::cout << G.id(w) << " is already reached" << std::endl;
    65 //    }
    66 //     void at_newly_reached(OutEdgeIt& e) { 
    67 //       //Node v=G.aNode(e);
    68 //       Node w=G.bNode(e);
    69 //       std::cout << G.id(w) << " is newly reached :-)" << std::endl;
    70 //     }
    71 //   };
    72 
    73 //   template <typename Graph, typename ReachedMap, typename visitor_type>
    74 //   struct bfs_iterator {
    75 //     typedef typename Graph::Node Node;
    76 //     typedef typename Graph::Edge Edge;
    77 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
    78 //     Graph& G;
    79 //     std::queue<OutEdgeIt>& bfs_queue;
    80 //     ReachedMap& reached;
    81 //     visitor_type& visitor;
    82 //     void process() {
    83 //       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
    84 //       if (bfs_queue.empty()) return;
    85 //       OutEdgeIt e=bfs_queue.front();
    86 //       //Node v=G.aNode(e);
    87 //       Node w=G.bNode(e);
    88 //       if (!reached.get(w)) {
    89 // 	visitor.at_newly_reached(e);
    90 // 	bfs_queue.push(G.template first<OutEdgeIt>(w));
    91 // 	reached.set(w, true);
    92 //       } else {
    93 // 	visitor.at_previously_reached(e);
    94 //       }
    95 //     }
    96 //     bfs_iterator(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached, visitor_type& _visitor) : G(_G), bfs_queue(_bfs_queue), reached(_reached), visitor(_visitor) { 
    97 //       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
    98 //       valid();
    99 //     }
   100 //     bfs_iterator<Graph, ReachedMap, visitor_type>& operator++() { 
   101 //       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   102 //       //if (bfs_queue.empty()) return *this;
   103 //       if (!valid()) return *this;
   104 //       ++(bfs_queue.front());
   105 //       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   106 //       valid();
   107 //       return *this;
   108 //     }
   109 //     //void next() { 
   110 //     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   111 //     //  if (bfs_queue.empty()) return;
   112 //     //  ++(bfs_queue.front());
   113 //     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   114 //     //}
   115 //     bool valid() { 
   116 //       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   117 //       if (bfs_queue.empty()) return false; else return true;
   118 //     }
   119 //     //bool finished() { 
   120 //     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   121 //     //  if (bfs_queue.empty()) return true; else return false;
   122 //     //}
   123 //     operator Edge () { return bfs_queue.front(); }
   124 
   125 //   };
   126 
   127 //   template <typename Graph, typename ReachedMap>
   128 //   struct bfs_iterator1 {
   129 //     typedef typename Graph::Node Node;
   130 //     typedef typename Graph::Edge Edge;
   131 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
   132 //     Graph& G;
   133 //     std::queue<OutEdgeIt>& bfs_queue;
   134 //     ReachedMap& reached;
   135 //     bool _newly_reached;
   136 //     bfs_iterator1(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached) : G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
   137 //       valid();
   138 //       if (!bfs_queue.empty() && bfs_queue.front().valid()) { 
   139 // 	OutEdgeIt e=bfs_queue.front();
   140 // 	Node w=G.bNode(e);
   141 // 	if (!reached.get(w)) {
   142 // 	  bfs_queue.push(G.template first<OutEdgeIt>(w));
   143 // 	  reached.set(w, true);
   144 // 	  _newly_reached=true;
   145 // 	} else {
   146 // 	  _newly_reached=false;
   147 // 	}
   148 //       }
   149 //     }
   150 //     bfs_iterator1<Graph, ReachedMap>& operator++() { 
   151 //       if (!valid()) return *this;
   152 //       ++(bfs_queue.front());
   153 //       valid();
   154 //       if (!bfs_queue.empty() && bfs_queue.front().valid()) { 
   155 // 	OutEdgeIt e=bfs_queue.front();
   156 // 	Node w=G.bNode(e);
   157 // 	if (!reached.get(w)) {
   158 // 	  bfs_queue.push(G.template first<OutEdgeIt>(w));
   159 // 	  reached.set(w, true);
   160 // 	  _newly_reached=true;
   161 // 	} else {
   162 // 	  _newly_reached=false;
   163 // 	}
   164 //       }
   165 //       return *this;
   166 //     }
   167 //     bool valid() { 
   168 //       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
   169 //       if (bfs_queue.empty()) return false; else return true;
   170 //     }
   171 //     operator OutEdgeIt() { return bfs_queue.front(); }
   172 //     //ize
   173 //     bool newly_reached() { return _newly_reached; }
   174 
   175 //   };
   176 
   177 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   178 //   struct BfsIterator {
   179 //     typedef typename Graph::Node Node;
   180 //     Graph& G;
   181 //     std::queue<OutEdgeIt>& bfs_queue;
   182 //     ReachedMap& reached;
   183 //     bool b_node_newly_reached;
   184 //     OutEdgeIt actual_edge;
   185 //     BfsIterator(Graph& _G, 
   186 // 		std::queue<OutEdgeIt>& _bfs_queue, 
   187 // 		ReachedMap& _reached) : 
   188 //       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
   189 //       actual_edge=bfs_queue.front();
   190 //       if (actual_edge.valid()) { 
   191 // 	Node w=G.bNode(actual_edge);
   192 // 	if (!reached.get(w)) {
   193 // 	  bfs_queue.push(G.firstOutEdge(w));
   194 // 	  reached.set(w, true);
   195 // 	  b_node_newly_reached=true;
   196 // 	} else {
   197 // 	  b_node_newly_reached=false;
   198 // 	}
   199 //       }
   200 //     }
   201 //     BfsIterator<Graph, OutEdgeIt, ReachedMap>& 
   202 //     operator++() { 
   203 //       if (bfs_queue.front().valid()) { 
   204 // 	++(bfs_queue.front());
   205 // 	actual_edge=bfs_queue.front();
   206 // 	if (actual_edge.valid()) {
   207 // 	  Node w=G.bNode(actual_edge);
   208 // 	  if (!reached.get(w)) {
   209 // 	    bfs_queue.push(G.firstOutEdge(w));
   210 // 	    reached.set(w, true);
   211 // 	    b_node_newly_reached=true;
   212 // 	  } else {
   213 // 	    b_node_newly_reached=false;
   214 // 	  }
   215 // 	}
   216 //       } else {
   217 // 	bfs_queue.pop(); 
   218 // 	actual_edge=bfs_queue.front();
   219 // 	if (actual_edge.valid()) {
   220 // 	  Node w=G.bNode(actual_edge);
   221 // 	  if (!reached.get(w)) {
   222 // 	    bfs_queue.push(G.firstOutEdge(w));
   223 // 	    reached.set(w, true);
   224 // 	    b_node_newly_reached=true;
   225 // 	  } else {
   226 // 	    b_node_newly_reached=false;
   227 // 	  }
   228 // 	}
   229 //       }
   230 //       return *this;
   231 //     }
   232 //     bool finished() { return bfs_queue.empty(); }
   233 //     operator OutEdgeIt () { return actual_edge; }
   234 //     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
   235 //     bool aNodeIsExamined() { return !(actual_edge.valid()); }
   236 //   };
   237 
   238 
   239 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   240 //   struct DfsIterator {
   241 //     typedef typename Graph::Node Node;
   242 //     Graph& G;
   243 //     std::stack<OutEdgeIt>& bfs_queue;
   244 //     ReachedMap& reached;
   245 //     bool b_node_newly_reached;
   246 //     OutEdgeIt actual_edge;
   247 //     DfsIterator(Graph& _G, 
   248 // 		std::stack<OutEdgeIt>& _bfs_queue, 
   249 // 		ReachedMap& _reached) : 
   250 //       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
   251 //       actual_edge=bfs_queue.top();
   252 //       if (actual_edge.valid()) { 
   253 // 	Node w=G.bNode(actual_edge);
   254 // 	if (!reached.get(w)) {
   255 // 	  bfs_queue.push(G.firstOutEdge(w));
   256 // 	  reached.set(w, true);
   257 // 	  b_node_newly_reached=true;
   258 // 	} else {
   259 // 	  ++(bfs_queue.top());
   260 // 	  b_node_newly_reached=false;
   261 // 	}
   262 //       } else {
   263 // 	bfs_queue.pop();
   264 //       }
   265 //     }
   266 //     DfsIterator<Graph, OutEdgeIt, ReachedMap>& 
   267 //     operator++() { 
   268 //       actual_edge=bfs_queue.top();
   269 //       if (actual_edge.valid()) { 
   270 // 	Node w=G.bNode(actual_edge);
   271 // 	if (!reached.get(w)) {
   272 // 	  bfs_queue.push(G.firstOutEdge(w));
   273 // 	  reached.set(w, true);
   274 // 	  b_node_newly_reached=true;
   275 // 	} else {
   276 // 	  ++(bfs_queue.top());
   277 // 	  b_node_newly_reached=false;
   278 // 	}
   279 //       } else {
   280 // 	bfs_queue.pop();
   281 //       }
   282 //       return *this;
   283 //     }
   284 //     bool finished() { return bfs_queue.empty(); }
   285 //     operator OutEdgeIt () { return actual_edge; }
   286 //     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
   287 //     bool aNodeIsExamined() { return !(actual_edge.valid()); }
   288 //   };
   289 
   290 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   291 //   struct BfsIterator1 {
   292 //     typedef typename Graph::Node Node;
   293 //     Graph& G;
   294 //     std::queue<OutEdgeIt>& bfs_queue;
   295 //     ReachedMap& reached;
   296 //     bool b_node_newly_reached;
   297 //     OutEdgeIt actual_edge;
   298 //     BfsIterator1(Graph& _G, 
   299 // 		std::queue<OutEdgeIt>& _bfs_queue, 
   300 // 		ReachedMap& _reached) : 
   301 //       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
   302 //       actual_edge=bfs_queue.front();
   303 //       if (actual_edge.valid()) { 
   304 //       	Node w=G.bNode(actual_edge);
   305 // 	if (!reached.get(w)) {
   306 // 	  bfs_queue.push(OutEdgeIt(G, w));
   307 // 	  reached.set(w, true);
   308 // 	  b_node_newly_reached=true;
   309 // 	} else {
   310 // 	  b_node_newly_reached=false;
   311 // 	}
   312 //       }
   313 //     }
   314 //     void next() { 
   315 //       if (bfs_queue.front().valid()) { 
   316 // 	++(bfs_queue.front());
   317 // 	actual_edge=bfs_queue.front();
   318 // 	if (actual_edge.valid()) {
   319 // 	  Node w=G.bNode(actual_edge);
   320 // 	  if (!reached.get(w)) {
   321 // 	    bfs_queue.push(OutEdgeIt(G, w));
   322 // 	    reached.set(w, true);
   323 // 	    b_node_newly_reached=true;
   324 // 	  } else {
   325 // 	    b_node_newly_reached=false;
   326 // 	  }
   327 // 	}
   328 //       } else {
   329 // 	bfs_queue.pop(); 
   330 // 	actual_edge=bfs_queue.front();
   331 // 	if (actual_edge.valid()) {
   332 // 	  Node w=G.bNode(actual_edge);
   333 // 	  if (!reached.get(w)) {
   334 // 	    bfs_queue.push(OutEdgeIt(G, w));
   335 // 	    reached.set(w, true);
   336 // 	    b_node_newly_reached=true;
   337 // 	  } else {
   338 // 	    b_node_newly_reached=false;
   339 // 	  }
   340 // 	}
   341 //       }
   342 //       //return *this;
   343 //     }
   344 //     bool finished() { return bfs_queue.empty(); }
   345 //     operator OutEdgeIt () { return actual_edge; }
   346 //     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
   347 //     bool aNodeIsExamined() { return !(actual_edge.valid()); }
   348 //   };
   349 
   350 
   351 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   352 //   struct DfsIterator1 {
   353 //     typedef typename Graph::Node Node;
   354 //     Graph& G;
   355 //     std::stack<OutEdgeIt>& bfs_queue;
   356 //     ReachedMap& reached;
   357 //     bool b_node_newly_reached;
   358 //     OutEdgeIt actual_edge;
   359 //     DfsIterator1(Graph& _G, 
   360 // 		std::stack<OutEdgeIt>& _bfs_queue, 
   361 // 		ReachedMap& _reached) : 
   362 //       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
   363 //       //actual_edge=bfs_queue.top();
   364 //       //if (actual_edge.valid()) { 
   365 //       //	Node w=G.bNode(actual_edge);
   366 //       //if (!reached.get(w)) {
   367 //       //  bfs_queue.push(OutEdgeIt(G, w));
   368 //       //  reached.set(w, true);
   369 //       //  b_node_newly_reached=true;
   370 //       //} else {
   371 //       //  ++(bfs_queue.top());
   372 //       //  b_node_newly_reached=false;
   373 //       //}
   374 //       //} else {
   375 //       //	bfs_queue.pop();
   376 //       //}
   377 //     }
   378 //     void next() { 
   379 //       actual_edge=bfs_queue.top();
   380 //       if (actual_edge.valid()) { 
   381 // 	Node w=G.bNode(actual_edge);
   382 // 	if (!reached.get(w)) {
   383 // 	  bfs_queue.push(OutEdgeIt(G, w));
   384 // 	  reached.set(w, true);
   385 // 	  b_node_newly_reached=true;
   386 // 	} else {
   387 // 	  ++(bfs_queue.top());
   388 // 	  b_node_newly_reached=false;
   389 // 	}
   390 //       } else {
   391 // 	bfs_queue.pop();
   392 //       }
   393 //       //return *this;
   394 //     }
   395 //     bool finished() { return bfs_queue.empty(); }
   396 //     operator OutEdgeIt () { return actual_edge; }
   397 //     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
   398 //     bool aNodeIsLeaved() { return !(actual_edge.valid()); }
   399 //   };
   400 
   401 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   402 //   class BfsIterator2 {
   403 //     typedef typename Graph::Node Node;
   404 //     const Graph& G;
   405 //     std::queue<OutEdgeIt> bfs_queue;
   406 //     ReachedMap reached;
   407 //     bool b_node_newly_reached;
   408 //     OutEdgeIt actual_edge;
   409 //   public:
   410 //     BfsIterator2(const Graph& _G) : G(_G), reached(G, false) { }
   411 //     void pushAndSetReached(Node s) { 
   412 //       reached.set(s, true);
   413 //       if (bfs_queue.empty()) {
   414 // 	bfs_queue.push(G.template first<OutEdgeIt>(s));
   415 // 	actual_edge=bfs_queue.front();
   416 // 	if (actual_edge.valid()) { 
   417 // 	  Node w=G.bNode(actual_edge);
   418 // 	  if (!reached.get(w)) {
   419 // 	    bfs_queue.push(G.template first<OutEdgeIt>(w));
   420 // 	    reached.set(w, true);
   421 // 	    b_node_newly_reached=true;
   422 // 	  } else {
   423 // 	    b_node_newly_reached=false;
   424 // 	  }
   425 // 	} //else {
   426 // 	//}
   427 //       } else {
   428 // 	bfs_queue.push(G.template first<OutEdgeIt>(s));
   429 //       }
   430 //     }
   431 //     BfsIterator2<Graph, OutEdgeIt, ReachedMap>& 
   432 //     operator++() { 
   433 //       if (bfs_queue.front().valid()) { 
   434 // 	++(bfs_queue.front());
   435 // 	actual_edge=bfs_queue.front();
   436 // 	if (actual_edge.valid()) {
   437 // 	  Node w=G.bNode(actual_edge);
   438 // 	  if (!reached.get(w)) {
   439 // 	    bfs_queue.push(G.template first<OutEdgeIt>(w));
   440 // 	    reached.set(w, true);
   441 // 	    b_node_newly_reached=true;
   442 // 	  } else {
   443 // 	    b_node_newly_reached=false;
   444 // 	  }
   445 // 	}
   446 //       } else {
   447 // 	bfs_queue.pop(); 
   448 // 	if (!bfs_queue.empty()) {
   449 // 	  actual_edge=bfs_queue.front();
   450 // 	  if (actual_edge.valid()) {
   451 // 	    Node w=G.bNode(actual_edge);
   452 // 	    if (!reached.get(w)) {
   453 // 	      bfs_queue.push(G.template first<OutEdgeIt>(w));
   454 // 	      reached.set(w, true);
   455 // 	      b_node_newly_reached=true;
   456 // 	    } else {
   457 // 	      b_node_newly_reached=false;
   458 // 	    }
   459 // 	  }
   460 // 	}
   461 //       }
   462 //       return *this;
   463 //     }
   464 //     bool finished() const { return bfs_queue.empty(); }
   465 //     operator OutEdgeIt () const { return actual_edge; }
   466 //     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   467 //     bool isANodeExamined() const { return !(actual_edge.valid()); }
   468 //     const ReachedMap& getReachedMap() const { return reached; }
   469 //     const std::queue<OutEdgeIt>& getBfsQueue() const { return bfs_queue; }
   470 //  };
   471 
   472 
   473 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
   474 //   class BfsIterator3 {
   475 //     typedef typename Graph::Node Node;
   476 //     const Graph& G;
   477 //     std::queue< std::pair<Node, OutEdgeIt> > bfs_queue;
   478 //     ReachedMap reached;
   479 //     bool b_node_newly_reached;
   480 //     OutEdgeIt actual_edge;
   481 //   public:
   482 //     BfsIterator3(const Graph& _G) : G(_G), reached(G, false) { }
   483 //     void pushAndSetReached(Node s) { 
   484 //       reached.set(s, true);
   485 //       if (bfs_queue.empty()) {
   486 // 	bfs_queue.push(std::pair<Node, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
   487 // 	actual_edge=bfs_queue.front().second;
   488 // 	if (actual_edge.valid()) { 
   489 // 	  Node w=G.bNode(actual_edge);
   490 // 	  if (!reached.get(w)) {
   491 // 	    bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
   492 // 	    reached.set(w, true);
   493 // 	    b_node_newly_reached=true;
   494 // 	  } else {
   495 // 	    b_node_newly_reached=false;
   496 // 	  }
   497 // 	} //else {
   498 // 	//}
   499 //       } else {
   500 // 	bfs_queue.push(std::pair<Node, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
   501 //       }
   502 //     }
   503 //     BfsIterator3<Graph, OutEdgeIt, ReachedMap>& 
   504 //     operator++() { 
   505 //       if (bfs_queue.front().second.valid()) { 
   506 // 	++(bfs_queue.front().second);
   507 // 	actual_edge=bfs_queue.front().second;
   508 // 	if (actual_edge.valid()) {
   509 // 	  Node w=G.bNode(actual_edge);
   510 // 	  if (!reached.get(w)) {
   511 // 	    bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
   512 // 	    reached.set(w, true);
   513 // 	    b_node_newly_reached=true;
   514 // 	  } else {
   515 // 	    b_node_newly_reached=false;
   516 // 	  }
   517 // 	}
   518 //       } else {
   519 // 	bfs_queue.pop(); 
   520 // 	if (!bfs_queue.empty()) {
   521 // 	  actual_edge=bfs_queue.front().second;
   522 // 	  if (actual_edge.valid()) {
   523 // 	    Node w=G.bNode(actual_edge);
   524 // 	    if (!reached.get(w)) {
   525 // 	      bfs_queue.push(std::pair<Node, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
   526 // 	      reached.set(w, true);
   527 // 	      b_node_newly_reached=true;
   528 // 	    } else {
   529 // 	      b_node_newly_reached=false;
   530 // 	    }
   531 // 	  }
   532 // 	}
   533 //       }
   534 //       return *this;
   535 //     }
   536 //     bool finished() const { return bfs_queue.empty(); }
   537 //     operator OutEdgeIt () const { return actual_edge; }
   538 //     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   539 //     bool isANodeExamined() const { return !(actual_edge.valid()); }
   540 //     Node aNode() const { return bfs_queue.front().first; }
   541 //     Node bNode() const { return G.bNode(actual_edge); }
   542 //     const ReachedMap& getReachedMap() const { return reached; }
   543 //     //const std::queue< std::pair<Node, OutEdgeIt> >& getBfsQueue() const { return bfs_queue; }
   544 //  };
   545 
   546 
   547 //   template <typename Graph, typename OutEdgeIt, 
   548 // 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
   549 //   class BfsIterator4 {
   550 //     typedef typename Graph::Node Node;
   551 //     const Graph& G;
   552 //     std::queue<Node> bfs_queue;
   553 //     ReachedMap& reached;
   554 //     bool b_node_newly_reached;
   555 //     OutEdgeIt actual_edge;
   556 //     bool own_reached_map;
   557 //   public:
   558 //     BfsIterator4(const Graph& _G, ReachedMap& _reached) : 
   559 //       G(_G), reached(_reached), 
   560 //       own_reached_map(false) { }
   561 //     BfsIterator4(const Graph& _G) : 
   562 //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
   563 //       own_reached_map(true) { }
   564 //     ~BfsIterator4() { if (own_reached_map) delete &reached; }
   565 //     void pushAndSetReached(Node s) { 
   566 //       //std::cout << "mimi" << &reached << std::endl;
   567 //       reached.set(s, true);
   568 //       //std::cout << "mumus" << std::endl;
   569 //       if (bfs_queue.empty()) {
   570 // 	//std::cout << "bibi1" << std::endl;
   571 // 	bfs_queue.push(s);
   572 // 	//std::cout << "zizi" << std::endl;
   573 // 	G./*getF*/first(actual_edge, s);
   574 // 	//std::cout << "kiki" << std::endl;
   575 // 	if (G.valid(actual_edge)/*.valid()*/) { 
   576 // 	  Node w=G.bNode(actual_edge);
   577 // 	  if (!reached.get(w)) {
   578 // 	    bfs_queue.push(w);
   579 // 	    reached.set(w, true);
   580 // 	    b_node_newly_reached=true;
   581 // 	  } else {
   582 // 	    b_node_newly_reached=false;
   583 // 	  }
   584 // 	} 
   585 //       } else {
   586 // 	//std::cout << "bibi2" << std::endl;
   587 // 	bfs_queue.push(s);
   588 //       }
   589 //     }
   590 //     BfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
   591 //     operator++() { 
   592 //       if (G.valid(actual_edge)/*.valid()*/) { 
   593 // 	/*++*/G.next(actual_edge);
   594 // 	if (G.valid(actual_edge)/*.valid()*/) {
   595 // 	  Node w=G.bNode(actual_edge);
   596 // 	  if (!reached.get(w)) {
   597 // 	    bfs_queue.push(w);
   598 // 	    reached.set(w, true);
   599 // 	    b_node_newly_reached=true;
   600 // 	  } else {
   601 // 	    b_node_newly_reached=false;
   602 // 	  }
   603 // 	}
   604 //       } else {
   605 // 	bfs_queue.pop(); 
   606 // 	if (!bfs_queue.empty()) {
   607 // 	  G./*getF*/first(actual_edge, bfs_queue.front());
   608 // 	  if (G.valid(actual_edge)/*.valid()*/) {
   609 // 	    Node w=G.bNode(actual_edge);
   610 // 	    if (!reached.get(w)) {
   611 // 	      bfs_queue.push(w);
   612 // 	      reached.set(w, true);
   613 // 	      b_node_newly_reached=true;
   614 // 	    } else {
   615 // 	      b_node_newly_reached=false;
   616 // 	    }
   617 // 	  }
   618 // 	}
   619 //       }
   620 //       return *this;
   621 //     }
   622 //     bool finished() const { return bfs_queue.empty(); }
   623 //     operator OutEdgeIt () const { return actual_edge; }
   624 //     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   625 //     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
   626 //     Node aNode() const { return bfs_queue.front(); }
   627 //     Node bNode() const { return G.bNode(actual_edge); }
   628 //     const ReachedMap& getReachedMap() const { return reached; }
   629 //     const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
   630 //  };  
   631 
   632 
   633   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
   634 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
   635   class BfsIterator5 {
   636     typedef typename GraphWrapper::Node Node;
   637     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
   638     GraphWrapper G;
   639     std::queue<Node> bfs_queue;
   640     ReachedMap& reached;
   641     bool b_node_newly_reached;
   642     OutEdgeIt actual_edge;
   643     bool own_reached_map;
   644   public:
   645     BfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
   646       G(_G), reached(_reached), 
   647       own_reached_map(false) { }
   648     BfsIterator5(const GraphWrapper& _G) : 
   649       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
   650       own_reached_map(true) { }
   651 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G, 
   652 // 		 ReachedMap& _reached) : 
   653 //       G(_G), reached(_reached), 
   654 //       own_reached_map(false) { }
   655 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G) : 
   656 //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
   657 //       own_reached_map(true) { }
   658     ~BfsIterator5() { if (own_reached_map) delete &reached; }
   659     void pushAndSetReached(Node s) { 
   660       reached.set(s, true);
   661       if (bfs_queue.empty()) {
   662 	bfs_queue.push(s);
   663 	G./*getF*/first(actual_edge, s);
   664 	if (G.valid(actual_edge)/*.valid()*/) { 
   665 	  Node w=G.bNode(actual_edge);
   666 	  if (!reached.get(w)) {
   667 	    bfs_queue.push(w);
   668 	    reached.set(w, true);
   669 	    b_node_newly_reached=true;
   670 	  } else {
   671 	    b_node_newly_reached=false;
   672 	  }
   673 	} 
   674       } else {
   675 	bfs_queue.push(s);
   676       }
   677     }
   678     BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
   679     operator++() { 
   680       if (G.valid(actual_edge)/*.valid()*/) { 
   681 	/*++*/G.next(actual_edge);
   682 	if (G.valid(actual_edge)/*.valid()*/) {
   683 	  Node w=G.bNode(actual_edge);
   684 	  if (!reached.get(w)) {
   685 	    bfs_queue.push(w);
   686 	    reached.set(w, true);
   687 	    b_node_newly_reached=true;
   688 	  } else {
   689 	    b_node_newly_reached=false;
   690 	  }
   691 	}
   692       } else {
   693 	bfs_queue.pop(); 
   694 	if (!bfs_queue.empty()) {
   695 	  G./*getF*/first(actual_edge, bfs_queue.front());
   696 	  if (G.valid(actual_edge)/*.valid()*/) {
   697 	    Node w=G.bNode(actual_edge);
   698 	    if (!reached.get(w)) {
   699 	      bfs_queue.push(w);
   700 	      reached.set(w, true);
   701 	      b_node_newly_reached=true;
   702 	    } else {
   703 	      b_node_newly_reached=false;
   704 	    }
   705 	  }
   706 	}
   707       }
   708       return *this;
   709     }
   710     bool finished() const { return bfs_queue.empty(); }
   711     operator OutEdgeIt () const { return actual_edge; }
   712     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   713     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
   714     Node aNode() const { return bfs_queue.front(); }
   715     Node bNode() const { return G.bNode(actual_edge); }
   716     const ReachedMap& getReachedMap() const { return reached; }
   717     const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
   718   };  
   719 
   720 //   template <typename Graph, typename OutEdgeIt, 
   721 // 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
   722 //   class DfsIterator4 {
   723 //     typedef typename Graph::Node Node;
   724 //     const Graph& G;
   725 //     std::stack<OutEdgeIt> dfs_stack;
   726 //     bool b_node_newly_reached;
   727 //     OutEdgeIt actual_edge;
   728 //     Node actual_node;
   729 //     ReachedMap& reached;
   730 //     bool own_reached_map;
   731 //   public:
   732 //     DfsIterator4(const Graph& _G, ReachedMap& _reached) : 
   733 //       G(_G), reached(_reached), 
   734 //       own_reached_map(false) { }
   735 //     DfsIterator4(const Graph& _G) : 
   736 //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
   737 //       own_reached_map(true) { }
   738 //     ~DfsIterator4() { if (own_reached_map) delete &reached; }
   739 //     void pushAndSetReached(Node s) { 
   740 //       actual_node=s;
   741 //       reached.set(s, true);
   742 //       dfs_stack.push(G.template first<OutEdgeIt>(s)); 
   743 //     }
   744 //     DfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
   745 //     operator++() { 
   746 //       actual_edge=dfs_stack.top();
   747 //       //actual_node=G.aNode(actual_edge);
   748 //       if (G.valid(actual_edge)/*.valid()*/) { 
   749 // 	Node w=G.bNode(actual_edge);
   750 // 	actual_node=w;
   751 // 	if (!reached.get(w)) {
   752 // 	  dfs_stack.push(G.template first<OutEdgeIt>(w));
   753 // 	  reached.set(w, true);
   754 // 	  b_node_newly_reached=true;
   755 // 	} else {
   756 // 	  actual_node=G.aNode(actual_edge);
   757 // 	  /*++*/G.next(dfs_stack.top());
   758 // 	  b_node_newly_reached=false;
   759 // 	}
   760 //       } else {
   761 // 	//actual_node=G.aNode(dfs_stack.top());
   762 // 	dfs_stack.pop();
   763 //       }
   764 //       return *this;
   765 //     }
   766 //     bool finished() const { return dfs_stack.empty(); }
   767 //     operator OutEdgeIt () const { return actual_edge; }
   768 //     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   769 //     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
   770 //     Node aNode() const { return actual_node; /*FIXME*/}
   771 //     Node bNode() const { return G.bNode(actual_edge); }
   772 //     const ReachedMap& getReachedMap() const { return reached; }
   773 //     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
   774 //   };
   775 
   776   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
   777 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
   778   class DfsIterator5 {
   779     typedef typename GraphWrapper::Node Node;
   780     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
   781     GraphWrapper G;
   782     std::stack<OutEdgeIt> dfs_stack;
   783     bool b_node_newly_reached;
   784     OutEdgeIt actual_edge;
   785     Node actual_node;
   786     ReachedMap& reached;
   787     bool own_reached_map;
   788   public:
   789     DfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
   790       G(_G), reached(_reached), 
   791       own_reached_map(false) { }
   792     DfsIterator5(const GraphWrapper& _G) : 
   793       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
   794       own_reached_map(true) { }
   795     ~DfsIterator5() { if (own_reached_map) delete &reached; }
   796     void pushAndSetReached(Node s) { 
   797       actual_node=s;
   798       reached.set(s, true);
   799       OutEdgeIt e;
   800       G.first(e, s);
   801       dfs_stack.push(e); 
   802     }
   803     DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
   804     operator++() { 
   805       actual_edge=dfs_stack.top();
   806       //actual_node=G.aNode(actual_edge);
   807       if (G.valid(actual_edge)/*.valid()*/) { 
   808 	Node w=G.bNode(actual_edge);
   809 	actual_node=w;
   810 	if (!reached.get(w)) {
   811 	  OutEdgeIt e;
   812 	  G.first(e, w);
   813 	  dfs_stack.push(e);
   814 	  reached.set(w, true);
   815 	  b_node_newly_reached=true;
   816 	} else {
   817 	  actual_node=G.aNode(actual_edge);
   818 	  /*++*/G.next(dfs_stack.top());
   819 	  b_node_newly_reached=false;
   820 	}
   821       } else {
   822 	//actual_node=G.aNode(dfs_stack.top());
   823 	dfs_stack.pop();
   824       }
   825       return *this;
   826     }
   827     bool finished() const { return dfs_stack.empty(); }
   828     operator OutEdgeIt () const { return actual_edge; }
   829     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
   830     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
   831     Node aNode() const { return actual_node; /*FIXME*/}
   832     Node bNode() const { return G.bNode(actual_edge); }
   833     const ReachedMap& getReachedMap() const { return reached; }
   834     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
   835   };
   836 
   837 
   838 
   839 } // namespace hugo
   840 
   841 #endif //HUGO_BFS_ITERATOR_H