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