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