1 #ifndef BFS_ITERATOR_HH |
|
2 #define BFS_ITERATOR_HH |
|
3 |
|
4 #include <queue> |
|
5 #include <stack> |
|
6 #include <utility> |
|
7 #include <graph_wrapper.h> |
|
8 |
|
9 namespace hugo { |
|
10 |
|
11 template <typename Graph> |
|
12 struct bfs { |
|
13 typedef typename Graph::NodeIt NodeIt; |
|
14 typedef typename Graph::EdgeIt EdgeIt; |
|
15 typedef typename Graph::EachNodeIt EachNodeIt; |
|
16 typedef typename Graph::OutEdgeIt OutEdgeIt; |
|
17 Graph& G; |
|
18 NodeIt s; |
|
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) { |
|
24 bfs_queue.push(s); |
|
25 for(EachNodeIt i=G.template first<EachNodeIt>(); i.valid(); ++i) |
|
26 reached.set(i, false); |
|
27 reached.set(s, true); |
|
28 dist.set(s, 0); |
|
29 } |
|
30 |
|
31 void run() { |
|
32 while (!bfs_queue.empty()) { |
|
33 NodeIt v=bfs_queue.front(); |
|
34 OutEdgeIt e=G.template first<OutEdgeIt>(v); |
|
35 bfs_queue.pop(); |
|
36 for( ; e.valid(); ++e) { |
|
37 NodeIt w=G.bNode(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; |
|
41 bfs_queue.push(w); |
|
42 dist.set(w, dist.get(v)+1); |
|
43 pred.set(w, e); |
|
44 reached.set(w, true); |
|
45 } else { |
|
46 std::cout << G.id(w) << " is already reached" << std::endl; |
|
47 } |
|
48 } |
|
49 } |
|
50 } |
|
51 }; |
|
52 |
|
53 template <typename Graph> |
|
54 struct bfs_visitor { |
|
55 typedef typename Graph::NodeIt NodeIt; |
|
56 typedef typename Graph::EdgeIt EdgeIt; |
|
57 typedef typename Graph::OutEdgeIt OutEdgeIt; |
|
58 Graph& G; |
|
59 bfs_visitor(Graph& _G) : G(_G) { } |
|
60 void at_previously_reached(OutEdgeIt& e) { |
|
61 //NodeIt v=G.aNode(e); |
|
62 NodeIt w=G.bNode(e); |
|
63 std::cout << G.id(w) << " is already reached" << std::endl; |
|
64 } |
|
65 void at_newly_reached(OutEdgeIt& e) { |
|
66 //NodeIt v=G.aNode(e); |
|
67 NodeIt w=G.bNode(e); |
|
68 std::cout << G.id(w) << " is newly reached :-)" << std::endl; |
|
69 } |
|
70 }; |
|
71 |
|
72 template <typename Graph, typename ReachedMap, typename visitor_type> |
|
73 struct bfs_iterator { |
|
74 typedef typename Graph::NodeIt NodeIt; |
|
75 typedef typename Graph::EdgeIt EdgeIt; |
|
76 typedef typename Graph::OutEdgeIt OutEdgeIt; |
|
77 Graph& G; |
|
78 std::queue<OutEdgeIt>& bfs_queue; |
|
79 ReachedMap& reached; |
|
80 visitor_type& visitor; |
|
81 void process() { |
|
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); |
|
86 NodeIt w=G.bNode(e); |
|
87 if (!reached.get(w)) { |
|
88 visitor.at_newly_reached(e); |
|
89 bfs_queue.push(G.template first<OutEdgeIt>(w)); |
|
90 reached.set(w, true); |
|
91 } else { |
|
92 visitor.at_previously_reached(e); |
|
93 } |
|
94 } |
|
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(); } |
|
97 valid(); |
|
98 } |
|
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(); } |
|
105 valid(); |
|
106 return *this; |
|
107 } |
|
108 //void next() { |
|
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(); } |
|
113 //} |
|
114 bool valid() { |
|
115 while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } |
|
116 if (bfs_queue.empty()) return false; else return true; |
|
117 } |
|
118 //bool finished() { |
|
119 // while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } |
|
120 // if (bfs_queue.empty()) return true; else return false; |
|
121 //} |
|
122 operator EdgeIt () { return bfs_queue.front(); } |
|
123 |
|
124 }; |
|
125 |
|
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; |
|
131 Graph& G; |
|
132 std::queue<OutEdgeIt>& bfs_queue; |
|
133 ReachedMap& reached; |
|
134 bool _newly_reached; |
|
135 bfs_iterator1(Graph& _G, std::queue<OutEdgeIt>& _bfs_queue, ReachedMap& _reached) : G(_G), bfs_queue(_bfs_queue), reached(_reached) { |
|
136 valid(); |
|
137 if (!bfs_queue.empty() && bfs_queue.front().valid()) { |
|
138 OutEdgeIt e=bfs_queue.front(); |
|
139 NodeIt w=G.bNode(e); |
|
140 if (!reached.get(w)) { |
|
141 bfs_queue.push(G.template first<OutEdgeIt>(w)); |
|
142 reached.set(w, true); |
|
143 _newly_reached=true; |
|
144 } else { |
|
145 _newly_reached=false; |
|
146 } |
|
147 } |
|
148 } |
|
149 bfs_iterator1<Graph, ReachedMap>& operator++() { |
|
150 if (!valid()) return *this; |
|
151 ++(bfs_queue.front()); |
|
152 valid(); |
|
153 if (!bfs_queue.empty() && bfs_queue.front().valid()) { |
|
154 OutEdgeIt e=bfs_queue.front(); |
|
155 NodeIt w=G.bNode(e); |
|
156 if (!reached.get(w)) { |
|
157 bfs_queue.push(G.template first<OutEdgeIt>(w)); |
|
158 reached.set(w, true); |
|
159 _newly_reached=true; |
|
160 } else { |
|
161 _newly_reached=false; |
|
162 } |
|
163 } |
|
164 return *this; |
|
165 } |
|
166 bool valid() { |
|
167 while ( !bfs_queue.empty() && !bfs_queue.front().valid() ) { bfs_queue.pop(); } |
|
168 if (bfs_queue.empty()) return false; else return true; |
|
169 } |
|
170 operator OutEdgeIt() { return bfs_queue.front(); } |
|
171 //ize |
|
172 bool newly_reached() { return _newly_reached; } |
|
173 |
|
174 }; |
|
175 |
|
176 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
177 struct BfsIterator { |
|
178 typedef typename Graph::NodeIt NodeIt; |
|
179 Graph& G; |
|
180 std::queue<OutEdgeIt>& bfs_queue; |
|
181 ReachedMap& reached; |
|
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; |
|
195 } else { |
|
196 b_node_newly_reached=false; |
|
197 } |
|
198 } |
|
199 } |
|
200 BfsIterator<Graph, OutEdgeIt, ReachedMap>& |
|
201 operator++() { |
|
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; |
|
211 } else { |
|
212 b_node_newly_reached=false; |
|
213 } |
|
214 } |
|
215 } else { |
|
216 bfs_queue.pop(); |
|
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; |
|
224 } else { |
|
225 b_node_newly_reached=false; |
|
226 } |
|
227 } |
|
228 } |
|
229 return *this; |
|
230 } |
|
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()); } |
|
235 }; |
|
236 |
|
237 |
|
238 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
239 struct DfsIterator { |
|
240 typedef typename Graph::NodeIt NodeIt; |
|
241 Graph& G; |
|
242 std::stack<OutEdgeIt>& bfs_queue; |
|
243 ReachedMap& reached; |
|
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; |
|
257 } else { |
|
258 ++(bfs_queue.top()); |
|
259 b_node_newly_reached=false; |
|
260 } |
|
261 } else { |
|
262 bfs_queue.pop(); |
|
263 } |
|
264 } |
|
265 DfsIterator<Graph, OutEdgeIt, ReachedMap>& |
|
266 operator++() { |
|
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; |
|
274 } else { |
|
275 ++(bfs_queue.top()); |
|
276 b_node_newly_reached=false; |
|
277 } |
|
278 } else { |
|
279 bfs_queue.pop(); |
|
280 } |
|
281 return *this; |
|
282 } |
|
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()); } |
|
287 }; |
|
288 |
|
289 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
290 struct BfsIterator1 { |
|
291 typedef typename Graph::NodeIt NodeIt; |
|
292 Graph& G; |
|
293 std::queue<OutEdgeIt>& bfs_queue; |
|
294 ReachedMap& reached; |
|
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; |
|
308 } else { |
|
309 b_node_newly_reached=false; |
|
310 } |
|
311 } |
|
312 } |
|
313 void next() { |
|
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; |
|
323 } else { |
|
324 b_node_newly_reached=false; |
|
325 } |
|
326 } |
|
327 } else { |
|
328 bfs_queue.pop(); |
|
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; |
|
336 } else { |
|
337 b_node_newly_reached=false; |
|
338 } |
|
339 } |
|
340 } |
|
341 //return *this; |
|
342 } |
|
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()); } |
|
347 }; |
|
348 |
|
349 |
|
350 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
351 struct DfsIterator1 { |
|
352 typedef typename Graph::NodeIt NodeIt; |
|
353 Graph& G; |
|
354 std::stack<OutEdgeIt>& bfs_queue; |
|
355 ReachedMap& reached; |
|
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; |
|
369 //} else { |
|
370 // ++(bfs_queue.top()); |
|
371 // b_node_newly_reached=false; |
|
372 //} |
|
373 //} else { |
|
374 // bfs_queue.pop(); |
|
375 //} |
|
376 } |
|
377 void next() { |
|
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; |
|
385 } else { |
|
386 ++(bfs_queue.top()); |
|
387 b_node_newly_reached=false; |
|
388 } |
|
389 } else { |
|
390 bfs_queue.pop(); |
|
391 } |
|
392 //return *this; |
|
393 } |
|
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()); } |
|
398 }; |
|
399 |
|
400 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
401 class BfsIterator2 { |
|
402 typedef typename Graph::NodeIt NodeIt; |
|
403 const Graph& G; |
|
404 std::queue<OutEdgeIt> bfs_queue; |
|
405 ReachedMap reached; |
|
406 bool b_node_newly_reached; |
|
407 OutEdgeIt actual_edge; |
|
408 public: |
|
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; |
|
421 } else { |
|
422 b_node_newly_reached=false; |
|
423 } |
|
424 } //else { |
|
425 //} |
|
426 } else { |
|
427 bfs_queue.push(G.template first<OutEdgeIt>(s)); |
|
428 } |
|
429 } |
|
430 BfsIterator2<Graph, OutEdgeIt, ReachedMap>& |
|
431 operator++() { |
|
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; |
|
441 } else { |
|
442 b_node_newly_reached=false; |
|
443 } |
|
444 } |
|
445 } else { |
|
446 bfs_queue.pop(); |
|
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; |
|
455 } else { |
|
456 b_node_newly_reached=false; |
|
457 } |
|
458 } |
|
459 } |
|
460 } |
|
461 return *this; |
|
462 } |
|
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; } |
|
469 }; |
|
470 |
|
471 |
|
472 template <typename Graph, typename OutEdgeIt, typename ReachedMap> |
|
473 class BfsIterator3 { |
|
474 typedef typename Graph::NodeIt NodeIt; |
|
475 const Graph& G; |
|
476 std::queue< std::pair<NodeIt, OutEdgeIt> > bfs_queue; |
|
477 ReachedMap reached; |
|
478 bool b_node_newly_reached; |
|
479 OutEdgeIt actual_edge; |
|
480 public: |
|
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; |
|
493 } else { |
|
494 b_node_newly_reached=false; |
|
495 } |
|
496 } //else { |
|
497 //} |
|
498 } else { |
|
499 bfs_queue.push(std::pair<NodeIt, OutEdgeIt>(s, G.template first<OutEdgeIt>(s))); |
|
500 } |
|
501 } |
|
502 BfsIterator3<Graph, OutEdgeIt, ReachedMap>& |
|
503 operator++() { |
|
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; |
|
513 } else { |
|
514 b_node_newly_reached=false; |
|
515 } |
|
516 } |
|
517 } else { |
|
518 bfs_queue.pop(); |
|
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; |
|
527 } else { |
|
528 b_node_newly_reached=false; |
|
529 } |
|
530 } |
|
531 } |
|
532 } |
|
533 return *this; |
|
534 } |
|
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; } |
|
543 }; |
|
544 |
|
545 |
|
546 template <typename Graph, typename OutEdgeIt, |
|
547 typename ReachedMap/*=typename Graph::NodeMap<bool>*/ > |
|
548 class BfsIterator4 { |
|
549 typedef typename Graph::NodeIt NodeIt; |
|
550 const Graph& G; |
|
551 std::queue<NodeIt> bfs_queue; |
|
552 ReachedMap& reached; |
|
553 bool b_node_newly_reached; |
|
554 OutEdgeIt actual_edge; |
|
555 bool own_reached_map; |
|
556 public: |
|
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; |
|
570 bfs_queue.push(s); |
|
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)) { |
|
577 bfs_queue.push(w); |
|
578 reached.set(w, true); |
|
579 b_node_newly_reached=true; |
|
580 } else { |
|
581 b_node_newly_reached=false; |
|
582 } |
|
583 } |
|
584 } else { |
|
585 //std::cout << "bibi2" << std::endl; |
|
586 bfs_queue.push(s); |
|
587 } |
|
588 } |
|
589 BfsIterator4<Graph, OutEdgeIt, ReachedMap>& |
|
590 operator++() { |
|
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)) { |
|
596 bfs_queue.push(w); |
|
597 reached.set(w, true); |
|
598 b_node_newly_reached=true; |
|
599 } else { |
|
600 b_node_newly_reached=false; |
|
601 } |
|
602 } |
|
603 } else { |
|
604 bfs_queue.pop(); |
|
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)) { |
|
610 bfs_queue.push(w); |
|
611 reached.set(w, true); |
|
612 b_node_newly_reached=true; |
|
613 } else { |
|
614 b_node_newly_reached=false; |
|
615 } |
|
616 } |
|
617 } |
|
618 } |
|
619 return *this; |
|
620 } |
|
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; } |
|
629 }; |
|
630 |
|
631 |
|
632 template <typename GraphWrapper, /*typename OutEdgeIt,*/ |
|
633 typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ > |
|
634 class BfsIterator5 { |
|
635 typedef typename GraphWrapper::NodeIt NodeIt; |
|
636 typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; |
|
637 GraphWrapper G; |
|
638 std::queue<NodeIt> bfs_queue; |
|
639 ReachedMap& reached; |
|
640 bool b_node_newly_reached; |
|
641 OutEdgeIt actual_edge; |
|
642 bool own_reached_map; |
|
643 public: |
|
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()) { |
|
661 bfs_queue.push(s); |
|
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)) { |
|
666 bfs_queue.push(w); |
|
667 reached.set(w, true); |
|
668 b_node_newly_reached=true; |
|
669 } else { |
|
670 b_node_newly_reached=false; |
|
671 } |
|
672 } |
|
673 } else { |
|
674 bfs_queue.push(s); |
|
675 } |
|
676 } |
|
677 BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& |
|
678 operator++() { |
|
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)) { |
|
684 bfs_queue.push(w); |
|
685 reached.set(w, true); |
|
686 b_node_newly_reached=true; |
|
687 } else { |
|
688 b_node_newly_reached=false; |
|
689 } |
|
690 } |
|
691 } else { |
|
692 bfs_queue.pop(); |
|
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)) { |
|
698 bfs_queue.push(w); |
|
699 reached.set(w, true); |
|
700 b_node_newly_reached=true; |
|
701 } else { |
|
702 b_node_newly_reached=false; |
|
703 } |
|
704 } |
|
705 } |
|
706 } |
|
707 return *this; |
|
708 } |
|
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; } |
|
717 }; |
|
718 |
|
719 template <typename Graph, typename OutEdgeIt, |
|
720 typename ReachedMap/*=typename Graph::NodeMap<bool>*/ > |
|
721 class DfsIterator4 { |
|
722 typedef typename Graph::NodeIt NodeIt; |
|
723 const Graph& G; |
|
724 std::stack<OutEdgeIt> dfs_stack; |
|
725 bool b_node_newly_reached; |
|
726 OutEdgeIt actual_edge; |
|
727 NodeIt actual_node; |
|
728 ReachedMap& reached; |
|
729 bool own_reached_map; |
|
730 public: |
|
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) { |
|
739 actual_node=s; |
|
740 reached.set(s, true); |
|
741 dfs_stack.push(G.template first<OutEdgeIt>(s)); |
|
742 } |
|
743 DfsIterator4<Graph, OutEdgeIt, ReachedMap>& |
|
744 operator++() { |
|
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); |
|
749 actual_node=w; |
|
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; |
|
754 } else { |
|
755 actual_node=G.aNode(actual_edge); |
|
756 /*++*/G.next(dfs_stack.top()); |
|
757 b_node_newly_reached=false; |
|
758 } |
|
759 } else { |
|
760 //actual_node=G.aNode(dfs_stack.top()); |
|
761 dfs_stack.pop(); |
|
762 } |
|
763 return *this; |
|
764 } |
|
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; } |
|
773 }; |
|
774 |
|
775 template <typename GraphWrapper, /*typename OutEdgeIt,*/ |
|
776 typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ > |
|
777 class DfsIterator5 { |
|
778 typedef typename GraphWrapper::NodeIt NodeIt; |
|
779 typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; |
|
780 GraphWrapper G; |
|
781 std::stack<OutEdgeIt> dfs_stack; |
|
782 bool b_node_newly_reached; |
|
783 OutEdgeIt actual_edge; |
|
784 NodeIt actual_node; |
|
785 ReachedMap& reached; |
|
786 bool own_reached_map; |
|
787 public: |
|
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) { |
|
796 actual_node=s; |
|
797 reached.set(s, true); |
|
798 dfs_stack.push(G.template first<OutEdgeIt>(s)); |
|
799 } |
|
800 DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>& |
|
801 operator++() { |
|
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); |
|
806 actual_node=w; |
|
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; |
|
811 } else { |
|
812 actual_node=G.aNode(actual_edge); |
|
813 /*++*/G.next(dfs_stack.top()); |
|
814 b_node_newly_reached=false; |
|
815 } |
|
816 } else { |
|
817 //actual_node=G.aNode(dfs_stack.top()); |
|
818 dfs_stack.pop(); |
|
819 } |
|
820 return *this; |
|
821 } |
|
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; } |
|
830 }; |
|
831 |
|
832 |
|
833 |
|
834 } // namespace hugo |
|
835 |
|
836 #endif //BFS_ITERATOR_HH |
|