Not ready yet.
     2 #ifndef HUGO_BFS_ITERATOR_H
 
     3 #define HUGO_BFS_ITERATOR_H
 
     8 #include <graph_wrapper.h>
 
    12 //   template <typename Graph>
 
    14 //     typedef typename Graph::Node Node;
 
    15 //     typedef typename Graph::Edge Edge;
 
    16 //     typedef typename Graph::NodeIt NodeIt;
 
    17 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    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) { 
 
    26 //       for(NodeIt i=G.template first<NodeIt>(); i.valid(); ++i) 
 
    27 // 	reached.set(i, false);
 
    28 //       reached.set(s, true);
 
    33 //       while (!bfs_queue.empty()) {
 
    34 // 	Node v=bfs_queue.front();
 
    35 // 	OutEdgeIt e=G.template first<OutEdgeIt>(v);
 
    37 // 	for( ; e.valid(); ++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;
 
    43 // 	    dist.set(w, dist.get(v)+1);
 
    45 // 	    reached.set(w, true);
 
    47 // 	    std::cout << G.id(w) << " is already reached" << std::endl;
 
    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;
 
    60 //     bfs_visitor(Graph& _G) : G(_G) { }
 
    61 //     void at_previously_reached(OutEdgeIt& e) { 
 
    62 //       //Node v=G.aNode(e);
 
    64 //       std::cout << G.id(w) << " is already reached" << std::endl;
 
    66 //     void at_newly_reached(OutEdgeIt& e) { 
 
    67 //       //Node v=G.aNode(e);
 
    69 //       std::cout << G.id(w) << " is newly reached :-)" << std::endl;
 
    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;
 
    79 //     std::queue<OutEdgeIt>& bfs_queue;
 
    80 //     ReachedMap& reached;
 
    81 //     visitor_type& visitor;
 
    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);
 
    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);
 
    93 // 	visitor.at_previously_reached(e);
 
    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(); } 
 
   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(); } 
 
   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(); } 
 
   116 //       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   117 //       if (bfs_queue.empty()) return false; else return true;
 
   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;
 
   123 //     operator Edge () { return bfs_queue.front(); }
 
   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;
 
   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) { 
 
   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;
 
   146 // 	  _newly_reached=false;
 
   150 //     bfs_iterator1<Graph, ReachedMap>& operator++() { 
 
   151 //       if (!valid()) return *this;
 
   152 //       ++(bfs_queue.front());
 
   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;
 
   162 // 	  _newly_reached=false;
 
   168 //       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   169 //       if (bfs_queue.empty()) return false; else return true;
 
   171 //     operator OutEdgeIt() { return bfs_queue.front(); }
 
   173 //     bool newly_reached() { return _newly_reached; }
 
   177 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   178 //   struct BfsIterator {
 
   179 //     typedef typename Graph::Node Node;
 
   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;
 
   197 // 	  b_node_newly_reached=false;
 
   201 //     BfsIterator<Graph, OutEdgeIt, ReachedMap>& 
 
   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;
 
   213 // 	    b_node_newly_reached=false;
 
   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;
 
   226 // 	    b_node_newly_reached=false;
 
   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()); }
 
   239 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   240 //   struct DfsIterator {
 
   241 //     typedef typename Graph::Node Node;
 
   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;
 
   259 // 	  ++(bfs_queue.top());
 
   260 // 	  b_node_newly_reached=false;
 
   266 //     DfsIterator<Graph, OutEdgeIt, ReachedMap>& 
 
   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;
 
   276 // 	  ++(bfs_queue.top());
 
   277 // 	  b_node_newly_reached=false;
 
   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()); }
 
   290 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   291 //   struct BfsIterator1 {
 
   292 //     typedef typename Graph::Node Node;
 
   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;
 
   310 // 	  b_node_newly_reached=false;
 
   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;
 
   325 // 	    b_node_newly_reached=false;
 
   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;
 
   338 // 	    b_node_newly_reached=false;
 
   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()); }
 
   351 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   352 //   struct DfsIterator1 {
 
   353 //     typedef typename Graph::Node Node;
 
   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;
 
   371 //       //  ++(bfs_queue.top());
 
   372 //       //  b_node_newly_reached=false;
 
   375 //       //	bfs_queue.pop();
 
   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;
 
   387 // 	  ++(bfs_queue.top());
 
   388 // 	  b_node_newly_reached=false;
 
   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()); }
 
   401 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   402 //   class BfsIterator2 {
 
   403 //     typedef typename Graph::Node Node;
 
   405 //     std::queue<OutEdgeIt> bfs_queue;
 
   406 //     ReachedMap reached;
 
   407 //     bool b_node_newly_reached;
 
   408 //     OutEdgeIt actual_edge;
 
   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;
 
   423 // 	    b_node_newly_reached=false;
 
   428 // 	bfs_queue.push(G.template first<OutEdgeIt>(s));
 
   431 //     BfsIterator2<Graph, OutEdgeIt, ReachedMap>& 
 
   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;
 
   443 // 	    b_node_newly_reached=false;
 
   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;
 
   457 // 	      b_node_newly_reached=false;
 
   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; }
 
   473 //   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   474 //   class BfsIterator3 {
 
   475 //     typedef typename Graph::Node Node;
 
   477 //     std::queue< std::pair<Node, OutEdgeIt> > bfs_queue;
 
   478 //     ReachedMap reached;
 
   479 //     bool b_node_newly_reached;
 
   480 //     OutEdgeIt actual_edge;
 
   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;
 
   495 // 	    b_node_newly_reached=false;
 
   500 // 	bfs_queue.push(std::pair<Node, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
 
   503 //     BfsIterator3<Graph, OutEdgeIt, ReachedMap>& 
 
   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;
 
   515 // 	    b_node_newly_reached=false;
 
   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;
 
   529 // 	      b_node_newly_reached=false;
 
   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; }
 
   547 //   template <typename Graph, typename OutEdgeIt, 
 
   548 // 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
   549 //   class BfsIterator4 {
 
   550 //     typedef typename Graph::Node Node;
 
   552 //     std::queue<Node> bfs_queue;
 
   553 //     ReachedMap& reached;
 
   554 //     bool b_node_newly_reached;
 
   555 //     OutEdgeIt actual_edge;
 
   556 //     bool own_reached_map;
 
   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;
 
   582 // 	    b_node_newly_reached=false;
 
   586 // 	//std::cout << "bibi2" << std::endl;
 
   587 // 	bfs_queue.push(s);
 
   590 //     BfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
 
   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;
 
   601 // 	    b_node_newly_reached=false;
 
   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;
 
   615 // 	      b_node_newly_reached=false;
 
   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; }
 
   633   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 
   634 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 
   636     typedef typename GraphWrapper::Node Node;
 
   637     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 
   639     std::queue<Node> bfs_queue;
 
   641     bool b_node_newly_reached;
 
   642     OutEdgeIt actual_edge;
 
   643     bool own_reached_map;
 
   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()) {
 
   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)) {
 
   668 	    reached.set(w, true);
 
   669 	    b_node_newly_reached=true;
 
   671 	    b_node_newly_reached=false;
 
   678     BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 
   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)) {
 
   686 	    reached.set(w, true);
 
   687 	    b_node_newly_reached=true;
 
   689 	    b_node_newly_reached=false;
 
   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)) {
 
   700 	      reached.set(w, true);
 
   701 	      b_node_newly_reached=true;
 
   703 	      b_node_newly_reached=false;
 
   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; }
 
   720 //   template <typename Graph, typename OutEdgeIt, 
 
   721 // 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
   722 //   class DfsIterator4 {
 
   723 //     typedef typename Graph::Node Node;
 
   725 //     std::stack<OutEdgeIt> dfs_stack;
 
   726 //     bool b_node_newly_reached;
 
   727 //     OutEdgeIt actual_edge;
 
   729 //     ReachedMap& reached;
 
   730 //     bool own_reached_map;
 
   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) { 
 
   741 //       reached.set(s, true);
 
   742 //       dfs_stack.push(G.template first<OutEdgeIt>(s)); 
 
   744 //     DfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
 
   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);
 
   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;
 
   756 // 	  actual_node=G.aNode(actual_edge);
 
   757 // 	  /*++*/G.next(dfs_stack.top());
 
   758 // 	  b_node_newly_reached=false;
 
   761 // 	//actual_node=G.aNode(dfs_stack.top());
 
   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; }
 
   776   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 
   777 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 
   779     typedef typename GraphWrapper::Node Node;
 
   780     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 
   782     std::stack<OutEdgeIt> dfs_stack;
 
   783     bool b_node_newly_reached;
 
   784     OutEdgeIt actual_edge;
 
   787     bool own_reached_map;
 
   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) { 
 
   798       reached.set(s, true);
 
   803     DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 
   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);
 
   810 	if (!reached.get(w)) {
 
   814 	  reached.set(w, true);
 
   815 	  b_node_newly_reached=true;
 
   817 	  actual_node=G.aNode(actual_edge);
 
   818 	  /*++*/G.next(dfs_stack.top());
 
   819 	  b_node_newly_reached=false;
 
   822 	//actual_node=G.aNode(dfs_stack.top());
 
   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; }
 
   841 #endif //HUGO_BFS_ITERATOR_H