gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Wrong member variable settings bug fix. (Ticket #95)
0 2 0
default
2 files changed with 4 insertions and 4 deletions:
↑ Collapse diff ↑
Show white space 16384 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief Bfs algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/graph_utils.h>
28 28
#include <lemon/bits/path_dump.h>
29 29
#include <lemon/bits/invalid.h>
30 30
#include <lemon/error.h>
31 31
#include <lemon/maps.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35

	
36 36
  
37 37
  ///Default traits class of Bfs class.
38 38

	
39 39
  ///Default traits class of Bfs class.
40 40
  ///\tparam GR Digraph type.
41 41
  template<class GR>
42 42
  struct BfsDefaultTraits
43 43
  {
44 44
    ///The digraph type the algorithm runs on. 
45 45
    typedef GR Digraph;
46 46
    ///\brief The type of the map that stores the last
47 47
    ///arcs of the shortest paths.
48 48
    /// 
49 49
    ///The type of the map that stores the last
50 50
    ///arcs of the shortest paths.
51 51
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 52
    ///
53 53
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
54 54
    ///Instantiates a PredMap.
55 55
 
56 56
    ///This function instantiates a \ref PredMap. 
57 57
    ///\param G is the digraph, to which we would like to define the PredMap.
58 58
    ///\todo The digraph alone may be insufficient to initialize
59 59
    static PredMap *createPredMap(const GR &G) 
60 60
    {
61 61
      return new PredMap(G);
62 62
    }
63 63
    ///The type of the map that indicates which nodes are processed.
64 64
 
65 65
    ///The type of the map that indicates which nodes are processed.
66 66
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
67 67
    ///\todo named parameter to set this type, function to read and write.
68 68
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
69 69
    ///Instantiates a ProcessedMap.
70 70
 
71 71
    ///This function instantiates a \ref ProcessedMap. 
72 72
    ///\param g is the digraph, to which
73 73
    ///we would like to define the \ref ProcessedMap
74 74
#ifdef DOXYGEN
75 75
    static ProcessedMap *createProcessedMap(const GR &g)
76 76
#else
77 77
    static ProcessedMap *createProcessedMap(const GR &)
78 78
#endif
79 79
    {
80 80
      return new ProcessedMap();
81 81
    }
82 82
    ///The type of the map that indicates which nodes are reached.
83 83
 
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
86 86
    ///\todo named parameter to set this type, function to read and write.
87 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
88 88
    ///Instantiates a ReachedMap.
89 89
 
90 90
    ///This function instantiates a \ref ReachedMap. 
91 91
    ///\param G is the digraph, to which
92 92
    ///we would like to define the \ref ReachedMap.
93 93
    static ReachedMap *createReachedMap(const GR &G)
94 94
    {
95 95
      return new ReachedMap(G);
96 96
    }
97 97
    ///The type of the map that stores the dists of the nodes.
98 98
 
99 99
    ///The type of the map that stores the dists of the nodes.
100 100
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 101
    ///
102 102
    typedef typename Digraph::template NodeMap<int> DistMap;
103 103
    ///Instantiates a DistMap.
104 104
 
105 105
    ///This function instantiates a \ref DistMap. 
106 106
    ///\param G is the digraph, to which we would like to define the \ref DistMap
107 107
    static DistMap *createDistMap(const GR &G)
108 108
    {
109 109
      return new DistMap(G);
110 110
    }
111 111
  };
112 112
  
113 113
  ///%BFS algorithm class.
114 114
  
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %BFS algorithm.
117 117
  ///
118 118
  ///\tparam GR The digraph type the algorithm runs on. The default value is
119 119
  ///\ref ListDigraph. The value of GR is not used directly by Bfs, it
120 120
  ///is only passed to \ref BfsDefaultTraits.
121 121
  ///\tparam TR Traits class to set various data types used by the algorithm.
122 122
  ///The default traits class is
123 123
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
124 124
  ///See \ref BfsDefaultTraits for the documentation of
125 125
  ///a Bfs traits class.
126 126

	
127 127
#ifdef DOXYGEN
128 128
  template <typename GR,
129 129
	    typename TR>
130 130
#else
131 131
  template <typename GR=ListDigraph,
132 132
	    typename TR=BfsDefaultTraits<GR> >
133 133
#endif
134 134
  class Bfs {
135 135
  public:
136 136
    /**
137 137
     * \brief \ref Exception for uninitialized parameters.
138 138
     *
139 139
     * This error represents problems in the initialization
140 140
     * of the parameters of the algorithms.
141 141
     */
142 142
    class UninitializedParameter : public lemon::UninitializedParameter {
143 143
    public:
144 144
      virtual const char* what() const throw() {
145 145
	return "lemon::Bfs::UninitializedParameter";
146 146
      }
147 147
    };
148 148

	
149 149
    typedef TR Traits;
150 150
    ///The type of the underlying digraph.
151 151
    typedef typename TR::Digraph Digraph;
152 152
    
153 153
    ///\brief The type of the map that stores the last
154 154
    ///arcs of the shortest paths.
155 155
    typedef typename TR::PredMap PredMap;
156 156
    ///The type of the map indicating which nodes are reached.
157 157
    typedef typename TR::ReachedMap ReachedMap;
158 158
    ///The type of the map indicating which nodes are processed.
159 159
    typedef typename TR::ProcessedMap ProcessedMap;
160 160
    ///The type of the map that stores the dists of the nodes.
161 161
    typedef typename TR::DistMap DistMap;
162 162
  private:
163 163

	
164 164
    typedef typename Digraph::Node Node;
165 165
    typedef typename Digraph::NodeIt NodeIt;
166 166
    typedef typename Digraph::Arc Arc;
167 167
    typedef typename Digraph::OutArcIt OutArcIt;
168 168

	
169 169
    /// Pointer to the underlying digraph.
170 170
    const Digraph *G;
171 171
    ///Pointer to the map of predecessors arcs.
172 172
    PredMap *_pred;
173 173
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
174 174
    bool local_pred;
175 175
    ///Pointer to the map of distances.
176 176
    DistMap *_dist;
177 177
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
178 178
    bool local_dist;
179 179
    ///Pointer to the map of reached status of the nodes.
180 180
    ReachedMap *_reached;
181 181
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
182 182
    bool local_reached;
183 183
    ///Pointer to the map of processed status of the nodes.
184 184
    ProcessedMap *_processed;
185 185
    ///Indicates if \ref _processed is locally allocated (\c true) or not.
186 186
    bool local_processed;
187 187

	
188 188
    std::vector<typename Digraph::Node> _queue;
189 189
    int _queue_head,_queue_tail,_queue_next_dist;
190 190
    int _curr_dist;
191 191

	
192 192
    ///Creates the maps if necessary.
193 193
    
194 194
    ///\todo Better memory allocation (instead of new).
195 195
    void create_maps() 
196 196
    {
197 197
      if(!_pred) {
198 198
	local_pred = true;
199 199
	_pred = Traits::createPredMap(*G);
200 200
      }
201 201
      if(!_dist) {
202 202
	local_dist = true;
203 203
	_dist = Traits::createDistMap(*G);
204 204
      }
205 205
      if(!_reached) {
206 206
	local_reached = true;
207 207
	_reached = Traits::createReachedMap(*G);
208 208
      }
209 209
      if(!_processed) {
210 210
	local_processed = true;
211 211
	_processed = Traits::createProcessedMap(*G);
212 212
      }
213 213
    }
214 214

	
215 215
  protected:
216 216
    
217 217
    Bfs() {}
218 218
    
219 219
  public:
220 220
 
221 221
    typedef Bfs Create;
222 222

	
223 223
    ///\name Named template parameters
224 224

	
225 225
    ///@{
226 226

	
227 227
    template <class T>
228 228
    struct DefPredMapTraits : public Traits {
229 229
      typedef T PredMap;
230 230
      static PredMap *createPredMap(const Digraph &) 
231 231
      {
232 232
	throw UninitializedParameter();
233 233
      }
234 234
    };
235 235
    ///\brief \ref named-templ-param "Named parameter" for setting
236 236
    ///PredMap type
237 237
    ///
238 238
    ///\ref named-templ-param "Named parameter" for setting PredMap type
239 239
    ///
240 240
    template <class T>
241 241
    struct DefPredMap : public Bfs< Digraph, DefPredMapTraits<T> > { 
242 242
      typedef Bfs< Digraph, DefPredMapTraits<T> > Create;
243 243
    };
244 244
    
245 245
    template <class T>
246 246
    struct DefDistMapTraits : public Traits {
247 247
      typedef T DistMap;
248 248
      static DistMap *createDistMap(const Digraph &) 
249 249
      {
250 250
	throw UninitializedParameter();
251 251
      }
252 252
    };
253 253
    ///\brief \ref named-templ-param "Named parameter" for setting
254 254
    ///DistMap type
255 255
    ///
256 256
    ///\ref named-templ-param "Named parameter" for setting DistMap type
257 257
    ///
258 258
    template <class T>
259 259
    struct DefDistMap : public Bfs< Digraph, DefDistMapTraits<T> > { 
260 260
      typedef Bfs< Digraph, DefDistMapTraits<T> > Create;
261 261
    };
262 262
    
263 263
    template <class T>
264 264
    struct DefReachedMapTraits : public Traits {
265 265
      typedef T ReachedMap;
266 266
      static ReachedMap *createReachedMap(const Digraph &) 
267 267
      {
268 268
	throw UninitializedParameter();
269 269
      }
270 270
    };
271 271
    ///\brief \ref named-templ-param "Named parameter" for setting
272 272
    ///ReachedMap type
273 273
    ///
274 274
    ///\ref named-templ-param "Named parameter" for setting ReachedMap type
275 275
    ///
276 276
    template <class T>
277 277
    struct DefReachedMap : public Bfs< Digraph, DefReachedMapTraits<T> > { 
278 278
      typedef Bfs< Digraph, DefReachedMapTraits<T> > Create;
279 279
    };
280 280
    
281 281
    template <class T>
282 282
    struct DefProcessedMapTraits : public Traits {
283 283
      typedef T ProcessedMap;
284 284
      static ProcessedMap *createProcessedMap(const Digraph &) 
285 285
      {
286 286
	throw UninitializedParameter();
287 287
      }
288 288
    };
289 289
    ///\brief \ref named-templ-param "Named parameter" for setting
290 290
    ///ProcessedMap type
291 291
    ///
292 292
    ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
293 293
    ///
294 294
    template <class T>
295 295
    struct DefProcessedMap : public Bfs< Digraph, DefProcessedMapTraits<T> > {
296 296
      typedef Bfs< Digraph, DefProcessedMapTraits<T> > Create;
297 297
    };
298 298
    
299 299
    struct DefDigraphProcessedMapTraits : public Traits {
300 300
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
301 301
      static ProcessedMap *createProcessedMap(const Digraph &G) 
302 302
      {
303 303
	return new ProcessedMap(G);
304 304
      }
305 305
    };
306 306
    ///\brief \ref named-templ-param "Named parameter"
307 307
    ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
308 308
    ///
309 309
    ///\ref named-templ-param "Named parameter"
310 310
    ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
311 311
    ///If you don't set it explicitly, it will be automatically allocated.
312 312
    template <class T>
313 313
    struct DefProcessedMapToBeDefaultMap :
314 314
      public Bfs< Digraph, DefDigraphProcessedMapTraits> { 
315 315
      typedef Bfs< Digraph, DefDigraphProcessedMapTraits> Create;
316 316
    };
317 317
    
318 318
    ///@}
319 319

	
320 320
  public:      
321 321
    
322 322
    ///Constructor.
323 323
    
324 324
    ///\param _G the digraph the algorithm will run on.
325 325
    ///
326 326
    Bfs(const Digraph& _G) :
327 327
      G(&_G),
328 328
      _pred(NULL), local_pred(false),
329 329
      _dist(NULL), local_dist(false),
330 330
      _reached(NULL), local_reached(false),
331 331
      _processed(NULL), local_processed(false)
332 332
    { }
333 333
    
334 334
    ///Destructor.
335 335
    ~Bfs() 
336 336
    {
337 337
      if(local_pred) delete _pred;
338 338
      if(local_dist) delete _dist;
339 339
      if(local_reached) delete _reached;
340 340
      if(local_processed) delete _processed;
341 341
    }
342 342

	
343 343
    ///Sets the map storing the predecessor arcs.
344 344

	
345 345
    ///Sets the map storing the predecessor arcs.
346 346
    ///If you don't use this function before calling \ref run(),
347 347
    ///it will allocate one. The destructor deallocates this
348 348
    ///automatically allocated map, of course.
349 349
    ///\return <tt> (*this) </tt>
350 350
    Bfs &predMap(PredMap &m) 
351 351
    {
352 352
      if(local_pred) {
353 353
	delete _pred;
354 354
	local_pred=false;
355 355
      }
356 356
      _pred = &m;
357 357
      return *this;
358 358
    }
359 359

	
360 360
    ///Sets the map indicating the reached nodes.
361 361

	
362 362
    ///Sets the map indicating the reached nodes.
363 363
    ///If you don't use this function before calling \ref run(),
364 364
    ///it will allocate one. The destructor deallocates this
365 365
    ///automatically allocated map, of course.
366 366
    ///\return <tt> (*this) </tt>
367 367
    Bfs &reachedMap(ReachedMap &m) 
368 368
    {
369 369
      if(local_reached) {
370 370
	delete _reached;
371 371
	local_reached=false;
372 372
      }
373 373
      _reached = &m;
374 374
      return *this;
375 375
    }
376 376

	
377 377
    ///Sets the map indicating the processed nodes.
378 378

	
379 379
    ///Sets the map indicating the processed nodes.
380 380
    ///If you don't use this function before calling \ref run(),
381 381
    ///it will allocate one. The destructor deallocates this
382 382
    ///automatically allocated map, of course.
383 383
    ///\return <tt> (*this) </tt>
384 384
    Bfs &processedMap(ProcessedMap &m) 
385 385
    {
386 386
      if(local_processed) {
387 387
	delete _processed;
388 388
	local_processed=false;
389 389
      }
390 390
      _processed = &m;
391 391
      return *this;
392 392
    }
393 393

	
394 394
    ///Sets the map storing the distances calculated by the algorithm.
395 395

	
396 396
    ///Sets the map storing the distances calculated by the algorithm.
397 397
    ///If you don't use this function before calling \ref run(),
398 398
    ///it will allocate one. The destructor deallocates this
399 399
    ///automatically allocated map, of course.
400 400
    ///\return <tt> (*this) </tt>
401 401
    Bfs &distMap(DistMap &m) 
402 402
    {
403 403
      if(local_dist) {
404 404
	delete _dist;
405 405
	local_dist=false;
406 406
      }
407 407
      _dist = &m;
408 408
      return *this;
409 409
    }
410 410

	
411 411
  public:
412 412
    ///\name Execution control
413 413
    ///The simplest way to execute the algorithm is to use
414 414
    ///one of the member functions called \c run(...).
415 415
    ///\n
416 416
    ///If you need more control on the execution,
417 417
    ///first you must call \ref init(), then you can add several source nodes
418 418
    ///with \ref addSource().
419 419
    ///Finally \ref start() will perform the actual path
420 420
    ///computation.
421 421

	
422 422
    ///@{
423 423

	
424 424
    ///\brief Initializes the internal data structures.
425 425
    ///
426 426
    ///Initializes the internal data structures.
427 427
    ///
428 428
    void init()
429 429
    {
430 430
      create_maps();
431 431
      _queue.resize(countNodes(*G));
432 432
      _queue_head=_queue_tail=0;
433 433
      _curr_dist=1;
434 434
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
435 435
	_pred->set(u,INVALID);
436 436
	_reached->set(u,false);
437 437
	_processed->set(u,false);
438 438
      }
439 439
    }
440 440
    
441 441
    ///Adds a new source node.
442 442

	
443 443
    ///Adds a new source node to the set of nodes to be processed.
444 444
    ///
445 445
    void addSource(Node s)
446 446
    {
447 447
      if(!(*_reached)[s])
448 448
	{
449 449
	  _reached->set(s,true);
450 450
	  _pred->set(s,INVALID);
451 451
	  _dist->set(s,0);
452 452
	  _queue[_queue_head++]=s;
453 453
	  _queue_next_dist=_queue_head;
454 454
	}
455 455
    }
456 456
    
457 457
    ///Processes the next node.
458 458

	
459 459
    ///Processes the next node.
460 460
    ///
461 461
    ///\return The processed node.
462 462
    ///
463 463
    ///\warning The queue must not be empty!
464 464
    Node processNextNode()
465 465
    {
466 466
      if(_queue_tail==_queue_next_dist) {
467 467
	_curr_dist++;
468 468
	_queue_next_dist=_queue_head;
469 469
      }
470 470
      Node n=_queue[_queue_tail++];
471 471
      _processed->set(n,true);
472 472
      Node m;
473 473
      for(OutArcIt e(*G,n);e!=INVALID;++e)
474 474
	if(!(*_reached)[m=G->target(e)]) {
475 475
	  _queue[_queue_head++]=m;
476 476
	  _reached->set(m,true);
477 477
	  _pred->set(m,e);
478 478
	  _dist->set(m,_curr_dist);
479 479
	}
480 480
      return n;
481 481
    }
482 482

	
483 483
    ///Processes the next node.
484 484

	
485 485
    ///Processes the next node. And checks that the given target node
486 486
    ///is reached. If the target node is reachable from the processed
487 487
    ///node then the reached parameter will be set true. The reached
488 488
    ///parameter should be initially false.
489 489
    ///
490 490
    ///\param target The target node.
491 491
    ///\retval reach Indicates that the target node is reached.
492 492
    ///\return The processed node.
493 493
    ///
494 494
    ///\warning The queue must not be empty!
495 495
    Node processNextNode(Node target, bool& reach)
496 496
    {
497 497
      if(_queue_tail==_queue_next_dist) {
498 498
	_curr_dist++;
499 499
	_queue_next_dist=_queue_head;
500 500
      }
501 501
      Node n=_queue[_queue_tail++];
502 502
      _processed->set(n,true);
503 503
      Node m;
504 504
      for(OutArcIt e(*G,n);e!=INVALID;++e)
505 505
	if(!(*_reached)[m=G->target(e)]) {
506 506
	  _queue[_queue_head++]=m;
507 507
	  _reached->set(m,true);
508 508
	  _pred->set(m,e);
509 509
	  _dist->set(m,_curr_dist);
510 510
          reach = reach || (target == m);
511 511
	}
512 512
      return n;
513 513
    }
514 514

	
515 515
    ///Processes the next node.
516 516

	
517 517
    ///Processes the next node. And checks that at least one of
518 518
    ///reached node has true value in the \c nm node map. If one node
519 519
    ///with true value is reachable from the processed node then the
520 520
    ///rnode parameter will be set to the first of such nodes.
521 521
    ///
522 522
    ///\param nm The node map of possible targets.
523 523
    ///\retval rnode The reached target node.
524 524
    ///\return The processed node.
525 525
    ///
526 526
    ///\warning The queue must not be empty!
527 527
    template<class NM>
528 528
    Node processNextNode(const NM& nm, Node& rnode)
529 529
    {
530 530
      if(_queue_tail==_queue_next_dist) {
531 531
	_curr_dist++;
532 532
	_queue_next_dist=_queue_head;
533 533
      }
534 534
      Node n=_queue[_queue_tail++];
535 535
      _processed->set(n,true);
536 536
      Node m;
537 537
      for(OutArcIt e(*G,n);e!=INVALID;++e)
538 538
	if(!(*_reached)[m=G->target(e)]) {
539 539
	  _queue[_queue_head++]=m;
540 540
	  _reached->set(m,true);
541 541
	  _pred->set(m,e);
542 542
	  _dist->set(m,_curr_dist);
543 543
	  if (nm[m] && rnode == INVALID) rnode = m;
544 544
	}
545 545
      return n;
546 546
    }
547 547
      
548 548
    ///Next node to be processed.
549 549

	
550 550
    ///Next node to be processed.
551 551
    ///
552 552
    ///\return The next node to be processed or INVALID if the queue is
553 553
    /// empty.
554 554
    Node nextNode()
555 555
    { 
556 556
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
557 557
    }
558 558
 
559 559
    ///\brief Returns \c false if there are nodes
560 560
    ///to be processed in the queue
561 561
    ///
562 562
    ///Returns \c false if there are nodes
563 563
    ///to be processed in the queue
564 564
    bool emptyQueue() { return _queue_tail==_queue_head; }
565 565
    ///Returns the number of the nodes to be processed.
566 566
    
567 567
    ///Returns the number of the nodes to be processed in the queue.
568 568
    int queueSize() { return _queue_head-_queue_tail; }
569 569
    
570 570
    ///Executes the algorithm.
571 571

	
572 572
    ///Executes the algorithm.
573 573
    ///
574 574
    ///\pre init() must be called and at least one node should be added
575 575
    ///with addSource() before using this function.
576 576
    ///
577 577
    ///This method runs the %BFS algorithm from the root node(s)
578 578
    ///in order to
579 579
    ///compute the
580 580
    ///shortest path to each node. The algorithm computes
581 581
    ///- The shortest path tree.
582 582
    ///- The distance of each node from the root(s).
583 583
    void start()
584 584
    {
585 585
      while ( !emptyQueue() ) processNextNode();
586 586
    }
587 587
    
588 588
    ///Executes the algorithm until \c dest is reached.
589 589

	
590 590
    ///Executes the algorithm until \c dest is reached.
591 591
    ///
592 592
    ///\pre init() must be called and at least one node should be added
593 593
    ///with addSource() before using this function.
594 594
    ///
595 595
    ///This method runs the %BFS algorithm from the root node(s)
596 596
    ///in order to compute the shortest path to \c dest.
597 597
    ///The algorithm computes
598 598
    ///- The shortest path to \c  dest.
599 599
    ///- The distance of \c dest from the root(s).
600 600
    void start(Node dest)
601 601
    {
602 602
      bool reach = false;
603 603
      while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
604 604
    }
605 605
    
606 606
    ///Executes the algorithm until a condition is met.
607 607

	
608 608
    ///Executes the algorithm until a condition is met.
609 609
    ///
610 610
    ///\pre init() must be called and at least one node should be added
611 611
    ///with addSource() before using this function.
612 612
    ///
613 613
    ///\param nm must be a bool (or convertible) node map. The
614 614
    ///algorithm will stop when it reaches a node \c v with
615 615
    /// <tt>nm[v]</tt> true.
616 616
    ///
617 617
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
618 618
    ///\c INVALID if no such node was found.
619 619
    template<class NM>
620 620
    Node start(const NM &nm)
621 621
    {
622 622
      Node rnode = INVALID;
623 623
      while ( !emptyQueue() && rnode == INVALID ) {
624 624
	processNextNode(nm, rnode);
625 625
      }
626 626
      return rnode;
627 627
    }
628 628
    
629 629
    ///Runs %BFS algorithm from node \c s.
630 630
    
631 631
    ///This method runs the %BFS algorithm from a root node \c s
632 632
    ///in order to
633 633
    ///compute the
634 634
    ///shortest path to each node. The algorithm computes
635 635
    ///- The shortest path tree.
636 636
    ///- The distance of each node from the root.
637 637
    ///
638 638
    ///\note b.run(s) is just a shortcut of the following code.
639 639
    ///\code
640 640
    ///  b.init();
641 641
    ///  b.addSource(s);
642 642
    ///  b.start();
643 643
    ///\endcode
644 644
    void run(Node s) {
645 645
      init();
646 646
      addSource(s);
647 647
      start();
648 648
    }
649 649
    
650 650
    ///Finds the shortest path between \c s and \c t.
651 651
    
652 652
    ///Finds the shortest path between \c s and \c t.
653 653
    ///
654 654
    ///\return The length of the shortest s---t path if there exists one,
655 655
    ///0 otherwise.
656 656
    ///\note Apart from the return value, b.run(s) is
657 657
    ///just a shortcut of the following code.
658 658
    ///\code
659 659
    ///  b.init();
660 660
    ///  b.addSource(s);
661 661
    ///  b.start(t);
662 662
    ///\endcode
663 663
    int run(Node s,Node t) {
664 664
      init();
665 665
      addSource(s);
666 666
      start(t);
667 667
      return reached(t) ? _curr_dist : 0;
668 668
    }
669 669
    
670 670
    ///@}
671 671

	
672 672
    ///\name Query Functions
673 673
    ///The result of the %BFS algorithm can be obtained using these
674 674
    ///functions.\n
675 675
    ///Before the use of these functions,
676 676
    ///either run() or start() must be calleb.
677 677
    
678 678
    ///@{
679 679

	
680 680
    typedef PredMapPath<Digraph, PredMap> Path;
681 681

	
682 682
    ///Gives back the shortest path.
683 683
    
684 684
    ///Gives back the shortest path.
685 685
    ///\pre The \c t should be reachable from the source.
686 686
    Path path(Node t) 
687 687
    {
688 688
      return Path(*G, *_pred, t);
689 689
    }
690 690

	
691 691
    ///The distance of a node from the root(s).
692 692

	
693 693
    ///Returns the distance of a node from the root(s).
694 694
    ///\pre \ref run() must be called before using this function.
695 695
    ///\warning If node \c v in unreachable from the root(s) the return value
696 696
    ///of this function is undefined.
697 697
    int dist(Node v) const { return (*_dist)[v]; }
698 698

	
699 699
    ///Returns the 'previous arc' of the shortest path tree.
700 700

	
701 701
    ///For a node \c v it returns the 'previous arc'
702 702
    ///of the shortest path tree,
703 703
    ///i.e. it returns the last arc of a shortest path from the root(s) to \c
704 704
    ///v. It is \ref INVALID
705 705
    ///if \c v is unreachable from the root(s) or \c v is a root. The
706 706
    ///shortest path tree used here is equal to the shortest path tree used in
707 707
    ///\ref predNode().
708 708
    ///\pre Either \ref run() or \ref start() must be called before using
709 709
    ///this function.
710 710
    Arc predArc(Node v) const { return (*_pred)[v];}
711 711

	
712 712
    ///Returns the 'previous node' of the shortest path tree.
713 713

	
714 714
    ///For a node \c v it returns the 'previous node'
715 715
    ///of the shortest path tree,
716 716
    ///i.e. it returns the last but one node from a shortest path from the
717 717
    ///root(a) to \c /v.
718 718
    ///It is INVALID if \c v is unreachable from the root(s) or
719 719
    ///if \c v itself a root.
720 720
    ///The shortest path tree used here is equal to the shortest path
721 721
    ///tree used in \ref predArc().
722 722
    ///\pre Either \ref run() or \ref start() must be called before
723 723
    ///using this function.
724 724
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
725 725
				  G->source((*_pred)[v]); }
726 726
    
727 727
    ///Returns a reference to the NodeMap of distances.
728 728

	
729 729
    ///Returns a reference to the NodeMap of distances.
730 730
    ///\pre Either \ref run() or \ref init() must
731 731
    ///be called before using this function.
732 732
    const DistMap &distMap() const { return *_dist;}
733 733
 
734 734
    ///Returns a reference to the shortest path tree map.
735 735

	
736 736
    ///Returns a reference to the NodeMap of the arcs of the
737 737
    ///shortest path tree.
738 738
    ///\pre Either \ref run() or \ref init()
739 739
    ///must be called before using this function.
740 740
    const PredMap &predMap() const { return *_pred;}
741 741
 
742 742
    ///Checks if a node is reachable from the root.
743 743

	
744 744
    ///Returns \c true if \c v is reachable from the root.
745 745
    ///\warning The source nodes are indicated as unreached.
746 746
    ///\pre Either \ref run() or \ref start()
747 747
    ///must be called before using this function.
748 748
    ///
749 749
    bool reached(Node v) { return (*_reached)[v]; }
750 750
    
751 751
    ///@}
752 752
  };
753 753

	
754 754
  ///Default traits class of Bfs function.
755 755

	
756 756
  ///Default traits class of Bfs function.
757 757
  ///\tparam GR Digraph type.
758 758
  template<class GR>
759 759
  struct BfsWizardDefaultTraits
760 760
  {
761 761
    ///The digraph type the algorithm runs on. 
762 762
    typedef GR Digraph;
763 763
    ///\brief The type of the map that stores the last
764 764
    ///arcs of the shortest paths.
765 765
    /// 
766 766
    ///The type of the map that stores the last
767 767
    ///arcs of the shortest paths.
768 768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
769 769
    ///
770 770
    typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap;
771 771
    ///Instantiates a PredMap.
772 772
 
773 773
    ///This function instantiates a \ref PredMap. 
774 774
    ///\param g is the digraph, to which we would like to define the PredMap.
775 775
    ///\todo The digraph alone may be insufficient to initialize
776 776
#ifdef DOXYGEN
777 777
    static PredMap *createPredMap(const GR &g) 
778 778
#else
779 779
    static PredMap *createPredMap(const GR &) 
780 780
#endif
781 781
    {
782 782
      return new PredMap();
783 783
    }
784 784

	
785 785
    ///The type of the map that indicates which nodes are processed.
786 786
 
787 787
    ///The type of the map that indicates which nodes are processed.
788 788
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
789 789
    ///\todo named parameter to set this type, function to read and write.
790 790
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
791 791
    ///Instantiates a ProcessedMap.
792 792
 
793 793
    ///This function instantiates a \ref ProcessedMap. 
794 794
    ///\param g is the digraph, to which
795 795
    ///we would like to define the \ref ProcessedMap
796 796
#ifdef DOXYGEN
797 797
    static ProcessedMap *createProcessedMap(const GR &g)
798 798
#else
799 799
    static ProcessedMap *createProcessedMap(const GR &)
800 800
#endif
801 801
    {
802 802
      return new ProcessedMap();
803 803
    }
804 804
    ///The type of the map that indicates which nodes are reached.
805 805
 
806 806
    ///The type of the map that indicates which nodes are reached.
807 807
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
808 808
    ///\todo named parameter to set this type, function to read and write.
809 809
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
810 810
    ///Instantiates a ReachedMap.
811 811
 
812 812
    ///This function instantiates a \ref ReachedMap. 
813 813
    ///\param G is the digraph, to which
814 814
    ///we would like to define the \ref ReachedMap.
815 815
    static ReachedMap *createReachedMap(const GR &G)
816 816
    {
817 817
      return new ReachedMap(G);
818 818
    }
819 819
    ///The type of the map that stores the dists of the nodes.
820 820
 
821 821
    ///The type of the map that stores the dists of the nodes.
822 822
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
823 823
    ///
824 824
    typedef NullMap<typename Digraph::Node,int> DistMap;
825 825
    ///Instantiates a DistMap.
826 826
 
827 827
    ///This function instantiates a \ref DistMap. 
828 828
    ///\param g is the digraph, to which we would like to define the \ref DistMap
829 829
#ifdef DOXYGEN
830 830
    static DistMap *createDistMap(const GR &g)
831 831
#else
832 832
    static DistMap *createDistMap(const GR &)
833 833
#endif
834 834
    {
835 835
      return new DistMap();
836 836
    }
837 837
  };
838 838
  
839 839
  /// Default traits used by \ref BfsWizard
840 840

	
841 841
  /// To make it easier to use Bfs algorithm
842 842
  ///we have created a wizard class.
843 843
  /// This \ref BfsWizard class needs default traits,
844 844
  ///as well as the \ref Bfs class.
845 845
  /// The \ref BfsWizardBase is a class to be the default traits of the
846 846
  /// \ref BfsWizard class.
847 847
  template<class GR>
848 848
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
849 849
  {
850 850

	
851 851
    typedef BfsWizardDefaultTraits<GR> Base;
852 852
  protected:
853 853
    /// Type of the nodes in the digraph.
854 854
    typedef typename Base::Digraph::Node Node;
855 855

	
856 856
    /// Pointer to the underlying digraph.
857 857
    void *_g;
858 858
    ///Pointer to the map of reached nodes.
859 859
    void *_reached;
860 860
    ///Pointer to the map of processed nodes.
861 861
    void *_processed;
862 862
    ///Pointer to the map of predecessors arcs.
863 863
    void *_pred;
864 864
    ///Pointer to the map of distances.
865 865
    void *_dist;
866 866
    ///Pointer to the source node.
867 867
    Node _source;
868 868
    
869 869
    public:
870 870
    /// Constructor.
871 871
    
872 872
    /// This constructor does not require parameters, therefore it initiates
873 873
    /// all of the attributes to default values (0, INVALID).
874 874
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 875
			   _dist(0), _source(INVALID) {}
876 876

	
877 877
    /// Constructor.
878 878
    
879 879
    /// This constructor requires some parameters,
880 880
    /// listed in the parameters list.
881 881
    /// Others are initiated to 0.
882 882
    /// \param g is the initial value of  \ref _g
883 883
    /// \param s is the initial value of  \ref _source
884 884
    BfsWizardBase(const GR &g, Node s=INVALID) :
885 885
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 
886 886
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
887 887

	
888 888
  };
889 889
  
890 890
  /// A class to make the usage of Bfs algorithm easier
891 891

	
892 892
  /// This class is created to make it easier to use Bfs algorithm.
893 893
  /// It uses the functions and features of the plain \ref Bfs,
894 894
  /// but it is much simpler to use it.
895 895
  ///
896 896
  /// Simplicity means that the way to change the types defined
897 897
  /// in the traits class is based on functions that returns the new class
898 898
  /// and not on templatable built-in classes.
899 899
  /// When using the plain \ref Bfs
900 900
  /// the new class with the modified type comes from
901 901
  /// the original class by using the ::
902 902
  /// operator. In the case of \ref BfsWizard only
903 903
  /// a function have to be called and it will
904 904
  /// return the needed class.
905 905
  ///
906 906
  /// It does not have own \ref run method. When its \ref run method is called
907 907
  /// it initiates a plain \ref Bfs class, and calls the \ref Bfs::run
908 908
  /// method of it.
909 909
  template<class TR>
910 910
  class BfsWizard : public TR
911 911
  {
912 912
    typedef TR Base;
913 913

	
914 914
    ///The type of the underlying digraph.
915 915
    typedef typename TR::Digraph Digraph;
916 916
    //\e
917 917
    typedef typename Digraph::Node Node;
918 918
    //\e
919 919
    typedef typename Digraph::NodeIt NodeIt;
920 920
    //\e
921 921
    typedef typename Digraph::Arc Arc;
922 922
    //\e
923 923
    typedef typename Digraph::OutArcIt OutArcIt;
924 924
    
925 925
    ///\brief The type of the map that stores
926 926
    ///the reached nodes
927 927
    typedef typename TR::ReachedMap ReachedMap;
928 928
    ///\brief The type of the map that stores
929 929
    ///the processed nodes
930 930
    typedef typename TR::ProcessedMap ProcessedMap;
931 931
    ///\brief The type of the map that stores the last
932 932
    ///arcs of the shortest paths.
933 933
    typedef typename TR::PredMap PredMap;
934 934
    ///The type of the map that stores the dists of the nodes.
935 935
    typedef typename TR::DistMap DistMap;
936 936

	
937 937
  public:
938 938
    /// Constructor.
939 939
    BfsWizard() : TR() {}
940 940

	
941 941
    /// Constructor that requires parameters.
942 942

	
943 943
    /// Constructor that requires parameters.
944 944
    /// These parameters will be the default values for the traits class.
945 945
    BfsWizard(const Digraph &g, Node s=INVALID) :
946 946
      TR(g,s) {}
947 947

	
948 948
    ///Copy constructor
949 949
    BfsWizard(const TR &b) : TR(b) {}
950 950

	
951 951
    ~BfsWizard() {}
952 952

	
953 953
    ///Runs Bfs algorithm from a given node.
954 954
    
955 955
    ///Runs Bfs algorithm from a given node.
956 956
    ///The node can be given by the \ref source function.
957 957
    void run()
958 958
    {
959 959
      if(Base::_source==INVALID) throw UninitializedParameter();
960 960
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
961 961
      if(Base::_reached)
962 962
	alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
963 963
      if(Base::_processed) 
964 964
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
965 965
      if(Base::_pred) 
966 966
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
967 967
      if(Base::_dist) 
968 968
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
969 969
      alg.run(Base::_source);
970 970
    }
971 971

	
972 972
    ///Runs Bfs algorithm from the given node.
973 973

	
974 974
    ///Runs Bfs algorithm from the given node.
975 975
    ///\param s is the given source.
976 976
    void run(Node s)
977 977
    {
978 978
      Base::_source=s;
979 979
      run();
980 980
    }
981 981

	
982 982
    template<class T>
983 983
    struct DefPredMapBase : public Base {
984 984
      typedef T PredMap;
985 985
      static PredMap *createPredMap(const Digraph &) { return 0; };
986 986
      DefPredMapBase(const TR &b) : TR(b) {}
987 987
    };
988 988
    
989 989
    ///\brief \ref named-templ-param "Named parameter"
990 990
    ///function for setting PredMap
991 991
    ///
992 992
    /// \ref named-templ-param "Named parameter"
993 993
    ///function for setting PredMap
994 994
    ///
995 995
    template<class T>
996 996
    BfsWizard<DefPredMapBase<T> > predMap(const T &t) 
997 997
    {
998 998
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
999 999
      return BfsWizard<DefPredMapBase<T> >(*this);
1000 1000
    }
1001 1001
    
1002 1002
 
1003 1003
    template<class T>
1004 1004
    struct DefReachedMapBase : public Base {
1005 1005
      typedef T ReachedMap;
1006 1006
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1007 1007
      DefReachedMapBase(const TR &b) : TR(b) {}
1008 1008
    };
1009 1009
    
1010 1010
    ///\brief \ref named-templ-param "Named parameter"
1011 1011
    ///function for setting ReachedMap
1012 1012
    ///
1013 1013
    /// \ref named-templ-param "Named parameter"
1014 1014
    ///function for setting ReachedMap
1015 1015
    ///
1016 1016
    template<class T>
1017 1017
    BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 
1018 1018
    {
1019
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1019
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1020 1020
      return BfsWizard<DefReachedMapBase<T> >(*this);
1021 1021
    }
1022 1022
    
1023 1023

	
1024 1024
    template<class T>
1025 1025
    struct DefProcessedMapBase : public Base {
1026 1026
      typedef T ProcessedMap;
1027 1027
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1028 1028
      DefProcessedMapBase(const TR &b) : TR(b) {}
1029 1029
    };
1030 1030
    
1031 1031
    ///\brief \ref named-templ-param "Named parameter"
1032 1032
    ///function for setting ProcessedMap
1033 1033
    ///
1034 1034
    /// \ref named-templ-param "Named parameter"
1035 1035
    ///function for setting ProcessedMap
1036 1036
    ///
1037 1037
    template<class T>
1038 1038
    BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 
1039 1039
    {
1040
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1040
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1041 1041
      return BfsWizard<DefProcessedMapBase<T> >(*this);
1042 1042
    }
1043 1043
    
1044 1044
   
1045 1045
    template<class T>
1046 1046
    struct DefDistMapBase : public Base {
1047 1047
      typedef T DistMap;
1048 1048
      static DistMap *createDistMap(const Digraph &) { return 0; };
1049 1049
      DefDistMapBase(const TR &b) : TR(b) {}
1050 1050
    };
1051 1051
    
1052 1052
    ///\brief \ref named-templ-param "Named parameter"
1053 1053
    ///function for setting DistMap type
1054 1054
    ///
1055 1055
    /// \ref named-templ-param "Named parameter"
1056 1056
    ///function for setting DistMap type
1057 1057
    ///
1058 1058
    template<class T>
1059 1059
    BfsWizard<DefDistMapBase<T> > distMap(const T &t) 
1060 1060
    {
1061 1061
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1062 1062
      return BfsWizard<DefDistMapBase<T> >(*this);
1063 1063
    }
1064 1064
    
1065 1065
    /// Sets the source node, from which the Bfs algorithm runs.
1066 1066

	
1067 1067
    /// Sets the source node, from which the Bfs algorithm runs.
1068 1068
    /// \param s is the source node.
1069 1069
    BfsWizard<TR> &source(Node s) 
1070 1070
    {
1071 1071
      Base::_source=s;
1072 1072
      return *this;
1073 1073
    }
1074 1074
    
1075 1075
  };
1076 1076
  
1077 1077
  ///Function type interface for Bfs algorithm.
1078 1078

	
1079 1079
  /// \ingroup search
1080 1080
  ///Function type interface for Bfs algorithm.
1081 1081
  ///
1082 1082
  ///This function also has several
1083 1083
  ///\ref named-templ-func-param "named parameters",
1084 1084
  ///they are declared as the members of class \ref BfsWizard.
1085 1085
  ///The following
1086 1086
  ///example shows how to use these parameters.
1087 1087
  ///\code
1088 1088
  ///  bfs(g,source).predMap(preds).run();
1089 1089
  ///\endcode
1090 1090
  ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1091 1091
  ///to the end of the parameter list.
1092 1092
  ///\sa BfsWizard
1093 1093
  ///\sa Bfs
1094 1094
  template<class GR>
1095 1095
  BfsWizard<BfsWizardBase<GR> >
1096 1096
  bfs(const GR &g,typename GR::Node s=INVALID)
1097 1097
  {
1098 1098
    return BfsWizard<BfsWizardBase<GR> >(g,s);
1099 1099
  }
1100 1100

	
1101 1101
#ifdef DOXYGEN
1102 1102
  /// \brief Visitor class for bfs.
1103 1103
  ///  
1104 1104
  /// This class defines the interface of the BfsVisit events, and
1105 1105
  /// it could be the base of a real Visitor class.
1106 1106
  template <typename _Digraph>
1107 1107
  struct BfsVisitor {
1108 1108
    typedef _Digraph Digraph;
1109 1109
    typedef typename Digraph::Arc Arc;
1110 1110
    typedef typename Digraph::Node Node;
1111 1111
    /// \brief Called when the arc reach a node.
1112 1112
    /// 
1113 1113
    /// It is called when the bfs find an arc which target is not
1114 1114
    /// reached yet.
1115 1115
    void discover(const Arc& arc) {}
1116 1116
    /// \brief Called when the node reached first time.
1117 1117
    /// 
1118 1118
    /// It is Called when the node reached first time.
1119 1119
    void reach(const Node& node) {}
1120 1120
    /// \brief Called when the arc examined but target of the arc 
1121 1121
    /// already discovered.
1122 1122
    /// 
1123 1123
    /// It called when the arc examined but the target of the arc 
1124 1124
    /// already discovered.
1125 1125
    void examine(const Arc& arc) {}
1126 1126
    /// \brief Called for the source node of the bfs.
1127 1127
    /// 
1128 1128
    /// It is called for the source node of the bfs.
1129 1129
    void start(const Node& node) {}
1130 1130
    /// \brief Called when the node processed.
1131 1131
    /// 
1132 1132
    /// It is Called when the node processed.
1133 1133
    void process(const Node& node) {}
1134 1134
  };
1135 1135
#else
1136 1136
  template <typename _Digraph>
1137 1137
  struct BfsVisitor {
1138 1138
    typedef _Digraph Digraph;
1139 1139
    typedef typename Digraph::Arc Arc;
1140 1140
    typedef typename Digraph::Node Node;
1141 1141
    void discover(const Arc&) {}
1142 1142
    void reach(const Node&) {}
1143 1143
    void examine(const Arc&) {}
1144 1144
    void start(const Node&) {}
1145 1145
    void process(const Node&) {}
1146 1146

	
1147 1147
    template <typename _Visitor>
1148 1148
    struct Constraints {
1149 1149
      void constraints() {
1150 1150
	Arc arc;
1151 1151
	Node node;
1152 1152
	visitor.discover(arc);
1153 1153
	visitor.reach(node);
1154 1154
	visitor.examine(arc);
1155 1155
	visitor.start(node);
1156 1156
        visitor.process(node);
1157 1157
      }
1158 1158
      _Visitor& visitor;
1159 1159
    };
1160 1160
  };
1161 1161
#endif
1162 1162

	
1163 1163
  /// \brief Default traits class of BfsVisit class.
1164 1164
  ///
1165 1165
  /// Default traits class of BfsVisit class.
1166 1166
  /// \tparam _Digraph Digraph type.
1167 1167
  template<class _Digraph>
1168 1168
  struct BfsVisitDefaultTraits {
1169 1169

	
1170 1170
    /// \brief The digraph type the algorithm runs on. 
1171 1171
    typedef _Digraph Digraph;
1172 1172

	
1173 1173
    /// \brief The type of the map that indicates which nodes are reached.
1174 1174
    /// 
1175 1175
    /// The type of the map that indicates which nodes are reached.
1176 1176
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
1177 1177
    /// \todo named parameter to set this type, function to read and write.
1178 1178
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1179 1179

	
1180 1180
    /// \brief Instantiates a ReachedMap.
1181 1181
    ///
1182 1182
    /// This function instantiates a \ref ReachedMap. 
1183 1183
    /// \param digraph is the digraph, to which
1184 1184
    /// we would like to define the \ref ReachedMap.
1185 1185
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1186 1186
      return new ReachedMap(digraph);
1187 1187
    }
1188 1188

	
1189 1189
  };
1190 1190

	
1191 1191
  /// \ingroup search
1192 1192
  ///  
1193 1193
  /// \brief %BFS Visit algorithm class.
1194 1194
  ///  
1195 1195
  /// This class provides an efficient implementation of the %BFS algorithm
1196 1196
  /// with visitor interface.
1197 1197
  ///
1198 1198
  /// The %BfsVisit class provides an alternative interface to the Bfs
1199 1199
  /// class. It works with callback mechanism, the BfsVisit object calls
1200 1200
  /// on every bfs event the \c Visitor class member functions. 
1201 1201
  ///
1202 1202
  /// \tparam _Digraph The digraph type the algorithm runs on. The default value is
1203 1203
  /// \ref ListDigraph. The value of _Digraph is not used directly by Bfs, it
1204 1204
  /// is only passed to \ref BfsDefaultTraits.
1205 1205
  /// \tparam _Visitor The Visitor object for the algorithm. The 
1206 1206
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty Visitor which
1207 1207
  /// does not observe the Bfs events. If you want to observe the bfs
1208 1208
  /// events you should implement your own Visitor class.
1209 1209
  /// \tparam _Traits Traits class to set various data types used by the 
1210 1210
  /// algorithm. The default traits class is
1211 1211
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1212 1212
  /// See \ref BfsVisitDefaultTraits for the documentation of
1213 1213
  /// a Bfs visit traits class.
1214 1214
#ifdef DOXYGEN
1215 1215
  template <typename _Digraph, typename _Visitor, typename _Traits>
1216 1216
#else
1217 1217
  template <typename _Digraph = ListDigraph,
1218 1218
	    typename _Visitor = BfsVisitor<_Digraph>,
1219 1219
	    typename _Traits = BfsDefaultTraits<_Digraph> >
1220 1220
#endif
1221 1221
  class BfsVisit {
1222 1222
  public:
1223 1223
    
1224 1224
    /// \brief \ref Exception for uninitialized parameters.
1225 1225
    ///
1226 1226
    /// This error represents problems in the initialization
1227 1227
    /// of the parameters of the algorithms.
1228 1228
    class UninitializedParameter : public lemon::UninitializedParameter {
1229 1229
    public:
1230 1230
      virtual const char* what() const throw() 
1231 1231
      {
1232 1232
	return "lemon::BfsVisit::UninitializedParameter";
1233 1233
      }
1234 1234
    };
1235 1235

	
1236 1236
    typedef _Traits Traits;
1237 1237

	
1238 1238
    typedef typename Traits::Digraph Digraph;
1239 1239

	
1240 1240
    typedef _Visitor Visitor;
1241 1241

	
1242 1242
    ///The type of the map indicating which nodes are reached.
1243 1243
    typedef typename Traits::ReachedMap ReachedMap;
1244 1244

	
1245 1245
  private:
1246 1246

	
1247 1247
    typedef typename Digraph::Node Node;
1248 1248
    typedef typename Digraph::NodeIt NodeIt;
1249 1249
    typedef typename Digraph::Arc Arc;
1250 1250
    typedef typename Digraph::OutArcIt OutArcIt;
1251 1251

	
1252 1252
    /// Pointer to the underlying digraph.
1253 1253
    const Digraph *_digraph;
1254 1254
    /// Pointer to the visitor object.
1255 1255
    Visitor *_visitor;
1256 1256
    ///Pointer to the map of reached status of the nodes.
1257 1257
    ReachedMap *_reached;
1258 1258
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
1259 1259
    bool local_reached;
1260 1260

	
1261 1261
    std::vector<typename Digraph::Node> _list;
1262 1262
    int _list_front, _list_back;
1263 1263

	
1264 1264
    /// \brief Creates the maps if necessary.
1265 1265
    ///
1266 1266
    /// Creates the maps if necessary.
1267 1267
    void create_maps() {
1268 1268
      if(!_reached) {
1269 1269
	local_reached = true;
1270 1270
	_reached = Traits::createReachedMap(*_digraph);
1271 1271
      }
1272 1272
    }
1273 1273

	
1274 1274
  protected:
1275 1275

	
1276 1276
    BfsVisit() {}
1277 1277
    
1278 1278
  public:
1279 1279

	
1280 1280
    typedef BfsVisit Create;
1281 1281

	
1282 1282
    /// \name Named template parameters
1283 1283

	
1284 1284
    ///@{
1285 1285
    template <class T>
1286 1286
    struct DefReachedMapTraits : public Traits {
1287 1287
      typedef T ReachedMap;
1288 1288
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1289 1289
	throw UninitializedParameter();
1290 1290
      }
1291 1291
    };
1292 1292
    /// \brief \ref named-templ-param "Named parameter" for setting 
1293 1293
    /// ReachedMap type
1294 1294
    ///
1295 1295
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type
1296 1296
    template <class T>
1297 1297
    struct DefReachedMap : public BfsVisit< Digraph, Visitor,
1298 1298
					    DefReachedMapTraits<T> > {
1299 1299
      typedef BfsVisit< Digraph, Visitor, DefReachedMapTraits<T> > Create;
1300 1300
    };
1301 1301
    ///@}
1302 1302

	
1303 1303
  public:      
1304 1304
    
1305 1305
    /// \brief Constructor.
1306 1306
    ///
1307 1307
    /// Constructor.
1308 1308
    ///
1309 1309
    /// \param digraph the digraph the algorithm will run on.
1310 1310
    /// \param visitor The visitor of the algorithm.
1311 1311
    ///
1312 1312
    BfsVisit(const Digraph& digraph, Visitor& visitor) 
1313 1313
      : _digraph(&digraph), _visitor(&visitor),
1314 1314
	_reached(0), local_reached(false) {}
1315 1315
    
1316 1316
    /// \brief Destructor.
1317 1317
    ///
1318 1318
    /// Destructor.
1319 1319
    ~BfsVisit() {
1320 1320
      if(local_reached) delete _reached;
1321 1321
    }
1322 1322

	
1323 1323
    /// \brief Sets the map indicating if a node is reached.
1324 1324
    ///
1325 1325
    /// Sets the map indicating if a node is reached.
1326 1326
    /// If you don't use this function before calling \ref run(),
1327 1327
    /// it will allocate one. The destuctor deallocates this
1328 1328
    /// automatically allocated map, of course.
1329 1329
    /// \return <tt> (*this) </tt>
1330 1330
    BfsVisit &reachedMap(ReachedMap &m) {
1331 1331
      if(local_reached) {
1332 1332
	delete _reached;
1333 1333
	local_reached = false;
1334 1334
      }
1335 1335
      _reached = &m;
1336 1336
      return *this;
1337 1337
    }
1338 1338

	
1339 1339
  public:
1340 1340
    /// \name Execution control
1341 1341
    /// The simplest way to execute the algorithm is to use
1342 1342
    /// one of the member functions called \c run(...).
1343 1343
    /// \n
1344 1344
    /// If you need more control on the execution,
1345 1345
    /// first you must call \ref init(), then you can adda source node
1346 1346
    /// with \ref addSource().
1347 1347
    /// Finally \ref start() will perform the actual path
1348 1348
    /// computation.
1349 1349

	
1350 1350
    /// @{
1351 1351
    /// \brief Initializes the internal data structures.
1352 1352
    ///
1353 1353
    /// Initializes the internal data structures.
1354 1354
    ///
1355 1355
    void init() {
1356 1356
      create_maps();
1357 1357
      _list.resize(countNodes(*_digraph));
1358 1358
      _list_front = _list_back = -1;
1359 1359
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1360 1360
	_reached->set(u, false);
1361 1361
      }
1362 1362
    }
1363 1363
    
1364 1364
    /// \brief Adds a new source node.
1365 1365
    ///
1366 1366
    /// Adds a new source node to the set of nodes to be processed.
1367 1367
    void addSource(Node s) {
1368 1368
      if(!(*_reached)[s]) {
1369 1369
	  _reached->set(s,true);
1370 1370
	  _visitor->start(s);
1371 1371
	  _visitor->reach(s);
1372 1372
          _list[++_list_back] = s;
1373 1373
	}
1374 1374
    }
1375 1375
    
1376 1376
    /// \brief Processes the next node.
1377 1377
    ///
1378 1378
    /// Processes the next node.
1379 1379
    ///
1380 1380
    /// \return The processed node.
1381 1381
    ///
1382 1382
    /// \pre The queue must not be empty!
1383 1383
    Node processNextNode() { 
1384 1384
      Node n = _list[++_list_front];
1385 1385
      _visitor->process(n);
1386 1386
      Arc e;
1387 1387
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1388 1388
        Node m = _digraph->target(e);
1389 1389
        if (!(*_reached)[m]) {
1390 1390
          _visitor->discover(e);
1391 1391
          _visitor->reach(m);
1392 1392
          _reached->set(m, true);
1393 1393
          _list[++_list_back] = m;
1394 1394
        } else {
1395 1395
          _visitor->examine(e);
1396 1396
        }
1397 1397
      }
1398 1398
      return n;
1399 1399
    }
1400 1400

	
1401 1401
    /// \brief Processes the next node.
1402 1402
    ///
1403 1403
    /// Processes the next node. And checks that the given target node
1404 1404
    /// is reached. If the target node is reachable from the processed
1405 1405
    /// node then the reached parameter will be set true. The reached
1406 1406
    /// parameter should be initially false.
1407 1407
    ///
1408 1408
    /// \param target The target node.
1409 1409
    /// \retval reach Indicates that the target node is reached.
1410 1410
    /// \return The processed node.
1411 1411
    ///
1412 1412
    /// \warning The queue must not be empty!
1413 1413
    Node processNextNode(Node target, bool& reach) {
1414 1414
      Node n = _list[++_list_front];
1415 1415
      _visitor->process(n);
1416 1416
      Arc e;
1417 1417
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1418 1418
        Node m = _digraph->target(e);
1419 1419
        if (!(*_reached)[m]) {
1420 1420
          _visitor->discover(e);
1421 1421
          _visitor->reach(m);
1422 1422
          _reached->set(m, true);
1423 1423
          _list[++_list_back] = m;
1424 1424
          reach = reach || (target == m);
1425 1425
        } else {
1426 1426
          _visitor->examine(e);
1427 1427
        }
1428 1428
      }
1429 1429
      return n;
1430 1430
    }
1431 1431

	
1432 1432
    /// \brief Processes the next node.
1433 1433
    ///
1434 1434
    /// Processes the next node. And checks that at least one of
1435 1435
    /// reached node has true value in the \c nm node map. If one node
1436 1436
    /// with true value is reachable from the processed node then the
1437 1437
    /// rnode parameter will be set to the first of such nodes.
1438 1438
    ///
1439 1439
    /// \param nm The node map of possible targets.
1440 1440
    /// \retval rnode The reached target node.
1441 1441
    /// \return The processed node.
1442 1442
    ///
1443 1443
    /// \warning The queue must not be empty!
1444 1444
    template <typename NM>
1445 1445
    Node processNextNode(const NM& nm, Node& rnode) {
1446 1446
      Node n = _list[++_list_front];
1447 1447
      _visitor->process(n);
1448 1448
      Arc e;
1449 1449
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1450 1450
        Node m = _digraph->target(e);
1451 1451
        if (!(*_reached)[m]) {
1452 1452
          _visitor->discover(e);
1453 1453
          _visitor->reach(m);
1454 1454
          _reached->set(m, true);
1455 1455
          _list[++_list_back] = m;
1456 1456
          if (nm[m] && rnode == INVALID) rnode = m;
1457 1457
        } else {
1458 1458
          _visitor->examine(e);
1459 1459
        }
1460 1460
      }
1461 1461
      return n;
1462 1462
    }
1463 1463

	
1464 1464
    /// \brief Next node to be processed.
1465 1465
    ///
1466 1466
    /// Next node to be processed.
1467 1467
    ///
1468 1468
    /// \return The next node to be processed or INVALID if the stack is
1469 1469
    /// empty.
1470 1470
    Node nextNode() { 
1471 1471
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1472 1472
    }
1473 1473

	
1474 1474
    /// \brief Returns \c false if there are nodes
1475 1475
    /// to be processed in the queue
1476 1476
    ///
1477 1477
    /// Returns \c false if there are nodes
1478 1478
    /// to be processed in the queue
1479 1479
    bool emptyQueue() { return _list_front == _list_back; }
1480 1480

	
1481 1481
    /// \brief Returns the number of the nodes to be processed.
1482 1482
    ///
1483 1483
    /// Returns the number of the nodes to be processed in the queue.
1484 1484
    int queueSize() { return _list_back - _list_front; }
1485 1485
    
1486 1486
    /// \brief Executes the algorithm.
1487 1487
    ///
1488 1488
    /// Executes the algorithm.
1489 1489
    ///
1490 1490
    /// \pre init() must be called and at least one node should be added
1491 1491
    /// with addSource() before using this function.
1492 1492
    void start() {
1493 1493
      while ( !emptyQueue() ) processNextNode();
1494 1494
    }
1495 1495
    
1496 1496
    /// \brief Executes the algorithm until \c dest is reached.
1497 1497
    ///
1498 1498
    /// Executes the algorithm until \c dest is reached.
1499 1499
    ///
1500 1500
    /// \pre init() must be called and at least one node should be added
1501 1501
    /// with addSource() before using this function.
1502 1502
    void start(Node dest) {
1503 1503
      bool reach = false;
1504 1504
      while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
1505 1505
    }
1506 1506
    
1507 1507
    /// \brief Executes the algorithm until a condition is met.
1508 1508
    ///
1509 1509
    /// Executes the algorithm until a condition is met.
1510 1510
    ///
1511 1511
    /// \pre init() must be called and at least one node should be added
1512 1512
    /// with addSource() before using this function.
1513 1513
    ///
1514 1514
    ///\param nm must be a bool (or convertible) node map. The
1515 1515
    ///algorithm will stop when it reaches a node \c v with
1516 1516
    /// <tt>nm[v]</tt> true.
1517 1517
    ///
1518 1518
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
1519 1519
    ///\c INVALID if no such node was found.
1520 1520
    template <typename NM>
1521 1521
    Node start(const NM &nm) {
1522 1522
      Node rnode = INVALID;
1523 1523
      while ( !emptyQueue() && rnode == INVALID ) {
1524 1524
	processNextNode(nm, rnode);
1525 1525
      }
1526 1526
      return rnode;
1527 1527
    }
1528 1528

	
1529 1529
    /// \brief Runs %BFSVisit algorithm from node \c s.
1530 1530
    ///
1531 1531
    /// This method runs the %BFS algorithm from a root node \c s.
1532 1532
    /// \note b.run(s) is just a shortcut of the following code.
1533 1533
    ///\code
1534 1534
    ///   b.init();
1535 1535
    ///   b.addSource(s);
1536 1536
    ///   b.start();
1537 1537
    ///\endcode
1538 1538
    void run(Node s) {
1539 1539
      init();
1540 1540
      addSource(s);
1541 1541
      start();
1542 1542
    }
1543 1543

	
1544 1544
    /// \brief Runs %BFSVisit algorithm to visit all nodes in the digraph.
1545 1545
    ///    
1546 1546
    /// This method runs the %BFS algorithm in order to
1547 1547
    /// compute the %BFS path to each node. The algorithm computes
1548 1548
    /// - The %BFS tree.
1549 1549
    /// - The distance of each node from the root in the %BFS tree.
1550 1550
    ///
1551 1551
    ///\note b.run() is just a shortcut of the following code.
1552 1552
    ///\code
1553 1553
    ///  b.init();
1554 1554
    ///  for (NodeIt it(digraph); it != INVALID; ++it) {
1555 1555
    ///    if (!b.reached(it)) {
1556 1556
    ///      b.addSource(it);
1557 1557
    ///      b.start();
1558 1558
    ///    }
1559 1559
    ///  }
1560 1560
    ///\endcode
1561 1561
    void run() {
1562 1562
      init();
1563 1563
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1564 1564
        if (!reached(it)) {
1565 1565
          addSource(it);
1566 1566
          start();
1567 1567
        }
1568 1568
      }
1569 1569
    }
1570 1570
    ///@}
1571 1571

	
1572 1572
    /// \name Query Functions
1573 1573
    /// The result of the %BFS algorithm can be obtained using these
1574 1574
    /// functions.\n
1575 1575
    /// Before the use of these functions,
1576 1576
    /// either run() or start() must be called.
1577 1577
    ///@{
1578 1578

	
1579 1579
    /// \brief Checks if a node is reachable from the root.
1580 1580
    ///
1581 1581
    /// Returns \c true if \c v is reachable from the root(s).
1582 1582
    /// \warning The source nodes are inditated as unreachable.
1583 1583
    /// \pre Either \ref run() or \ref start()
1584 1584
    /// must be called before using this function.
1585 1585
    ///
1586 1586
    bool reached(Node v) { return (*_reached)[v]; }
1587 1587
    ///@}
1588 1588
  };
1589 1589

	
1590 1590
} //END OF NAMESPACE LEMON
1591 1591

	
1592 1592
#endif
1593 1593

	
Show white space 16384 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief Dfs algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/graph_utils.h>
28 28
#include <lemon/bits/path_dump.h>
29 29
#include <lemon/bits/invalid.h>
30 30
#include <lemon/error.h>
31 31
#include <lemon/maps.h>
32 32

	
33 33
#include <lemon/concept_check.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  
38 38
  ///Default traits class of Dfs class.
39 39

	
40 40
  ///Default traits class of Dfs class.
41 41
  ///\tparam GR Digraph type.
42 42
  template<class GR>
43 43
  struct DfsDefaultTraits
44 44
  {
45 45
    ///The digraph type the algorithm runs on. 
46 46
    typedef GR Digraph;
47 47
    ///\brief The type of the map that stores the last
48 48
    ///arcs of the %DFS paths.
49 49
    /// 
50 50
    ///The type of the map that stores the last
51 51
    ///arcs of the %DFS paths.
52 52
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
53 53
    ///
54 54
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
55 55
    ///Instantiates a PredMap.
56 56
 
57 57
    ///This function instantiates a \ref PredMap. 
58 58
    ///\param G is the digraph, to which we would like to define the PredMap.
59 59
    ///\todo The digraph alone may be insufficient to initialize
60 60
    static PredMap *createPredMap(const GR &G) 
61 61
    {
62 62
      return new PredMap(G);
63 63
    }
64 64

	
65 65
    ///The type of the map that indicates which nodes are processed.
66 66
 
67 67
    ///The type of the map that indicates which nodes are processed.
68 68
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
69 69
    ///\todo named parameter to set this type, function to read and write.
70 70
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
71 71
    ///Instantiates a ProcessedMap.
72 72
 
73 73
    ///This function instantiates a \ref ProcessedMap. 
74 74
    ///\param g is the digraph, to which
75 75
    ///we would like to define the \ref ProcessedMap
76 76
#ifdef DOXYGEN
77 77
    static ProcessedMap *createProcessedMap(const GR &g)
78 78
#else
79 79
    static ProcessedMap *createProcessedMap(const GR &)
80 80
#endif
81 81
    {
82 82
      return new ProcessedMap();
83 83
    }
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
 
86 86
    ///The type of the map that indicates which nodes are reached.
87 87
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
88 88
    ///\todo named parameter to set this type, function to read and write.
89 89
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
90 90
    ///Instantiates a ReachedMap.
91 91
 
92 92
    ///This function instantiates a \ref ReachedMap. 
93 93
    ///\param G is the digraph, to which
94 94
    ///we would like to define the \ref ReachedMap.
95 95
    static ReachedMap *createReachedMap(const GR &G)
96 96
    {
97 97
      return new ReachedMap(G);
98 98
    }
99 99
    ///The type of the map that stores the dists of the nodes.
100 100
 
101 101
    ///The type of the map that stores the dists of the nodes.
102 102
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
103 103
    ///
104 104
    typedef typename Digraph::template NodeMap<int> DistMap;
105 105
    ///Instantiates a DistMap.
106 106
 
107 107
    ///This function instantiates a \ref DistMap. 
108 108
    ///\param G is the digraph, to which we would like to define the \ref DistMap
109 109
    static DistMap *createDistMap(const GR &G)
110 110
    {
111 111
      return new DistMap(G);
112 112
    }
113 113
  };
114 114
  
115 115
  ///%DFS algorithm class.
116 116
  
117 117
  ///\ingroup search
118 118
  ///This class provides an efficient implementation of the %DFS algorithm.
119 119
  ///
120 120
  ///\tparam GR The digraph type the algorithm runs on. The default value is
121 121
  ///\ref ListDigraph. The value of GR is not used directly by Dfs, it
122 122
  ///is only passed to \ref DfsDefaultTraits.
123 123
  ///\tparam TR Traits class to set various data types used by the algorithm.
124 124
  ///The default traits class is
125 125
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
126 126
  ///See \ref DfsDefaultTraits for the documentation of
127 127
  ///a Dfs traits class.
128 128
#ifdef DOXYGEN
129 129
  template <typename GR,
130 130
	    typename TR>
131 131
#else
132 132
  template <typename GR=ListDigraph,
133 133
	    typename TR=DfsDefaultTraits<GR> >
134 134
#endif
135 135
  class Dfs {
136 136
  public:
137 137
    /**
138 138
     * \brief \ref Exception for uninitialized parameters.
139 139
     *
140 140
     * This error represents problems in the initialization
141 141
     * of the parameters of the algorithms.
142 142
     */
143 143
    class UninitializedParameter : public lemon::UninitializedParameter {
144 144
    public:
145 145
      virtual const char* what() const throw() {
146 146
	return "lemon::Dfs::UninitializedParameter";
147 147
      }
148 148
    };
149 149

	
150 150
    typedef TR Traits;
151 151
    ///The type of the underlying digraph.
152 152
    typedef typename TR::Digraph Digraph;
153 153
    ///\e
154 154
    typedef typename Digraph::Node Node;
155 155
    ///\e
156 156
    typedef typename Digraph::NodeIt NodeIt;
157 157
    ///\e
158 158
    typedef typename Digraph::Arc Arc;
159 159
    ///\e
160 160
    typedef typename Digraph::OutArcIt OutArcIt;
161 161
    
162 162
    ///\brief The type of the map that stores the last
163 163
    ///arcs of the %DFS paths.
164 164
    typedef typename TR::PredMap PredMap;
165 165
    ///The type of the map indicating which nodes are reached.
166 166
    typedef typename TR::ReachedMap ReachedMap;
167 167
    ///The type of the map indicating which nodes are processed.
168 168
    typedef typename TR::ProcessedMap ProcessedMap;
169 169
    ///The type of the map that stores the dists of the nodes.
170 170
    typedef typename TR::DistMap DistMap;
171 171
  private:
172 172
    /// Pointer to the underlying digraph.
173 173
    const Digraph *G;
174 174
    ///Pointer to the map of predecessors arcs.
175 175
    PredMap *_pred;
176 176
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
177 177
    bool local_pred;
178 178
    ///Pointer to the map of distances.
179 179
    DistMap *_dist;
180 180
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
181 181
    bool local_dist;
182 182
    ///Pointer to the map of reached status of the nodes.
183 183
    ReachedMap *_reached;
184 184
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
185 185
    bool local_reached;
186 186
    ///Pointer to the map of processed status of the nodes.
187 187
    ProcessedMap *_processed;
188 188
    ///Indicates if \ref _processed is locally allocated (\c true) or not.
189 189
    bool local_processed;
190 190

	
191 191
    std::vector<typename Digraph::OutArcIt> _stack;
192 192
    int _stack_head;
193 193

	
194 194
    ///Creates the maps if necessary.
195 195
    
196 196
    ///\todo Better memory allocation (instead of new).
197 197
    void create_maps() 
198 198
    {
199 199
      if(!_pred) {
200 200
	local_pred = true;
201 201
	_pred = Traits::createPredMap(*G);
202 202
      }
203 203
      if(!_dist) {
204 204
	local_dist = true;
205 205
	_dist = Traits::createDistMap(*G);
206 206
      }
207 207
      if(!_reached) {
208 208
	local_reached = true;
209 209
	_reached = Traits::createReachedMap(*G);
210 210
      }
211 211
      if(!_processed) {
212 212
	local_processed = true;
213 213
	_processed = Traits::createProcessedMap(*G);
214 214
      }
215 215
    }
216 216

	
217 217
  protected:
218 218

	
219 219
    Dfs() {}
220 220
    
221 221
  public:
222 222

	
223 223
    typedef Dfs Create;
224 224

	
225 225
    ///\name Named template parameters
226 226

	
227 227
    ///@{
228 228

	
229 229
    template <class T>
230 230
    struct DefPredMapTraits : public Traits {
231 231
      typedef T PredMap;
232 232
      static PredMap *createPredMap(const Digraph &G) 
233 233
      {
234 234
	throw UninitializedParameter();
235 235
      }
236 236
    };
237 237
    ///\brief \ref named-templ-param "Named parameter" for setting
238 238
    ///PredMap type
239 239
    ///
240 240
    ///\ref named-templ-param "Named parameter" for setting PredMap type
241 241
    ///
242 242
    template <class T>
243 243
    struct DefPredMap : public Dfs<Digraph, DefPredMapTraits<T> > {
244 244
      typedef Dfs<Digraph, DefPredMapTraits<T> > Create;
245 245
    };
246 246
    
247 247
    
248 248
    template <class T>
249 249
    struct DefDistMapTraits : public Traits {
250 250
      typedef T DistMap;
251 251
      static DistMap *createDistMap(const Digraph &) 
252 252
      {
253 253
	throw UninitializedParameter();
254 254
      }
255 255
    };
256 256
    ///\brief \ref named-templ-param "Named parameter" for setting
257 257
    ///DistMap type
258 258
    ///
259 259
    ///\ref named-templ-param "Named parameter" for setting DistMap
260 260
    ///type
261 261
    template <class T>
262 262
    struct DefDistMap {
263 263
      typedef Dfs<Digraph, DefDistMapTraits<T> > Create;
264 264
    };
265 265
    
266 266
    template <class T>
267 267
    struct DefReachedMapTraits : public Traits {
268 268
      typedef T ReachedMap;
269 269
      static ReachedMap *createReachedMap(const Digraph &) 
270 270
      {
271 271
	throw UninitializedParameter();
272 272
      }
273 273
    };
274 274
    ///\brief \ref named-templ-param "Named parameter" for setting
275 275
    ///ReachedMap type
276 276
    ///
277 277
    ///\ref named-templ-param "Named parameter" for setting ReachedMap type
278 278
    ///
279 279
    template <class T>
280 280
    struct DefReachedMap : public Dfs< Digraph, DefReachedMapTraits<T> > {
281 281
      typedef Dfs< Digraph, DefReachedMapTraits<T> > Create;
282 282
    };
283 283

	
284 284
    template <class T>
285 285
    struct DefProcessedMapTraits : public Traits {
286 286
      typedef T ProcessedMap;
287 287
      static ProcessedMap *createProcessedMap(const Digraph &) 
288 288
      {
289 289
	throw UninitializedParameter();
290 290
      }
291 291
    };
292 292
    ///\brief \ref named-templ-param "Named parameter" for setting
293 293
    ///ProcessedMap type
294 294
    ///
295 295
    ///\ref named-templ-param "Named parameter" for setting ProcessedMap type
296 296
    ///
297 297
    template <class T>
298 298
    struct DefProcessedMap : public Dfs< Digraph, DefProcessedMapTraits<T> > { 
299 299
      typedef Dfs< Digraph, DefProcessedMapTraits<T> > Create;
300 300
    };
301 301
    
302 302
    struct DefDigraphProcessedMapTraits : public Traits {
303 303
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
304 304
      static ProcessedMap *createProcessedMap(const Digraph &G) 
305 305
      {
306 306
	return new ProcessedMap(G);
307 307
      }
308 308
    };
309 309
    ///\brief \ref named-templ-param "Named parameter"
310 310
    ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
311 311
    ///
312 312
    ///\ref named-templ-param "Named parameter"
313 313
    ///for setting the ProcessedMap type to be Digraph::NodeMap<bool>.
314 314
    ///If you don't set it explicitely, it will be automatically allocated.
315 315
    template <class T>
316 316
    class DefProcessedMapToBeDefaultMap :
317 317
      public Dfs< Digraph, DefDigraphProcessedMapTraits> { 
318 318
      typedef Dfs< Digraph, DefDigraphProcessedMapTraits> Create;
319 319
    };
320 320
    
321 321
    ///@}
322 322

	
323 323
  public:      
324 324
    
325 325
    ///Constructor.
326 326
    
327 327
    ///\param _G the digraph the algorithm will run on.
328 328
    ///
329 329
    Dfs(const Digraph& _G) :
330 330
      G(&_G),
331 331
      _pred(NULL), local_pred(false),
332 332
      _dist(NULL), local_dist(false),
333 333
      _reached(NULL), local_reached(false),
334 334
      _processed(NULL), local_processed(false)
335 335
    { }
336 336
    
337 337
    ///Destructor.
338 338
    ~Dfs() 
339 339
    {
340 340
      if(local_pred) delete _pred;
341 341
      if(local_dist) delete _dist;
342 342
      if(local_reached) delete _reached;
343 343
      if(local_processed) delete _processed;
344 344
    }
345 345

	
346 346
    ///Sets the map storing the predecessor arcs.
347 347

	
348 348
    ///Sets the map storing the predecessor arcs.
349 349
    ///If you don't use this function before calling \ref run(),
350 350
    ///it will allocate one. The destuctor deallocates this
351 351
    ///automatically allocated map, of course.
352 352
    ///\return <tt> (*this) </tt>
353 353
    Dfs &predMap(PredMap &m) 
354 354
    {
355 355
      if(local_pred) {
356 356
	delete _pred;
357 357
	local_pred=false;
358 358
      }
359 359
      _pred = &m;
360 360
      return *this;
361 361
    }
362 362

	
363 363
    ///Sets the map storing the distances calculated by the algorithm.
364 364

	
365 365
    ///Sets the map storing the distances calculated by the algorithm.
366 366
    ///If you don't use this function before calling \ref run(),
367 367
    ///it will allocate one. The destuctor deallocates this
368 368
    ///automatically allocated map, of course.
369 369
    ///\return <tt> (*this) </tt>
370 370
    Dfs &distMap(DistMap &m) 
371 371
    {
372 372
      if(local_dist) {
373 373
	delete _dist;
374 374
	local_dist=false;
375 375
      }
376 376
      _dist = &m;
377 377
      return *this;
378 378
    }
379 379

	
380 380
    ///Sets the map indicating if a node is reached.
381 381

	
382 382
    ///Sets the map indicating if a node is reached.
383 383
    ///If you don't use this function before calling \ref run(),
384 384
    ///it will allocate one. The destuctor deallocates this
385 385
    ///automatically allocated map, of course.
386 386
    ///\return <tt> (*this) </tt>
387 387
    Dfs &reachedMap(ReachedMap &m) 
388 388
    {
389 389
      if(local_reached) {
390 390
	delete _reached;
391 391
	local_reached=false;
392 392
      }
393 393
      _reached = &m;
394 394
      return *this;
395 395
    }
396 396

	
397 397
    ///Sets the map indicating if a node is processed.
398 398

	
399 399
    ///Sets the map indicating if a node is processed.
400 400
    ///If you don't use this function before calling \ref run(),
401 401
    ///it will allocate one. The destuctor deallocates this
402 402
    ///automatically allocated map, of course.
403 403
    ///\return <tt> (*this) </tt>
404 404
    Dfs &processedMap(ProcessedMap &m) 
405 405
    {
406 406
      if(local_processed) {
407 407
	delete _processed;
408 408
	local_processed=false;
409 409
      }
410 410
      _processed = &m;
411 411
      return *this;
412 412
    }
413 413

	
414 414
  public:
415 415
    ///\name Execution control
416 416
    ///The simplest way to execute the algorithm is to use
417 417
    ///one of the member functions called \c run(...).
418 418
    ///\n
419 419
    ///If you need more control on the execution,
420 420
    ///first you must call \ref init(), then you can add a source node
421 421
    ///with \ref addSource().
422 422
    ///Finally \ref start() will perform the actual path
423 423
    ///computation.
424 424

	
425 425
    ///@{
426 426

	
427 427
    ///Initializes the internal data structures.
428 428

	
429 429
    ///Initializes the internal data structures.
430 430
    ///
431 431
    void init()
432 432
    {
433 433
      create_maps();
434 434
      _stack.resize(countNodes(*G));
435 435
      _stack_head=-1;
436 436
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
437 437
	_pred->set(u,INVALID);
438 438
	// _predNode->set(u,INVALID);
439 439
	_reached->set(u,false);
440 440
	_processed->set(u,false);
441 441
      }
442 442
    }
443 443
    
444 444
    ///Adds a new source node.
445 445

	
446 446
    ///Adds a new source node to the set of nodes to be processed.
447 447
    ///
448 448
    ///\warning dists are wrong (or at least strange)
449 449
    ///in case of multiple sources.
450 450
    void addSource(Node s)
451 451
    {
452 452
      if(!(*_reached)[s])
453 453
	{
454 454
	  _reached->set(s,true);
455 455
	  _pred->set(s,INVALID);
456 456
	  OutArcIt e(*G,s);
457 457
	  if(e!=INVALID) {
458 458
	    _stack[++_stack_head]=e;
459 459
	    _dist->set(s,_stack_head);
460 460
	  }
461 461
	  else {
462 462
	    _processed->set(s,true);
463 463
	    _dist->set(s,0);
464 464
	  }
465 465
	}
466 466
    }
467 467
    
468 468
    ///Processes the next arc.
469 469

	
470 470
    ///Processes the next arc.
471 471
    ///
472 472
    ///\return The processed arc.
473 473
    ///
474 474
    ///\pre The stack must not be empty!
475 475
    Arc processNextArc()
476 476
    { 
477 477
      Node m;
478 478
      Arc e=_stack[_stack_head];
479 479
      if(!(*_reached)[m=G->target(e)]) {
480 480
	_pred->set(m,e);
481 481
	_reached->set(m,true);
482 482
	++_stack_head;
483 483
	_stack[_stack_head] = OutArcIt(*G, m);
484 484
	_dist->set(m,_stack_head);
485 485
      }
486 486
      else {
487 487
	m=G->source(e);
488 488
	++_stack[_stack_head];
489 489
      }
490 490
      while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
491 491
	_processed->set(m,true);
492 492
	--_stack_head;
493 493
	if(_stack_head>=0) {
494 494
	  m=G->source(_stack[_stack_head]);
495 495
	  ++_stack[_stack_head];
496 496
	}
497 497
      }
498 498
      return e;
499 499
    }
500 500
    ///Next arc to be processed.
501 501

	
502 502
    ///Next arc to be processed.
503 503
    ///
504 504
    ///\return The next arc to be processed or INVALID if the stack is
505 505
    /// empty.
506 506
    OutArcIt nextArc()
507 507
    { 
508 508
      return _stack_head>=0?_stack[_stack_head]:INVALID;
509 509
    }
510 510

	
511 511
    ///\brief Returns \c false if there are nodes
512 512
    ///to be processed in the queue
513 513
    ///
514 514
    ///Returns \c false if there are nodes
515 515
    ///to be processed in the queue
516 516
    bool emptyQueue() { return _stack_head<0; }
517 517
    ///Returns the number of the nodes to be processed.
518 518
    
519 519
    ///Returns the number of the nodes to be processed in the queue.
520 520
    int queueSize() { return _stack_head+1; }
521 521
    
522 522
    ///Executes the algorithm.
523 523

	
524 524
    ///Executes the algorithm.
525 525
    ///
526 526
    ///\pre init() must be called and at least one node should be added
527 527
    ///with addSource() before using this function.
528 528
    ///
529 529
    ///This method runs the %DFS algorithm from the root node(s)
530 530
    ///in order to
531 531
    ///compute the
532 532
    ///%DFS path to each node. The algorithm computes
533 533
    ///- The %DFS tree.
534 534
    ///- The distance of each node from the root(s) in the %DFS tree.
535 535
    ///
536 536
    void start()
537 537
    {
538 538
      while ( !emptyQueue() ) processNextArc();
539 539
    }
540 540
    
541 541
    ///Executes the algorithm until \c dest is reached.
542 542

	
543 543
    ///Executes the algorithm until \c dest is reached.
544 544
    ///
545 545
    ///\pre init() must be called and at least one node should be added
546 546
    ///with addSource() before using this function.
547 547
    ///
548 548
    ///This method runs the %DFS algorithm from the root node(s)
549 549
    ///in order to
550 550
    ///compute the
551 551
    ///%DFS path to \c dest. The algorithm computes
552 552
    ///- The %DFS path to \c  dest.
553 553
    ///- The distance of \c dest from the root(s) in the %DFS tree.
554 554
    ///
555 555
    void start(Node dest)
556 556
    {
557 557
      while ( !emptyQueue() && G->target(_stack[_stack_head])!=dest ) 
558 558
	processNextArc();
559 559
    }
560 560
    
561 561
    ///Executes the algorithm until a condition is met.
562 562

	
563 563
    ///Executes the algorithm until a condition is met.
564 564
    ///
565 565
    ///\pre init() must be called and at least one node should be added
566 566
    ///with addSource() before using this function.
567 567
    ///
568 568
    ///\param em must be a bool (or convertible) arc map. The algorithm
569 569
    ///will stop when it reaches an arc \c e with <tt>em[e]</tt> true.
570 570
    ///
571 571
    ///\return The reached arc \c e with <tt>em[e]</tt> true or
572 572
    ///\c INVALID if no such arc was found.
573 573
    ///
574 574
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c em is an arc map,
575 575
    ///not a node map.
576 576
    template<class EM>
577 577
    Arc start(const EM &em)
578 578
    {
579 579
      while ( !emptyQueue() && !em[_stack[_stack_head]] )
580 580
        processNextArc();
581 581
      return emptyQueue() ? INVALID : _stack[_stack_head];
582 582
    }
583 583

	
584 584
    ///Runs %DFS algorithm to visit all nodes in the digraph.
585 585
    
586 586
    ///This method runs the %DFS algorithm in order to
587 587
    ///compute the
588 588
    ///%DFS path to each node. The algorithm computes
589 589
    ///- The %DFS tree.
590 590
    ///- The distance of each node from the root in the %DFS tree.
591 591
    ///
592 592
    ///\note d.run() is just a shortcut of the following code.
593 593
    ///\code
594 594
    ///  d.init();
595 595
    ///  for (NodeIt it(digraph); it != INVALID; ++it) {
596 596
    ///    if (!d.reached(it)) {
597 597
    ///      d.addSource(it);
598 598
    ///      d.start();
599 599
    ///    }
600 600
    ///  }
601 601
    ///\endcode
602 602
    void run() {
603 603
      init();
604 604
      for (NodeIt it(*G); it != INVALID; ++it) {
605 605
        if (!reached(it)) {
606 606
          addSource(it);
607 607
          start();
608 608
        }
609 609
      }
610 610
    }
611 611

	
612 612
    ///Runs %DFS algorithm from node \c s.
613 613
    
614 614
    ///This method runs the %DFS algorithm from a root node \c s
615 615
    ///in order to
616 616
    ///compute the
617 617
    ///%DFS path to each node. The algorithm computes
618 618
    ///- The %DFS tree.
619 619
    ///- The distance of each node from the root in the %DFS tree.
620 620
    ///
621 621
    ///\note d.run(s) is just a shortcut of the following code.
622 622
    ///\code
623 623
    ///  d.init();
624 624
    ///  d.addSource(s);
625 625
    ///  d.start();
626 626
    ///\endcode
627 627
    void run(Node s) {
628 628
      init();
629 629
      addSource(s);
630 630
      start();
631 631
    }
632 632
    
633 633
    ///Finds the %DFS path between \c s and \c t.
634 634
    
635 635
    ///Finds the %DFS path between \c s and \c t.
636 636
    ///
637 637
    ///\return The length of the %DFS s---t path if there exists one,
638 638
    ///0 otherwise.
639 639
    ///\note Apart from the return value, d.run(s,t) is
640 640
    ///just a shortcut of the following code.
641 641
    ///\code
642 642
    ///  d.init();
643 643
    ///  d.addSource(s);
644 644
    ///  d.start(t);
645 645
    ///\endcode
646 646
    int run(Node s,Node t) {
647 647
      init();
648 648
      addSource(s);
649 649
      start(t);
650 650
      return reached(t)?_stack_head+1:0;
651 651
    }
652 652
    
653 653
    ///@}
654 654

	
655 655
    ///\name Query Functions
656 656
    ///The result of the %DFS algorithm can be obtained using these
657 657
    ///functions.\n
658 658
    ///Before the use of these functions,
659 659
    ///either run() or start() must be called.
660 660
    
661 661
    ///@{
662 662

	
663 663
    typedef PredMapPath<Digraph, PredMap> Path;
664 664

	
665 665
    ///Gives back the shortest path.
666 666
    
667 667
    ///Gives back the shortest path.
668 668
    ///\pre The \c t should be reachable from the source.
669 669
    Path path(Node t) 
670 670
    {
671 671
      return Path(*G, *_pred, t);
672 672
    }
673 673

	
674 674
    ///The distance of a node from the root(s).
675 675

	
676 676
    ///Returns the distance of a node from the root(s).
677 677
    ///\pre \ref run() must be called before using this function.
678 678
    ///\warning If node \c v is unreachable from the root(s) then the return 
679 679
    ///value of this funcion is undefined.
680 680
    int dist(Node v) const { return (*_dist)[v]; }
681 681

	
682 682
    ///Returns the 'previous arc' of the %DFS tree.
683 683

	
684 684
    ///For a node \c v it returns the 'previous arc'
685 685
    ///of the %DFS path,
686 686
    ///i.e. it returns the last arc of a %DFS path from the root(s) to \c
687 687
    ///v. It is \ref INVALID
688 688
    ///if \c v is unreachable from the root(s) or \c v is a root. The
689 689
    ///%DFS tree used here is equal to the %DFS tree used in
690 690
    ///\ref predNode().
691 691
    ///\pre Either \ref run() or \ref start() must be called before using
692 692
    ///this function.
693 693
    Arc predArc(Node v) const { return (*_pred)[v];}
694 694

	
695 695
    ///Returns the 'previous node' of the %DFS tree.
696 696

	
697 697
    ///For a node \c v it returns the 'previous node'
698 698
    ///of the %DFS tree,
699 699
    ///i.e. it returns the last but one node from a %DFS path from the
700 700
    ///root(s) to \c v.
701 701
    ///It is INVALID if \c v is unreachable from the root(s) or
702 702
    ///if \c v itself a root.
703 703
    ///The %DFS tree used here is equal to the %DFS
704 704
    ///tree used in \ref predArc().
705 705
    ///\pre Either \ref run() or \ref start() must be called before
706 706
    ///using this function.
707 707
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
708 708
				  G->source((*_pred)[v]); }
709 709
    
710 710
    ///Returns a reference to the NodeMap of distances.
711 711

	
712 712
    ///Returns a reference to the NodeMap of distances.
713 713
    ///\pre Either \ref run() or \ref init() must
714 714
    ///be called before using this function.
715 715
    const DistMap &distMap() const { return *_dist;}
716 716
 
717 717
    ///Returns a reference to the %DFS arc-tree map.
718 718

	
719 719
    ///Returns a reference to the NodeMap of the arcs of the
720 720
    ///%DFS tree.
721 721
    ///\pre Either \ref run() or \ref init()
722 722
    ///must be called before using this function.
723 723
    const PredMap &predMap() const { return *_pred;}
724 724
 
725 725
    ///Checks if a node is reachable from the root.
726 726

	
727 727
    ///Returns \c true if \c v is reachable from the root(s).
728 728
    ///\warning The source nodes are inditated as unreachable.
729 729
    ///\pre Either \ref run() or \ref start()
730 730
    ///must be called before using this function.
731 731
    ///
732 732
    bool reached(Node v) { return (*_reached)[v]; }
733 733
    
734 734
    ///@}
735 735
  };
736 736

	
737 737
  ///Default traits class of Dfs function.
738 738

	
739 739
  ///Default traits class of Dfs function.
740 740
  ///\tparam GR Digraph type.
741 741
  template<class GR>
742 742
  struct DfsWizardDefaultTraits
743 743
  {
744 744
    ///The digraph type the algorithm runs on. 
745 745
    typedef GR Digraph;
746 746
    ///\brief The type of the map that stores the last
747 747
    ///arcs of the %DFS paths.
748 748
    /// 
749 749
    ///The type of the map that stores the last
750 750
    ///arcs of the %DFS paths.
751 751
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
752 752
    ///
753 753
    typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap;
754 754
    ///Instantiates a PredMap.
755 755
 
756 756
    ///This function instantiates a \ref PredMap. 
757 757
    ///\param g is the digraph, to which we would like to define the PredMap.
758 758
    ///\todo The digraph alone may be insufficient to initialize
759 759
#ifdef DOXYGEN
760 760
    static PredMap *createPredMap(const GR &g) 
761 761
#else
762 762
    static PredMap *createPredMap(const GR &) 
763 763
#endif
764 764
    {
765 765
      return new PredMap();
766 766
    }
767 767

	
768 768
    ///The type of the map that indicates which nodes are processed.
769 769
 
770 770
    ///The type of the map that indicates which nodes are processed.
771 771
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
772 772
    ///\todo named parameter to set this type, function to read and write.
773 773
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
774 774
    ///Instantiates a ProcessedMap.
775 775
 
776 776
    ///This function instantiates a \ref ProcessedMap. 
777 777
    ///\param g is the digraph, to which
778 778
    ///we would like to define the \ref ProcessedMap
779 779
#ifdef DOXYGEN
780 780
    static ProcessedMap *createProcessedMap(const GR &g)
781 781
#else
782 782
    static ProcessedMap *createProcessedMap(const GR &)
783 783
#endif
784 784
    {
785 785
      return new ProcessedMap();
786 786
    }
787 787
    ///The type of the map that indicates which nodes are reached.
788 788
 
789 789
    ///The type of the map that indicates which nodes are reached.
790 790
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
791 791
    ///\todo named parameter to set this type, function to read and write.
792 792
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
793 793
    ///Instantiates a ReachedMap.
794 794
 
795 795
    ///This function instantiates a \ref ReachedMap. 
796 796
    ///\param G is the digraph, to which
797 797
    ///we would like to define the \ref ReachedMap.
798 798
    static ReachedMap *createReachedMap(const GR &G)
799 799
    {
800 800
      return new ReachedMap(G);
801 801
    }
802 802
    ///The type of the map that stores the dists of the nodes.
803 803
 
804 804
    ///The type of the map that stores the dists of the nodes.
805 805
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
806 806
    ///
807 807
    typedef NullMap<typename Digraph::Node,int> DistMap;
808 808
    ///Instantiates a DistMap.
809 809
 
810 810
    ///This function instantiates a \ref DistMap. 
811 811
    ///\param g is the digraph, to which we would like to define the \ref DistMap
812 812
#ifdef DOXYGEN
813 813
    static DistMap *createDistMap(const GR &g)
814 814
#else
815 815
    static DistMap *createDistMap(const GR &)
816 816
#endif
817 817
    {
818 818
      return new DistMap();
819 819
    }
820 820
  };
821 821
  
822 822
  /// Default traits used by \ref DfsWizard
823 823

	
824 824
  /// To make it easier to use Dfs algorithm
825 825
  ///we have created a wizard class.
826 826
  /// This \ref DfsWizard class needs default traits,
827 827
  ///as well as the \ref Dfs class.
828 828
  /// The \ref DfsWizardBase is a class to be the default traits of the
829 829
  /// \ref DfsWizard class.
830 830
  template<class GR>
831 831
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
832 832
  {
833 833

	
834 834
    typedef DfsWizardDefaultTraits<GR> Base;
835 835
  protected:
836 836
    /// Type of the nodes in the digraph.
837 837
    typedef typename Base::Digraph::Node Node;
838 838

	
839 839
    /// Pointer to the underlying digraph.
840 840
    void *_g;
841 841
    ///Pointer to the map of reached nodes.
842 842
    void *_reached;
843 843
    ///Pointer to the map of processed nodes.
844 844
    void *_processed;
845 845
    ///Pointer to the map of predecessors arcs.
846 846
    void *_pred;
847 847
    ///Pointer to the map of distances.
848 848
    void *_dist;
849 849
    ///Pointer to the source node.
850 850
    Node _source;
851 851
    
852 852
    public:
853 853
    /// Constructor.
854 854
    
855 855
    /// This constructor does not require parameters, therefore it initiates
856 856
    /// all of the attributes to default values (0, INVALID).
857 857
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
858 858
			   _dist(0), _source(INVALID) {}
859 859

	
860 860
    /// Constructor.
861 861
    
862 862
    /// This constructor requires some parameters,
863 863
    /// listed in the parameters list.
864 864
    /// Others are initiated to 0.
865 865
    /// \param g is the initial value of  \ref _g
866 866
    /// \param s is the initial value of  \ref _source
867 867
    DfsWizardBase(const GR &g, Node s=INVALID) :
868 868
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 
869 869
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
870 870

	
871 871
  };
872 872
  
873 873
  /// A class to make the usage of the Dfs algorithm easier
874 874

	
875 875
  /// This class is created to make it easier to use the Dfs algorithm.
876 876
  /// It uses the functions and features of the plain \ref Dfs,
877 877
  /// but it is much simpler to use it.
878 878
  ///
879 879
  /// Simplicity means that the way to change the types defined
880 880
  /// in the traits class is based on functions that returns the new class
881 881
  /// and not on templatable built-in classes.
882 882
  /// When using the plain \ref Dfs
883 883
  /// the new class with the modified type comes from
884 884
  /// the original class by using the ::
885 885
  /// operator. In the case of \ref DfsWizard only
886 886
  /// a function have to be called and it will
887 887
  /// return the needed class.
888 888
  ///
889 889
  /// It does not have own \ref run method. When its \ref run method is called
890 890
  /// it initiates a plain \ref Dfs object, and calls the \ref Dfs::run
891 891
  /// method of it.
892 892
  template<class TR>
893 893
  class DfsWizard : public TR
894 894
  {
895 895
    typedef TR Base;
896 896

	
897 897
    ///The type of the underlying digraph.
898 898
    typedef typename TR::Digraph Digraph;
899 899
    //\e
900 900
    typedef typename Digraph::Node Node;
901 901
    //\e
902 902
    typedef typename Digraph::NodeIt NodeIt;
903 903
    //\e
904 904
    typedef typename Digraph::Arc Arc;
905 905
    //\e
906 906
    typedef typename Digraph::OutArcIt OutArcIt;
907 907
    
908 908
    ///\brief The type of the map that stores
909 909
    ///the reached nodes
910 910
    typedef typename TR::ReachedMap ReachedMap;
911 911
    ///\brief The type of the map that stores
912 912
    ///the processed nodes
913 913
    typedef typename TR::ProcessedMap ProcessedMap;
914 914
    ///\brief The type of the map that stores the last
915 915
    ///arcs of the %DFS paths.
916 916
    typedef typename TR::PredMap PredMap;
917 917
    ///The type of the map that stores the distances of the nodes.
918 918
    typedef typename TR::DistMap DistMap;
919 919

	
920 920
  public:
921 921
    /// Constructor.
922 922
    DfsWizard() : TR() {}
923 923

	
924 924
    /// Constructor that requires parameters.
925 925

	
926 926
    /// Constructor that requires parameters.
927 927
    /// These parameters will be the default values for the traits class.
928 928
    DfsWizard(const Digraph &g, Node s=INVALID) :
929 929
      TR(g,s) {}
930 930

	
931 931
    ///Copy constructor
932 932
    DfsWizard(const TR &b) : TR(b) {}
933 933

	
934 934
    ~DfsWizard() {}
935 935

	
936 936
    ///Runs Dfs algorithm from a given node.
937 937
    
938 938
    ///Runs Dfs algorithm from a given node.
939 939
    ///The node can be given by the \ref source function.
940 940
    void run()
941 941
    {
942 942
      if(Base::_source==INVALID) throw UninitializedParameter();
943 943
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
944 944
      if(Base::_reached) 
945 945
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
946 946
      if(Base::_processed) 
947 947
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
948 948
      if(Base::_pred) 
949 949
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
950 950
      if(Base::_dist) 
951 951
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
952 952
      alg.run(Base::_source);
953 953
    }
954 954

	
955 955
    ///Runs Dfs algorithm from the given node.
956 956

	
957 957
    ///Runs Dfs algorithm from the given node.
958 958
    ///\param s is the given source.
959 959
    void run(Node s)
960 960
    {
961 961
      Base::_source=s;
962 962
      run();
963 963
    }
964 964

	
965 965
    template<class T>
966 966
    struct DefPredMapBase : public Base {
967 967
      typedef T PredMap;
968 968
      static PredMap *createPredMap(const Digraph &) { return 0; };
969 969
      DefPredMapBase(const TR &b) : TR(b) {}
970 970
    };
971 971
    
972 972
    ///\brief \ref named-templ-param "Named parameter"
973 973
    ///function for setting PredMap type
974 974
    ///
975 975
    /// \ref named-templ-param "Named parameter"
976 976
    ///function for setting PredMap type
977 977
    ///
978 978
    template<class T>
979 979
    DfsWizard<DefPredMapBase<T> > predMap(const T &t) 
980 980
    {
981 981
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
982 982
      return DfsWizard<DefPredMapBase<T> >(*this);
983 983
    }
984 984
    
985 985
 
986 986
    template<class T>
987 987
    struct DefReachedMapBase : public Base {
988 988
      typedef T ReachedMap;
989 989
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
990 990
      DefReachedMapBase(const TR &b) : TR(b) {}
991 991
    };
992 992
    
993 993
    ///\brief \ref named-templ-param "Named parameter"
994 994
    ///function for setting ReachedMap
995 995
    ///
996 996
    /// \ref named-templ-param "Named parameter"
997 997
    ///function for setting ReachedMap
998 998
    ///
999 999
    template<class T>
1000 1000
    DfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 
1001 1001
    {
1002
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1002
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1003 1003
      return DfsWizard<DefReachedMapBase<T> >(*this);
1004 1004
    }
1005 1005
    
1006 1006

	
1007 1007
    template<class T>
1008 1008
    struct DefProcessedMapBase : public Base {
1009 1009
      typedef T ProcessedMap;
1010 1010
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1011 1011
      DefProcessedMapBase(const TR &b) : TR(b) {}
1012 1012
    };
1013 1013
    
1014 1014
    ///\brief \ref named-templ-param "Named parameter"
1015 1015
    ///function for setting ProcessedMap
1016 1016
    ///
1017 1017
    /// \ref named-templ-param "Named parameter"
1018 1018
    ///function for setting ProcessedMap
1019 1019
    ///
1020 1020
    template<class T>
1021 1021
    DfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 
1022 1022
    {
1023
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1023
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1024 1024
      return DfsWizard<DefProcessedMapBase<T> >(*this);
1025 1025
    }
1026 1026
    
1027 1027
    template<class T>
1028 1028
    struct DefDistMapBase : public Base {
1029 1029
      typedef T DistMap;
1030 1030
      static DistMap *createDistMap(const Digraph &) { return 0; };
1031 1031
      DefDistMapBase(const TR &b) : TR(b) {}
1032 1032
    };
1033 1033
    
1034 1034
    ///\brief \ref named-templ-param "Named parameter"
1035 1035
    ///function for setting DistMap type
1036 1036
    ///
1037 1037
    /// \ref named-templ-param "Named parameter"
1038 1038
    ///function for setting DistMap type
1039 1039
    ///
1040 1040
    template<class T>
1041 1041
    DfsWizard<DefDistMapBase<T> > distMap(const T &t) 
1042 1042
    {
1043 1043
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1044 1044
      return DfsWizard<DefDistMapBase<T> >(*this);
1045 1045
    }
1046 1046
    
1047 1047
    /// Sets the source node, from which the Dfs algorithm runs.
1048 1048

	
1049 1049
    /// Sets the source node, from which the Dfs algorithm runs.
1050 1050
    /// \param s is the source node.
1051 1051
    DfsWizard<TR> &source(Node s) 
1052 1052
    {
1053 1053
      Base::_source=s;
1054 1054
      return *this;
1055 1055
    }
1056 1056
    
1057 1057
  };
1058 1058
  
1059 1059
  ///Function type interface for Dfs algorithm.
1060 1060

	
1061 1061
  ///\ingroup search
1062 1062
  ///Function type interface for Dfs algorithm.
1063 1063
  ///
1064 1064
  ///This function also has several
1065 1065
  ///\ref named-templ-func-param "named parameters",
1066 1066
  ///they are declared as the members of class \ref DfsWizard.
1067 1067
  ///The following
1068 1068
  ///example shows how to use these parameters.
1069 1069
  ///\code
1070 1070
  ///  dfs(g,source).predMap(preds).run();
1071 1071
  ///\endcode
1072 1072
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1073 1073
  ///to the end of the parameter list.
1074 1074
  ///\sa DfsWizard
1075 1075
  ///\sa Dfs
1076 1076
  template<class GR>
1077 1077
  DfsWizard<DfsWizardBase<GR> >
1078 1078
  dfs(const GR &g,typename GR::Node s=INVALID)
1079 1079
  {
1080 1080
    return DfsWizard<DfsWizardBase<GR> >(g,s);
1081 1081
  }
1082 1082

	
1083 1083
#ifdef DOXYGEN
1084 1084
  /// \brief Visitor class for dfs.
1085 1085
  ///  
1086 1086
  /// It gives a simple interface for a functional interface for dfs 
1087 1087
  /// traversal. The traversal on a linear data structure. 
1088 1088
  template <typename _Digraph>
1089 1089
  struct DfsVisitor {
1090 1090
    typedef _Digraph Digraph;
1091 1091
    typedef typename Digraph::Arc Arc;
1092 1092
    typedef typename Digraph::Node Node;
1093 1093
    /// \brief Called when the arc reach a node.
1094 1094
    /// 
1095 1095
    /// It is called when the dfs find an arc which target is not
1096 1096
    /// reached yet.
1097 1097
    void discover(const Arc& arc) {}
1098 1098
    /// \brief Called when the node reached first time.
1099 1099
    /// 
1100 1100
    /// It is Called when the node reached first time.
1101 1101
    void reach(const Node& node) {}
1102 1102
    /// \brief Called when we step back on an arc.
1103 1103
    /// 
1104 1104
    /// It is called when the dfs should step back on the arc.
1105 1105
    void backtrack(const Arc& arc) {}
1106 1106
    /// \brief Called when we step back from the node.
1107 1107
    /// 
1108 1108
    /// It is called when we step back from the node.
1109 1109
    void leave(const Node& node) {}
1110 1110
    /// \brief Called when the arc examined but target of the arc 
1111 1111
    /// already discovered.
1112 1112
    /// 
1113 1113
    /// It called when the arc examined but the target of the arc 
1114 1114
    /// already discovered.
1115 1115
    void examine(const Arc& arc) {}
1116 1116
    /// \brief Called for the source node of the dfs.
1117 1117
    /// 
1118 1118
    /// It is called for the source node of the dfs.
1119 1119
    void start(const Node& node) {}
1120 1120
    /// \brief Called when we leave the source node of the dfs.
1121 1121
    /// 
1122 1122
    /// It is called when we leave the source node of the dfs.
1123 1123
    void stop(const Node& node) {}
1124 1124

	
1125 1125
  };
1126 1126
#else
1127 1127
  template <typename _Digraph>
1128 1128
  struct DfsVisitor {
1129 1129
    typedef _Digraph Digraph;
1130 1130
    typedef typename Digraph::Arc Arc;
1131 1131
    typedef typename Digraph::Node Node;
1132 1132
    void discover(const Arc&) {}
1133 1133
    void reach(const Node&) {}
1134 1134
    void backtrack(const Arc&) {}
1135 1135
    void leave(const Node&) {}
1136 1136
    void examine(const Arc&) {}
1137 1137
    void start(const Node&) {}
1138 1138
    void stop(const Node&) {}
1139 1139

	
1140 1140
    template <typename _Visitor>
1141 1141
    struct Constraints {
1142 1142
      void constraints() {
1143 1143
	Arc arc;
1144 1144
	Node node;
1145 1145
	visitor.discover(arc);
1146 1146
	visitor.reach(node);
1147 1147
	visitor.backtrack(arc);
1148 1148
	visitor.leave(node);
1149 1149
	visitor.examine(arc);
1150 1150
	visitor.start(node);
1151 1151
	visitor.stop(arc);
1152 1152
      }
1153 1153
      _Visitor& visitor;
1154 1154
    };
1155 1155
  };
1156 1156
#endif
1157 1157

	
1158 1158
  /// \brief Default traits class of DfsVisit class.
1159 1159
  ///
1160 1160
  /// Default traits class of DfsVisit class.
1161 1161
  /// \tparam _Digraph Digraph type.
1162 1162
  template<class _Digraph>
1163 1163
  struct DfsVisitDefaultTraits {
1164 1164

	
1165 1165
    /// \brief The digraph type the algorithm runs on. 
1166 1166
    typedef _Digraph Digraph;
1167 1167

	
1168 1168
    /// \brief The type of the map that indicates which nodes are reached.
1169 1169
    /// 
1170 1170
    /// The type of the map that indicates which nodes are reached.
1171 1171
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
1172 1172
    /// \todo named parameter to set this type, function to read and write.
1173 1173
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1174 1174

	
1175 1175
    /// \brief Instantiates a ReachedMap.
1176 1176
    ///
1177 1177
    /// This function instantiates a \ref ReachedMap. 
1178 1178
    /// \param digraph is the digraph, to which
1179 1179
    /// we would like to define the \ref ReachedMap.
1180 1180
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1181 1181
      return new ReachedMap(digraph);
1182 1182
    }
1183 1183

	
1184 1184
  };
1185 1185
  
1186 1186
  /// %DFS Visit algorithm class.
1187 1187
  
1188 1188
  /// \ingroup search
1189 1189
  /// This class provides an efficient implementation of the %DFS algorithm
1190 1190
  /// with visitor interface.
1191 1191
  ///
1192 1192
  /// The %DfsVisit class provides an alternative interface to the Dfs
1193 1193
  /// class. It works with callback mechanism, the DfsVisit object calls
1194 1194
  /// on every dfs event the \c Visitor class member functions. 
1195 1195
  ///
1196 1196
  /// \tparam _Digraph The digraph type the algorithm runs on. The default value is
1197 1197
  /// \ref ListDigraph. The value of _Digraph is not used directly by Dfs, it
1198 1198
  /// is only passed to \ref DfsDefaultTraits.
1199 1199
  /// \tparam _Visitor The Visitor object for the algorithm. The 
1200 1200
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty Visitor which
1201 1201
  /// does not observe the Dfs events. If you want to observe the dfs
1202 1202
  /// events you should implement your own Visitor class.
1203 1203
  /// \tparam _Traits Traits class to set various data types used by the 
1204 1204
  /// algorithm. The default traits class is
1205 1205
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1206 1206
  /// See \ref DfsVisitDefaultTraits for the documentation of
1207 1207
  /// a Dfs visit traits class.
1208 1208
  ///
1209 1209
  /// \author Jacint Szabo, Alpar Juttner and Balazs Dezso
1210 1210
#ifdef DOXYGEN
1211 1211
  template <typename _Digraph, typename _Visitor, typename _Traits>
1212 1212
#else
1213 1213
  template <typename _Digraph = ListDigraph,
1214 1214
	    typename _Visitor = DfsVisitor<_Digraph>,
1215 1215
	    typename _Traits = DfsDefaultTraits<_Digraph> >
1216 1216
#endif
1217 1217
  class DfsVisit {
1218 1218
  public:
1219 1219
    
1220 1220
    /// \brief \ref Exception for uninitialized parameters.
1221 1221
    ///
1222 1222
    /// This error represents problems in the initialization
1223 1223
    /// of the parameters of the algorithms.
1224 1224
    class UninitializedParameter : public lemon::UninitializedParameter {
1225 1225
    public:
1226 1226
      virtual const char* what() const throw() 
1227 1227
      {
1228 1228
	return "lemon::DfsVisit::UninitializedParameter";
1229 1229
      }
1230 1230
    };
1231 1231

	
1232 1232
    typedef _Traits Traits;
1233 1233

	
1234 1234
    typedef typename Traits::Digraph Digraph;
1235 1235

	
1236 1236
    typedef _Visitor Visitor;
1237 1237

	
1238 1238
    ///The type of the map indicating which nodes are reached.
1239 1239
    typedef typename Traits::ReachedMap ReachedMap;
1240 1240

	
1241 1241
  private:
1242 1242

	
1243 1243
    typedef typename Digraph::Node Node;
1244 1244
    typedef typename Digraph::NodeIt NodeIt;
1245 1245
    typedef typename Digraph::Arc Arc;
1246 1246
    typedef typename Digraph::OutArcIt OutArcIt;
1247 1247

	
1248 1248
    /// Pointer to the underlying digraph.
1249 1249
    const Digraph *_digraph;
1250 1250
    /// Pointer to the visitor object.
1251 1251
    Visitor *_visitor;
1252 1252
    ///Pointer to the map of reached status of the nodes.
1253 1253
    ReachedMap *_reached;
1254 1254
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
1255 1255
    bool local_reached;
1256 1256

	
1257 1257
    std::vector<typename Digraph::Arc> _stack;
1258 1258
    int _stack_head;
1259 1259

	
1260 1260
    /// \brief Creates the maps if necessary.
1261 1261
    ///
1262 1262
    /// Creates the maps if necessary.
1263 1263
    void create_maps() {
1264 1264
      if(!_reached) {
1265 1265
	local_reached = true;
1266 1266
	_reached = Traits::createReachedMap(*_digraph);
1267 1267
      }
1268 1268
    }
1269 1269

	
1270 1270
  protected:
1271 1271

	
1272 1272
    DfsVisit() {}
1273 1273
    
1274 1274
  public:
1275 1275

	
1276 1276
    typedef DfsVisit Create;
1277 1277

	
1278 1278
    /// \name Named template parameters
1279 1279

	
1280 1280
    ///@{
1281 1281
    template <class T>
1282 1282
    struct DefReachedMapTraits : public Traits {
1283 1283
      typedef T ReachedMap;
1284 1284
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1285 1285
	throw UninitializedParameter();
1286 1286
      }
1287 1287
    };
1288 1288
    /// \brief \ref named-templ-param "Named parameter" for setting 
1289 1289
    /// ReachedMap type
1290 1290
    ///
1291 1291
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type
1292 1292
    template <class T>
1293 1293
    struct DefReachedMap : public DfsVisit< Digraph, Visitor,
1294 1294
					    DefReachedMapTraits<T> > {
1295 1295
      typedef DfsVisit< Digraph, Visitor, DefReachedMapTraits<T> > Create;
1296 1296
    };
1297 1297
    ///@}
1298 1298

	
1299 1299
  public:      
1300 1300
    
1301 1301
    /// \brief Constructor.
1302 1302
    ///
1303 1303
    /// Constructor.
1304 1304
    ///
1305 1305
    /// \param digraph the digraph the algorithm will run on.
1306 1306
    /// \param visitor The visitor of the algorithm.
1307 1307
    ///
1308 1308
    DfsVisit(const Digraph& digraph, Visitor& visitor) 
1309 1309
      : _digraph(&digraph), _visitor(&visitor),
1310 1310
	_reached(0), local_reached(false) {}
1311 1311
    
1312 1312
    /// \brief Destructor.
1313 1313
    ///
1314 1314
    /// Destructor.
1315 1315
    ~DfsVisit() {
1316 1316
      if(local_reached) delete _reached;
1317 1317
    }
1318 1318

	
1319 1319
    /// \brief Sets the map indicating if a node is reached.
1320 1320
    ///
1321 1321
    /// Sets the map indicating if a node is reached.
1322 1322
    /// If you don't use this function before calling \ref run(),
1323 1323
    /// it will allocate one. The destuctor deallocates this
1324 1324
    /// automatically allocated map, of course.
1325 1325
    /// \return <tt> (*this) </tt>
1326 1326
    DfsVisit &reachedMap(ReachedMap &m) {
1327 1327
      if(local_reached) {
1328 1328
	delete _reached;
1329 1329
	local_reached=false;
1330 1330
      }
1331 1331
      _reached = &m;
1332 1332
      return *this;
1333 1333
    }
1334 1334

	
1335 1335
  public:
1336 1336
    /// \name Execution control
1337 1337
    /// The simplest way to execute the algorithm is to use
1338 1338
    /// one of the member functions called \c run(...).
1339 1339
    /// \n
1340 1340
    /// If you need more control on the execution,
1341 1341
    /// first you must call \ref init(), then you can adda source node
1342 1342
    /// with \ref addSource().
1343 1343
    /// Finally \ref start() will perform the actual path
1344 1344
    /// computation.
1345 1345

	
1346 1346
    /// @{
1347 1347
    /// \brief Initializes the internal data structures.
1348 1348
    ///
1349 1349
    /// Initializes the internal data structures.
1350 1350
    ///
1351 1351
    void init() {
1352 1352
      create_maps();
1353 1353
      _stack.resize(countNodes(*_digraph));
1354 1354
      _stack_head = -1;
1355 1355
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1356 1356
	_reached->set(u, false);
1357 1357
      }
1358 1358
    }
1359 1359
    
1360 1360
    /// \brief Adds a new source node.
1361 1361
    ///
1362 1362
    /// Adds a new source node to the set of nodes to be processed.
1363 1363
    void addSource(Node s) {
1364 1364
      if(!(*_reached)[s]) {
1365 1365
	  _reached->set(s,true);
1366 1366
	  _visitor->start(s);
1367 1367
	  _visitor->reach(s);
1368 1368
	  Arc e; 
1369 1369
	  _digraph->firstOut(e, s);
1370 1370
	  if (e != INVALID) {
1371 1371
	    _stack[++_stack_head] = e;
1372 1372
	  } else {
1373 1373
	    _visitor->leave(s);
1374 1374
	  }
1375 1375
	}
1376 1376
    }
1377 1377
    
1378 1378
    /// \brief Processes the next arc.
1379 1379
    ///
1380 1380
    /// Processes the next arc.
1381 1381
    ///
1382 1382
    /// \return The processed arc.
1383 1383
    ///
1384 1384
    /// \pre The stack must not be empty!
1385 1385
    Arc processNextArc() { 
1386 1386
      Arc e = _stack[_stack_head];
1387 1387
      Node m = _digraph->target(e);
1388 1388
      if(!(*_reached)[m]) {
1389 1389
	_visitor->discover(e);
1390 1390
	_visitor->reach(m);
1391 1391
	_reached->set(m, true);
1392 1392
	_digraph->firstOut(_stack[++_stack_head], m);
1393 1393
      } else {
1394 1394
	_visitor->examine(e);
1395 1395
	m = _digraph->source(e);
1396 1396
	_digraph->nextOut(_stack[_stack_head]);
1397 1397
      }
1398 1398
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1399 1399
	_visitor->leave(m);
1400 1400
	--_stack_head;
1401 1401
	if (_stack_head >= 0) {
1402 1402
	  _visitor->backtrack(_stack[_stack_head]);
1403 1403
	  m = _digraph->source(_stack[_stack_head]);
1404 1404
	  _digraph->nextOut(_stack[_stack_head]);
1405 1405
	} else {
1406 1406
	  _visitor->stop(m);	  
1407 1407
	}
1408 1408
      }
1409 1409
      return e;
1410 1410
    }
1411 1411

	
1412 1412
    /// \brief Next arc to be processed.
1413 1413
    ///
1414 1414
    /// Next arc to be processed.
1415 1415
    ///
1416 1416
    /// \return The next arc to be processed or INVALID if the stack is
1417 1417
    /// empty.
1418 1418
    Arc nextArc() { 
1419 1419
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1420 1420
    }
1421 1421

	
1422 1422
    /// \brief Returns \c false if there are nodes
1423 1423
    /// to be processed in the queue
1424 1424
    ///
1425 1425
    /// Returns \c false if there are nodes
1426 1426
    /// to be processed in the queue
1427 1427
    bool emptyQueue() { return _stack_head < 0; }
1428 1428

	
1429 1429
    /// \brief Returns the number of the nodes to be processed.
1430 1430
    ///
1431 1431
    /// Returns the number of the nodes to be processed in the queue.
1432 1432
    int queueSize() { return _stack_head + 1; }
1433 1433
    
1434 1434
    /// \brief Executes the algorithm.
1435 1435
    ///
1436 1436
    /// Executes the algorithm.
1437 1437
    ///
1438 1438
    /// \pre init() must be called and at least one node should be added
1439 1439
    /// with addSource() before using this function.
1440 1440
    void start() {
1441 1441
      while ( !emptyQueue() ) processNextArc();
1442 1442
    }
1443 1443
    
1444 1444
    /// \brief Executes the algorithm until \c dest is reached.
1445 1445
    ///
1446 1446
    /// Executes the algorithm until \c dest is reached.
1447 1447
    ///
1448 1448
    /// \pre init() must be called and at least one node should be added
1449 1449
    /// with addSource() before using this function.
1450 1450
    void start(Node dest) {
1451 1451
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != dest ) 
1452 1452
	processNextArc();
1453 1453
    }
1454 1454
    
1455 1455
    /// \brief Executes the algorithm until a condition is met.
1456 1456
    ///
1457 1457
    /// Executes the algorithm until a condition is met.
1458 1458
    ///
1459 1459
    /// \pre init() must be called and at least one node should be added
1460 1460
    /// with addSource() before using this function.
1461 1461
    ///
1462 1462
    /// \param em must be a bool (or convertible) arc map. The algorithm
1463 1463
    /// will stop when it reaches an arc \c e with <tt>em[e]</tt> true.
1464 1464
    ///
1465 1465
    ///\return The reached arc \c e with <tt>em[e]</tt> true or
1466 1466
    ///\c INVALID if no such arc was found.
1467 1467
    ///
1468 1468
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c em is an arc map,
1469 1469
    /// not a node map.
1470 1470
    template <typename EM>
1471 1471
    Arc start(const EM &em) {
1472 1472
      while ( !emptyQueue() && !em[_stack[_stack_head]] )
1473 1473
        processNextArc();
1474 1474
      return emptyQueue() ? INVALID : _stack[_stack_head];
1475 1475
    }
1476 1476

	
1477 1477
    /// \brief Runs %DFSVisit algorithm from node \c s.
1478 1478
    ///
1479 1479
    /// This method runs the %DFS algorithm from a root node \c s.
1480 1480
    /// \note d.run(s) is just a shortcut of the following code.
1481 1481
    ///\code
1482 1482
    ///   d.init();
1483 1483
    ///   d.addSource(s);
1484 1484
    ///   d.start();
1485 1485
    ///\endcode
1486 1486
    void run(Node s) {
1487 1487
      init();
1488 1488
      addSource(s);
1489 1489
      start();
1490 1490
    }
1491 1491

	
1492 1492
    /// \brief Runs %DFSVisit algorithm to visit all nodes in the digraph.
1493 1493
    
1494 1494
    /// This method runs the %DFS algorithm in order to
1495 1495
    /// compute the %DFS path to each node. The algorithm computes
1496 1496
    /// - The %DFS tree.
1497 1497
    /// - The distance of each node from the root in the %DFS tree.
1498 1498
    ///
1499 1499
    ///\note d.run() is just a shortcut of the following code.
1500 1500
    ///\code
1501 1501
    ///  d.init();
1502 1502
    ///  for (NodeIt it(digraph); it != INVALID; ++it) {
1503 1503
    ///    if (!d.reached(it)) {
1504 1504
    ///      d.addSource(it);
1505 1505
    ///      d.start();
1506 1506
    ///    }
1507 1507
    ///  }
1508 1508
    ///\endcode
1509 1509
    void run() {
1510 1510
      init();
1511 1511
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1512 1512
        if (!reached(it)) {
1513 1513
          addSource(it);
1514 1514
          start();
1515 1515
        }
1516 1516
      }
1517 1517
    }
1518 1518
    ///@}
1519 1519

	
1520 1520
    /// \name Query Functions
1521 1521
    /// The result of the %DFS algorithm can be obtained using these
1522 1522
    /// functions.\n
1523 1523
    /// Before the use of these functions,
1524 1524
    /// either run() or start() must be called.
1525 1525
    ///@{
1526 1526
    /// \brief Checks if a node is reachable from the root.
1527 1527
    ///
1528 1528
    /// Returns \c true if \c v is reachable from the root(s).
1529 1529
    /// \warning The source nodes are inditated as unreachable.
1530 1530
    /// \pre Either \ref run() or \ref start()
1531 1531
    /// must be called before using this function.
1532 1532
    ///
1533 1533
    bool reached(Node v) { return (*_reached)[v]; }
1534 1534
    ///@}
1535 1535
  };
1536 1536

	
1537 1537

	
1538 1538
} //END OF NAMESPACE LEMON
1539 1539

	
1540 1540
#endif
1541 1541

	
0 comments (0 inline)