Improved docs.
     1 #ifndef BFS_ITERATOR_HH
 
     2 #define BFS_ITERATOR_HH
 
     7 #include <graph_wrapper.h>
 
    11   template <typename Graph>
 
    13     typedef typename Graph::NodeIt NodeIt;
 
    14     typedef typename Graph::EdgeIt EdgeIt;
 
    15     typedef typename Graph::EachNodeIt EachNodeIt;
 
    16     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    19     typename Graph::NodeMap<bool> reached;
 
    20     typename Graph::NodeMap<EdgeIt> pred;
 
    21     typename Graph::NodeMap<int> dist;
 
    22     std::queue<NodeIt> bfs_queue;
 
    23     bfs(Graph& _G, NodeIt _s) : G(_G), s(_s), reached(_G), pred(_G), dist(_G) { 
 
    25       for(EachNodeIt i=G.template first<EachNodeIt>(); i.valid(); ++i) 
 
    26 	reached.set(i, false);
 
    32       while (!bfs_queue.empty()) {
 
    33 	NodeIt v=bfs_queue.front();
 
    34 	OutEdgeIt e=G.template first<OutEdgeIt>(v);
 
    36 	for( ; e.valid(); ++e) {
 
    38 	  std::cout << "scan node " << G.id(w) << " from node " << G.id(v) << std::endl;
 
    39 	  if (!reached.get(w)) {
 
    40 	    std::cout << G.id(w) << " is newly reached :-)" << std::endl;
 
    42 	    dist.set(w, dist.get(v)+1);
 
    46 	    std::cout << G.id(w) << " is already reached" << std::endl;
 
    53   template <typename Graph> 
 
    55     typedef typename Graph::NodeIt NodeIt;
 
    56     typedef typename Graph::EdgeIt EdgeIt;
 
    57     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    59     bfs_visitor(Graph& _G) : G(_G) { }
 
    60     void at_previously_reached(OutEdgeIt& e) { 
 
    61       //NodeIt v=G.aNode(e);
 
    63       std::cout << G.id(w) << " is already reached" << std::endl;
 
    65     void at_newly_reached(OutEdgeIt& e) { 
 
    66       //NodeIt v=G.aNode(e);
 
    68       std::cout << G.id(w) << " is newly reached :-)" << std::endl;
 
    72   template <typename Graph, typename ReachedMap, typename visitor_type>
 
    74     typedef typename Graph::NodeIt NodeIt;
 
    75     typedef typename Graph::EdgeIt EdgeIt;
 
    76     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    78     std::queue<OutEdgeIt>& bfs_queue;
 
    80     visitor_type& visitor;
 
    82       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
    83       if (bfs_queue.empty()) return;
 
    84       OutEdgeIt e=bfs_queue.front();
 
    85       //NodeIt v=G.aNode(e);
 
    87       if (!reached.get(w)) {
 
    88 	visitor.at_newly_reached(e);
 
    89 	bfs_queue.push(G.template first<OutEdgeIt>(w));
 
    92 	visitor.at_previously_reached(e);
 
    95     bfs_iterator(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached, visitor_type& _visitor) : G(_G), bfs_queue(_bfs_queue), reached(_reached), visitor(_visitor) { 
 
    96       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
    99     bfs_iterator<Graph, ReachedMap, visitor_type>& operator++() { 
 
   100       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   101       //if (bfs_queue.empty()) return *this;
 
   102       if (!valid()) return *this;
 
   103       ++(bfs_queue.front());
 
   104       //while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   109     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   110     //  if (bfs_queue.empty()) return;
 
   111     //  ++(bfs_queue.front());
 
   112     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   115       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   116       if (bfs_queue.empty()) return false; else return true;
 
   119     //  while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   120     //  if (bfs_queue.empty()) return true; else return false;
 
   122     operator EdgeIt () { return bfs_queue.front(); }
 
   126   template <typename Graph, typename ReachedMap>
 
   127   struct bfs_iterator1 {
 
   128     typedef typename Graph::NodeIt NodeIt;
 
   129     typedef typename Graph::EdgeIt EdgeIt;
 
   130     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
   132     std::queue<OutEdgeIt>& bfs_queue;
 
   135     bfs_iterator1(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached) : G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
 
   137       if (!bfs_queue.empty() && bfs_queue.front().valid()) { 
 
   138 	OutEdgeIt e=bfs_queue.front();
 
   140 	if (!reached.get(w)) {
 
   141 	  bfs_queue.push(G.template first<OutEdgeIt>(w));
 
   142 	  reached.set(w, true);
 
   145 	  _newly_reached=false;
 
   149     bfs_iterator1<Graph, ReachedMap>& operator++() { 
 
   150       if (!valid()) return *this;
 
   151       ++(bfs_queue.front());
 
   153       if (!bfs_queue.empty() && bfs_queue.front().valid()) { 
 
   154 	OutEdgeIt e=bfs_queue.front();
 
   156 	if (!reached.get(w)) {
 
   157 	  bfs_queue.push(G.template first<OutEdgeIt>(w));
 
   158 	  reached.set(w, true);
 
   161 	  _newly_reached=false;
 
   167       while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } 
 
   168       if (bfs_queue.empty()) return false; else return true;
 
   170     operator OutEdgeIt() { return bfs_queue.front(); }
 
   172     bool newly_reached() { return _newly_reached; }
 
   176   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   178     typedef typename Graph::NodeIt NodeIt;
 
   180     std::queue<OutEdgeIt>& bfs_queue;
 
   182     bool b_node_newly_reached;
 
   183     OutEdgeIt actual_edge;
 
   184     BfsIterator(Graph& _G, 
 
   185 		std::queue<OutEdgeIt>& _bfs_queue, 
 
   186 		ReachedMap& _reached) : 
 
   187       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
 
   188       actual_edge=bfs_queue.front();
 
   189       if (actual_edge.valid()) { 
 
   190 	NodeIt w=G.bNode(actual_edge);
 
   191 	if (!reached.get(w)) {
 
   192 	  bfs_queue.push(G.firstOutEdge(w));
 
   193 	  reached.set(w, true);
 
   194 	  b_node_newly_reached=true;
 
   196 	  b_node_newly_reached=false;
 
   200     BfsIterator<Graph, OutEdgeIt, ReachedMap>& 
 
   202       if (bfs_queue.front().valid()) { 
 
   203 	++(bfs_queue.front());
 
   204 	actual_edge=bfs_queue.front();
 
   205 	if (actual_edge.valid()) {
 
   206 	  NodeIt w=G.bNode(actual_edge);
 
   207 	  if (!reached.get(w)) {
 
   208 	    bfs_queue.push(G.firstOutEdge(w));
 
   209 	    reached.set(w, true);
 
   210 	    b_node_newly_reached=true;
 
   212 	    b_node_newly_reached=false;
 
   217 	actual_edge=bfs_queue.front();
 
   218 	if (actual_edge.valid()) {
 
   219 	  NodeIt w=G.bNode(actual_edge);
 
   220 	  if (!reached.get(w)) {
 
   221 	    bfs_queue.push(G.firstOutEdge(w));
 
   222 	    reached.set(w, true);
 
   223 	    b_node_newly_reached=true;
 
   225 	    b_node_newly_reached=false;
 
   231     bool finished() { return bfs_queue.empty(); }
 
   232     operator OutEdgeIt () { return actual_edge; }
 
   233     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
 
   234     bool aNodeIsExamined() { return !(actual_edge.valid()); }
 
   238   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   240     typedef typename Graph::NodeIt NodeIt;
 
   242     std::stack<OutEdgeIt>& bfs_queue;
 
   244     bool b_node_newly_reached;
 
   245     OutEdgeIt actual_edge;
 
   246     DfsIterator(Graph& _G, 
 
   247 		std::stack<OutEdgeIt>& _bfs_queue, 
 
   248 		ReachedMap& _reached) : 
 
   249       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
 
   250       actual_edge=bfs_queue.top();
 
   251       if (actual_edge.valid()) { 
 
   252 	NodeIt w=G.bNode(actual_edge);
 
   253 	if (!reached.get(w)) {
 
   254 	  bfs_queue.push(G.firstOutEdge(w));
 
   255 	  reached.set(w, true);
 
   256 	  b_node_newly_reached=true;
 
   259 	  b_node_newly_reached=false;
 
   265     DfsIterator<Graph, OutEdgeIt, ReachedMap>& 
 
   267       actual_edge=bfs_queue.top();
 
   268       if (actual_edge.valid()) { 
 
   269 	NodeIt w=G.bNode(actual_edge);
 
   270 	if (!reached.get(w)) {
 
   271 	  bfs_queue.push(G.firstOutEdge(w));
 
   272 	  reached.set(w, true);
 
   273 	  b_node_newly_reached=true;
 
   276 	  b_node_newly_reached=false;
 
   283     bool finished() { return bfs_queue.empty(); }
 
   284     operator OutEdgeIt () { return actual_edge; }
 
   285     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
 
   286     bool aNodeIsExamined() { return !(actual_edge.valid()); }
 
   289   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   290   struct BfsIterator1 {
 
   291     typedef typename Graph::NodeIt NodeIt;
 
   293     std::queue<OutEdgeIt>& bfs_queue;
 
   295     bool b_node_newly_reached;
 
   296     OutEdgeIt actual_edge;
 
   297     BfsIterator1(Graph& _G, 
 
   298 		std::queue<OutEdgeIt>& _bfs_queue, 
 
   299 		ReachedMap& _reached) : 
 
   300       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
 
   301       actual_edge=bfs_queue.front();
 
   302       if (actual_edge.valid()) { 
 
   303       	NodeIt w=G.bNode(actual_edge);
 
   304 	if (!reached.get(w)) {
 
   305 	  bfs_queue.push(OutEdgeIt(G, w));
 
   306 	  reached.set(w, true);
 
   307 	  b_node_newly_reached=true;
 
   309 	  b_node_newly_reached=false;
 
   314       if (bfs_queue.front().valid()) { 
 
   315 	++(bfs_queue.front());
 
   316 	actual_edge=bfs_queue.front();
 
   317 	if (actual_edge.valid()) {
 
   318 	  NodeIt w=G.bNode(actual_edge);
 
   319 	  if (!reached.get(w)) {
 
   320 	    bfs_queue.push(OutEdgeIt(G, w));
 
   321 	    reached.set(w, true);
 
   322 	    b_node_newly_reached=true;
 
   324 	    b_node_newly_reached=false;
 
   329 	actual_edge=bfs_queue.front();
 
   330 	if (actual_edge.valid()) {
 
   331 	  NodeIt w=G.bNode(actual_edge);
 
   332 	  if (!reached.get(w)) {
 
   333 	    bfs_queue.push(OutEdgeIt(G, w));
 
   334 	    reached.set(w, true);
 
   335 	    b_node_newly_reached=true;
 
   337 	    b_node_newly_reached=false;
 
   343     bool finished() { return bfs_queue.empty(); }
 
   344     operator OutEdgeIt () { return actual_edge; }
 
   345     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
 
   346     bool aNodeIsExamined() { return !(actual_edge.valid()); }
 
   350   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   351   struct DfsIterator1 {
 
   352     typedef typename Graph::NodeIt NodeIt;
 
   354     std::stack<OutEdgeIt>& bfs_queue;
 
   356     bool b_node_newly_reached;
 
   357     OutEdgeIt actual_edge;
 
   358     DfsIterator1(Graph& _G, 
 
   359 		std::stack<OutEdgeIt>& _bfs_queue, 
 
   360 		ReachedMap& _reached) : 
 
   361       G(_G), bfs_queue(_bfs_queue), reached(_reached) { 
 
   362       //actual_edge=bfs_queue.top();
 
   363       //if (actual_edge.valid()) { 
 
   364       //	NodeIt w=G.bNode(actual_edge);
 
   365       //if (!reached.get(w)) {
 
   366       //  bfs_queue.push(OutEdgeIt(G, w));
 
   367       //  reached.set(w, true);
 
   368       //  b_node_newly_reached=true;
 
   370       //  ++(bfs_queue.top());
 
   371       //  b_node_newly_reached=false;
 
   378       actual_edge=bfs_queue.top();
 
   379       if (actual_edge.valid()) { 
 
   380 	NodeIt w=G.bNode(actual_edge);
 
   381 	if (!reached.get(w)) {
 
   382 	  bfs_queue.push(OutEdgeIt(G, w));
 
   383 	  reached.set(w, true);
 
   384 	  b_node_newly_reached=true;
 
   387 	  b_node_newly_reached=false;
 
   394     bool finished() { return bfs_queue.empty(); }
 
   395     operator OutEdgeIt () { return actual_edge; }
 
   396     bool bNodeIsNewlyReached() { return b_node_newly_reached; }
 
   397     bool aNodeIsLeaved() { return !(actual_edge.valid()); }
 
   400   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   402     typedef typename Graph::NodeIt NodeIt;
 
   404     std::queue<OutEdgeIt> bfs_queue;
 
   406     bool b_node_newly_reached;
 
   407     OutEdgeIt actual_edge;
 
   409     BfsIterator2(const Graph& _G) : G(_G), reached(G, false) { }
 
   410     void pushAndSetReached(NodeIt s) { 
 
   411       reached.set(s, true);
 
   412       if (bfs_queue.empty()) {
 
   413 	bfs_queue.push(G.template first<OutEdgeIt>(s));
 
   414 	actual_edge=bfs_queue.front();
 
   415 	if (actual_edge.valid()) { 
 
   416 	  NodeIt w=G.bNode(actual_edge);
 
   417 	  if (!reached.get(w)) {
 
   418 	    bfs_queue.push(G.template first<OutEdgeIt>(w));
 
   419 	    reached.set(w, true);
 
   420 	    b_node_newly_reached=true;
 
   422 	    b_node_newly_reached=false;
 
   427 	bfs_queue.push(G.template first<OutEdgeIt>(s));
 
   430     BfsIterator2<Graph, OutEdgeIt, ReachedMap>& 
 
   432       if (bfs_queue.front().valid()) { 
 
   433 	++(bfs_queue.front());
 
   434 	actual_edge=bfs_queue.front();
 
   435 	if (actual_edge.valid()) {
 
   436 	  NodeIt w=G.bNode(actual_edge);
 
   437 	  if (!reached.get(w)) {
 
   438 	    bfs_queue.push(G.template first<OutEdgeIt>(w));
 
   439 	    reached.set(w, true);
 
   440 	    b_node_newly_reached=true;
 
   442 	    b_node_newly_reached=false;
 
   447 	if (!bfs_queue.empty()) {
 
   448 	  actual_edge=bfs_queue.front();
 
   449 	  if (actual_edge.valid()) {
 
   450 	    NodeIt w=G.bNode(actual_edge);
 
   451 	    if (!reached.get(w)) {
 
   452 	      bfs_queue.push(G.template first<OutEdgeIt>(w));
 
   453 	      reached.set(w, true);
 
   454 	      b_node_newly_reached=true;
 
   456 	      b_node_newly_reached=false;
 
   463     bool finished() const { return bfs_queue.empty(); }
 
   464     operator OutEdgeIt () const { return actual_edge; }
 
   465     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   466     bool isANodeExamined() const { return !(actual_edge.valid()); }
 
   467     const ReachedMap& getReachedMap() const { return reached; }
 
   468     const std::queue<OutEdgeIt>& getBfsQueue() const { return bfs_queue; }
 
   472   template <typename Graph, typename OutEdgeIt, typename ReachedMap>
 
   474     typedef typename Graph::NodeIt NodeIt;
 
   476     std::queue< std::pair<NodeIt, OutEdgeIt> > bfs_queue;
 
   478     bool b_node_newly_reached;
 
   479     OutEdgeIt actual_edge;
 
   481     BfsIterator3(const Graph& _G) : G(_G), reached(G, false) { }
 
   482     void pushAndSetReached(NodeIt s) { 
 
   483       reached.set(s, true);
 
   484       if (bfs_queue.empty()) {
 
   485 	bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
 
   486 	actual_edge=bfs_queue.front().second;
 
   487 	if (actual_edge.valid()) { 
 
   488 	  NodeIt w=G.bNode(actual_edge);
 
   489 	  if (!reached.get(w)) {
 
   490 	    bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
 
   491 	    reached.set(w, true);
 
   492 	    b_node_newly_reached=true;
 
   494 	    b_node_newly_reached=false;
 
   499 	bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(s, G.template first<OutEdgeIt>(s)));
 
   502     BfsIterator3<Graph, OutEdgeIt, ReachedMap>& 
 
   504       if (bfs_queue.front().second.valid()) { 
 
   505 	++(bfs_queue.front().second);
 
   506 	actual_edge=bfs_queue.front().second;
 
   507 	if (actual_edge.valid()) {
 
   508 	  NodeIt w=G.bNode(actual_edge);
 
   509 	  if (!reached.get(w)) {
 
   510 	    bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
 
   511 	    reached.set(w, true);
 
   512 	    b_node_newly_reached=true;
 
   514 	    b_node_newly_reached=false;
 
   519 	if (!bfs_queue.empty()) {
 
   520 	  actual_edge=bfs_queue.front().second;
 
   521 	  if (actual_edge.valid()) {
 
   522 	    NodeIt w=G.bNode(actual_edge);
 
   523 	    if (!reached.get(w)) {
 
   524 	      bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(w, G.template first<OutEdgeIt>(w)));
 
   525 	      reached.set(w, true);
 
   526 	      b_node_newly_reached=true;
 
   528 	      b_node_newly_reached=false;
 
   535     bool finished() const { return bfs_queue.empty(); }
 
   536     operator OutEdgeIt () const { return actual_edge; }
 
   537     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   538     bool isANodeExamined() const { return !(actual_edge.valid()); }
 
   539     NodeIt aNode() const { return bfs_queue.front().first; }
 
   540     NodeIt bNode() const { return G.bNode(actual_edge); }
 
   541     const ReachedMap& getReachedMap() const { return reached; }
 
   542     //const std::queue< std::pair<NodeIt, OutEdgeIt> >& getBfsQueue() const { return bfs_queue; }
 
   546   template <typename Graph, typename OutEdgeIt, 
 
   547 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
   549     typedef typename Graph::NodeIt NodeIt;
 
   551     std::queue<NodeIt> bfs_queue;
 
   553     bool b_node_newly_reached;
 
   554     OutEdgeIt actual_edge;
 
   555     bool own_reached_map;
 
   557     BfsIterator4(const Graph& _G, ReachedMap& _reached) : 
 
   558       G(_G), reached(_reached), 
 
   559       own_reached_map(false) { }
 
   560     BfsIterator4(const Graph& _G) : 
 
   561       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 
   562       own_reached_map(true) { }
 
   563     ~BfsIterator4() { if (own_reached_map) delete &reached; }
 
   564     void pushAndSetReached(NodeIt s) { 
 
   565       //std::cout << "mimi" << &reached << std::endl;
 
   566       reached.set(s, true);
 
   567       //std::cout << "mumus" << std::endl;
 
   568       if (bfs_queue.empty()) {
 
   569 	//std::cout << "bibi1" << std::endl;
 
   571 	//std::cout << "zizi" << std::endl;
 
   572 	G.getFirst(actual_edge, s);
 
   573 	//std::cout << "kiki" << std::endl;
 
   574 	if (G.valid(actual_edge)/*.valid()*/) { 
 
   575 	  NodeIt w=G.bNode(actual_edge);
 
   576 	  if (!reached.get(w)) {
 
   578 	    reached.set(w, true);
 
   579 	    b_node_newly_reached=true;
 
   581 	    b_node_newly_reached=false;
 
   585 	//std::cout << "bibi2" << std::endl;
 
   589     BfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
 
   591       if (G.valid(actual_edge)/*.valid()*/) { 
 
   592 	/*++*/G.next(actual_edge);
 
   593 	if (G.valid(actual_edge)/*.valid()*/) {
 
   594 	  NodeIt w=G.bNode(actual_edge);
 
   595 	  if (!reached.get(w)) {
 
   597 	    reached.set(w, true);
 
   598 	    b_node_newly_reached=true;
 
   600 	    b_node_newly_reached=false;
 
   605 	if (!bfs_queue.empty()) {
 
   606 	  G.getFirst(actual_edge, bfs_queue.front());
 
   607 	  if (G.valid(actual_edge)/*.valid()*/) {
 
   608 	    NodeIt w=G.bNode(actual_edge);
 
   609 	    if (!reached.get(w)) {
 
   611 	      reached.set(w, true);
 
   612 	      b_node_newly_reached=true;
 
   614 	      b_node_newly_reached=false;
 
   621     bool finished() const { return bfs_queue.empty(); }
 
   622     operator OutEdgeIt () const { return actual_edge; }
 
   623     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   624     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 
   625     NodeIt aNode() const { return bfs_queue.front(); }
 
   626     NodeIt bNode() const { return G.bNode(actual_edge); }
 
   627     const ReachedMap& getReachedMap() const { return reached; }
 
   628     const std::queue<NodeIt>& getBfsQueue() const { return bfs_queue; }
 
   632   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 
   633 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 
   635     typedef typename GraphWrapper::NodeIt NodeIt;
 
   636     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 
   638     std::queue<NodeIt> bfs_queue;
 
   640     bool b_node_newly_reached;
 
   641     OutEdgeIt actual_edge;
 
   642     bool own_reached_map;
 
   644     BfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
 
   645       G(_G), reached(_reached), 
 
   646       own_reached_map(false) { }
 
   647     BfsIterator5(const GraphWrapper& _G) : 
 
   648       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 
   649       own_reached_map(true) { }
 
   650 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G, 
 
   651 // 		 ReachedMap& _reached) : 
 
   652 //       G(_G), reached(_reached), 
 
   653 //       own_reached_map(false) { }
 
   654 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G) : 
 
   655 //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 
   656 //       own_reached_map(true) { }
 
   657     ~BfsIterator5() { if (own_reached_map) delete &reached; }
 
   658     void pushAndSetReached(NodeIt s) { 
 
   659       reached.set(s, true);
 
   660       if (bfs_queue.empty()) {
 
   662 	G.getFirst(actual_edge, s);
 
   663 	if (G.valid(actual_edge)/*.valid()*/) { 
 
   664 	  NodeIt w=G.bNode(actual_edge);
 
   665 	  if (!reached.get(w)) {
 
   667 	    reached.set(w, true);
 
   668 	    b_node_newly_reached=true;
 
   670 	    b_node_newly_reached=false;
 
   677     BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 
   679       if (G.valid(actual_edge)/*.valid()*/) { 
 
   680 	/*++*/G.next(actual_edge);
 
   681 	if (G.valid(actual_edge)/*.valid()*/) {
 
   682 	  NodeIt w=G.bNode(actual_edge);
 
   683 	  if (!reached.get(w)) {
 
   685 	    reached.set(w, true);
 
   686 	    b_node_newly_reached=true;
 
   688 	    b_node_newly_reached=false;
 
   693 	if (!bfs_queue.empty()) {
 
   694 	  G.getFirst(actual_edge, bfs_queue.front());
 
   695 	  if (G.valid(actual_edge)/*.valid()*/) {
 
   696 	    NodeIt w=G.bNode(actual_edge);
 
   697 	    if (!reached.get(w)) {
 
   699 	      reached.set(w, true);
 
   700 	      b_node_newly_reached=true;
 
   702 	      b_node_newly_reached=false;
 
   709     bool finished() const { return bfs_queue.empty(); }
 
   710     operator OutEdgeIt () const { return actual_edge; }
 
   711     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   712     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 
   713     NodeIt aNode() const { return bfs_queue.front(); }
 
   714     NodeIt bNode() const { return G.bNode(actual_edge); }
 
   715     const ReachedMap& getReachedMap() const { return reached; }
 
   716     const std::queue<NodeIt>& getBfsQueue() const { return bfs_queue; }
 
   719   template <typename Graph, typename OutEdgeIt, 
 
   720 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
   722     typedef typename Graph::NodeIt NodeIt;
 
   724     std::stack<OutEdgeIt> dfs_stack;
 
   725     bool b_node_newly_reached;
 
   726     OutEdgeIt actual_edge;
 
   729     bool own_reached_map;
 
   731     DfsIterator4(const Graph& _G, ReachedMap& _reached) : 
 
   732       G(_G), reached(_reached), 
 
   733       own_reached_map(false) { }
 
   734     DfsIterator4(const Graph& _G) : 
 
   735       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 
   736       own_reached_map(true) { }
 
   737     ~DfsIterator4() { if (own_reached_map) delete &reached; }
 
   738     void pushAndSetReached(NodeIt s) { 
 
   740       reached.set(s, true);
 
   741       dfs_stack.push(G.template first<OutEdgeIt>(s)); 
 
   743     DfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
 
   745       actual_edge=dfs_stack.top();
 
   746       //actual_node=G.aNode(actual_edge);
 
   747       if (G.valid(actual_edge)/*.valid()*/) { 
 
   748 	NodeIt w=G.bNode(actual_edge);
 
   750 	if (!reached.get(w)) {
 
   751 	  dfs_stack.push(G.template first<OutEdgeIt>(w));
 
   752 	  reached.set(w, true);
 
   753 	  b_node_newly_reached=true;
 
   755 	  actual_node=G.aNode(actual_edge);
 
   756 	  /*++*/G.next(dfs_stack.top());
 
   757 	  b_node_newly_reached=false;
 
   760 	//actual_node=G.aNode(dfs_stack.top());
 
   765     bool finished() const { return dfs_stack.empty(); }
 
   766     operator OutEdgeIt () const { return actual_edge; }
 
   767     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   768     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 
   769     NodeIt aNode() const { return actual_node; /*FIXME*/}
 
   770     NodeIt bNode() const { return G.bNode(actual_edge); }
 
   771     const ReachedMap& getReachedMap() const { return reached; }
 
   772     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
 
   775   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 
   776 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 
   778     typedef typename GraphWrapper::NodeIt NodeIt;
 
   779     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 
   781     std::stack<OutEdgeIt> dfs_stack;
 
   782     bool b_node_newly_reached;
 
   783     OutEdgeIt actual_edge;
 
   786     bool own_reached_map;
 
   788     DfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
 
   789       G(_G), reached(_reached), 
 
   790       own_reached_map(false) { }
 
   791     DfsIterator5(const GraphWrapper& _G) : 
 
   792       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 
   793       own_reached_map(true) { }
 
   794     ~DfsIterator5() { if (own_reached_map) delete &reached; }
 
   795     void pushAndSetReached(NodeIt s) { 
 
   797       reached.set(s, true);
 
   798       dfs_stack.push(G.template first<OutEdgeIt>(s)); 
 
   800     DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 
   802       actual_edge=dfs_stack.top();
 
   803       //actual_node=G.aNode(actual_edge);
 
   804       if (G.valid(actual_edge)/*.valid()*/) { 
 
   805 	NodeIt w=G.bNode(actual_edge);
 
   807 	if (!reached.get(w)) {
 
   808 	  dfs_stack.push(G.template first<OutEdgeIt>(w));
 
   809 	  reached.set(w, true);
 
   810 	  b_node_newly_reached=true;
 
   812 	  actual_node=G.aNode(actual_edge);
 
   813 	  /*++*/G.next(dfs_stack.top());
 
   814 	  b_node_newly_reached=false;
 
   817 	//actual_node=G.aNode(dfs_stack.top());
 
   822     bool finished() const { return dfs_stack.empty(); }
 
   823     operator OutEdgeIt () const { return actual_edge; }
 
   824     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   825     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 
   826     NodeIt aNode() const { return actual_node; /*FIXME*/}
 
   827     NodeIt bNode() const { return G.bNode(actual_edge); }
 
   828     const ReachedMap& getReachedMap() const { return reached; }
 
   829     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
 
   836 #endif //BFS_ITERATOR_HH