| marci@281 |      1 | // -*- c++ -*-
 | 
| marci@281 |      2 | #ifndef HUGO_BFS_ITERATOR_H
 | 
| marci@281 |      3 | #define HUGO_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.h>
 | 
| marci@281 |      9 | 
 | 
| marci@281 |     10 | namespace hugo {
 | 
| 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@281 |    633 |   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 | 
| marci@281 |    634 | 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 | 
| marci@281 |    635 |   class BfsIterator5 {
 | 
| marci@281 |    636 |     typedef typename GraphWrapper::Node Node;
 | 
| marci@281 |    637 |     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 | 
| marci@281 |    638 |     GraphWrapper G;
 | 
| marci@281 |    639 |     std::queue<Node> bfs_queue;
 | 
| marci@281 |    640 |     ReachedMap& reached;
 | 
| marci@281 |    641 |     bool b_node_newly_reached;
 | 
| marci@281 |    642 |     OutEdgeIt actual_edge;
 | 
| marci@281 |    643 |     bool own_reached_map;
 | 
| marci@281 |    644 |   public:
 | 
| marci@281 |    645 |     BfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
 | 
| marci@281 |    646 |       G(_G), reached(_reached), 
 | 
| marci@281 |    647 |       own_reached_map(false) { }
 | 
| marci@281 |    648 |     BfsIterator5(const GraphWrapper& _G) : 
 | 
| marci@281 |    649 |       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 | 
| marci@281 |    650 |       own_reached_map(true) { }
 | 
| marci@281 |    651 | //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G, 
 | 
| marci@281 |    652 | // 		 ReachedMap& _reached) : 
 | 
| marci@281 |    653 | //       G(_G), reached(_reached), 
 | 
| marci@281 |    654 | //       own_reached_map(false) { }
 | 
| marci@281 |    655 | //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G) : 
 | 
| marci@281 |    656 | //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 | 
| marci@281 |    657 | //       own_reached_map(true) { }
 | 
| marci@281 |    658 |     ~BfsIterator5() { if (own_reached_map) delete &reached; }
 | 
| marci@281 |    659 |     void pushAndSetReached(Node s) { 
 | 
| marci@281 |    660 |       reached.set(s, true);
 | 
| marci@281 |    661 |       if (bfs_queue.empty()) {
 | 
| marci@281 |    662 | 	bfs_queue.push(s);
 | 
| marci@281 |    663 | 	G./*getF*/first(actual_edge, s);
 | 
| marci@281 |    664 | 	if (G.valid(actual_edge)/*.valid()*/) { 
 | 
| marci@281 |    665 | 	  Node w=G.bNode(actual_edge);
 | 
| marci@281 |    666 | 	  if (!reached.get(w)) {
 | 
| marci@281 |    667 | 	    bfs_queue.push(w);
 | 
| marci@281 |    668 | 	    reached.set(w, true);
 | 
| marci@281 |    669 | 	    b_node_newly_reached=true;
 | 
| marci@281 |    670 | 	  } else {
 | 
| marci@281 |    671 | 	    b_node_newly_reached=false;
 | 
| marci@281 |    672 | 	  }
 | 
| marci@281 |    673 | 	} 
 | 
| marci@281 |    674 |       } else {
 | 
| marci@281 |    675 | 	bfs_queue.push(s);
 | 
| marci@281 |    676 |       }
 | 
| marci@281 |    677 |     }
 | 
| marci@281 |    678 |     BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 | 
| marci@281 |    679 |     operator++() { 
 | 
| marci@281 |    680 |       if (G.valid(actual_edge)/*.valid()*/) { 
 | 
| marci@281 |    681 | 	/*++*/G.next(actual_edge);
 | 
| marci@281 |    682 | 	if (G.valid(actual_edge)/*.valid()*/) {
 | 
| marci@281 |    683 | 	  Node w=G.bNode(actual_edge);
 | 
| marci@281 |    684 | 	  if (!reached.get(w)) {
 | 
| marci@281 |    685 | 	    bfs_queue.push(w);
 | 
| marci@281 |    686 | 	    reached.set(w, true);
 | 
| marci@281 |    687 | 	    b_node_newly_reached=true;
 | 
| marci@281 |    688 | 	  } else {
 | 
| marci@281 |    689 | 	    b_node_newly_reached=false;
 | 
| marci@281 |    690 | 	  }
 | 
| marci@281 |    691 | 	}
 | 
| marci@281 |    692 |       } else {
 | 
| marci@281 |    693 | 	bfs_queue.pop(); 
 | 
| marci@281 |    694 | 	if (!bfs_queue.empty()) {
 | 
| marci@281 |    695 | 	  G./*getF*/first(actual_edge, bfs_queue.front());
 | 
| marci@281 |    696 | 	  if (G.valid(actual_edge)/*.valid()*/) {
 | 
| marci@281 |    697 | 	    Node w=G.bNode(actual_edge);
 | 
| marci@281 |    698 | 	    if (!reached.get(w)) {
 | 
| marci@281 |    699 | 	      bfs_queue.push(w);
 | 
| marci@281 |    700 | 	      reached.set(w, true);
 | 
| marci@281 |    701 | 	      b_node_newly_reached=true;
 | 
| marci@281 |    702 | 	    } else {
 | 
| marci@281 |    703 | 	      b_node_newly_reached=false;
 | 
| marci@281 |    704 | 	    }
 | 
| marci@281 |    705 | 	  }
 | 
| marci@281 |    706 | 	}
 | 
| marci@281 |    707 |       }
 | 
| marci@281 |    708 |       return *this;
 | 
| marci@281 |    709 |     }
 | 
| marci@281 |    710 |     bool finished() const { return bfs_queue.empty(); }
 | 
| marci@281 |    711 |     operator OutEdgeIt () const { return actual_edge; }
 | 
| marci@281 |    712 |     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 | 
| marci@281 |    713 |     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 | 
| marci@281 |    714 |     Node aNode() const { return bfs_queue.front(); }
 | 
| marci@281 |    715 |     Node bNode() const { return G.bNode(actual_edge); }
 | 
| marci@281 |    716 |     const ReachedMap& getReachedMap() const { return reached; }
 | 
| marci@281 |    717 |     const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
 | 
| marci@281 |    718 |   };  
 | 
| marci@281 |    719 | 
 | 
| marci@281 |    720 | //   template <typename Graph, typename OutEdgeIt, 
 | 
| marci@281 |    721 | // 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 | 
| marci@281 |    722 | //   class DfsIterator4 {
 | 
| marci@281 |    723 | //     typedef typename Graph::Node Node;
 | 
| marci@281 |    724 | //     const Graph& G;
 | 
| marci@281 |    725 | //     std::stack<OutEdgeIt> dfs_stack;
 | 
| marci@281 |    726 | //     bool b_node_newly_reached;
 | 
| marci@281 |    727 | //     OutEdgeIt actual_edge;
 | 
| marci@281 |    728 | //     Node actual_node;
 | 
| marci@281 |    729 | //     ReachedMap& reached;
 | 
| marci@281 |    730 | //     bool own_reached_map;
 | 
| marci@281 |    731 | //   public:
 | 
| marci@281 |    732 | //     DfsIterator4(const Graph& _G, ReachedMap& _reached) : 
 | 
| marci@281 |    733 | //       G(_G), reached(_reached), 
 | 
| marci@281 |    734 | //       own_reached_map(false) { }
 | 
| marci@281 |    735 | //     DfsIterator4(const Graph& _G) : 
 | 
| marci@281 |    736 | //       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 | 
| marci@281 |    737 | //       own_reached_map(true) { }
 | 
| marci@281 |    738 | //     ~DfsIterator4() { if (own_reached_map) delete &reached; }
 | 
| marci@281 |    739 | //     void pushAndSetReached(Node s) { 
 | 
| marci@281 |    740 | //       actual_node=s;
 | 
| marci@281 |    741 | //       reached.set(s, true);
 | 
| marci@281 |    742 | //       dfs_stack.push(G.template first<OutEdgeIt>(s)); 
 | 
| marci@281 |    743 | //     }
 | 
| marci@281 |    744 | //     DfsIterator4<Graph, OutEdgeIt, ReachedMap>& 
 | 
| marci@281 |    745 | //     operator++() { 
 | 
| marci@281 |    746 | //       actual_edge=dfs_stack.top();
 | 
| marci@281 |    747 | //       //actual_node=G.aNode(actual_edge);
 | 
| marci@281 |    748 | //       if (G.valid(actual_edge)/*.valid()*/) { 
 | 
| marci@281 |    749 | // 	Node w=G.bNode(actual_edge);
 | 
| marci@281 |    750 | // 	actual_node=w;
 | 
| marci@281 |    751 | // 	if (!reached.get(w)) {
 | 
| marci@281 |    752 | // 	  dfs_stack.push(G.template first<OutEdgeIt>(w));
 | 
| marci@281 |    753 | // 	  reached.set(w, true);
 | 
| marci@281 |    754 | // 	  b_node_newly_reached=true;
 | 
| marci@281 |    755 | // 	} else {
 | 
| marci@281 |    756 | // 	  actual_node=G.aNode(actual_edge);
 | 
| marci@281 |    757 | // 	  /*++*/G.next(dfs_stack.top());
 | 
| marci@281 |    758 | // 	  b_node_newly_reached=false;
 | 
| marci@281 |    759 | // 	}
 | 
| marci@281 |    760 | //       } else {
 | 
| marci@281 |    761 | // 	//actual_node=G.aNode(dfs_stack.top());
 | 
| marci@281 |    762 | // 	dfs_stack.pop();
 | 
| marci@281 |    763 | //       }
 | 
| marci@281 |    764 | //       return *this;
 | 
| marci@281 |    765 | //     }
 | 
| marci@281 |    766 | //     bool finished() const { return dfs_stack.empty(); }
 | 
| marci@281 |    767 | //     operator OutEdgeIt () const { return actual_edge; }
 | 
| marci@281 |    768 | //     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 | 
| marci@281 |    769 | //     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 | 
| marci@281 |    770 | //     Node aNode() const { return actual_node; /*FIXME*/}
 | 
| marci@281 |    771 | //     Node bNode() const { return G.bNode(actual_edge); }
 | 
| marci@281 |    772 | //     const ReachedMap& getReachedMap() const { return reached; }
 | 
| marci@281 |    773 | //     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
 | 
| marci@281 |    774 | //   };
 | 
| marci@281 |    775 | 
 | 
| marci@281 |    776 |   template <typename GraphWrapper, /*typename OutEdgeIt,*/ 
 | 
| marci@281 |    777 | 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >
 | 
| marci@281 |    778 |   class DfsIterator5 {
 | 
| marci@281 |    779 |     typedef typename GraphWrapper::Node Node;
 | 
| marci@281 |    780 |     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
 | 
| marci@281 |    781 |     GraphWrapper G;
 | 
| marci@281 |    782 |     std::stack<OutEdgeIt> dfs_stack;
 | 
| marci@281 |    783 |     bool b_node_newly_reached;
 | 
| marci@281 |    784 |     OutEdgeIt actual_edge;
 | 
| marci@281 |    785 |     Node actual_node;
 | 
| marci@281 |    786 |     ReachedMap& reached;
 | 
| marci@281 |    787 |     bool own_reached_map;
 | 
| marci@281 |    788 |   public:
 | 
| marci@281 |    789 |     DfsIterator5(const GraphWrapper& _G, ReachedMap& _reached) : 
 | 
| marci@281 |    790 |       G(_G), reached(_reached), 
 | 
| marci@281 |    791 |       own_reached_map(false) { }
 | 
| marci@281 |    792 |     DfsIterator5(const GraphWrapper& _G) : 
 | 
| marci@281 |    793 |       G(_G), reached(*(new ReachedMap(G /*, false*/))), 
 | 
| marci@281 |    794 |       own_reached_map(true) { }
 | 
| marci@281 |    795 |     ~DfsIterator5() { if (own_reached_map) delete &reached; }
 | 
| marci@281 |    796 |     void pushAndSetReached(Node s) { 
 | 
| marci@281 |    797 |       actual_node=s;
 | 
| marci@281 |    798 |       reached.set(s, true);
 | 
| marci@281 |    799 |       OutEdgeIt e;
 | 
| marci@281 |    800 |       G.first(e, s);
 | 
| marci@281 |    801 |       dfs_stack.push(e); 
 | 
| marci@281 |    802 |     }
 | 
| marci@281 |    803 |     DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& 
 | 
| marci@281 |    804 |     operator++() { 
 | 
| marci@281 |    805 |       actual_edge=dfs_stack.top();
 | 
| marci@281 |    806 |       //actual_node=G.aNode(actual_edge);
 | 
| marci@281 |    807 |       if (G.valid(actual_edge)/*.valid()*/) { 
 | 
| marci@281 |    808 | 	Node w=G.bNode(actual_edge);
 | 
| marci@281 |    809 | 	actual_node=w;
 | 
| marci@281 |    810 | 	if (!reached.get(w)) {
 | 
| marci@281 |    811 | 	  OutEdgeIt e;
 | 
| marci@281 |    812 | 	  G.first(e, w);
 | 
| marci@281 |    813 | 	  dfs_stack.push(e);
 | 
| marci@281 |    814 | 	  reached.set(w, true);
 | 
| marci@281 |    815 | 	  b_node_newly_reached=true;
 | 
| marci@281 |    816 | 	} else {
 | 
| marci@281 |    817 | 	  actual_node=G.aNode(actual_edge);
 | 
| marci@281 |    818 | 	  /*++*/G.next(dfs_stack.top());
 | 
| marci@281 |    819 | 	  b_node_newly_reached=false;
 | 
| marci@281 |    820 | 	}
 | 
| marci@281 |    821 |       } else {
 | 
| marci@281 |    822 | 	//actual_node=G.aNode(dfs_stack.top());
 | 
| marci@281 |    823 | 	dfs_stack.pop();
 | 
| marci@281 |    824 |       }
 | 
| marci@281 |    825 |       return *this;
 | 
| marci@281 |    826 |     }
 | 
| marci@281 |    827 |     bool finished() const { return dfs_stack.empty(); }
 | 
| marci@281 |    828 |     operator OutEdgeIt () const { return actual_edge; }
 | 
| marci@281 |    829 |     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 | 
| marci@281 |    830 |     bool isANodeExamined() const { return !(G.valid(actual_edge)/*.valid()*/); }
 | 
| marci@281 |    831 |     Node aNode() const { return actual_node; /*FIXME*/}
 | 
| marci@281 |    832 |     Node bNode() const { return G.bNode(actual_edge); }
 | 
| marci@281 |    833 |     const ReachedMap& getReachedMap() const { return reached; }
 | 
| marci@281 |    834 |     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
 | 
| marci@281 |    835 |   };
 | 
| marci@281 |    836 | 
 | 
| marci@281 |    837 | 
 | 
| marci@281 |    838 | 
 | 
| marci@281 |    839 | } // namespace hugo
 | 
| marci@281 |    840 | 
 | 
| marci@281 |    841 | #endif //HUGO_BFS_ITERATOR_H
 |