gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small doc improvements (#304)
0 4 0
default
4 files changed with 166 insertions and 174 deletions:
↑ Collapse diff ↑
Ignore white space 24576 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
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/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%BFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %BFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=BfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Bfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///shortest paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
148 149
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
149 150
    typedef TR Traits;
150 151

	
151 152
  private:
152 153

	
153 154
    typedef typename Digraph::Node Node;
154 155
    typedef typename Digraph::NodeIt NodeIt;
155 156
    typedef typename Digraph::Arc Arc;
156 157
    typedef typename Digraph::OutArcIt OutArcIt;
157 158

	
158 159
    //Pointer to the underlying digraph.
159 160
    const Digraph *G;
160 161
    //Pointer to the map of predecessor arcs.
161 162
    PredMap *_pred;
162 163
    //Indicates if _pred is locally allocated (true) or not.
163 164
    bool local_pred;
164 165
    //Pointer to the map of distances.
165 166
    DistMap *_dist;
166 167
    //Indicates if _dist is locally allocated (true) or not.
167 168
    bool local_dist;
168 169
    //Pointer to the map of reached status of the nodes.
169 170
    ReachedMap *_reached;
170 171
    //Indicates if _reached is locally allocated (true) or not.
171 172
    bool local_reached;
172 173
    //Pointer to the map of processed status of the nodes.
173 174
    ProcessedMap *_processed;
174 175
    //Indicates if _processed is locally allocated (true) or not.
175 176
    bool local_processed;
176 177

	
177 178
    std::vector<typename Digraph::Node> _queue;
178 179
    int _queue_head,_queue_tail,_queue_next_dist;
179 180
    int _curr_dist;
180 181

	
181 182
    //Creates the maps if necessary.
182 183
    void create_maps()
183 184
    {
184 185
      if(!_pred) {
185 186
        local_pred = true;
186 187
        _pred = Traits::createPredMap(*G);
187 188
      }
188 189
      if(!_dist) {
189 190
        local_dist = true;
190 191
        _dist = Traits::createDistMap(*G);
191 192
      }
192 193
      if(!_reached) {
193 194
        local_reached = true;
194 195
        _reached = Traits::createReachedMap(*G);
195 196
      }
196 197
      if(!_processed) {
197 198
        local_processed = true;
198 199
        _processed = Traits::createProcessedMap(*G);
199 200
      }
200 201
    }
201 202

	
202 203
  protected:
203 204

	
204 205
    Bfs() {}
205 206

	
206 207
  public:
207 208

	
208 209
    typedef Bfs Create;
209 210

	
210 211
    ///\name Named Template Parameters
211 212

	
212 213
    ///@{
213 214

	
214 215
    template <class T>
215 216
    struct SetPredMapTraits : public Traits {
216 217
      typedef T PredMap;
217 218
      static PredMap *createPredMap(const Digraph &)
218 219
      {
219 220
        LEMON_ASSERT(false, "PredMap is not initialized");
220 221
        return 0; // ignore warnings
221 222
      }
222 223
    };
223 224
    ///\brief \ref named-templ-param "Named parameter" for setting
224 225
    ///\c PredMap type.
225 226
    ///
226 227
    ///\ref named-templ-param "Named parameter" for setting
227 228
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 230
    template <class T>
230 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 233
    };
233 234

	
234 235
    template <class T>
235 236
    struct SetDistMapTraits : public Traits {
236 237
      typedef T DistMap;
237 238
      static DistMap *createDistMap(const Digraph &)
238 239
      {
239 240
        LEMON_ASSERT(false, "DistMap is not initialized");
240 241
        return 0; // ignore warnings
241 242
      }
242 243
    };
243 244
    ///\brief \ref named-templ-param "Named parameter" for setting
244 245
    ///\c DistMap type.
245 246
    ///
246 247
    ///\ref named-templ-param "Named parameter" for setting
247 248
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
249
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 250
    template <class T>
250 251
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 252
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 253
    };
253 254

	
254 255
    template <class T>
255 256
    struct SetReachedMapTraits : public Traits {
256 257
      typedef T ReachedMap;
257 258
      static ReachedMap *createReachedMap(const Digraph &)
258 259
      {
259 260
        LEMON_ASSERT(false, "ReachedMap is not initialized");
260 261
        return 0; // ignore warnings
261 262
      }
262 263
    };
263 264
    ///\brief \ref named-templ-param "Named parameter" for setting
264 265
    ///\c ReachedMap type.
265 266
    ///
266 267
    ///\ref named-templ-param "Named parameter" for setting
267 268
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 270
    template <class T>
270 271
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 272
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 273
    };
273 274

	
274 275
    template <class T>
275 276
    struct SetProcessedMapTraits : public Traits {
276 277
      typedef T ProcessedMap;
277 278
      static ProcessedMap *createProcessedMap(const Digraph &)
278 279
      {
279 280
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 281
        return 0; // ignore warnings
281 282
      }
282 283
    };
283 284
    ///\brief \ref named-templ-param "Named parameter" for setting
284 285
    ///\c ProcessedMap type.
285 286
    ///
286 287
    ///\ref named-templ-param "Named parameter" for setting
287 288
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
289
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 290
    template <class T>
290 291
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 292
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 293
    };
293 294

	
294 295
    struct SetStandardProcessedMapTraits : public Traits {
295 296
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 297
      static ProcessedMap *createProcessedMap(const Digraph &g)
297 298
      {
298 299
        return new ProcessedMap(g);
299 300
        return 0; // ignore warnings
300 301
      }
301 302
    };
302 303
    ///\brief \ref named-templ-param "Named parameter" for setting
303 304
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 305
    ///
305 306
    ///\ref named-templ-param "Named parameter" for setting
306 307
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307 308
    ///If you don't set it explicitly, it will be automatically allocated.
308 309
    struct SetStandardProcessedMap :
309 310
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
310 311
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
311 312
    };
312 313

	
313 314
    ///@}
314 315

	
315 316
  public:
316 317

	
317 318
    ///Constructor.
318 319

	
319 320
    ///Constructor.
320 321
    ///\param g The digraph the algorithm runs on.
321 322
    Bfs(const Digraph &g) :
322 323
      G(&g),
323 324
      _pred(NULL), local_pred(false),
324 325
      _dist(NULL), local_dist(false),
325 326
      _reached(NULL), local_reached(false),
326 327
      _processed(NULL), local_processed(false)
327 328
    { }
328 329

	
329 330
    ///Destructor.
330 331
    ~Bfs()
331 332
    {
332 333
      if(local_pred) delete _pred;
333 334
      if(local_dist) delete _dist;
334 335
      if(local_reached) delete _reached;
335 336
      if(local_processed) delete _processed;
336 337
    }
337 338

	
338 339
    ///Sets the map that stores the predecessor arcs.
339 340

	
340 341
    ///Sets the map that stores the predecessor arcs.
341 342
    ///If you don't use this function before calling \ref run(Node) "run()"
342 343
    ///or \ref init(), an instance will be allocated automatically.
343 344
    ///The destructor deallocates this automatically allocated map,
344 345
    ///of course.
345 346
    ///\return <tt> (*this) </tt>
346 347
    Bfs &predMap(PredMap &m)
347 348
    {
348 349
      if(local_pred) {
349 350
        delete _pred;
350 351
        local_pred=false;
351 352
      }
352 353
      _pred = &m;
353 354
      return *this;
354 355
    }
355 356

	
356 357
    ///Sets the map that indicates which nodes are reached.
357 358

	
358 359
    ///Sets the map that indicates which nodes are reached.
359 360
    ///If you don't use this function before calling \ref run(Node) "run()"
360 361
    ///or \ref init(), an instance will be allocated automatically.
361 362
    ///The destructor deallocates this automatically allocated map,
362 363
    ///of course.
363 364
    ///\return <tt> (*this) </tt>
364 365
    Bfs &reachedMap(ReachedMap &m)
365 366
    {
366 367
      if(local_reached) {
367 368
        delete _reached;
368 369
        local_reached=false;
369 370
      }
370 371
      _reached = &m;
371 372
      return *this;
372 373
    }
373 374

	
374 375
    ///Sets the map that indicates which nodes are processed.
375 376

	
376 377
    ///Sets the map that indicates which nodes are processed.
377 378
    ///If you don't use this function before calling \ref run(Node) "run()"
378 379
    ///or \ref init(), an instance will be allocated automatically.
379 380
    ///The destructor deallocates this automatically allocated map,
380 381
    ///of course.
381 382
    ///\return <tt> (*this) </tt>
382 383
    Bfs &processedMap(ProcessedMap &m)
383 384
    {
384 385
      if(local_processed) {
385 386
        delete _processed;
386 387
        local_processed=false;
387 388
      }
388 389
      _processed = &m;
389 390
      return *this;
390 391
    }
391 392

	
392 393
    ///Sets the map that stores the distances of the nodes.
393 394

	
394 395
    ///Sets the map that stores the distances of the nodes calculated by
395 396
    ///the algorithm.
396 397
    ///If you don't use this function before calling \ref run(Node) "run()"
397 398
    ///or \ref init(), an instance will be allocated automatically.
398 399
    ///The destructor deallocates this automatically allocated map,
399 400
    ///of course.
400 401
    ///\return <tt> (*this) </tt>
401 402
    Bfs &distMap(DistMap &m)
402 403
    {
403 404
      if(local_dist) {
404 405
        delete _dist;
405 406
        local_dist=false;
406 407
      }
407 408
      _dist = &m;
408 409
      return *this;
409 410
    }
410 411

	
411 412
  public:
412 413

	
413 414
    ///\name Execution Control
414 415
    ///The simplest way to execute the BFS algorithm is to use one of the
415 416
    ///member functions called \ref run(Node) "run()".\n
416 417
    ///If you need more control on the execution, first you have to call
417 418
    ///\ref init(), then you can add several source nodes with
418 419
    ///\ref addSource(). Finally the actual path computation can be
419 420
    ///performed with one of the \ref start() functions.
420 421

	
421 422
    ///@{
422 423

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

	
439 440
    ///Adds a new source node.
440 441

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

	
455 456
    ///Processes the next node.
456 457

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

	
481 482
    ///Processes the next node.
482 483

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

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

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

	
550 551
    ///The next node to be processed.
551 552

	
552 553
    ///Returns the next node to be processed or \c INVALID if the queue
553 554
    ///is empty.
554 555
    Node nextNode() const
555 556
    {
556 557
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
557 558
    }
558 559

	
559 560
    ///Returns \c false if there are nodes to be processed.
560 561

	
561 562
    ///Returns \c false if there are nodes to be processed
562 563
    ///in the queue.
563 564
    bool emptyQueue() const { return _queue_tail==_queue_head; }
564 565

	
565 566
    ///Returns the number of the nodes to be processed.
566 567

	
567 568
    ///Returns the number of the nodes to be processed
568 569
    ///in the queue.
569 570
    int queueSize() const { return _queue_head-_queue_tail; }
570 571

	
571 572
    ///Executes the algorithm.
572 573

	
573 574
    ///Executes the algorithm.
574 575
    ///
575 576
    ///This method runs the %BFS algorithm from the root node(s)
576 577
    ///in order to compute the shortest path to each node.
577 578
    ///
578 579
    ///The algorithm computes
579 580
    ///- the shortest path tree (forest),
580 581
    ///- the distance of each node from the root(s).
581 582
    ///
582 583
    ///\pre init() must be called and at least one root node should be
583 584
    ///added with addSource() before using this function.
584 585
    ///
585 586
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
586 587
    ///\code
587 588
    ///  while ( !b.emptyQueue() ) {
588 589
    ///    b.processNextNode();
589 590
    ///  }
590 591
    ///\endcode
591 592
    void start()
592 593
    {
593 594
      while ( !emptyQueue() ) processNextNode();
594 595
    }
595 596

	
596 597
    ///Executes the algorithm until the given target node is reached.
597 598

	
598 599
    ///Executes the algorithm until the given target node is reached.
599 600
    ///
600 601
    ///This method runs the %BFS algorithm from the root node(s)
601 602
    ///in order to compute the shortest path to \c t.
602 603
    ///
603 604
    ///The algorithm computes
604 605
    ///- the shortest path to \c t,
605 606
    ///- the distance of \c t from the root(s).
606 607
    ///
607 608
    ///\pre init() must be called and at least one root node should be
608 609
    ///added with addSource() before using this function.
609 610
    ///
610 611
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
611 612
    ///\code
612 613
    ///  bool reach = false;
613 614
    ///  while ( !b.emptyQueue() && !reach ) {
614 615
    ///    b.processNextNode(t, reach);
615 616
    ///  }
616 617
    ///\endcode
617 618
    void start(Node t)
618 619
    {
619 620
      bool reach = false;
620 621
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
621 622
    }
622 623

	
623 624
    ///Executes the algorithm until a condition is met.
624 625

	
625 626
    ///Executes the algorithm until a condition is met.
626 627
    ///
627 628
    ///This method runs the %BFS algorithm from the root node(s) in
628 629
    ///order to compute the shortest path to a node \c v with
629 630
    /// <tt>nm[v]</tt> true, if such a node can be found.
630 631
    ///
631 632
    ///\param nm A \c bool (or convertible) node map. The algorithm
632 633
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
633 634
    ///
634 635
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
635 636
    ///\c INVALID if no such node was found.
636 637
    ///
637 638
    ///\pre init() must be called and at least one root node should be
638 639
    ///added with addSource() before using this function.
639 640
    ///
640 641
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
641 642
    ///\code
642 643
    ///  Node rnode = INVALID;
643 644
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
644 645
    ///    b.processNextNode(nm, rnode);
645 646
    ///  }
646 647
    ///  return rnode;
647 648
    ///\endcode
648 649
    template<class NodeBoolMap>
649 650
    Node start(const NodeBoolMap &nm)
650 651
    {
651 652
      Node rnode = INVALID;
652 653
      while ( !emptyQueue() && rnode == INVALID ) {
653 654
        processNextNode(nm, rnode);
654 655
      }
655 656
      return rnode;
656 657
    }
657 658

	
658 659
    ///Runs the algorithm from the given source node.
659 660

	
660 661
    ///This method runs the %BFS algorithm from node \c s
661 662
    ///in order to compute the shortest path to each node.
662 663
    ///
663 664
    ///The algorithm computes
664 665
    ///- the shortest path tree,
665 666
    ///- the distance of each node from the root.
666 667
    ///
667 668
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
668 669
    ///\code
669 670
    ///  b.init();
670 671
    ///  b.addSource(s);
671 672
    ///  b.start();
672 673
    ///\endcode
673 674
    void run(Node s) {
674 675
      init();
675 676
      addSource(s);
676 677
      start();
677 678
    }
678 679

	
679 680
    ///Finds the shortest path between \c s and \c t.
680 681

	
681 682
    ///This method runs the %BFS algorithm from node \c s
682 683
    ///in order to compute the shortest path to node \c t
683 684
    ///(it stops searching when \c t is processed).
684 685
    ///
685 686
    ///\return \c true if \c t is reachable form \c s.
686 687
    ///
687 688
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
688 689
    ///shortcut of the following code.
689 690
    ///\code
690 691
    ///  b.init();
691 692
    ///  b.addSource(s);
692 693
    ///  b.start(t);
693 694
    ///\endcode
694 695
    bool run(Node s,Node t) {
695 696
      init();
696 697
      addSource(s);
697 698
      start(t);
698 699
      return reached(t);
699 700
    }
700 701

	
701 702
    ///Runs the algorithm to visit all nodes in the digraph.
702 703

	
703 704
    ///This method runs the %BFS algorithm in order to
704 705
    ///compute the shortest path to each node.
705 706
    ///
706 707
    ///The algorithm computes
707 708
    ///- the shortest path tree (forest),
708 709
    ///- the distance of each node from the root(s).
709 710
    ///
710 711
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 712
    ///\code
712 713
    ///  b.init();
713 714
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 715
    ///    if (!b.reached(n)) {
715 716
    ///      b.addSource(n);
716 717
    ///      b.start();
717 718
    ///    }
718 719
    ///  }
719 720
    ///\endcode
720 721
    void run() {
721 722
      init();
722 723
      for (NodeIt n(*G); n != INVALID; ++n) {
723 724
        if (!reached(n)) {
724 725
          addSource(n);
725 726
          start();
726 727
        }
727 728
      }
728 729
    }
729 730

	
730 731
    ///@}
731 732

	
732 733
    ///\name Query Functions
733 734
    ///The results of the BFS algorithm can be obtained using these
734 735
    ///functions.\n
735 736
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 737
    ///before using them.
737 738

	
738 739
    ///@{
739 740

	
740
    ///The shortest path to a node.
741
    ///The shortest path to the given node.
741 742

	
742
    ///Returns the shortest path to a node.
743
    ///Returns the shortest path to the given node from the root(s).
743 744
    ///
744 745
    ///\warning \c t should be reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 750

	
750
    ///The distance of a node from the root(s).
751
    ///The distance of the given node from the root(s).
751 752

	
752
    ///Returns the distance of a node from the root(s).
753
    ///Returns the distance of the given node from the root(s).
753 754
    ///
754 755
    ///\warning If node \c v is not reached from the root(s), then
755 756
    ///the return value of this function is undefined.
756 757
    ///
757 758
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 759
    ///must be called before using this function.
759 760
    int dist(Node v) const { return (*_dist)[v]; }
760 761

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
762
    ///\brief Returns the 'previous arc' of the shortest path tree for
763
    ///the given node.
764
    ///
763 765
    ///This function returns the 'previous arc' of the shortest path
764 766
    ///tree for the node \c v, i.e. it returns the last arc of a
765 767
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 768
    ///is not reached from the root(s) or if \c v is a root.
767 769
    ///
768 770
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
771
    ///tree used in \ref predNode() and \ref predMap().
770 772
    ///
771 773
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 774
    ///must be called before using this function.
773 775
    Arc predArc(Node v) const { return (*_pred)[v];}
774 776

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

	
777
    ///\brief Returns the 'previous node' of the shortest path tree for
778
    ///the given node.
779
    ///
777 780
    ///This function returns the 'previous node' of the shortest path
778 781
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
782
    ///of a shortest path from a root to \c v. It is \c INVALID
780 783
    ///if \c v is not reached from the root(s) or if \c v is a root.
781 784
    ///
782 785
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
786
    ///tree used in \ref predArc() and \ref predMap().
784 787
    ///
785 788
    ///\pre Either \ref run(Node) "run()" or \ref init()
786 789
    ///must be called before using this function.
787 790
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 791
                                  G->source((*_pred)[v]); }
789 792

	
790 793
    ///\brief Returns a const reference to the node map that stores the
791 794
    /// distances of the nodes.
792 795
    ///
793 796
    ///Returns a const reference to the node map that stores the distances
794 797
    ///of the nodes calculated by the algorithm.
795 798
    ///
796 799
    ///\pre Either \ref run(Node) "run()" or \ref init()
797 800
    ///must be called before using this function.
798 801
    const DistMap &distMap() const { return *_dist;}
799 802

	
800 803
    ///\brief Returns a const reference to the node map that stores the
801 804
    ///predecessor arcs.
802 805
    ///
803 806
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
807
    ///arcs, which form the shortest path tree (forest).
805 808
    ///
806 809
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 810
    ///must be called before using this function.
808 811
    const PredMap &predMap() const { return *_pred;}
809 812

	
810
    ///Checks if a node is reached from the root(s).
813
    ///Checks if the given node is reached from the root(s).
811 814

	
812 815
    ///Returns \c true if \c v is reached from the root(s).
813 816
    ///
814 817
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 818
    ///must be called before using this function.
816 819
    bool reached(Node v) const { return (*_reached)[v]; }
817 820

	
818 821
    ///@}
819 822
  };
820 823

	
821 824
  ///Default traits class of bfs() function.
822 825

	
823 826
  ///Default traits class of bfs() function.
824 827
  ///\tparam GR Digraph type.
825 828
  template<class GR>
826 829
  struct BfsWizardDefaultTraits
827 830
  {
828 831
    ///The type of the digraph the algorithm runs on.
829 832
    typedef GR Digraph;
830 833

	
831 834
    ///\brief The type of the map that stores the predecessor
832 835
    ///arcs of the shortest paths.
833 836
    ///
834 837
    ///The type of the map that stores the predecessor
835 838
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
839
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 840
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 841
    ///Instantiates a PredMap.
839 842

	
840 843
    ///This function instantiates a PredMap.
841 844
    ///\param g is the digraph, to which we would like to define the
842 845
    ///PredMap.
843 846
    static PredMap *createPredMap(const Digraph &g)
844 847
    {
845 848
      return new PredMap(g);
846 849
    }
847 850

	
848 851
    ///The type of the map that indicates which nodes are processed.
849 852

	
850 853
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
854
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
852 855
    ///By default it is a NullMap.
853 856
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 857
    ///Instantiates a ProcessedMap.
855 858

	
856 859
    ///This function instantiates a ProcessedMap.
857 860
    ///\param g is the digraph, to which
858 861
    ///we would like to define the ProcessedMap.
859 862
#ifdef DOXYGEN
860 863
    static ProcessedMap *createProcessedMap(const Digraph &g)
861 864
#else
862 865
    static ProcessedMap *createProcessedMap(const Digraph &)
863 866
#endif
864 867
    {
865 868
      return new ProcessedMap();
866 869
    }
867 870

	
868 871
    ///The type of the map that indicates which nodes are reached.
869 872

	
870 873
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
874
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 875
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 876
    ///Instantiates a ReachedMap.
874 877

	
875 878
    ///This function instantiates a ReachedMap.
876 879
    ///\param g is the digraph, to which
877 880
    ///we would like to define the ReachedMap.
878 881
    static ReachedMap *createReachedMap(const Digraph &g)
879 882
    {
880 883
      return new ReachedMap(g);
881 884
    }
882 885

	
883 886
    ///The type of the map that stores the distances of the nodes.
884 887

	
885 888
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
889
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 890
    typedef typename Digraph::template NodeMap<int> DistMap;
888 891
    ///Instantiates a DistMap.
889 892

	
890 893
    ///This function instantiates a DistMap.
891 894
    ///\param g is the digraph, to which we would like to define
892 895
    ///the DistMap
893 896
    static DistMap *createDistMap(const Digraph &g)
894 897
    {
895 898
      return new DistMap(g);
896 899
    }
897 900

	
898 901
    ///The type of the shortest paths.
899 902

	
900 903
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
904
    ///It must conform to the \ref concepts::Path "Path" concept.
902 905
    typedef lemon::Path<Digraph> Path;
903 906
  };
904 907

	
905 908
  /// Default traits class used by BfsWizard
906 909

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
910
  /// Default traits class used by BfsWizard.
911
  /// \tparam GR The type of the digraph.
913 912
  template<class GR>
914 913
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 914
  {
916 915

	
917 916
    typedef BfsWizardDefaultTraits<GR> Base;
918 917
  protected:
919 918
    //The type of the nodes in the digraph.
920 919
    typedef typename Base::Digraph::Node Node;
921 920

	
922 921
    //Pointer to the digraph the algorithm runs on.
923 922
    void *_g;
924 923
    //Pointer to the map of reached nodes.
925 924
    void *_reached;
926 925
    //Pointer to the map of processed nodes.
927 926
    void *_processed;
928 927
    //Pointer to the map of predecessors arcs.
929 928
    void *_pred;
930 929
    //Pointer to the map of distances.
931 930
    void *_dist;
932 931
    //Pointer to the shortest path to the target node.
933 932
    void *_path;
934 933
    //Pointer to the distance of the target node.
935 934
    int *_di;
936 935

	
937 936
    public:
938 937
    /// Constructor.
939 938

	
940
    /// This constructor does not require parameters, therefore it initiates
939
    /// This constructor does not require parameters, it initiates
941 940
    /// all of the attributes to \c 0.
942 941
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 942
                      _dist(0), _path(0), _di(0) {}
944 943

	
945 944
    /// Constructor.
946 945

	
947 946
    /// This constructor requires one parameter,
948 947
    /// others are initiated to \c 0.
949 948
    /// \param g The digraph the algorithm runs on.
950 949
    BfsWizardBase(const GR &g) :
951 950
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 951
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 952

	
954 953
  };
955 954

	
956 955
  /// Auxiliary class for the function-type interface of BFS algorithm.
957 956

	
958 957
  /// This auxiliary class is created to implement the
959 958
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 959
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 960
  /// functions and features of the plain \ref Bfs.
962 961
  ///
963 962
  /// This class should only be used through the \ref bfs() function,
964 963
  /// which makes it easier to use the algorithm.
965 964
  template<class TR>
966 965
  class BfsWizard : public TR
967 966
  {
968 967
    typedef TR Base;
969 968

	
970
    ///The type of the digraph the algorithm runs on.
971 969
    typedef typename TR::Digraph Digraph;
972 970

	
973 971
    typedef typename Digraph::Node Node;
974 972
    typedef typename Digraph::NodeIt NodeIt;
975 973
    typedef typename Digraph::Arc Arc;
976 974
    typedef typename Digraph::OutArcIt OutArcIt;
977 975

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 976
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 977
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 978
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 979
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 980
    typedef typename TR::Path Path;
989 981

	
990 982
  public:
991 983

	
992 984
    /// Constructor.
993 985
    BfsWizard() : TR() {}
994 986

	
995 987
    /// Constructor that requires parameters.
996 988

	
997 989
    /// Constructor that requires parameters.
998 990
    /// These parameters will be the default values for the traits class.
999 991
    /// \param g The digraph the algorithm runs on.
1000 992
    BfsWizard(const Digraph &g) :
1001 993
      TR(g) {}
1002 994

	
1003 995
    ///Copy constructor
1004 996
    BfsWizard(const TR &b) : TR(b) {}
1005 997

	
1006 998
    ~BfsWizard() {}
1007 999

	
1008 1000
    ///Runs BFS algorithm from the given source node.
1009 1001

	
1010 1002
    ///This method runs BFS algorithm from node \c s
1011 1003
    ///in order to compute the shortest path to each node.
1012 1004
    void run(Node s)
1013 1005
    {
1014 1006
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1015 1007
      if (Base::_pred)
1016 1008
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1017 1009
      if (Base::_dist)
1018 1010
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1019 1011
      if (Base::_reached)
1020 1012
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1021 1013
      if (Base::_processed)
1022 1014
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1023 1015
      if (s!=INVALID)
1024 1016
        alg.run(s);
1025 1017
      else
1026 1018
        alg.run();
1027 1019
    }
1028 1020

	
1029 1021
    ///Finds the shortest path between \c s and \c t.
1030 1022

	
1031 1023
    ///This method runs BFS algorithm from node \c s
1032 1024
    ///in order to compute the shortest path to node \c t
1033 1025
    ///(it stops searching when \c t is processed).
1034 1026
    ///
1035 1027
    ///\return \c true if \c t is reachable form \c s.
1036 1028
    bool run(Node s, Node t)
1037 1029
    {
1038 1030
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 1031
      if (Base::_pred)
1040 1032
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1033
      if (Base::_dist)
1042 1034
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1035
      if (Base::_reached)
1044 1036
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 1037
      if (Base::_processed)
1046 1038
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1047 1039
      alg.run(s,t);
1048 1040
      if (Base::_path)
1049 1041
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1042
      if (Base::_di)
1051 1043
        *Base::_di = alg.dist(t);
1052 1044
      return alg.reached(t);
1053 1045
    }
1054 1046

	
1055 1047
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1048

	
1057 1049
    ///This method runs BFS algorithm in order to compute
1058 1050
    ///the shortest path to each node.
1059 1051
    void run()
1060 1052
    {
1061 1053
      run(INVALID);
1062 1054
    }
1063 1055

	
1064 1056
    template<class T>
1065 1057
    struct SetPredMapBase : public Base {
1066 1058
      typedef T PredMap;
1067 1059
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1060
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1061
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1062

	
1063
    ///\brief \ref named-templ-param "Named parameter" for setting
1064
    ///the predecessor map.
1072 1065
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1066
    ///\ref named-templ-param "Named parameter" function for setting
1067
    ///the map that stores the predecessor arcs of the nodes.
1075 1068
    template<class T>
1076 1069
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1070
    {
1078 1071
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1072
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1073
    }
1081 1074

	
1082 1075
    template<class T>
1083 1076
    struct SetReachedMapBase : public Base {
1084 1077
      typedef T ReachedMap;
1085 1078
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1079
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1080
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1081

	
1082
    ///\brief \ref named-templ-param "Named parameter" for setting
1083
    ///the reached map.
1090 1084
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1085
    ///\ref named-templ-param "Named parameter" function for setting
1086
    ///the map that indicates which nodes are reached.
1093 1087
    template<class T>
1094 1088
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1089
    {
1096 1090
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1091
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1092
    }
1099 1093

	
1100 1094
    template<class T>
1101 1095
    struct SetDistMapBase : public Base {
1102 1096
      typedef T DistMap;
1103 1097
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1098
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1099
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1100

	
1101
    ///\brief \ref named-templ-param "Named parameter" for setting
1102
    ///the distance map.
1108 1103
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1104
    ///\ref named-templ-param "Named parameter" function for setting
1105
    ///the map that stores the distances of the nodes calculated
1106
    ///by the algorithm.
1111 1107
    template<class T>
1112 1108
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1109
    {
1114 1110
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1111
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1112
    }
1117 1113

	
1118 1114
    template<class T>
1119 1115
    struct SetProcessedMapBase : public Base {
1120 1116
      typedef T ProcessedMap;
1121 1117
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1118
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1119
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1120

	
1121
    ///\brief \ref named-func-param "Named parameter" for setting
1122
    ///the processed map.
1126 1123
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1124
    ///\ref named-templ-param "Named parameter" function for setting
1125
    ///the map that indicates which nodes are processed.
1129 1126
    template<class T>
1130 1127
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1128
    {
1132 1129
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1130
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1131
    }
1135 1132

	
1136 1133
    template<class T>
1137 1134
    struct SetPathBase : public Base {
1138 1135
      typedef T Path;
1139 1136
      SetPathBase(const TR &b) : TR(b) {}
1140 1137
    };
1141 1138
    ///\brief \ref named-func-param "Named parameter"
1142 1139
    ///for getting the shortest path to the target node.
1143 1140
    ///
1144 1141
    ///\ref named-func-param "Named parameter"
1145 1142
    ///for getting the shortest path to the target node.
1146 1143
    template<class T>
1147 1144
    BfsWizard<SetPathBase<T> > path(const T &t)
1148 1145
    {
1149 1146
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 1147
      return BfsWizard<SetPathBase<T> >(*this);
1151 1148
    }
1152 1149

	
1153 1150
    ///\brief \ref named-func-param "Named parameter"
1154 1151
    ///for getting the distance of the target node.
1155 1152
    ///
1156 1153
    ///\ref named-func-param "Named parameter"
1157 1154
    ///for getting the distance of the target node.
1158 1155
    BfsWizard dist(const int &d)
1159 1156
    {
1160 1157
      Base::_di=const_cast<int*>(&d);
1161 1158
      return *this;
1162 1159
    }
1163 1160

	
1164 1161
  };
1165 1162

	
1166 1163
  ///Function-type interface for BFS algorithm.
1167 1164

	
1168 1165
  /// \ingroup search
1169 1166
  ///Function-type interface for BFS algorithm.
1170 1167
  ///
1171 1168
  ///This function also has several \ref named-func-param "named parameters",
1172 1169
  ///they are declared as the members of class \ref BfsWizard.
1173 1170
  ///The following examples show how to use these parameters.
1174 1171
  ///\code
1175 1172
  ///  // Compute shortest path from node s to each node
1176 1173
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1177 1174
  ///
1178 1175
  ///  // Compute shortest path from s to t
1179 1176
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1180 1177
  ///\endcode
1181 1178
  ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1182 1179
  ///to the end of the parameter list.
1183 1180
  ///\sa BfsWizard
1184 1181
  ///\sa Bfs
1185 1182
  template<class GR>
1186 1183
  BfsWizard<BfsWizardBase<GR> >
1187 1184
  bfs(const GR &digraph)
1188 1185
  {
1189 1186
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1190 1187
  }
1191 1188

	
1192 1189
#ifdef DOXYGEN
1193 1190
  /// \brief Visitor class for BFS.
1194 1191
  ///
1195 1192
  /// This class defines the interface of the BfsVisit events, and
1196 1193
  /// it could be the base of a real visitor class.
1197 1194
  template <typename GR>
1198 1195
  struct BfsVisitor {
1199 1196
    typedef GR Digraph;
1200 1197
    typedef typename Digraph::Arc Arc;
1201 1198
    typedef typename Digraph::Node Node;
1202 1199
    /// \brief Called for the source node(s) of the BFS.
1203 1200
    ///
1204 1201
    /// This function is called for the source node(s) of the BFS.
1205 1202
    void start(const Node& node) {}
1206 1203
    /// \brief Called when a node is reached first time.
1207 1204
    ///
1208 1205
    /// This function is called when a node is reached first time.
1209 1206
    void reach(const Node& node) {}
1210 1207
    /// \brief Called when a node is processed.
1211 1208
    ///
1212 1209
    /// This function is called when a node is processed.
1213 1210
    void process(const Node& node) {}
1214 1211
    /// \brief Called when an arc reaches a new node.
1215 1212
    ///
1216 1213
    /// This function is called when the BFS finds an arc whose target node
1217 1214
    /// is not reached yet.
1218 1215
    void discover(const Arc& arc) {}
1219 1216
    /// \brief Called when an arc is examined but its target node is
1220 1217
    /// already discovered.
1221 1218
    ///
1222 1219
    /// This function is called when an arc is examined but its target node is
1223 1220
    /// already discovered.
1224 1221
    void examine(const Arc& arc) {}
1225 1222
  };
1226 1223
#else
1227 1224
  template <typename GR>
1228 1225
  struct BfsVisitor {
1229 1226
    typedef GR Digraph;
1230 1227
    typedef typename Digraph::Arc Arc;
1231 1228
    typedef typename Digraph::Node Node;
1232 1229
    void start(const Node&) {}
1233 1230
    void reach(const Node&) {}
1234 1231
    void process(const Node&) {}
1235 1232
    void discover(const Arc&) {}
1236 1233
    void examine(const Arc&) {}
1237 1234

	
1238 1235
    template <typename _Visitor>
1239 1236
    struct Constraints {
1240 1237
      void constraints() {
1241 1238
        Arc arc;
1242 1239
        Node node;
1243 1240
        visitor.start(node);
1244 1241
        visitor.reach(node);
1245 1242
        visitor.process(node);
1246 1243
        visitor.discover(arc);
1247 1244
        visitor.examine(arc);
1248 1245
      }
1249 1246
      _Visitor& visitor;
1250 1247
    };
1251 1248
  };
1252 1249
#endif
1253 1250

	
1254 1251
  /// \brief Default traits class of BfsVisit class.
1255 1252
  ///
1256 1253
  /// Default traits class of BfsVisit class.
1257 1254
  /// \tparam GR The type of the digraph the algorithm runs on.
1258 1255
  template<class GR>
1259 1256
  struct BfsVisitDefaultTraits {
1260 1257

	
1261 1258
    /// \brief The type of the digraph the algorithm runs on.
1262 1259
    typedef GR Digraph;
1263 1260

	
1264 1261
    /// \brief The type of the map that indicates which nodes are reached.
1265 1262
    ///
1266 1263
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1264
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1265
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1266

	
1270 1267
    /// \brief Instantiates a ReachedMap.
1271 1268
    ///
1272 1269
    /// This function instantiates a ReachedMap.
1273 1270
    /// \param digraph is the digraph, to which
1274 1271
    /// we would like to define the ReachedMap.
1275 1272
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 1273
      return new ReachedMap(digraph);
1277 1274
    }
1278 1275

	
1279 1276
  };
1280 1277

	
1281 1278
  /// \ingroup search
1282 1279
  ///
1283 1280
  /// \brief BFS algorithm class with visitor interface.
1284 1281
  ///
1285 1282
  /// This class provides an efficient implementation of the BFS algorithm
1286 1283
  /// with visitor interface.
1287 1284
  ///
1288 1285
  /// The BfsVisit class provides an alternative interface to the Bfs
1289 1286
  /// class. It works with callback mechanism, the BfsVisit object calls
1290 1287
  /// the member functions of the \c Visitor class on every BFS event.
1291 1288
  ///
1292 1289
  /// This interface of the BFS algorithm should be used in special cases
1293 1290
  /// when extra actions have to be performed in connection with certain
1294 1291
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1295 1292
  /// instead.
1296 1293
  ///
1297 1294
  /// \tparam GR The type of the digraph the algorithm runs on.
1298 1295
  /// The default type is \ref ListDigraph.
1299 1296
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1297
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1298
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1299
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1300
  /// does not observe the BFS events. If you want to observe the BFS
1304 1301
  /// events, you should implement your own visitor class.
1305 1302
  /// \tparam TR Traits class to set various data types used by the
1306 1303
  /// algorithm. The default traits class is
1307 1304
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308 1305
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309 1306
  /// a BFS visit traits class.
1310 1307
#ifdef DOXYGEN
1311 1308
  template <typename GR, typename VS, typename TR>
1312 1309
#else
1313 1310
  template <typename GR = ListDigraph,
1314 1311
            typename VS = BfsVisitor<GR>,
1315 1312
            typename TR = BfsVisitDefaultTraits<GR> >
1316 1313
#endif
1317 1314
  class BfsVisit {
1318 1315
  public:
1319 1316

	
1320 1317
    ///The traits class.
1321 1318
    typedef TR Traits;
1322 1319

	
1323 1320
    ///The type of the digraph the algorithm runs on.
1324 1321
    typedef typename Traits::Digraph Digraph;
1325 1322

	
1326 1323
    ///The visitor type used by the algorithm.
1327 1324
    typedef VS Visitor;
1328 1325

	
1329 1326
    ///The type of the map that indicates which nodes are reached.
1330 1327
    typedef typename Traits::ReachedMap ReachedMap;
1331 1328

	
1332 1329
  private:
1333 1330

	
1334 1331
    typedef typename Digraph::Node Node;
1335 1332
    typedef typename Digraph::NodeIt NodeIt;
1336 1333
    typedef typename Digraph::Arc Arc;
1337 1334
    typedef typename Digraph::OutArcIt OutArcIt;
1338 1335

	
1339 1336
    //Pointer to the underlying digraph.
1340 1337
    const Digraph *_digraph;
1341 1338
    //Pointer to the visitor object.
1342 1339
    Visitor *_visitor;
1343 1340
    //Pointer to the map of reached status of the nodes.
1344 1341
    ReachedMap *_reached;
1345 1342
    //Indicates if _reached is locally allocated (true) or not.
1346 1343
    bool local_reached;
1347 1344

	
1348 1345
    std::vector<typename Digraph::Node> _list;
1349 1346
    int _list_front, _list_back;
1350 1347

	
1351 1348
    //Creates the maps if necessary.
1352 1349
    void create_maps() {
1353 1350
      if(!_reached) {
1354 1351
        local_reached = true;
1355 1352
        _reached = Traits::createReachedMap(*_digraph);
1356 1353
      }
1357 1354
    }
1358 1355

	
1359 1356
  protected:
1360 1357

	
1361 1358
    BfsVisit() {}
1362 1359

	
1363 1360
  public:
1364 1361

	
1365 1362
    typedef BfsVisit Create;
1366 1363

	
1367 1364
    /// \name Named Template Parameters
1368 1365

	
1369 1366
    ///@{
1370 1367
    template <class T>
1371 1368
    struct SetReachedMapTraits : public Traits {
1372 1369
      typedef T ReachedMap;
1373 1370
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1374 1371
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375 1372
        return 0; // ignore warnings
1376 1373
      }
1377 1374
    };
1378 1375
    /// \brief \ref named-templ-param "Named parameter" for setting
1379 1376
    /// ReachedMap type.
1380 1377
    ///
1381 1378
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1382 1379
    template <class T>
1383 1380
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1384 1381
                                            SetReachedMapTraits<T> > {
1385 1382
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1386 1383
    };
1387 1384
    ///@}
1388 1385

	
1389 1386
  public:
1390 1387

	
1391 1388
    /// \brief Constructor.
1392 1389
    ///
1393 1390
    /// Constructor.
1394 1391
    ///
1395 1392
    /// \param digraph The digraph the algorithm runs on.
1396 1393
    /// \param visitor The visitor object of the algorithm.
1397 1394
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1398 1395
      : _digraph(&digraph), _visitor(&visitor),
1399 1396
        _reached(0), local_reached(false) {}
1400 1397

	
1401 1398
    /// \brief Destructor.
1402 1399
    ~BfsVisit() {
1403 1400
      if(local_reached) delete _reached;
1404 1401
    }
1405 1402

	
1406 1403
    /// \brief Sets the map that indicates which nodes are reached.
1407 1404
    ///
1408 1405
    /// Sets the map that indicates which nodes are reached.
1409 1406
    /// If you don't use this function before calling \ref run(Node) "run()"
1410 1407
    /// or \ref init(), an instance will be allocated automatically.
1411 1408
    /// The destructor deallocates this automatically allocated map,
1412 1409
    /// of course.
1413 1410
    /// \return <tt> (*this) </tt>
1414 1411
    BfsVisit &reachedMap(ReachedMap &m) {
1415 1412
      if(local_reached) {
1416 1413
        delete _reached;
1417 1414
        local_reached = false;
1418 1415
      }
1419 1416
      _reached = &m;
1420 1417
      return *this;
1421 1418
    }
1422 1419

	
1423 1420
  public:
1424 1421

	
1425 1422
    /// \name Execution Control
1426 1423
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1424
    /// member functions called \ref run(Node) "run()".\n
1428 1425
    /// If you need more control on the execution, first you have to call
1429 1426
    /// \ref init(), then you can add several source nodes with
1430 1427
    /// \ref addSource(). Finally the actual path computation can be
1431 1428
    /// performed with one of the \ref start() functions.
1432 1429

	
1433 1430
    /// @{
1434 1431

	
1435 1432
    /// \brief Initializes the internal data structures.
1436 1433
    ///
1437 1434
    /// Initializes the internal data structures.
1438 1435
    void init() {
1439 1436
      create_maps();
1440 1437
      _list.resize(countNodes(*_digraph));
1441 1438
      _list_front = _list_back = -1;
1442 1439
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1443 1440
        _reached->set(u, false);
1444 1441
      }
1445 1442
    }
1446 1443

	
1447 1444
    /// \brief Adds a new source node.
1448 1445
    ///
1449 1446
    /// Adds a new source node to the set of nodes to be processed.
1450 1447
    void addSource(Node s) {
1451 1448
      if(!(*_reached)[s]) {
1452 1449
          _reached->set(s,true);
1453 1450
          _visitor->start(s);
1454 1451
          _visitor->reach(s);
1455 1452
          _list[++_list_back] = s;
1456 1453
        }
1457 1454
    }
1458 1455

	
1459 1456
    /// \brief Processes the next node.
1460 1457
    ///
1461 1458
    /// Processes the next node.
1462 1459
    ///
1463 1460
    /// \return The processed node.
1464 1461
    ///
1465 1462
    /// \pre The queue must not be empty.
1466 1463
    Node processNextNode() {
1467 1464
      Node n = _list[++_list_front];
1468 1465
      _visitor->process(n);
1469 1466
      Arc e;
1470 1467
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1471 1468
        Node m = _digraph->target(e);
1472 1469
        if (!(*_reached)[m]) {
1473 1470
          _visitor->discover(e);
1474 1471
          _visitor->reach(m);
1475 1472
          _reached->set(m, true);
1476 1473
          _list[++_list_back] = m;
1477 1474
        } else {
1478 1475
          _visitor->examine(e);
1479 1476
        }
1480 1477
      }
1481 1478
      return n;
1482 1479
    }
1483 1480

	
1484 1481
    /// \brief Processes the next node.
1485 1482
    ///
1486 1483
    /// Processes the next node and checks if the given target node
1487 1484
    /// is reached. If the target node is reachable from the processed
1488 1485
    /// node, then the \c reach parameter will be set to \c true.
1489 1486
    ///
1490 1487
    /// \param target The target node.
1491 1488
    /// \retval reach Indicates if the target node is reached.
1492 1489
    /// It should be initially \c false.
1493 1490
    ///
1494 1491
    /// \return The processed node.
1495 1492
    ///
1496 1493
    /// \pre The queue must not be empty.
1497 1494
    Node processNextNode(Node target, bool& reach) {
1498 1495
      Node n = _list[++_list_front];
1499 1496
      _visitor->process(n);
1500 1497
      Arc e;
1501 1498
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1502 1499
        Node m = _digraph->target(e);
1503 1500
        if (!(*_reached)[m]) {
1504 1501
          _visitor->discover(e);
1505 1502
          _visitor->reach(m);
1506 1503
          _reached->set(m, true);
1507 1504
          _list[++_list_back] = m;
1508 1505
          reach = reach || (target == m);
1509 1506
        } else {
1510 1507
          _visitor->examine(e);
1511 1508
        }
1512 1509
      }
1513 1510
      return n;
1514 1511
    }
1515 1512

	
1516 1513
    /// \brief Processes the next node.
1517 1514
    ///
1518 1515
    /// Processes the next node and checks if at least one of reached
1519 1516
    /// nodes has \c true value in the \c nm node map. If one node
1520 1517
    /// with \c true value is reachable from the processed node, then the
1521 1518
    /// \c rnode parameter will be set to the first of such nodes.
1522 1519
    ///
1523 1520
    /// \param nm A \c bool (or convertible) node map that indicates the
1524 1521
    /// possible targets.
1525 1522
    /// \retval rnode The reached target node.
1526 1523
    /// It should be initially \c INVALID.
1527 1524
    ///
1528 1525
    /// \return The processed node.
1529 1526
    ///
1530 1527
    /// \pre The queue must not be empty.
1531 1528
    template <typename NM>
1532 1529
    Node processNextNode(const NM& nm, Node& rnode) {
1533 1530
      Node n = _list[++_list_front];
1534 1531
      _visitor->process(n);
1535 1532
      Arc e;
1536 1533
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1537 1534
        Node m = _digraph->target(e);
1538 1535
        if (!(*_reached)[m]) {
1539 1536
          _visitor->discover(e);
1540 1537
          _visitor->reach(m);
1541 1538
          _reached->set(m, true);
1542 1539
          _list[++_list_back] = m;
1543 1540
          if (nm[m] && rnode == INVALID) rnode = m;
1544 1541
        } else {
1545 1542
          _visitor->examine(e);
1546 1543
        }
1547 1544
      }
1548 1545
      return n;
1549 1546
    }
1550 1547

	
1551 1548
    /// \brief The next node to be processed.
1552 1549
    ///
1553 1550
    /// Returns the next node to be processed or \c INVALID if the queue
1554 1551
    /// is empty.
1555 1552
    Node nextNode() const {
1556 1553
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1557 1554
    }
1558 1555

	
1559 1556
    /// \brief Returns \c false if there are nodes
1560 1557
    /// to be processed.
1561 1558
    ///
1562 1559
    /// Returns \c false if there are nodes
1563 1560
    /// to be processed in the queue.
1564 1561
    bool emptyQueue() const { return _list_front == _list_back; }
1565 1562

	
1566 1563
    /// \brief Returns the number of the nodes to be processed.
1567 1564
    ///
1568 1565
    /// Returns the number of the nodes to be processed in the queue.
1569 1566
    int queueSize() const { return _list_back - _list_front; }
1570 1567

	
1571 1568
    /// \brief Executes the algorithm.
1572 1569
    ///
1573 1570
    /// Executes the algorithm.
1574 1571
    ///
1575 1572
    /// This method runs the %BFS algorithm from the root node(s)
1576 1573
    /// in order to compute the shortest path to each node.
1577 1574
    ///
1578 1575
    /// The algorithm computes
1579 1576
    /// - the shortest path tree (forest),
1580 1577
    /// - the distance of each node from the root(s).
1581 1578
    ///
1582 1579
    /// \pre init() must be called and at least one root node should be added
1583 1580
    /// with addSource() before using this function.
1584 1581
    ///
1585 1582
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1586 1583
    /// \code
1587 1584
    ///   while ( !b.emptyQueue() ) {
1588 1585
    ///     b.processNextNode();
1589 1586
    ///   }
1590 1587
    /// \endcode
1591 1588
    void start() {
1592 1589
      while ( !emptyQueue() ) processNextNode();
1593 1590
    }
1594 1591

	
1595 1592
    /// \brief Executes the algorithm until the given target node is reached.
1596 1593
    ///
1597 1594
    /// Executes the algorithm until the given target node is reached.
1598 1595
    ///
1599 1596
    /// This method runs the %BFS algorithm from the root node(s)
1600 1597
    /// in order to compute the shortest path to \c t.
1601 1598
    ///
1602 1599
    /// The algorithm computes
1603 1600
    /// - the shortest path to \c t,
1604 1601
    /// - the distance of \c t from the root(s).
1605 1602
    ///
1606 1603
    /// \pre init() must be called and at least one root node should be
1607 1604
    /// added with addSource() before using this function.
1608 1605
    ///
1609 1606
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1610 1607
    /// \code
1611 1608
    ///   bool reach = false;
1612 1609
    ///   while ( !b.emptyQueue() && !reach ) {
1613 1610
    ///     b.processNextNode(t, reach);
1614 1611
    ///   }
1615 1612
    /// \endcode
1616 1613
    void start(Node t) {
1617 1614
      bool reach = false;
1618 1615
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1619 1616
    }
1620 1617

	
1621 1618
    /// \brief Executes the algorithm until a condition is met.
1622 1619
    ///
1623 1620
    /// Executes the algorithm until a condition is met.
1624 1621
    ///
1625 1622
    /// This method runs the %BFS algorithm from the root node(s) in
1626 1623
    /// order to compute the shortest path to a node \c v with
1627 1624
    /// <tt>nm[v]</tt> true, if such a node can be found.
1628 1625
    ///
1629 1626
    /// \param nm must be a bool (or convertible) node map. The
1630 1627
    /// algorithm will stop when it reaches a node \c v with
1631 1628
    /// <tt>nm[v]</tt> true.
1632 1629
    ///
1633 1630
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1634 1631
    /// \c INVALID if no such node was found.
1635 1632
    ///
1636 1633
    /// \pre init() must be called and at least one root node should be
1637 1634
    /// added with addSource() before using this function.
1638 1635
    ///
1639 1636
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1640 1637
    /// \code
1641 1638
    ///   Node rnode = INVALID;
1642 1639
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1643 1640
    ///     b.processNextNode(nm, rnode);
1644 1641
    ///   }
1645 1642
    ///   return rnode;
1646 1643
    /// \endcode
1647 1644
    template <typename NM>
1648 1645
    Node start(const NM &nm) {
1649 1646
      Node rnode = INVALID;
1650 1647
      while ( !emptyQueue() && rnode == INVALID ) {
1651 1648
        processNextNode(nm, rnode);
1652 1649
      }
1653 1650
      return rnode;
1654 1651
    }
1655 1652

	
1656 1653
    /// \brief Runs the algorithm from the given source node.
1657 1654
    ///
1658 1655
    /// This method runs the %BFS algorithm from node \c s
1659 1656
    /// in order to compute the shortest path to each node.
1660 1657
    ///
1661 1658
    /// The algorithm computes
1662 1659
    /// - the shortest path tree,
1663 1660
    /// - the distance of each node from the root.
1664 1661
    ///
1665 1662
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1666 1663
    ///\code
1667 1664
    ///   b.init();
1668 1665
    ///   b.addSource(s);
1669 1666
    ///   b.start();
1670 1667
    ///\endcode
1671 1668
    void run(Node s) {
1672 1669
      init();
1673 1670
      addSource(s);
1674 1671
      start();
1675 1672
    }
1676 1673

	
1677 1674
    /// \brief Finds the shortest path between \c s and \c t.
1678 1675
    ///
1679 1676
    /// This method runs the %BFS algorithm from node \c s
1680 1677
    /// in order to compute the shortest path to node \c t
1681 1678
    /// (it stops searching when \c t is processed).
1682 1679
    ///
1683 1680
    /// \return \c true if \c t is reachable form \c s.
1684 1681
    ///
1685 1682
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1686 1683
    /// shortcut of the following code.
1687 1684
    ///\code
1688 1685
    ///   b.init();
1689 1686
    ///   b.addSource(s);
1690 1687
    ///   b.start(t);
1691 1688
    ///\endcode
1692 1689
    bool run(Node s,Node t) {
1693 1690
      init();
1694 1691
      addSource(s);
1695 1692
      start(t);
1696 1693
      return reached(t);
1697 1694
    }
1698 1695

	
1699 1696
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1697
    ///
1701 1698
    /// This method runs the %BFS algorithm in order to
1702 1699
    /// compute the shortest path to each node.
1703 1700
    ///
1704 1701
    /// The algorithm computes
1705 1702
    /// - the shortest path tree (forest),
1706 1703
    /// - the distance of each node from the root(s).
1707 1704
    ///
1708 1705
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1706
    ///\code
1710 1707
    ///  b.init();
1711 1708
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1709
    ///    if (!b.reached(n)) {
1713 1710
    ///      b.addSource(n);
1714 1711
    ///      b.start();
1715 1712
    ///    }
1716 1713
    ///  }
1717 1714
    ///\endcode
1718 1715
    void run() {
1719 1716
      init();
1720 1717
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1721 1718
        if (!reached(it)) {
1722 1719
          addSource(it);
1723 1720
          start();
1724 1721
        }
1725 1722
      }
1726 1723
    }
1727 1724

	
1728 1725
    ///@}
1729 1726

	
1730 1727
    /// \name Query Functions
1731 1728
    /// The results of the BFS algorithm can be obtained using these
1732 1729
    /// functions.\n
1733 1730
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1731
    /// before using them.
1735 1732

	
1736 1733
    ///@{
1737 1734

	
1738
    /// \brief Checks if a node is reached from the root(s).
1735
    /// \brief Checks if the given node is reached from the root(s).
1739 1736
    ///
1740 1737
    /// Returns \c true if \c v is reached from the root(s).
1741 1738
    ///
1742 1739
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1740
    /// must be called before using this function.
1744 1741
    bool reached(Node v) const { return (*_reached)[v]; }
1745 1742

	
1746 1743
    ///@}
1747 1744

	
1748 1745
  };
1749 1746

	
1750 1747
} //END OF NAMESPACE LEMON
1751 1748

	
1752 1749
#endif
Ignore white space 24576 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
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/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Dfs class.
36 36

	
37 37
  ///Default traits class of Dfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct DfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap.
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%DFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %DFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=DfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Dfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///DFS paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
148 149
    ///The \ref DfsDefaultTraits "traits class" of the algorithm.
149 150
    typedef TR Traits;
150 151

	
151 152
  private:
152 153

	
153 154
    typedef typename Digraph::Node Node;
154 155
    typedef typename Digraph::NodeIt NodeIt;
155 156
    typedef typename Digraph::Arc Arc;
156 157
    typedef typename Digraph::OutArcIt OutArcIt;
157 158

	
158 159
    //Pointer to the underlying digraph.
159 160
    const Digraph *G;
160 161
    //Pointer to the map of predecessor arcs.
161 162
    PredMap *_pred;
162 163
    //Indicates if _pred is locally allocated (true) or not.
163 164
    bool local_pred;
164 165
    //Pointer to the map of distances.
165 166
    DistMap *_dist;
166 167
    //Indicates if _dist is locally allocated (true) or not.
167 168
    bool local_dist;
168 169
    //Pointer to the map of reached status of the nodes.
169 170
    ReachedMap *_reached;
170 171
    //Indicates if _reached is locally allocated (true) or not.
171 172
    bool local_reached;
172 173
    //Pointer to the map of processed status of the nodes.
173 174
    ProcessedMap *_processed;
174 175
    //Indicates if _processed is locally allocated (true) or not.
175 176
    bool local_processed;
176 177

	
177 178
    std::vector<typename Digraph::OutArcIt> _stack;
178 179
    int _stack_head;
179 180

	
180 181
    //Creates the maps if necessary.
181 182
    void create_maps()
182 183
    {
183 184
      if(!_pred) {
184 185
        local_pred = true;
185 186
        _pred = Traits::createPredMap(*G);
186 187
      }
187 188
      if(!_dist) {
188 189
        local_dist = true;
189 190
        _dist = Traits::createDistMap(*G);
190 191
      }
191 192
      if(!_reached) {
192 193
        local_reached = true;
193 194
        _reached = Traits::createReachedMap(*G);
194 195
      }
195 196
      if(!_processed) {
196 197
        local_processed = true;
197 198
        _processed = Traits::createProcessedMap(*G);
198 199
      }
199 200
    }
200 201

	
201 202
  protected:
202 203

	
203 204
    Dfs() {}
204 205

	
205 206
  public:
206 207

	
207 208
    typedef Dfs Create;
208 209

	
209 210
    ///\name Named Template Parameters
210 211

	
211 212
    ///@{
212 213

	
213 214
    template <class T>
214 215
    struct SetPredMapTraits : public Traits {
215 216
      typedef T PredMap;
216 217
      static PredMap *createPredMap(const Digraph &)
217 218
      {
218 219
        LEMON_ASSERT(false, "PredMap is not initialized");
219 220
        return 0; // ignore warnings
220 221
      }
221 222
    };
222 223
    ///\brief \ref named-templ-param "Named parameter" for setting
223 224
    ///\c PredMap type.
224 225
    ///
225 226
    ///\ref named-templ-param "Named parameter" for setting
226 227
    ///\c PredMap type.
227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
228
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
228 229
    template <class T>
229 230
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
230 231
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
231 232
    };
232 233

	
233 234
    template <class T>
234 235
    struct SetDistMapTraits : public Traits {
235 236
      typedef T DistMap;
236 237
      static DistMap *createDistMap(const Digraph &)
237 238
      {
238 239
        LEMON_ASSERT(false, "DistMap is not initialized");
239 240
        return 0; // ignore warnings
240 241
      }
241 242
    };
242 243
    ///\brief \ref named-templ-param "Named parameter" for setting
243 244
    ///\c DistMap type.
244 245
    ///
245 246
    ///\ref named-templ-param "Named parameter" for setting
246 247
    ///\c DistMap type.
247
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
248
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
248 249
    template <class T>
249 250
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
250 251
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
251 252
    };
252 253

	
253 254
    template <class T>
254 255
    struct SetReachedMapTraits : public Traits {
255 256
      typedef T ReachedMap;
256 257
      static ReachedMap *createReachedMap(const Digraph &)
257 258
      {
258 259
        LEMON_ASSERT(false, "ReachedMap is not initialized");
259 260
        return 0; // ignore warnings
260 261
      }
261 262
    };
262 263
    ///\brief \ref named-templ-param "Named parameter" for setting
263 264
    ///\c ReachedMap type.
264 265
    ///
265 266
    ///\ref named-templ-param "Named parameter" for setting
266 267
    ///\c ReachedMap type.
267
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268 269
    template <class T>
269 270
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
270 271
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
271 272
    };
272 273

	
273 274
    template <class T>
274 275
    struct SetProcessedMapTraits : public Traits {
275 276
      typedef T ProcessedMap;
276 277
      static ProcessedMap *createProcessedMap(const Digraph &)
277 278
      {
278 279
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
279 280
        return 0; // ignore warnings
280 281
      }
281 282
    };
282 283
    ///\brief \ref named-templ-param "Named parameter" for setting
283 284
    ///\c ProcessedMap type.
284 285
    ///
285 286
    ///\ref named-templ-param "Named parameter" for setting
286 287
    ///\c ProcessedMap type.
287
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
288
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
288 289
    template <class T>
289 290
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
290 291
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
291 292
    };
292 293

	
293 294
    struct SetStandardProcessedMapTraits : public Traits {
294 295
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
295 296
      static ProcessedMap *createProcessedMap(const Digraph &g)
296 297
      {
297 298
        return new ProcessedMap(g);
298 299
      }
299 300
    };
300 301
    ///\brief \ref named-templ-param "Named parameter" for setting
301 302
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
302 303
    ///
303 304
    ///\ref named-templ-param "Named parameter" for setting
304 305
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 306
    ///If you don't set it explicitly, it will be automatically allocated.
306 307
    struct SetStandardProcessedMap :
307 308
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
308 309
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
309 310
    };
310 311

	
311 312
    ///@}
312 313

	
313 314
  public:
314 315

	
315 316
    ///Constructor.
316 317

	
317 318
    ///Constructor.
318 319
    ///\param g The digraph the algorithm runs on.
319 320
    Dfs(const Digraph &g) :
320 321
      G(&g),
321 322
      _pred(NULL), local_pred(false),
322 323
      _dist(NULL), local_dist(false),
323 324
      _reached(NULL), local_reached(false),
324 325
      _processed(NULL), local_processed(false)
325 326
    { }
326 327

	
327 328
    ///Destructor.
328 329
    ~Dfs()
329 330
    {
330 331
      if(local_pred) delete _pred;
331 332
      if(local_dist) delete _dist;
332 333
      if(local_reached) delete _reached;
333 334
      if(local_processed) delete _processed;
334 335
    }
335 336

	
336 337
    ///Sets the map that stores the predecessor arcs.
337 338

	
338 339
    ///Sets the map that stores the predecessor arcs.
339 340
    ///If you don't use this function before calling \ref run(Node) "run()"
340 341
    ///or \ref init(), an instance will be allocated automatically.
341 342
    ///The destructor deallocates this automatically allocated map,
342 343
    ///of course.
343 344
    ///\return <tt> (*this) </tt>
344 345
    Dfs &predMap(PredMap &m)
345 346
    {
346 347
      if(local_pred) {
347 348
        delete _pred;
348 349
        local_pred=false;
349 350
      }
350 351
      _pred = &m;
351 352
      return *this;
352 353
    }
353 354

	
354 355
    ///Sets the map that indicates which nodes are reached.
355 356

	
356 357
    ///Sets the map that indicates which nodes are reached.
357 358
    ///If you don't use this function before calling \ref run(Node) "run()"
358 359
    ///or \ref init(), an instance will be allocated automatically.
359 360
    ///The destructor deallocates this automatically allocated map,
360 361
    ///of course.
361 362
    ///\return <tt> (*this) </tt>
362 363
    Dfs &reachedMap(ReachedMap &m)
363 364
    {
364 365
      if(local_reached) {
365 366
        delete _reached;
366 367
        local_reached=false;
367 368
      }
368 369
      _reached = &m;
369 370
      return *this;
370 371
    }
371 372

	
372 373
    ///Sets the map that indicates which nodes are processed.
373 374

	
374 375
    ///Sets the map that indicates which nodes are processed.
375 376
    ///If you don't use this function before calling \ref run(Node) "run()"
376 377
    ///or \ref init(), an instance will be allocated automatically.
377 378
    ///The destructor deallocates this automatically allocated map,
378 379
    ///of course.
379 380
    ///\return <tt> (*this) </tt>
380 381
    Dfs &processedMap(ProcessedMap &m)
381 382
    {
382 383
      if(local_processed) {
383 384
        delete _processed;
384 385
        local_processed=false;
385 386
      }
386 387
      _processed = &m;
387 388
      return *this;
388 389
    }
389 390

	
390 391
    ///Sets the map that stores the distances of the nodes.
391 392

	
392 393
    ///Sets the map that stores the distances of the nodes calculated by
393 394
    ///the algorithm.
394 395
    ///If you don't use this function before calling \ref run(Node) "run()"
395 396
    ///or \ref init(), an instance will be allocated automatically.
396 397
    ///The destructor deallocates this automatically allocated map,
397 398
    ///of course.
398 399
    ///\return <tt> (*this) </tt>
399 400
    Dfs &distMap(DistMap &m)
400 401
    {
401 402
      if(local_dist) {
402 403
        delete _dist;
403 404
        local_dist=false;
404 405
      }
405 406
      _dist = &m;
406 407
      return *this;
407 408
    }
408 409

	
409 410
  public:
410 411

	
411 412
    ///\name Execution Control
412 413
    ///The simplest way to execute the DFS algorithm is to use one of the
413 414
    ///member functions called \ref run(Node) "run()".\n
414 415
    ///If you need more control on the execution, first you have to call
415 416
    ///\ref init(), then you can add a source node with \ref addSource()
416 417
    ///and perform the actual computation with \ref start().
417 418
    ///This procedure can be repeated if there are nodes that have not
418 419
    ///been reached.
419 420

	
420 421
    ///@{
421 422

	
422 423
    ///\brief Initializes the internal data structures.
423 424
    ///
424 425
    ///Initializes the internal data structures.
425 426
    void init()
426 427
    {
427 428
      create_maps();
428 429
      _stack.resize(countNodes(*G));
429 430
      _stack_head=-1;
430 431
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
431 432
        _pred->set(u,INVALID);
432 433
        _reached->set(u,false);
433 434
        _processed->set(u,false);
434 435
      }
435 436
    }
436 437

	
437 438
    ///Adds a new source node.
438 439

	
439 440
    ///Adds a new source node to the set of nodes to be processed.
440 441
    ///
441 442
    ///\pre The stack must be empty. Otherwise the algorithm gives
442 443
    ///wrong results. (One of the outgoing arcs of all the source nodes
443 444
    ///except for the last one will not be visited and distances will
444 445
    ///also be wrong.)
445 446
    void addSource(Node s)
446 447
    {
447 448
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
448 449
      if(!(*_reached)[s])
449 450
        {
450 451
          _reached->set(s,true);
451 452
          _pred->set(s,INVALID);
452 453
          OutArcIt e(*G,s);
453 454
          if(e!=INVALID) {
454 455
            _stack[++_stack_head]=e;
455 456
            _dist->set(s,_stack_head);
456 457
          }
457 458
          else {
458 459
            _processed->set(s,true);
459 460
            _dist->set(s,0);
460 461
          }
461 462
        }
462 463
    }
463 464

	
464 465
    ///Processes the next arc.
465 466

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

	
497 498
    ///Next arc to be processed.
498 499

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

	
508 509
    ///Returns \c false if there are nodes to be processed.
509 510

	
510 511
    ///Returns \c false if there are nodes to be processed
511 512
    ///in the queue (stack).
512 513
    bool emptyQueue() const { return _stack_head<0; }
513 514

	
514 515
    ///Returns the number of the nodes to be processed.
515 516

	
516 517
    ///Returns the number of the nodes to be processed
517 518
    ///in the queue (stack).
518 519
    int queueSize() const { return _stack_head+1; }
519 520

	
520 521
    ///Executes the algorithm.
521 522

	
522 523
    ///Executes the algorithm.
523 524
    ///
524 525
    ///This method runs the %DFS algorithm from the root node
525 526
    ///in order to compute the DFS path to each node.
526 527
    ///
527 528
    /// The algorithm computes
528 529
    ///- the %DFS tree,
529 530
    ///- the distance of each node from the root in the %DFS tree.
530 531
    ///
531 532
    ///\pre init() must be called and a root node should be
532 533
    ///added with addSource() before using this function.
533 534
    ///
534 535
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
535 536
    ///\code
536 537
    ///  while ( !d.emptyQueue() ) {
537 538
    ///    d.processNextArc();
538 539
    ///  }
539 540
    ///\endcode
540 541
    void start()
541 542
    {
542 543
      while ( !emptyQueue() ) processNextArc();
543 544
    }
544 545

	
545 546
    ///Executes the algorithm until the given target node is reached.
546 547

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

	
564 565
    ///Executes the algorithm until a condition is met.
565 566

	
566 567
    ///Executes the algorithm until a condition is met.
567 568
    ///
568 569
    ///This method runs the %DFS algorithm from the root node
569 570
    ///until an arc \c a with <tt>am[a]</tt> true is found.
570 571
    ///
571 572
    ///\param am A \c bool (or convertible) arc map. The algorithm
572 573
    ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
573 574
    ///
574 575
    ///\return The reached arc \c a with <tt>am[a]</tt> true or
575 576
    ///\c INVALID if no such arc was found.
576 577
    ///
577 578
    ///\pre init() must be called and a root node should be
578 579
    ///added with addSource() before using this function.
579 580
    ///
580 581
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
581 582
    ///not a node map.
582 583
    template<class ArcBoolMap>
583 584
    Arc start(const ArcBoolMap &am)
584 585
    {
585 586
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
586 587
        processNextArc();
587 588
      return emptyQueue() ? INVALID : _stack[_stack_head];
588 589
    }
589 590

	
590 591
    ///Runs the algorithm from the given source node.
591 592

	
592 593
    ///This method runs the %DFS algorithm from node \c s
593 594
    ///in order to compute the DFS path to each node.
594 595
    ///
595 596
    ///The algorithm computes
596 597
    ///- the %DFS tree,
597 598
    ///- the distance of each node from the root in the %DFS tree.
598 599
    ///
599 600
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
600 601
    ///\code
601 602
    ///  d.init();
602 603
    ///  d.addSource(s);
603 604
    ///  d.start();
604 605
    ///\endcode
605 606
    void run(Node s) {
606 607
      init();
607 608
      addSource(s);
608 609
      start();
609 610
    }
610 611

	
611 612
    ///Finds the %DFS path between \c s and \c t.
612 613

	
613 614
    ///This method runs the %DFS algorithm from node \c s
614 615
    ///in order to compute the DFS path to node \c t
615 616
    ///(it stops searching when \c t is processed)
616 617
    ///
617 618
    ///\return \c true if \c t is reachable form \c s.
618 619
    ///
619 620
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
620 621
    ///just a shortcut of the following code.
621 622
    ///\code
622 623
    ///  d.init();
623 624
    ///  d.addSource(s);
624 625
    ///  d.start(t);
625 626
    ///\endcode
626 627
    bool run(Node s,Node t) {
627 628
      init();
628 629
      addSource(s);
629 630
      start(t);
630 631
      return reached(t);
631 632
    }
632 633

	
633 634
    ///Runs the algorithm to visit all nodes in the digraph.
634 635

	
635 636
    ///This method runs the %DFS algorithm in order to compute the
636 637
    ///%DFS path to each node.
637 638
    ///
638 639
    ///The algorithm computes
639 640
    ///- the %DFS tree (forest),
640 641
    ///- the distance of each node from the root(s) in the %DFS tree.
641 642
    ///
642 643
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
643 644
    ///\code
644 645
    ///  d.init();
645 646
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
646 647
    ///    if (!d.reached(n)) {
647 648
    ///      d.addSource(n);
648 649
    ///      d.start();
649 650
    ///    }
650 651
    ///  }
651 652
    ///\endcode
652 653
    void run() {
653 654
      init();
654 655
      for (NodeIt it(*G); it != INVALID; ++it) {
655 656
        if (!reached(it)) {
656 657
          addSource(it);
657 658
          start();
658 659
        }
659 660
      }
660 661
    }
661 662

	
662 663
    ///@}
663 664

	
664 665
    ///\name Query Functions
665 666
    ///The results of the DFS algorithm can be obtained using these
666 667
    ///functions.\n
667 668
    ///Either \ref run(Node) "run()" or \ref start() should be called
668 669
    ///before using them.
669 670

	
670 671
    ///@{
671 672

	
672
    ///The DFS path to a node.
673
    ///The DFS path to the given node.
673 674

	
674
    ///Returns the DFS path to a node.
675
    ///Returns the DFS path to the given node from the root(s).
675 676
    ///
676 677
    ///\warning \c t should be reached from the root(s).
677 678
    ///
678 679
    ///\pre Either \ref run(Node) "run()" or \ref init()
679 680
    ///must be called before using this function.
680 681
    Path path(Node t) const { return Path(*G, *_pred, t); }
681 682

	
682
    ///The distance of a node from the root(s).
683
    ///The distance of the given node from the root(s).
683 684

	
684
    ///Returns the distance of a node from the root(s).
685
    ///Returns the distance of the given node from the root(s).
685 686
    ///
686 687
    ///\warning If node \c v is not reached from the root(s), then
687 688
    ///the return value of this function is undefined.
688 689
    ///
689 690
    ///\pre Either \ref run(Node) "run()" or \ref init()
690 691
    ///must be called before using this function.
691 692
    int dist(Node v) const { return (*_dist)[v]; }
692 693

	
693
    ///Returns the 'previous arc' of the %DFS tree for a node.
694
    ///Returns the 'previous arc' of the %DFS tree for the given node.
694 695

	
695 696
    ///This function returns the 'previous arc' of the %DFS tree for the
696 697
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
697 698
    ///root to \c v. It is \c INVALID if \c v is not reached from the
698 699
    ///root(s) or if \c v is a root.
699 700
    ///
700 701
    ///The %DFS tree used here is equal to the %DFS tree used in
701
    ///\ref predNode().
702
    ///\ref predNode() and \ref predMap().
702 703
    ///
703 704
    ///\pre Either \ref run(Node) "run()" or \ref init()
704 705
    ///must be called before using this function.
705 706
    Arc predArc(Node v) const { return (*_pred)[v];}
706 707

	
707
    ///Returns the 'previous node' of the %DFS tree.
708
    ///Returns the 'previous node' of the %DFS tree for the given node.
708 709

	
709 710
    ///This function returns the 'previous node' of the %DFS
710 711
    ///tree for the node \c v, i.e. it returns the last but one node
711
    ///from a %DFS path from a root to \c v. It is \c INVALID
712
    ///of a %DFS path from a root to \c v. It is \c INVALID
712 713
    ///if \c v is not reached from the root(s) or if \c v is a root.
713 714
    ///
714 715
    ///The %DFS tree used here is equal to the %DFS tree used in
715
    ///\ref predArc().
716
    ///\ref predArc() and \ref predMap().
716 717
    ///
717 718
    ///\pre Either \ref run(Node) "run()" or \ref init()
718 719
    ///must be called before using this function.
719 720
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
720 721
                                  G->source((*_pred)[v]); }
721 722

	
722 723
    ///\brief Returns a const reference to the node map that stores the
723 724
    ///distances of the nodes.
724 725
    ///
725 726
    ///Returns a const reference to the node map that stores the
726 727
    ///distances of the nodes calculated by the algorithm.
727 728
    ///
728 729
    ///\pre Either \ref run(Node) "run()" or \ref init()
729 730
    ///must be called before using this function.
730 731
    const DistMap &distMap() const { return *_dist;}
731 732

	
732 733
    ///\brief Returns a const reference to the node map that stores the
733 734
    ///predecessor arcs.
734 735
    ///
735 736
    ///Returns a const reference to the node map that stores the predecessor
736
    ///arcs, which form the DFS tree.
737
    ///arcs, which form the DFS tree (forest).
737 738
    ///
738 739
    ///\pre Either \ref run(Node) "run()" or \ref init()
739 740
    ///must be called before using this function.
740 741
    const PredMap &predMap() const { return *_pred;}
741 742

	
742
    ///Checks if a node is reached from the root(s).
743
    ///Checks if the given node. node is reached from the root(s).
743 744

	
744 745
    ///Returns \c true if \c v is reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    bool reached(Node v) const { return (*_reached)[v]; }
749 750

	
750 751
    ///@}
751 752
  };
752 753

	
753 754
  ///Default traits class of dfs() function.
754 755

	
755 756
  ///Default traits class of dfs() function.
756 757
  ///\tparam GR Digraph type.
757 758
  template<class GR>
758 759
  struct DfsWizardDefaultTraits
759 760
  {
760 761
    ///The type of the digraph the algorithm runs on.
761 762
    typedef GR Digraph;
762 763

	
763 764
    ///\brief The type of the map that stores the predecessor
764 765
    ///arcs of the %DFS paths.
765 766
    ///
766 767
    ///The type of the map that stores the predecessor
767 768
    ///arcs of the %DFS paths.
768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
769
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
769 770
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
770 771
    ///Instantiates a PredMap.
771 772

	
772 773
    ///This function instantiates a PredMap.
773 774
    ///\param g is the digraph, to which we would like to define the
774 775
    ///PredMap.
775 776
    static PredMap *createPredMap(const Digraph &g)
776 777
    {
777 778
      return new PredMap(g);
778 779
    }
779 780

	
780 781
    ///The type of the map that indicates which nodes are processed.
781 782

	
782 783
    ///The type of the map that indicates which nodes are processed.
783
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
784 785
    ///By default it is a NullMap.
785 786
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
786 787
    ///Instantiates a ProcessedMap.
787 788

	
788 789
    ///This function instantiates a ProcessedMap.
789 790
    ///\param g is the digraph, to which
790 791
    ///we would like to define the ProcessedMap.
791 792
#ifdef DOXYGEN
792 793
    static ProcessedMap *createProcessedMap(const Digraph &g)
793 794
#else
794 795
    static ProcessedMap *createProcessedMap(const Digraph &)
795 796
#endif
796 797
    {
797 798
      return new ProcessedMap();
798 799
    }
799 800

	
800 801
    ///The type of the map that indicates which nodes are reached.
801 802

	
802 803
    ///The type of the map that indicates which nodes are reached.
803
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 805
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
805 806
    ///Instantiates a ReachedMap.
806 807

	
807 808
    ///This function instantiates a ReachedMap.
808 809
    ///\param g is the digraph, to which
809 810
    ///we would like to define the ReachedMap.
810 811
    static ReachedMap *createReachedMap(const Digraph &g)
811 812
    {
812 813
      return new ReachedMap(g);
813 814
    }
814 815

	
815 816
    ///The type of the map that stores the distances of the nodes.
816 817

	
817 818
    ///The type of the map that stores the distances of the nodes.
818
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
819
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
819 820
    typedef typename Digraph::template NodeMap<int> DistMap;
820 821
    ///Instantiates a DistMap.
821 822

	
822 823
    ///This function instantiates a DistMap.
823 824
    ///\param g is the digraph, to which we would like to define
824 825
    ///the DistMap
825 826
    static DistMap *createDistMap(const Digraph &g)
826 827
    {
827 828
      return new DistMap(g);
828 829
    }
829 830

	
830 831
    ///The type of the DFS paths.
831 832

	
832 833
    ///The type of the DFS paths.
833
    ///It must meet the \ref concepts::Path "Path" concept.
834
    ///It must conform to the \ref concepts::Path "Path" concept.
834 835
    typedef lemon::Path<Digraph> Path;
835 836
  };
836 837

	
837 838
  /// Default traits class used by DfsWizard
838 839

	
839
  /// To make it easier to use Dfs algorithm
840
  /// we have created a wizard class.
841
  /// This \ref DfsWizard class needs default traits,
842
  /// as well as the \ref Dfs class.
843
  /// The \ref DfsWizardBase is a class to be the default traits of the
844
  /// \ref DfsWizard class.
840
  /// Default traits class used by DfsWizard.
841
  /// \tparam GR The type of the digraph.
845 842
  template<class GR>
846 843
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
847 844
  {
848 845

	
849 846
    typedef DfsWizardDefaultTraits<GR> Base;
850 847
  protected:
851 848
    //The type of the nodes in the digraph.
852 849
    typedef typename Base::Digraph::Node Node;
853 850

	
854 851
    //Pointer to the digraph the algorithm runs on.
855 852
    void *_g;
856 853
    //Pointer to the map of reached nodes.
857 854
    void *_reached;
858 855
    //Pointer to the map of processed nodes.
859 856
    void *_processed;
860 857
    //Pointer to the map of predecessors arcs.
861 858
    void *_pred;
862 859
    //Pointer to the map of distances.
863 860
    void *_dist;
864 861
    //Pointer to the DFS path to the target node.
865 862
    void *_path;
866 863
    //Pointer to the distance of the target node.
867 864
    int *_di;
868 865

	
869 866
    public:
870 867
    /// Constructor.
871 868

	
872
    /// This constructor does not require parameters, therefore it initiates
869
    /// This constructor does not require parameters, it initiates
873 870
    /// all of the attributes to \c 0.
874 871
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 872
                      _dist(0), _path(0), _di(0) {}
876 873

	
877 874
    /// Constructor.
878 875

	
879 876
    /// This constructor requires one parameter,
880 877
    /// others are initiated to \c 0.
881 878
    /// \param g The digraph the algorithm runs on.
882 879
    DfsWizardBase(const GR &g) :
883 880
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
884 881
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
885 882

	
886 883
  };
887 884

	
888 885
  /// Auxiliary class for the function-type interface of DFS algorithm.
889 886

	
890 887
  /// This auxiliary class is created to implement the
891 888
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
892 889
  /// It does not have own \ref run(Node) "run()" method, it uses the
893 890
  /// functions and features of the plain \ref Dfs.
894 891
  ///
895 892
  /// This class should only be used through the \ref dfs() function,
896 893
  /// which makes it easier to use the algorithm.
897 894
  template<class TR>
898 895
  class DfsWizard : public TR
899 896
  {
900 897
    typedef TR Base;
901 898

	
902
    ///The type of the digraph the algorithm runs on.
903 899
    typedef typename TR::Digraph Digraph;
904 900

	
905 901
    typedef typename Digraph::Node Node;
906 902
    typedef typename Digraph::NodeIt NodeIt;
907 903
    typedef typename Digraph::Arc Arc;
908 904
    typedef typename Digraph::OutArcIt OutArcIt;
909 905

	
910
    ///\brief The type of the map that stores the predecessor
911
    ///arcs of the DFS paths.
912 906
    typedef typename TR::PredMap PredMap;
913
    ///\brief The type of the map that stores the distances of the nodes.
914 907
    typedef typename TR::DistMap DistMap;
915
    ///\brief The type of the map that indicates which nodes are reached.
916 908
    typedef typename TR::ReachedMap ReachedMap;
917
    ///\brief The type of the map that indicates which nodes are processed.
918 909
    typedef typename TR::ProcessedMap ProcessedMap;
919
    ///The type of the DFS paths
920 910
    typedef typename TR::Path Path;
921 911

	
922 912
  public:
923 913

	
924 914
    /// Constructor.
925 915
    DfsWizard() : TR() {}
926 916

	
927 917
    /// Constructor that requires parameters.
928 918

	
929 919
    /// Constructor that requires parameters.
930 920
    /// These parameters will be the default values for the traits class.
931 921
    /// \param g The digraph the algorithm runs on.
932 922
    DfsWizard(const Digraph &g) :
933 923
      TR(g) {}
934 924

	
935 925
    ///Copy constructor
936 926
    DfsWizard(const TR &b) : TR(b) {}
937 927

	
938 928
    ~DfsWizard() {}
939 929

	
940 930
    ///Runs DFS algorithm from the given source node.
941 931

	
942 932
    ///This method runs DFS algorithm from node \c s
943 933
    ///in order to compute the DFS path to each node.
944 934
    void run(Node s)
945 935
    {
946 936
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
947 937
      if (Base::_pred)
948 938
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
949 939
      if (Base::_dist)
950 940
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
951 941
      if (Base::_reached)
952 942
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
953 943
      if (Base::_processed)
954 944
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
955 945
      if (s!=INVALID)
956 946
        alg.run(s);
957 947
      else
958 948
        alg.run();
959 949
    }
960 950

	
961 951
    ///Finds the DFS path between \c s and \c t.
962 952

	
963 953
    ///This method runs DFS algorithm from node \c s
964 954
    ///in order to compute the DFS path to node \c t
965 955
    ///(it stops searching when \c t is processed).
966 956
    ///
967 957
    ///\return \c true if \c t is reachable form \c s.
968 958
    bool run(Node s, Node t)
969 959
    {
970 960
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
971 961
      if (Base::_pred)
972 962
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
973 963
      if (Base::_dist)
974 964
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
975 965
      if (Base::_reached)
976 966
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
977 967
      if (Base::_processed)
978 968
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
979 969
      alg.run(s,t);
980 970
      if (Base::_path)
981 971
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
982 972
      if (Base::_di)
983 973
        *Base::_di = alg.dist(t);
984 974
      return alg.reached(t);
985 975
      }
986 976

	
987 977
    ///Runs DFS algorithm to visit all nodes in the digraph.
988 978

	
989 979
    ///This method runs DFS algorithm in order to compute
990 980
    ///the DFS path to each node.
991 981
    void run()
992 982
    {
993 983
      run(INVALID);
994 984
    }
995 985

	
996 986
    template<class T>
997 987
    struct SetPredMapBase : public Base {
998 988
      typedef T PredMap;
999 989
      static PredMap *createPredMap(const Digraph &) { return 0; };
1000 990
      SetPredMapBase(const TR &b) : TR(b) {}
1001 991
    };
1002
    ///\brief \ref named-func-param "Named parameter"
1003
    ///for setting PredMap object.
992

	
993
    ///\brief \ref named-templ-param "Named parameter" for setting
994
    ///the predecessor map.
1004 995
    ///
1005
    ///\ref named-func-param "Named parameter"
1006
    ///for setting PredMap object.
996
    ///\ref named-templ-param "Named parameter" function for setting
997
    ///the map that stores the predecessor arcs of the nodes.
1007 998
    template<class T>
1008 999
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1009 1000
    {
1010 1001
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1011 1002
      return DfsWizard<SetPredMapBase<T> >(*this);
1012 1003
    }
1013 1004

	
1014 1005
    template<class T>
1015 1006
    struct SetReachedMapBase : public Base {
1016 1007
      typedef T ReachedMap;
1017 1008
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1018 1009
      SetReachedMapBase(const TR &b) : TR(b) {}
1019 1010
    };
1020
    ///\brief \ref named-func-param "Named parameter"
1021
    ///for setting ReachedMap object.
1011

	
1012
    ///\brief \ref named-templ-param "Named parameter" for setting
1013
    ///the reached map.
1022 1014
    ///
1023
    /// \ref named-func-param "Named parameter"
1024
    ///for setting ReachedMap object.
1015
    ///\ref named-templ-param "Named parameter" function for setting
1016
    ///the map that indicates which nodes are reached.
1025 1017
    template<class T>
1026 1018
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1027 1019
    {
1028 1020
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1029 1021
      return DfsWizard<SetReachedMapBase<T> >(*this);
1030 1022
    }
1031 1023

	
1032 1024
    template<class T>
1033 1025
    struct SetDistMapBase : public Base {
1034 1026
      typedef T DistMap;
1035 1027
      static DistMap *createDistMap(const Digraph &) { return 0; };
1036 1028
      SetDistMapBase(const TR &b) : TR(b) {}
1037 1029
    };
1038
    ///\brief \ref named-func-param "Named parameter"
1039
    ///for setting DistMap object.
1030

	
1031
    ///\brief \ref named-templ-param "Named parameter" for setting
1032
    ///the distance map.
1040 1033
    ///
1041
    /// \ref named-func-param "Named parameter"
1042
    ///for setting DistMap object.
1034
    ///\ref named-templ-param "Named parameter" function for setting
1035
    ///the map that stores the distances of the nodes calculated
1036
    ///by the algorithm.
1043 1037
    template<class T>
1044 1038
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1045 1039
    {
1046 1040
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1047 1041
      return DfsWizard<SetDistMapBase<T> >(*this);
1048 1042
    }
1049 1043

	
1050 1044
    template<class T>
1051 1045
    struct SetProcessedMapBase : public Base {
1052 1046
      typedef T ProcessedMap;
1053 1047
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1054 1048
      SetProcessedMapBase(const TR &b) : TR(b) {}
1055 1049
    };
1056
    ///\brief \ref named-func-param "Named parameter"
1057
    ///for setting ProcessedMap object.
1050

	
1051
    ///\brief \ref named-func-param "Named parameter" for setting
1052
    ///the processed map.
1058 1053
    ///
1059
    /// \ref named-func-param "Named parameter"
1060
    ///for setting ProcessedMap object.
1054
    ///\ref named-templ-param "Named parameter" function for setting
1055
    ///the map that indicates which nodes are processed.
1061 1056
    template<class T>
1062 1057
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1063 1058
    {
1064 1059
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1065 1060
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1066 1061
    }
1067 1062

	
1068 1063
    template<class T>
1069 1064
    struct SetPathBase : public Base {
1070 1065
      typedef T Path;
1071 1066
      SetPathBase(const TR &b) : TR(b) {}
1072 1067
    };
1073 1068
    ///\brief \ref named-func-param "Named parameter"
1074 1069
    ///for getting the DFS path to the target node.
1075 1070
    ///
1076 1071
    ///\ref named-func-param "Named parameter"
1077 1072
    ///for getting the DFS path to the target node.
1078 1073
    template<class T>
1079 1074
    DfsWizard<SetPathBase<T> > path(const T &t)
1080 1075
    {
1081 1076
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1082 1077
      return DfsWizard<SetPathBase<T> >(*this);
1083 1078
    }
1084 1079

	
1085 1080
    ///\brief \ref named-func-param "Named parameter"
1086 1081
    ///for getting the distance of the target node.
1087 1082
    ///
1088 1083
    ///\ref named-func-param "Named parameter"
1089 1084
    ///for getting the distance of the target node.
1090 1085
    DfsWizard dist(const int &d)
1091 1086
    {
1092 1087
      Base::_di=const_cast<int*>(&d);
1093 1088
      return *this;
1094 1089
    }
1095 1090

	
1096 1091
  };
1097 1092

	
1098 1093
  ///Function-type interface for DFS algorithm.
1099 1094

	
1100 1095
  ///\ingroup search
1101 1096
  ///Function-type interface for DFS algorithm.
1102 1097
  ///
1103 1098
  ///This function also has several \ref named-func-param "named parameters",
1104 1099
  ///they are declared as the members of class \ref DfsWizard.
1105 1100
  ///The following examples show how to use these parameters.
1106 1101
  ///\code
1107 1102
  ///  // Compute the DFS tree
1108 1103
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1109 1104
  ///
1110 1105
  ///  // Compute the DFS path from s to t
1111 1106
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1112 1107
  ///\endcode
1113 1108
  ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1114 1109
  ///to the end of the parameter list.
1115 1110
  ///\sa DfsWizard
1116 1111
  ///\sa Dfs
1117 1112
  template<class GR>
1118 1113
  DfsWizard<DfsWizardBase<GR> >
1119 1114
  dfs(const GR &digraph)
1120 1115
  {
1121 1116
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1122 1117
  }
1123 1118

	
1124 1119
#ifdef DOXYGEN
1125 1120
  /// \brief Visitor class for DFS.
1126 1121
  ///
1127 1122
  /// This class defines the interface of the DfsVisit events, and
1128 1123
  /// it could be the base of a real visitor class.
1129 1124
  template <typename GR>
1130 1125
  struct DfsVisitor {
1131 1126
    typedef GR Digraph;
1132 1127
    typedef typename Digraph::Arc Arc;
1133 1128
    typedef typename Digraph::Node Node;
1134 1129
    /// \brief Called for the source node of the DFS.
1135 1130
    ///
1136 1131
    /// This function is called for the source node of the DFS.
1137 1132
    void start(const Node& node) {}
1138 1133
    /// \brief Called when the source node is leaved.
1139 1134
    ///
1140 1135
    /// This function is called when the source node is leaved.
1141 1136
    void stop(const Node& node) {}
1142 1137
    /// \brief Called when a node is reached first time.
1143 1138
    ///
1144 1139
    /// This function is called when a node is reached first time.
1145 1140
    void reach(const Node& node) {}
1146 1141
    /// \brief Called when an arc reaches a new node.
1147 1142
    ///
1148 1143
    /// This function is called when the DFS finds an arc whose target node
1149 1144
    /// is not reached yet.
1150 1145
    void discover(const Arc& arc) {}
1151 1146
    /// \brief Called when an arc is examined but its target node is
1152 1147
    /// already discovered.
1153 1148
    ///
1154 1149
    /// This function is called when an arc is examined but its target node is
1155 1150
    /// already discovered.
1156 1151
    void examine(const Arc& arc) {}
1157 1152
    /// \brief Called when the DFS steps back from a node.
1158 1153
    ///
1159 1154
    /// This function is called when the DFS steps back from a node.
1160 1155
    void leave(const Node& node) {}
1161 1156
    /// \brief Called when the DFS steps back on an arc.
1162 1157
    ///
1163 1158
    /// This function is called when the DFS steps back on an arc.
1164 1159
    void backtrack(const Arc& arc) {}
1165 1160
  };
1166 1161
#else
1167 1162
  template <typename GR>
1168 1163
  struct DfsVisitor {
1169 1164
    typedef GR Digraph;
1170 1165
    typedef typename Digraph::Arc Arc;
1171 1166
    typedef typename Digraph::Node Node;
1172 1167
    void start(const Node&) {}
1173 1168
    void stop(const Node&) {}
1174 1169
    void reach(const Node&) {}
1175 1170
    void discover(const Arc&) {}
1176 1171
    void examine(const Arc&) {}
1177 1172
    void leave(const Node&) {}
1178 1173
    void backtrack(const Arc&) {}
1179 1174

	
1180 1175
    template <typename _Visitor>
1181 1176
    struct Constraints {
1182 1177
      void constraints() {
1183 1178
        Arc arc;
1184 1179
        Node node;
1185 1180
        visitor.start(node);
1186 1181
        visitor.stop(arc);
1187 1182
        visitor.reach(node);
1188 1183
        visitor.discover(arc);
1189 1184
        visitor.examine(arc);
1190 1185
        visitor.leave(node);
1191 1186
        visitor.backtrack(arc);
1192 1187
      }
1193 1188
      _Visitor& visitor;
1194 1189
    };
1195 1190
  };
1196 1191
#endif
1197 1192

	
1198 1193
  /// \brief Default traits class of DfsVisit class.
1199 1194
  ///
1200 1195
  /// Default traits class of DfsVisit class.
1201 1196
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1202 1197
  template<class GR>
1203 1198
  struct DfsVisitDefaultTraits {
1204 1199

	
1205 1200
    /// \brief The type of the digraph the algorithm runs on.
1206 1201
    typedef GR Digraph;
1207 1202

	
1208 1203
    /// \brief The type of the map that indicates which nodes are reached.
1209 1204
    ///
1210 1205
    /// The type of the map that indicates which nodes are reached.
1211
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1206
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1212 1207
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1213 1208

	
1214 1209
    /// \brief Instantiates a ReachedMap.
1215 1210
    ///
1216 1211
    /// This function instantiates a ReachedMap.
1217 1212
    /// \param digraph is the digraph, to which
1218 1213
    /// we would like to define the ReachedMap.
1219 1214
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1220 1215
      return new ReachedMap(digraph);
1221 1216
    }
1222 1217

	
1223 1218
  };
1224 1219

	
1225 1220
  /// \ingroup search
1226 1221
  ///
1227 1222
  /// \brief DFS algorithm class with visitor interface.
1228 1223
  ///
1229 1224
  /// This class provides an efficient implementation of the DFS algorithm
1230 1225
  /// with visitor interface.
1231 1226
  ///
1232 1227
  /// The DfsVisit class provides an alternative interface to the Dfs
1233 1228
  /// class. It works with callback mechanism, the DfsVisit object calls
1234 1229
  /// the member functions of the \c Visitor class on every DFS event.
1235 1230
  ///
1236 1231
  /// This interface of the DFS algorithm should be used in special cases
1237 1232
  /// when extra actions have to be performed in connection with certain
1238 1233
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1239 1234
  /// instead.
1240 1235
  ///
1241 1236
  /// \tparam GR The type of the digraph the algorithm runs on.
1242 1237
  /// The default type is \ref ListDigraph.
1243 1238
  /// The value of GR is not used directly by \ref DfsVisit,
1244 1239
  /// it is only passed to \ref DfsVisitDefaultTraits.
1245 1240
  /// \tparam VS The Visitor type that is used by the algorithm.
1246 1241
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1247 1242
  /// does not observe the DFS events. If you want to observe the DFS
1248 1243
  /// events, you should implement your own visitor class.
1249 1244
  /// \tparam TR Traits class to set various data types used by the
1250 1245
  /// algorithm. The default traits class is
1251 1246
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1252 1247
  /// See \ref DfsVisitDefaultTraits for the documentation of
1253 1248
  /// a DFS visit traits class.
1254 1249
#ifdef DOXYGEN
1255 1250
  template <typename GR, typename VS, typename TR>
1256 1251
#else
1257 1252
  template <typename GR = ListDigraph,
1258 1253
            typename VS = DfsVisitor<GR>,
1259 1254
            typename TR = DfsVisitDefaultTraits<GR> >
1260 1255
#endif
1261 1256
  class DfsVisit {
1262 1257
  public:
1263 1258

	
1264 1259
    ///The traits class.
1265 1260
    typedef TR Traits;
1266 1261

	
1267 1262
    ///The type of the digraph the algorithm runs on.
1268 1263
    typedef typename Traits::Digraph Digraph;
1269 1264

	
1270 1265
    ///The visitor type used by the algorithm.
1271 1266
    typedef VS Visitor;
1272 1267

	
1273 1268
    ///The type of the map that indicates which nodes are reached.
1274 1269
    typedef typename Traits::ReachedMap ReachedMap;
1275 1270

	
1276 1271
  private:
1277 1272

	
1278 1273
    typedef typename Digraph::Node Node;
1279 1274
    typedef typename Digraph::NodeIt NodeIt;
1280 1275
    typedef typename Digraph::Arc Arc;
1281 1276
    typedef typename Digraph::OutArcIt OutArcIt;
1282 1277

	
1283 1278
    //Pointer to the underlying digraph.
1284 1279
    const Digraph *_digraph;
1285 1280
    //Pointer to the visitor object.
1286 1281
    Visitor *_visitor;
1287 1282
    //Pointer to the map of reached status of the nodes.
1288 1283
    ReachedMap *_reached;
1289 1284
    //Indicates if _reached is locally allocated (true) or not.
1290 1285
    bool local_reached;
1291 1286

	
1292 1287
    std::vector<typename Digraph::Arc> _stack;
1293 1288
    int _stack_head;
1294 1289

	
1295 1290
    //Creates the maps if necessary.
1296 1291
    void create_maps() {
1297 1292
      if(!_reached) {
1298 1293
        local_reached = true;
1299 1294
        _reached = Traits::createReachedMap(*_digraph);
1300 1295
      }
1301 1296
    }
1302 1297

	
1303 1298
  protected:
1304 1299

	
1305 1300
    DfsVisit() {}
1306 1301

	
1307 1302
  public:
1308 1303

	
1309 1304
    typedef DfsVisit Create;
1310 1305

	
1311 1306
    /// \name Named Template Parameters
1312 1307

	
1313 1308
    ///@{
1314 1309
    template <class T>
1315 1310
    struct SetReachedMapTraits : public Traits {
1316 1311
      typedef T ReachedMap;
1317 1312
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1318 1313
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1319 1314
        return 0; // ignore warnings
1320 1315
      }
1321 1316
    };
1322 1317
    /// \brief \ref named-templ-param "Named parameter" for setting
1323 1318
    /// ReachedMap type.
1324 1319
    ///
1325 1320
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1326 1321
    template <class T>
1327 1322
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1328 1323
                                            SetReachedMapTraits<T> > {
1329 1324
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1330 1325
    };
1331 1326
    ///@}
1332 1327

	
1333 1328
  public:
1334 1329

	
1335 1330
    /// \brief Constructor.
1336 1331
    ///
1337 1332
    /// Constructor.
1338 1333
    ///
1339 1334
    /// \param digraph The digraph the algorithm runs on.
1340 1335
    /// \param visitor The visitor object of the algorithm.
1341 1336
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1342 1337
      : _digraph(&digraph), _visitor(&visitor),
1343 1338
        _reached(0), local_reached(false) {}
1344 1339

	
1345 1340
    /// \brief Destructor.
1346 1341
    ~DfsVisit() {
1347 1342
      if(local_reached) delete _reached;
1348 1343
    }
1349 1344

	
1350 1345
    /// \brief Sets the map that indicates which nodes are reached.
1351 1346
    ///
1352 1347
    /// Sets the map that indicates which nodes are reached.
1353 1348
    /// If you don't use this function before calling \ref run(Node) "run()"
1354 1349
    /// or \ref init(), an instance will be allocated automatically.
1355 1350
    /// The destructor deallocates this automatically allocated map,
1356 1351
    /// of course.
1357 1352
    /// \return <tt> (*this) </tt>
1358 1353
    DfsVisit &reachedMap(ReachedMap &m) {
1359 1354
      if(local_reached) {
1360 1355
        delete _reached;
1361 1356
        local_reached=false;
1362 1357
      }
1363 1358
      _reached = &m;
1364 1359
      return *this;
1365 1360
    }
1366 1361

	
1367 1362
  public:
1368 1363

	
1369 1364
    /// \name Execution Control
1370 1365
    /// The simplest way to execute the DFS algorithm is to use one of the
1371 1366
    /// member functions called \ref run(Node) "run()".\n
1372 1367
    /// If you need more control on the execution, first you have to call
1373 1368
    /// \ref init(), then you can add a source node with \ref addSource()
1374 1369
    /// and perform the actual computation with \ref start().
1375 1370
    /// This procedure can be repeated if there are nodes that have not
1376 1371
    /// been reached.
1377 1372

	
1378 1373
    /// @{
1379 1374

	
1380 1375
    /// \brief Initializes the internal data structures.
1381 1376
    ///
1382 1377
    /// Initializes the internal data structures.
1383 1378
    void init() {
1384 1379
      create_maps();
1385 1380
      _stack.resize(countNodes(*_digraph));
1386 1381
      _stack_head = -1;
1387 1382
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1388 1383
        _reached->set(u, false);
1389 1384
      }
1390 1385
    }
1391 1386

	
1392 1387
    /// \brief Adds a new source node.
1393 1388
    ///
1394 1389
    /// Adds a new source node to the set of nodes to be processed.
1395 1390
    ///
1396 1391
    /// \pre The stack must be empty. Otherwise the algorithm gives
1397 1392
    /// wrong results. (One of the outgoing arcs of all the source nodes
1398 1393
    /// except for the last one will not be visited and distances will
1399 1394
    /// also be wrong.)
1400 1395
    void addSource(Node s)
1401 1396
    {
1402 1397
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1403 1398
      if(!(*_reached)[s]) {
1404 1399
          _reached->set(s,true);
1405 1400
          _visitor->start(s);
1406 1401
          _visitor->reach(s);
1407 1402
          Arc e;
1408 1403
          _digraph->firstOut(e, s);
1409 1404
          if (e != INVALID) {
1410 1405
            _stack[++_stack_head] = e;
1411 1406
          } else {
1412 1407
            _visitor->leave(s);
1413 1408
            _visitor->stop(s);
1414 1409
          }
1415 1410
        }
1416 1411
    }
1417 1412

	
1418 1413
    /// \brief Processes the next arc.
1419 1414
    ///
1420 1415
    /// Processes the next arc.
1421 1416
    ///
1422 1417
    /// \return The processed arc.
1423 1418
    ///
1424 1419
    /// \pre The stack must not be empty.
1425 1420
    Arc processNextArc() {
1426 1421
      Arc e = _stack[_stack_head];
1427 1422
      Node m = _digraph->target(e);
1428 1423
      if(!(*_reached)[m]) {
1429 1424
        _visitor->discover(e);
1430 1425
        _visitor->reach(m);
1431 1426
        _reached->set(m, true);
1432 1427
        _digraph->firstOut(_stack[++_stack_head], m);
1433 1428
      } else {
1434 1429
        _visitor->examine(e);
1435 1430
        m = _digraph->source(e);
1436 1431
        _digraph->nextOut(_stack[_stack_head]);
1437 1432
      }
1438 1433
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1439 1434
        _visitor->leave(m);
1440 1435
        --_stack_head;
1441 1436
        if (_stack_head >= 0) {
1442 1437
          _visitor->backtrack(_stack[_stack_head]);
1443 1438
          m = _digraph->source(_stack[_stack_head]);
1444 1439
          _digraph->nextOut(_stack[_stack_head]);
1445 1440
        } else {
1446 1441
          _visitor->stop(m);
1447 1442
        }
1448 1443
      }
1449 1444
      return e;
1450 1445
    }
1451 1446

	
1452 1447
    /// \brief Next arc to be processed.
1453 1448
    ///
1454 1449
    /// Next arc to be processed.
1455 1450
    ///
1456 1451
    /// \return The next arc to be processed or INVALID if the stack is
1457 1452
    /// empty.
1458 1453
    Arc nextArc() const {
1459 1454
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1460 1455
    }
1461 1456

	
1462 1457
    /// \brief Returns \c false if there are nodes
1463 1458
    /// to be processed.
1464 1459
    ///
1465 1460
    /// Returns \c false if there are nodes
1466 1461
    /// to be processed in the queue (stack).
1467 1462
    bool emptyQueue() const { return _stack_head < 0; }
1468 1463

	
1469 1464
    /// \brief Returns the number of the nodes to be processed.
1470 1465
    ///
1471 1466
    /// Returns the number of the nodes to be processed in the queue (stack).
1472 1467
    int queueSize() const { return _stack_head + 1; }
1473 1468

	
1474 1469
    /// \brief Executes the algorithm.
1475 1470
    ///
1476 1471
    /// Executes the algorithm.
1477 1472
    ///
1478 1473
    /// This method runs the %DFS algorithm from the root node
1479 1474
    /// in order to compute the %DFS path to each node.
1480 1475
    ///
1481 1476
    /// The algorithm computes
1482 1477
    /// - the %DFS tree,
1483 1478
    /// - the distance of each node from the root in the %DFS tree.
1484 1479
    ///
1485 1480
    /// \pre init() must be called and a root node should be
1486 1481
    /// added with addSource() before using this function.
1487 1482
    ///
1488 1483
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1489 1484
    /// \code
1490 1485
    ///   while ( !d.emptyQueue() ) {
1491 1486
    ///     d.processNextArc();
1492 1487
    ///   }
1493 1488
    /// \endcode
1494 1489
    void start() {
1495 1490
      while ( !emptyQueue() ) processNextArc();
1496 1491
    }
1497 1492

	
1498 1493
    /// \brief Executes the algorithm until the given target node is reached.
1499 1494
    ///
1500 1495
    /// Executes the algorithm until the given target node is reached.
1501 1496
    ///
1502 1497
    /// This method runs the %DFS algorithm from the root node
1503 1498
    /// in order to compute the DFS path to \c t.
1504 1499
    ///
1505 1500
    /// The algorithm computes
1506 1501
    /// - the %DFS path to \c t,
1507 1502
    /// - the distance of \c t from the root in the %DFS tree.
1508 1503
    ///
1509 1504
    /// \pre init() must be called and a root node should be added
1510 1505
    /// with addSource() before using this function.
1511 1506
    void start(Node t) {
1512 1507
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1513 1508
        processNextArc();
1514 1509
    }
1515 1510

	
1516 1511
    /// \brief Executes the algorithm until a condition is met.
1517 1512
    ///
1518 1513
    /// Executes the algorithm until a condition is met.
1519 1514
    ///
1520 1515
    /// This method runs the %DFS algorithm from the root node
1521 1516
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1522 1517
    ///
1523 1518
    /// \param am A \c bool (or convertible) arc map. The algorithm
1524 1519
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1525 1520
    ///
1526 1521
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1527 1522
    /// \c INVALID if no such arc was found.
1528 1523
    ///
1529 1524
    /// \pre init() must be called and a root node should be added
1530 1525
    /// with addSource() before using this function.
1531 1526
    ///
1532 1527
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1533 1528
    /// not a node map.
1534 1529
    template <typename AM>
1535 1530
    Arc start(const AM &am) {
1536 1531
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1537 1532
        processNextArc();
1538 1533
      return emptyQueue() ? INVALID : _stack[_stack_head];
1539 1534
    }
1540 1535

	
1541 1536
    /// \brief Runs the algorithm from the given source node.
1542 1537
    ///
1543 1538
    /// This method runs the %DFS algorithm from node \c s.
1544 1539
    /// in order to compute the DFS path to each node.
1545 1540
    ///
1546 1541
    /// The algorithm computes
1547 1542
    /// - the %DFS tree,
1548 1543
    /// - the distance of each node from the root in the %DFS tree.
1549 1544
    ///
1550 1545
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1551 1546
    ///\code
1552 1547
    ///   d.init();
1553 1548
    ///   d.addSource(s);
1554 1549
    ///   d.start();
1555 1550
    ///\endcode
1556 1551
    void run(Node s) {
1557 1552
      init();
1558 1553
      addSource(s);
1559 1554
      start();
1560 1555
    }
1561 1556

	
1562 1557
    /// \brief Finds the %DFS path between \c s and \c t.
1563 1558

	
1564 1559
    /// This method runs the %DFS algorithm from node \c s
1565 1560
    /// in order to compute the DFS path to node \c t
1566 1561
    /// (it stops searching when \c t is processed).
1567 1562
    ///
1568 1563
    /// \return \c true if \c t is reachable form \c s.
1569 1564
    ///
1570 1565
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1571 1566
    /// just a shortcut of the following code.
1572 1567
    ///\code
1573 1568
    ///   d.init();
1574 1569
    ///   d.addSource(s);
1575 1570
    ///   d.start(t);
1576 1571
    ///\endcode
1577 1572
    bool run(Node s,Node t) {
1578 1573
      init();
1579 1574
      addSource(s);
1580 1575
      start(t);
1581 1576
      return reached(t);
1582 1577
    }
1583 1578

	
1584 1579
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1585 1580

	
1586 1581
    /// This method runs the %DFS algorithm in order to
1587 1582
    /// compute the %DFS path to each node.
1588 1583
    ///
1589 1584
    /// The algorithm computes
1590 1585
    /// - the %DFS tree (forest),
1591 1586
    /// - the distance of each node from the root(s) in the %DFS tree.
1592 1587
    ///
1593 1588
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1594 1589
    ///\code
1595 1590
    ///   d.init();
1596 1591
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1597 1592
    ///     if (!d.reached(n)) {
1598 1593
    ///       d.addSource(n);
1599 1594
    ///       d.start();
1600 1595
    ///     }
1601 1596
    ///   }
1602 1597
    ///\endcode
1603 1598
    void run() {
1604 1599
      init();
1605 1600
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1606 1601
        if (!reached(it)) {
1607 1602
          addSource(it);
1608 1603
          start();
1609 1604
        }
1610 1605
      }
1611 1606
    }
1612 1607

	
1613 1608
    ///@}
1614 1609

	
1615 1610
    /// \name Query Functions
1616 1611
    /// The results of the DFS algorithm can be obtained using these
1617 1612
    /// functions.\n
1618 1613
    /// Either \ref run(Node) "run()" or \ref start() should be called
1619 1614
    /// before using them.
1620 1615

	
1621 1616
    ///@{
1622 1617

	
1623
    /// \brief Checks if a node is reached from the root(s).
1618
    /// \brief Checks if the given node is reached from the root(s).
1624 1619
    ///
1625 1620
    /// Returns \c true if \c v is reached from the root(s).
1626 1621
    ///
1627 1622
    /// \pre Either \ref run(Node) "run()" or \ref init()
1628 1623
    /// must be called before using this function.
1629 1624
    bool reached(Node v) const { return (*_reached)[v]; }
1630 1625

	
1631 1626
    ///@}
1632 1627

	
1633 1628
  };
1634 1629

	
1635 1630
} //END OF NAMESPACE LEMON
1636 1631

	
1637 1632
#endif
Ignore white space 24576 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
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_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename V>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \e
44 44
    typedef V Value;
45 45
    /// \brief Gives back the zero value of the type.
46 46
    static Value zero() {
47 47
      return static_cast<Value>(0);
48 48
    }
49 49
    /// \brief Gives back the sum of the given two elements.
50 50
    static Value plus(const Value& left, const Value& right) {
51 51
      return left + right;
52 52
    }
53 53
    /// \brief Gives back true only if the first value is less than the second.
54 54
    static bool less(const Value& left, const Value& right) {
55 55
      return left < right;
56 56
    }
57 57
  };
58 58

	
59 59
  ///Default traits class of Dijkstra class.
60 60

	
61 61
  ///Default traits class of Dijkstra class.
62 62
  ///\tparam GR The type of the digraph.
63 63
  ///\tparam LEN The type of the length map.
64 64
  template<typename GR, typename LEN>
65 65
  struct DijkstraDefaultTraits
66 66
  {
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75
    ///The type of the length of the arcs.
75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
82 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
83 83

	
84 84
    /// The cross reference type used by the heap.
85 85

	
86 86
    /// The cross reference type used by the heap.
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

	
91 91
    ///This function instantiates a \ref HeapCrossRef.
92 92
    /// \param g is the digraph, to which we would like to define the
93 93
    /// \ref HeapCrossRef.
94 94
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
95 95
    {
96 96
      return new HeapCrossRef(g);
97 97
    }
98 98

	
99 99
    ///The heap type used by the %Dijkstra algorithm.
100 100

	
101 101
    ///The heap type used by the Dijkstra algorithm.
102 102
    ///
103 103
    ///\sa BinHeap
104 104
    ///\sa Dijkstra
105 105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
106 106
    ///Instantiates a \c Heap.
107 107

	
108 108
    ///This function instantiates a \ref Heap.
109 109
    static Heap *createHeap(HeapCrossRef& r)
110 110
    {
111 111
      return new Heap(r);
112 112
    }
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
126 126
    static PredMap *createPredMap(const Digraph &g)
127 127
    {
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135 135
    ///By default it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
141 141
    ///we would like to define the \ref ProcessedMap.
142 142
#ifdef DOXYGEN
143 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
144 144
#else
145 145
    static ProcessedMap *createProcessedMap(const Digraph &)
146 146
#endif
147 147
    {
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
161 161
    static DistMap *createDistMap(const Digraph &g)
162 162
    {
163 163
      return new DistMap(g);
164 164
    }
165 165
  };
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173
  ///when all arc lengths are non-negative. If there are negative lengths,
174
  ///the BellmanFord algorithm should be used instead.
175
  ///
172 176
  ///The arc lengths are passed to the algorithm using a
173 177
  ///\ref concepts::ReadMap "ReadMap",
174 178
  ///so it is easy to change it to any kind of length.
175 179
  ///The type of the length is determined by the
176 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
177 181
  ///It is also possible to change the underlying priority heap.
178 182
  ///
179 183
  ///There is also a \ref dijkstra() "function-type interface" for the
180 184
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
181 185
  ///it can be used easier.
182 186
  ///
183 187
  ///\tparam GR The type of the digraph the algorithm runs on.
184 188
  ///The default type is \ref ListDigraph.
185 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
186 190
  ///the lengths of the arcs.
187 191
  ///It is read once for each arc, so the map may involve in
188 192
  ///relatively time consuming process to compute the arc lengths if
189 193
  ///it is necessary. The default map type is \ref
190 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
191 195
#ifdef DOXYGEN
192 196
  template <typename GR, typename LEN, typename TR>
193 197
#else
194 198
  template <typename GR=ListDigraph,
195 199
            typename LEN=typename GR::template ArcMap<int>,
196 200
            typename TR=DijkstraDefaultTraits<GR,LEN> >
197 201
#endif
198 202
  class Dijkstra {
199 203
  public:
200 204

	
201 205
    ///The type of the digraph the algorithm runs on.
202 206
    typedef typename TR::Digraph Digraph;
203 207

	
204
    ///The type of the length of the arcs.
208
    ///The type of the arc lengths.
205 209
    typedef typename TR::LengthMap::Value Value;
206 210
    ///The type of the map that stores the arc lengths.
207 211
    typedef typename TR::LengthMap LengthMap;
208 212
    ///\brief The type of the map that stores the predecessor arcs of the
209 213
    ///shortest paths.
210 214
    typedef typename TR::PredMap PredMap;
211 215
    ///The type of the map that stores the distances of the nodes.
212 216
    typedef typename TR::DistMap DistMap;
213 217
    ///The type of the map that indicates which nodes are processed.
214 218
    typedef typename TR::ProcessedMap ProcessedMap;
215 219
    ///The type of the paths.
216 220
    typedef PredMapPath<Digraph, PredMap> Path;
217 221
    ///The cross reference type used for the current heap.
218 222
    typedef typename TR::HeapCrossRef HeapCrossRef;
219 223
    ///The heap type used by the algorithm.
220 224
    typedef typename TR::Heap Heap;
221 225
    ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class"
222 226
    ///of the algorithm.
223 227
    typedef typename TR::OperationTraits OperationTraits;
224 228

	
225 229
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
226 230
    typedef TR Traits;
227 231

	
228 232
  private:
229 233

	
230 234
    typedef typename Digraph::Node Node;
231 235
    typedef typename Digraph::NodeIt NodeIt;
232 236
    typedef typename Digraph::Arc Arc;
233 237
    typedef typename Digraph::OutArcIt OutArcIt;
234 238

	
235 239
    //Pointer to the underlying digraph.
236 240
    const Digraph *G;
237 241
    //Pointer to the length map.
238 242
    const LengthMap *_length;
239 243
    //Pointer to the map of predecessors arcs.
240 244
    PredMap *_pred;
241 245
    //Indicates if _pred is locally allocated (true) or not.
242 246
    bool local_pred;
243 247
    //Pointer to the map of distances.
244 248
    DistMap *_dist;
245 249
    //Indicates if _dist is locally allocated (true) or not.
246 250
    bool local_dist;
247 251
    //Pointer to the map of processed status of the nodes.
248 252
    ProcessedMap *_processed;
249 253
    //Indicates if _processed is locally allocated (true) or not.
250 254
    bool local_processed;
251 255
    //Pointer to the heap cross references.
252 256
    HeapCrossRef *_heap_cross_ref;
253 257
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
254 258
    bool local_heap_cross_ref;
255 259
    //Pointer to the heap.
256 260
    Heap *_heap;
257 261
    //Indicates if _heap is locally allocated (true) or not.
258 262
    bool local_heap;
259 263

	
260 264
    //Creates the maps if necessary.
261 265
    void create_maps()
262 266
    {
263 267
      if(!_pred) {
264 268
        local_pred = true;
265 269
        _pred = Traits::createPredMap(*G);
266 270
      }
267 271
      if(!_dist) {
268 272
        local_dist = true;
269 273
        _dist = Traits::createDistMap(*G);
270 274
      }
271 275
      if(!_processed) {
272 276
        local_processed = true;
273 277
        _processed = Traits::createProcessedMap(*G);
274 278
      }
275 279
      if (!_heap_cross_ref) {
276 280
        local_heap_cross_ref = true;
277 281
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
278 282
      }
279 283
      if (!_heap) {
280 284
        local_heap = true;
281 285
        _heap = Traits::createHeap(*_heap_cross_ref);
282 286
      }
283 287
    }
284 288

	
285 289
  public:
286 290

	
287 291
    typedef Dijkstra Create;
288 292

	
289 293
    ///\name Named Template Parameters
290 294

	
291 295
    ///@{
292 296

	
293 297
    template <class T>
294 298
    struct SetPredMapTraits : public Traits {
295 299
      typedef T PredMap;
296 300
      static PredMap *createPredMap(const Digraph &)
297 301
      {
298 302
        LEMON_ASSERT(false, "PredMap is not initialized");
299 303
        return 0; // ignore warnings
300 304
      }
301 305
    };
302 306
    ///\brief \ref named-templ-param "Named parameter" for setting
303 307
    ///\c PredMap type.
304 308
    ///
305 309
    ///\ref named-templ-param "Named parameter" for setting
306 310
    ///\c PredMap type.
307
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
311
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
308 312
    template <class T>
309 313
    struct SetPredMap
310 314
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
311 315
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
312 316
    };
313 317

	
314 318
    template <class T>
315 319
    struct SetDistMapTraits : public Traits {
316 320
      typedef T DistMap;
317 321
      static DistMap *createDistMap(const Digraph &)
318 322
      {
319 323
        LEMON_ASSERT(false, "DistMap is not initialized");
320 324
        return 0; // ignore warnings
321 325
      }
322 326
    };
323 327
    ///\brief \ref named-templ-param "Named parameter" for setting
324 328
    ///\c DistMap type.
325 329
    ///
326 330
    ///\ref named-templ-param "Named parameter" for setting
327 331
    ///\c DistMap type.
328
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
332
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
329 333
    template <class T>
330 334
    struct SetDistMap
331 335
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
332 336
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
333 337
    };
334 338

	
335 339
    template <class T>
336 340
    struct SetProcessedMapTraits : public Traits {
337 341
      typedef T ProcessedMap;
338 342
      static ProcessedMap *createProcessedMap(const Digraph &)
339 343
      {
340 344
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
341 345
        return 0; // ignore warnings
342 346
      }
343 347
    };
344 348
    ///\brief \ref named-templ-param "Named parameter" for setting
345 349
    ///\c ProcessedMap type.
346 350
    ///
347 351
    ///\ref named-templ-param "Named parameter" for setting
348 352
    ///\c ProcessedMap type.
349
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
353
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
350 354
    template <class T>
351 355
    struct SetProcessedMap
352 356
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
353 357
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
354 358
    };
355 359

	
356 360
    struct SetStandardProcessedMapTraits : public Traits {
357 361
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
358 362
      static ProcessedMap *createProcessedMap(const Digraph &g)
359 363
      {
360 364
        return new ProcessedMap(g);
361 365
      }
362 366
    };
363 367
    ///\brief \ref named-templ-param "Named parameter" for setting
364 368
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
365 369
    ///
366 370
    ///\ref named-templ-param "Named parameter" for setting
367 371
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
368 372
    ///If you don't set it explicitly, it will be automatically allocated.
369 373
    struct SetStandardProcessedMap
370 374
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
371 375
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
372 376
      Create;
373 377
    };
374 378

	
375 379
    template <class H, class CR>
376 380
    struct SetHeapTraits : public Traits {
377 381
      typedef CR HeapCrossRef;
378 382
      typedef H Heap;
379 383
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
380 384
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
381 385
        return 0; // ignore warnings
382 386
      }
383 387
      static Heap *createHeap(HeapCrossRef &)
384 388
      {
385 389
        LEMON_ASSERT(false, "Heap is not initialized");
386 390
        return 0; // ignore warnings
387 391
      }
388 392
    };
389 393
    ///\brief \ref named-templ-param "Named parameter" for setting
390 394
    ///heap and cross reference types
391 395
    ///
392 396
    ///\ref named-templ-param "Named parameter" for setting heap and cross
393 397
    ///reference types. If this named parameter is used, then external
394 398
    ///heap and cross reference objects must be passed to the algorithm
395 399
    ///using the \ref heap() function before calling \ref run(Node) "run()"
396 400
    ///or \ref init().
397 401
    ///\sa SetStandardHeap
398 402
    template <class H, class CR = typename Digraph::template NodeMap<int> >
399 403
    struct SetHeap
400 404
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
401 405
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
402 406
    };
403 407

	
404 408
    template <class H, class CR>
405 409
    struct SetStandardHeapTraits : public Traits {
406 410
      typedef CR HeapCrossRef;
407 411
      typedef H Heap;
408 412
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
409 413
        return new HeapCrossRef(G);
410 414
      }
411 415
      static Heap *createHeap(HeapCrossRef &R)
412 416
      {
413 417
        return new Heap(R);
414 418
      }
415 419
    };
416 420
    ///\brief \ref named-templ-param "Named parameter" for setting
417 421
    ///heap and cross reference types with automatic allocation
418 422
    ///
419 423
    ///\ref named-templ-param "Named parameter" for setting heap and cross
420 424
    ///reference types with automatic allocation.
421 425
    ///They should have standard constructor interfaces to be able to
422 426
    ///automatically created by the algorithm (i.e. the digraph should be
423 427
    ///passed to the constructor of the cross reference and the cross
424 428
    ///reference should be passed to the constructor of the heap).
425 429
    ///However external heap and cross reference objects could also be
426 430
    ///passed to the algorithm using the \ref heap() function before
427 431
    ///calling \ref run(Node) "run()" or \ref init().
428 432
    ///\sa SetHeap
429 433
    template <class H, class CR = typename Digraph::template NodeMap<int> >
430 434
    struct SetStandardHeap
431 435
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
432 436
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
433 437
      Create;
434 438
    };
435 439

	
436 440
    template <class T>
437 441
    struct SetOperationTraitsTraits : public Traits {
438 442
      typedef T OperationTraits;
439 443
    };
440 444

	
441 445
    /// \brief \ref named-templ-param "Named parameter" for setting
442 446
    ///\c OperationTraits type
443 447
    ///
444 448
    ///\ref named-templ-param "Named parameter" for setting
445 449
    ///\c OperationTraits type.
450
    /// For more information see \ref DijkstraDefaultOperationTraits.
446 451
    template <class T>
447 452
    struct SetOperationTraits
448 453
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
449 454
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
450 455
      Create;
451 456
    };
452 457

	
453 458
    ///@}
454 459

	
455 460
  protected:
456 461

	
457 462
    Dijkstra() {}
458 463

	
459 464
  public:
460 465

	
461 466
    ///Constructor.
462 467

	
463 468
    ///Constructor.
464 469
    ///\param g The digraph the algorithm runs on.
465 470
    ///\param length The length map used by the algorithm.
466 471
    Dijkstra(const Digraph& g, const LengthMap& length) :
467 472
      G(&g), _length(&length),
468 473
      _pred(NULL), local_pred(false),
469 474
      _dist(NULL), local_dist(false),
470 475
      _processed(NULL), local_processed(false),
471 476
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
472 477
      _heap(NULL), local_heap(false)
473 478
    { }
474 479

	
475 480
    ///Destructor.
476 481
    ~Dijkstra()
477 482
    {
478 483
      if(local_pred) delete _pred;
479 484
      if(local_dist) delete _dist;
480 485
      if(local_processed) delete _processed;
481 486
      if(local_heap_cross_ref) delete _heap_cross_ref;
482 487
      if(local_heap) delete _heap;
483 488
    }
484 489

	
485 490
    ///Sets the length map.
486 491

	
487 492
    ///Sets the length map.
488 493
    ///\return <tt> (*this) </tt>
489 494
    Dijkstra &lengthMap(const LengthMap &m)
490 495
    {
491 496
      _length = &m;
492 497
      return *this;
493 498
    }
494 499

	
495 500
    ///Sets the map that stores the predecessor arcs.
496 501

	
497 502
    ///Sets the map that stores the predecessor arcs.
498 503
    ///If you don't use this function before calling \ref run(Node) "run()"
499 504
    ///or \ref init(), an instance will be allocated automatically.
500 505
    ///The destructor deallocates this automatically allocated map,
501 506
    ///of course.
502 507
    ///\return <tt> (*this) </tt>
503 508
    Dijkstra &predMap(PredMap &m)
504 509
    {
505 510
      if(local_pred) {
506 511
        delete _pred;
507 512
        local_pred=false;
508 513
      }
509 514
      _pred = &m;
510 515
      return *this;
511 516
    }
512 517

	
513 518
    ///Sets the map that indicates which nodes are processed.
514 519

	
515 520
    ///Sets the map that indicates which nodes are processed.
516 521
    ///If you don't use this function before calling \ref run(Node) "run()"
517 522
    ///or \ref init(), an instance will be allocated automatically.
518 523
    ///The destructor deallocates this automatically allocated map,
519 524
    ///of course.
520 525
    ///\return <tt> (*this) </tt>
521 526
    Dijkstra &processedMap(ProcessedMap &m)
522 527
    {
523 528
      if(local_processed) {
524 529
        delete _processed;
525 530
        local_processed=false;
526 531
      }
527 532
      _processed = &m;
528 533
      return *this;
529 534
    }
530 535

	
531 536
    ///Sets the map that stores the distances of the nodes.
532 537

	
533 538
    ///Sets the map that stores the distances of the nodes calculated by the
534 539
    ///algorithm.
535 540
    ///If you don't use this function before calling \ref run(Node) "run()"
536 541
    ///or \ref init(), an instance will be allocated automatically.
537 542
    ///The destructor deallocates this automatically allocated map,
538 543
    ///of course.
539 544
    ///\return <tt> (*this) </tt>
540 545
    Dijkstra &distMap(DistMap &m)
541 546
    {
542 547
      if(local_dist) {
543 548
        delete _dist;
544 549
        local_dist=false;
545 550
      }
546 551
      _dist = &m;
547 552
      return *this;
548 553
    }
549 554

	
550 555
    ///Sets the heap and the cross reference used by algorithm.
551 556

	
552 557
    ///Sets the heap and the cross reference used by algorithm.
553 558
    ///If you don't use this function before calling \ref run(Node) "run()"
554 559
    ///or \ref init(), heap and cross reference instances will be
555 560
    ///allocated automatically.
556 561
    ///The destructor deallocates these automatically allocated objects,
557 562
    ///of course.
558 563
    ///\return <tt> (*this) </tt>
559 564
    Dijkstra &heap(Heap& hp, HeapCrossRef &cr)
560 565
    {
561 566
      if(local_heap_cross_ref) {
562 567
        delete _heap_cross_ref;
563 568
        local_heap_cross_ref=false;
564 569
      }
565 570
      _heap_cross_ref = &cr;
566 571
      if(local_heap) {
567 572
        delete _heap;
568 573
        local_heap=false;
569 574
      }
570 575
      _heap = &hp;
571 576
      return *this;
572 577
    }
573 578

	
574 579
  private:
575 580

	
576 581
    void finalizeNodeData(Node v,Value dst)
577 582
    {
578 583
      _processed->set(v,true);
579 584
      _dist->set(v, dst);
580 585
    }
581 586

	
582 587
  public:
583 588

	
584 589
    ///\name Execution Control
585 590
    ///The simplest way to execute the %Dijkstra algorithm is to use
586 591
    ///one of the member functions called \ref run(Node) "run()".\n
587 592
    ///If you need more control on the execution, first you have to call
588 593
    ///\ref init(), then you can add several source nodes with
589 594
    ///\ref addSource(). Finally the actual path computation can be
590 595
    ///performed with one of the \ref start() functions.
591 596

	
592 597
    ///@{
593 598

	
594 599
    ///\brief Initializes the internal data structures.
595 600
    ///
596 601
    ///Initializes the internal data structures.
597 602
    void init()
598 603
    {
599 604
      create_maps();
600 605
      _heap->clear();
601 606
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
602 607
        _pred->set(u,INVALID);
603 608
        _processed->set(u,false);
604 609
        _heap_cross_ref->set(u,Heap::PRE_HEAP);
605 610
      }
606 611
    }
607 612

	
608 613
    ///Adds a new source node.
609 614

	
610 615
    ///Adds a new source node to the priority heap.
611 616
    ///The optional second parameter is the initial distance of the node.
612 617
    ///
613 618
    ///The function checks if the node has already been added to the heap and
614 619
    ///it is pushed to the heap only if either it was not in the heap
615 620
    ///or the shortest path found till then is shorter than \c dst.
616 621
    void addSource(Node s,Value dst=OperationTraits::zero())
617 622
    {
618 623
      if(_heap->state(s) != Heap::IN_HEAP) {
619 624
        _heap->push(s,dst);
620 625
      } else if(OperationTraits::less((*_heap)[s], dst)) {
621 626
        _heap->set(s,dst);
622 627
        _pred->set(s,INVALID);
623 628
      }
624 629
    }
625 630

	
626 631
    ///Processes the next node in the priority heap
627 632

	
628 633
    ///Processes the next node in the priority heap.
629 634
    ///
630 635
    ///\return The processed node.
631 636
    ///
632 637
    ///\warning The priority heap must not be empty.
633 638
    Node processNextNode()
634 639
    {
635 640
      Node v=_heap->top();
636 641
      Value oldvalue=_heap->prio();
637 642
      _heap->pop();
638 643
      finalizeNodeData(v,oldvalue);
639 644

	
640 645
      for(OutArcIt e(*G,v); e!=INVALID; ++e) {
641 646
        Node w=G->target(e);
642 647
        switch(_heap->state(w)) {
643 648
        case Heap::PRE_HEAP:
644 649
          _heap->push(w,OperationTraits::plus(oldvalue, (*_length)[e]));
645 650
          _pred->set(w,e);
646 651
          break;
647 652
        case Heap::IN_HEAP:
648 653
          {
649 654
            Value newvalue = OperationTraits::plus(oldvalue, (*_length)[e]);
650 655
            if ( OperationTraits::less(newvalue, (*_heap)[w]) ) {
651 656
              _heap->decrease(w, newvalue);
652 657
              _pred->set(w,e);
653 658
            }
654 659
          }
655 660
          break;
656 661
        case Heap::POST_HEAP:
657 662
          break;
658 663
        }
659 664
      }
660 665
      return v;
661 666
    }
662 667

	
663 668
    ///The next node to be processed.
664 669

	
665 670
    ///Returns the next node to be processed or \c INVALID if the
666 671
    ///priority heap is empty.
667 672
    Node nextNode() const
668 673
    {
669 674
      return !_heap->empty()?_heap->top():INVALID;
670 675
    }
671 676

	
672 677
    ///Returns \c false if there are nodes to be processed.
673 678

	
674 679
    ///Returns \c false if there are nodes to be processed
675 680
    ///in the priority heap.
676 681
    bool emptyQueue() const { return _heap->empty(); }
677 682

	
678 683
    ///Returns the number of the nodes to be processed.
679 684

	
680 685
    ///Returns the number of the nodes to be processed
681 686
    ///in the priority heap.
682 687
    int queueSize() const { return _heap->size(); }
683 688

	
684 689
    ///Executes the algorithm.
685 690

	
686 691
    ///Executes the algorithm.
687 692
    ///
688 693
    ///This method runs the %Dijkstra algorithm from the root node(s)
689 694
    ///in order to compute the shortest path to each node.
690 695
    ///
691 696
    ///The algorithm computes
692 697
    ///- the shortest path tree (forest),
693 698
    ///- the distance of each node from the root(s).
694 699
    ///
695 700
    ///\pre init() must be called and at least one root node should be
696 701
    ///added with addSource() before using this function.
697 702
    ///
698 703
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
699 704
    ///\code
700 705
    ///  while ( !d.emptyQueue() ) {
701 706
    ///    d.processNextNode();
702 707
    ///  }
703 708
    ///\endcode
704 709
    void start()
705 710
    {
706 711
      while ( !emptyQueue() ) processNextNode();
707 712
    }
708 713

	
709 714
    ///Executes the algorithm until the given target node is processed.
710 715

	
711 716
    ///Executes the algorithm until the given target node is processed.
712 717
    ///
713 718
    ///This method runs the %Dijkstra algorithm from the root node(s)
714 719
    ///in order to compute the shortest path to \c t.
715 720
    ///
716 721
    ///The algorithm computes
717 722
    ///- the shortest path to \c t,
718 723
    ///- the distance of \c t from the root(s).
719 724
    ///
720 725
    ///\pre init() must be called and at least one root node should be
721 726
    ///added with addSource() before using this function.
722 727
    void start(Node t)
723 728
    {
724 729
      while ( !_heap->empty() && _heap->top()!=t ) processNextNode();
725 730
      if ( !_heap->empty() ) {
726 731
        finalizeNodeData(_heap->top(),_heap->prio());
727 732
        _heap->pop();
728 733
      }
729 734
    }
730 735

	
731 736
    ///Executes the algorithm until a condition is met.
732 737

	
733 738
    ///Executes the algorithm until a condition is met.
734 739
    ///
735 740
    ///This method runs the %Dijkstra algorithm from the root node(s) in
736 741
    ///order to compute the shortest path to a node \c v with
737 742
    /// <tt>nm[v]</tt> true, if such a node can be found.
738 743
    ///
739 744
    ///\param nm A \c bool (or convertible) node map. The algorithm
740 745
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
741 746
    ///
742 747
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
743 748
    ///\c INVALID if no such node was found.
744 749
    ///
745 750
    ///\pre init() must be called and at least one root node should be
746 751
    ///added with addSource() before using this function.
747 752
    template<class NodeBoolMap>
748 753
    Node start(const NodeBoolMap &nm)
749 754
    {
750 755
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
751 756
      if ( _heap->empty() ) return INVALID;
752 757
      finalizeNodeData(_heap->top(),_heap->prio());
753 758
      return _heap->top();
754 759
    }
755 760

	
756 761
    ///Runs the algorithm from the given source node.
757 762

	
758 763
    ///This method runs the %Dijkstra algorithm from node \c s
759 764
    ///in order to compute the shortest path to each node.
760 765
    ///
761 766
    ///The algorithm computes
762 767
    ///- the shortest path tree,
763 768
    ///- the distance of each node from the root.
764 769
    ///
765 770
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
766 771
    ///\code
767 772
    ///  d.init();
768 773
    ///  d.addSource(s);
769 774
    ///  d.start();
770 775
    ///\endcode
771 776
    void run(Node s) {
772 777
      init();
773 778
      addSource(s);
774 779
      start();
775 780
    }
776 781

	
777 782
    ///Finds the shortest path between \c s and \c t.
778 783

	
779 784
    ///This method runs the %Dijkstra algorithm from node \c s
780 785
    ///in order to compute the shortest path to node \c t
781 786
    ///(it stops searching when \c t is processed).
782 787
    ///
783 788
    ///\return \c true if \c t is reachable form \c s.
784 789
    ///
785 790
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
786 791
    ///shortcut of the following code.
787 792
    ///\code
788 793
    ///  d.init();
789 794
    ///  d.addSource(s);
790 795
    ///  d.start(t);
791 796
    ///\endcode
792 797
    bool run(Node s,Node t) {
793 798
      init();
794 799
      addSource(s);
795 800
      start(t);
796 801
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
797 802
    }
798 803

	
799 804
    ///@}
800 805

	
801 806
    ///\name Query Functions
802 807
    ///The results of the %Dijkstra algorithm can be obtained using these
803 808
    ///functions.\n
804
    ///Either \ref run(Node) "run()" or \ref start() should be called
809
    ///Either \ref run(Node) "run()" or \ref init() should be called
805 810
    ///before using them.
806 811

	
807 812
    ///@{
808 813

	
809
    ///The shortest path to a node.
814
    ///The shortest path to the given node.
810 815

	
811
    ///Returns the shortest path to a node.
816
    ///Returns the shortest path to the given node from the root(s).
812 817
    ///
813 818
    ///\warning \c t should be reached from the root(s).
814 819
    ///
815 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
816 821
    ///must be called before using this function.
817 822
    Path path(Node t) const { return Path(*G, *_pred, t); }
818 823

	
819
    ///The distance of a node from the root(s).
824
    ///The distance of the given node from the root(s).
820 825

	
821
    ///Returns the distance of a node from the root(s).
826
    ///Returns the distance of the given node from the root(s).
822 827
    ///
823 828
    ///\warning If node \c v is not reached from the root(s), then
824 829
    ///the return value of this function is undefined.
825 830
    ///
826 831
    ///\pre Either \ref run(Node) "run()" or \ref init()
827 832
    ///must be called before using this function.
828 833
    Value dist(Node v) const { return (*_dist)[v]; }
829 834

	
830
    ///Returns the 'previous arc' of the shortest path tree for a node.
831

	
835
    ///\brief Returns the 'previous arc' of the shortest path tree for
836
    ///the given node.
837
    ///
832 838
    ///This function returns the 'previous arc' of the shortest path
833 839
    ///tree for the node \c v, i.e. it returns the last arc of a
834 840
    ///shortest path from a root to \c v. It is \c INVALID if \c v
835 841
    ///is not reached from the root(s) or if \c v is a root.
836 842
    ///
837 843
    ///The shortest path tree used here is equal to the shortest path
838
    ///tree used in \ref predNode().
844
    ///tree used in \ref predNode() and \ref predMap().
839 845
    ///
840 846
    ///\pre Either \ref run(Node) "run()" or \ref init()
841 847
    ///must be called before using this function.
842 848
    Arc predArc(Node v) const { return (*_pred)[v]; }
843 849

	
844
    ///Returns the 'previous node' of the shortest path tree for a node.
845

	
850
    ///\brief Returns the 'previous node' of the shortest path tree for
851
    ///the given node.
852
    ///
846 853
    ///This function returns the 'previous node' of the shortest path
847 854
    ///tree for the node \c v, i.e. it returns the last but one node
848
    ///from a shortest path from a root to \c v. It is \c INVALID
855
    ///of a shortest path from a root to \c v. It is \c INVALID
849 856
    ///if \c v is not reached from the root(s) or if \c v is a root.
850 857
    ///
851 858
    ///The shortest path tree used here is equal to the shortest path
852
    ///tree used in \ref predArc().
859
    ///tree used in \ref predArc() and \ref predMap().
853 860
    ///
854 861
    ///\pre Either \ref run(Node) "run()" or \ref init()
855 862
    ///must be called before using this function.
856 863
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
857 864
                                  G->source((*_pred)[v]); }
858 865

	
859 866
    ///\brief Returns a const reference to the node map that stores the
860 867
    ///distances of the nodes.
861 868
    ///
862 869
    ///Returns a const reference to the node map that stores the distances
863 870
    ///of the nodes calculated by the algorithm.
864 871
    ///
865 872
    ///\pre Either \ref run(Node) "run()" or \ref init()
866 873
    ///must be called before using this function.
867 874
    const DistMap &distMap() const { return *_dist;}
868 875

	
869 876
    ///\brief Returns a const reference to the node map that stores the
870 877
    ///predecessor arcs.
871 878
    ///
872 879
    ///Returns a const reference to the node map that stores the predecessor
873
    ///arcs, which form the shortest path tree.
880
    ///arcs, which form the shortest path tree (forest).
874 881
    ///
875 882
    ///\pre Either \ref run(Node) "run()" or \ref init()
876 883
    ///must be called before using this function.
877 884
    const PredMap &predMap() const { return *_pred;}
878 885

	
879
    ///Checks if a node is reached from the root(s).
886
    ///Checks if the given node is reached from the root(s).
880 887

	
881 888
    ///Returns \c true if \c v is reached from the root(s).
882 889
    ///
883 890
    ///\pre Either \ref run(Node) "run()" or \ref init()
884 891
    ///must be called before using this function.
885 892
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
886 893
                                        Heap::PRE_HEAP; }
887 894

	
888 895
    ///Checks if a node is processed.
889 896

	
890 897
    ///Returns \c true if \c v is processed, i.e. the shortest
891 898
    ///path to \c v has already found.
892 899
    ///
893 900
    ///\pre Either \ref run(Node) "run()" or \ref init()
894 901
    ///must be called before using this function.
895 902
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
896 903
                                          Heap::POST_HEAP; }
897 904

	
898
    ///The current distance of a node from the root(s).
905
    ///The current distance of the given node from the root(s).
899 906

	
900
    ///Returns the current distance of a node from the root(s).
907
    ///Returns the current distance of the given node from the root(s).
901 908
    ///It may be decreased in the following processes.
902 909
    ///
903 910
    ///\pre Either \ref run(Node) "run()" or \ref init()
904 911
    ///must be called before using this function and
905 912
    ///node \c v must be reached but not necessarily processed.
906 913
    Value currentDist(Node v) const {
907 914
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
908 915
    }
909 916

	
910 917
    ///@}
911 918
  };
912 919

	
913 920

	
914 921
  ///Default traits class of dijkstra() function.
915 922

	
916 923
  ///Default traits class of dijkstra() function.
917 924
  ///\tparam GR The type of the digraph.
918 925
  ///\tparam LEN The type of the length map.
919 926
  template<class GR, class LEN>
920 927
  struct DijkstraWizardDefaultTraits
921 928
  {
922 929
    ///The type of the digraph the algorithm runs on.
923 930
    typedef GR Digraph;
924 931
    ///The type of the map that stores the arc lengths.
925 932

	
926 933
    ///The type of the map that stores the arc lengths.
927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
934
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
928 935
    typedef LEN LengthMap;
929
    ///The type of the length of the arcs.
936
    ///The type of the arc lengths.
930 937
    typedef typename LEN::Value Value;
931 938

	
932 939
    /// Operation traits for Dijkstra algorithm.
933 940

	
934 941
    /// This class defines the operations that are used in the algorithm.
935 942
    /// \see DijkstraDefaultOperationTraits
936 943
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
937 944

	
938 945
    /// The cross reference type used by the heap.
939 946

	
940 947
    /// The cross reference type used by the heap.
941 948
    /// Usually it is \c Digraph::NodeMap<int>.
942 949
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
943 950
    ///Instantiates a \ref HeapCrossRef.
944 951

	
945 952
    ///This function instantiates a \ref HeapCrossRef.
946 953
    /// \param g is the digraph, to which we would like to define the
947 954
    /// HeapCrossRef.
948 955
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
949 956
    {
950 957
      return new HeapCrossRef(g);
951 958
    }
952 959

	
953 960
    ///The heap type used by the Dijkstra algorithm.
954 961

	
955 962
    ///The heap type used by the Dijkstra algorithm.
956 963
    ///
957 964
    ///\sa BinHeap
958 965
    ///\sa Dijkstra
959 966
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
960 967
                    std::less<Value> > Heap;
961 968

	
962 969
    ///Instantiates a \ref Heap.
963 970

	
964 971
    ///This function instantiates a \ref Heap.
965 972
    /// \param r is the HeapCrossRef which is used.
966 973
    static Heap *createHeap(HeapCrossRef& r)
967 974
    {
968 975
      return new Heap(r);
969 976
    }
970 977

	
971 978
    ///\brief The type of the map that stores the predecessor
972 979
    ///arcs of the shortest paths.
973 980
    ///
974 981
    ///The type of the map that stores the predecessor
975 982
    ///arcs of the shortest paths.
976
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
983
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
977 984
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
978 985
    ///Instantiates a PredMap.
979 986

	
980 987
    ///This function instantiates a PredMap.
981 988
    ///\param g is the digraph, to which we would like to define the
982 989
    ///PredMap.
983 990
    static PredMap *createPredMap(const Digraph &g)
984 991
    {
985 992
      return new PredMap(g);
986 993
    }
987 994

	
988 995
    ///The type of the map that indicates which nodes are processed.
989 996

	
990 997
    ///The type of the map that indicates which nodes are processed.
991
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
998
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
992 999
    ///By default it is a NullMap.
993 1000
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
994 1001
    ///Instantiates a ProcessedMap.
995 1002

	
996 1003
    ///This function instantiates a ProcessedMap.
997 1004
    ///\param g is the digraph, to which
998 1005
    ///we would like to define the ProcessedMap.
999 1006
#ifdef DOXYGEN
1000 1007
    static ProcessedMap *createProcessedMap(const Digraph &g)
1001 1008
#else
1002 1009
    static ProcessedMap *createProcessedMap(const Digraph &)
1003 1010
#endif
1004 1011
    {
1005 1012
      return new ProcessedMap();
1006 1013
    }
1007 1014

	
1008 1015
    ///The type of the map that stores the distances of the nodes.
1009 1016

	
1010 1017
    ///The type of the map that stores the distances of the nodes.
1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1018
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1012 1019
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1013 1020
    ///Instantiates a DistMap.
1014 1021

	
1015 1022
    ///This function instantiates a DistMap.
1016 1023
    ///\param g is the digraph, to which we would like to define
1017 1024
    ///the DistMap
1018 1025
    static DistMap *createDistMap(const Digraph &g)
1019 1026
    {
1020 1027
      return new DistMap(g);
1021 1028
    }
1022 1029

	
1023 1030
    ///The type of the shortest paths.
1024 1031

	
1025 1032
    ///The type of the shortest paths.
1026
    ///It must meet the \ref concepts::Path "Path" concept.
1033
    ///It must conform to the \ref concepts::Path "Path" concept.
1027 1034
    typedef lemon::Path<Digraph> Path;
1028 1035
  };
1029 1036

	
1030 1037
  /// Default traits class used by DijkstraWizard
1031 1038

	
1032
  /// To make it easier to use Dijkstra algorithm
1033
  /// we have created a wizard class.
1034
  /// This \ref DijkstraWizard class needs default traits,
1035
  /// as well as the \ref Dijkstra class.
1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1037
  /// \ref DijkstraWizard class.
1039
  /// Default traits class used by DijkstraWizard.
1040
  /// \tparam GR The type of the digraph.
1041
  /// \tparam LEN The type of the length map.
1038 1042
  template<typename GR, typename LEN>
1039 1043
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1040 1044
  {
1041 1045
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1042 1046
  protected:
1043 1047
    //The type of the nodes in the digraph.
1044 1048
    typedef typename Base::Digraph::Node Node;
1045 1049

	
1046 1050
    //Pointer to the digraph the algorithm runs on.
1047 1051
    void *_g;
1048 1052
    //Pointer to the length map.
1049 1053
    void *_length;
1050 1054
    //Pointer to the map of processed nodes.
1051 1055
    void *_processed;
1052 1056
    //Pointer to the map of predecessors arcs.
1053 1057
    void *_pred;
1054 1058
    //Pointer to the map of distances.
1055 1059
    void *_dist;
1056 1060
    //Pointer to the shortest path to the target node.
1057 1061
    void *_path;
1058 1062
    //Pointer to the distance of the target node.
1059 1063
    void *_di;
1060 1064

	
1061 1065
  public:
1062 1066
    /// Constructor.
1063 1067

	
1064 1068
    /// This constructor does not require parameters, therefore it initiates
1065 1069
    /// all of the attributes to \c 0.
1066 1070
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1067 1071
                           _dist(0), _path(0), _di(0) {}
1068 1072

	
1069 1073
    /// Constructor.
1070 1074

	
1071 1075
    /// This constructor requires two parameters,
1072 1076
    /// others are initiated to \c 0.
1073 1077
    /// \param g The digraph the algorithm runs on.
1074 1078
    /// \param l The length map.
1075 1079
    DijkstraWizardBase(const GR &g,const LEN &l) :
1076 1080
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1077 1081
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&l))),
1078 1082
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1079 1083

	
1080 1084
  };
1081 1085

	
1082 1086
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1083 1087

	
1084 1088
  /// This auxiliary class is created to implement the
1085 1089
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1086 1090
  /// It does not have own \ref run(Node) "run()" method, it uses the
1087 1091
  /// functions and features of the plain \ref Dijkstra.
1088 1092
  ///
1089 1093
  /// This class should only be used through the \ref dijkstra() function,
1090 1094
  /// which makes it easier to use the algorithm.
1091 1095
  template<class TR>
1092 1096
  class DijkstraWizard : public TR
1093 1097
  {
1094 1098
    typedef TR Base;
1095 1099

	
1096
    ///The type of the digraph the algorithm runs on.
1097 1100
    typedef typename TR::Digraph Digraph;
1098 1101

	
1099 1102
    typedef typename Digraph::Node Node;
1100 1103
    typedef typename Digraph::NodeIt NodeIt;
1101 1104
    typedef typename Digraph::Arc Arc;
1102 1105
    typedef typename Digraph::OutArcIt OutArcIt;
1103 1106

	
1104
    ///The type of the map that stores the arc lengths.
1105 1107
    typedef typename TR::LengthMap LengthMap;
1106
    ///The type of the length of the arcs.
1107 1108
    typedef typename LengthMap::Value Value;
1108
    ///\brief The type of the map that stores the predecessor
1109
    ///arcs of the shortest paths.
1110 1109
    typedef typename TR::PredMap PredMap;
1111
    ///The type of the map that stores the distances of the nodes.
1112 1110
    typedef typename TR::DistMap DistMap;
1113
    ///The type of the map that indicates which nodes are processed.
1114 1111
    typedef typename TR::ProcessedMap ProcessedMap;
1115
    ///The type of the shortest paths
1116 1112
    typedef typename TR::Path Path;
1117
    ///The heap type used by the dijkstra algorithm.
1118 1113
    typedef typename TR::Heap Heap;
1119 1114

	
1120 1115
  public:
1121 1116

	
1122 1117
    /// Constructor.
1123 1118
    DijkstraWizard() : TR() {}
1124 1119

	
1125 1120
    /// Constructor that requires parameters.
1126 1121

	
1127 1122
    /// Constructor that requires parameters.
1128 1123
    /// These parameters will be the default values for the traits class.
1129 1124
    /// \param g The digraph the algorithm runs on.
1130 1125
    /// \param l The length map.
1131 1126
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1132 1127
      TR(g,l) {}
1133 1128

	
1134 1129
    ///Copy constructor
1135 1130
    DijkstraWizard(const TR &b) : TR(b) {}
1136 1131

	
1137 1132
    ~DijkstraWizard() {}
1138 1133

	
1139 1134
    ///Runs Dijkstra algorithm from the given source node.
1140 1135

	
1141 1136
    ///This method runs %Dijkstra algorithm from the given source node
1142 1137
    ///in order to compute the shortest path to each node.
1143 1138
    void run(Node s)
1144 1139
    {
1145 1140
      Dijkstra<Digraph,LengthMap,TR>
1146 1141
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1147 1142
             *reinterpret_cast<const LengthMap*>(Base::_length));
1148 1143
      if (Base::_pred)
1149 1144
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1150 1145
      if (Base::_dist)
1151 1146
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1152 1147
      if (Base::_processed)
1153 1148
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1154 1149
      dijk.run(s);
1155 1150
    }
1156 1151

	
1157 1152
    ///Finds the shortest path between \c s and \c t.
1158 1153

	
1159 1154
    ///This method runs the %Dijkstra algorithm from node \c s
1160 1155
    ///in order to compute the shortest path to node \c t
1161 1156
    ///(it stops searching when \c t is processed).
1162 1157
    ///
1163 1158
    ///\return \c true if \c t is reachable form \c s.
1164 1159
    bool run(Node s, Node t)
1165 1160
    {
1166 1161
      Dijkstra<Digraph,LengthMap,TR>
1167 1162
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1168 1163
             *reinterpret_cast<const LengthMap*>(Base::_length));
1169 1164
      if (Base::_pred)
1170 1165
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1171 1166
      if (Base::_dist)
1172 1167
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1173 1168
      if (Base::_processed)
1174 1169
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1175 1170
      dijk.run(s,t);
1176 1171
      if (Base::_path)
1177 1172
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1178 1173
      if (Base::_di)
1179 1174
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1180 1175
      return dijk.reached(t);
1181 1176
    }
1182 1177

	
1183 1178
    template<class T>
1184 1179
    struct SetPredMapBase : public Base {
1185 1180
      typedef T PredMap;
1186 1181
      static PredMap *createPredMap(const Digraph &) { return 0; };
1187 1182
      SetPredMapBase(const TR &b) : TR(b) {}
1188 1183
    };
1189
    ///\brief \ref named-func-param "Named parameter"
1190
    ///for setting PredMap object.
1184

	
1185
    ///\brief \ref named-templ-param "Named parameter" for setting
1186
    ///the predecessor map.
1191 1187
    ///
1192
    ///\ref named-func-param "Named parameter"
1193
    ///for setting PredMap object.
1188
    ///\ref named-templ-param "Named parameter" function for setting
1189
    ///the map that stores the predecessor arcs of the nodes.
1194 1190
    template<class T>
1195 1191
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1196 1192
    {
1197 1193
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1198 1194
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1199 1195
    }
1200 1196

	
1201 1197
    template<class T>
1202 1198
    struct SetDistMapBase : public Base {
1203 1199
      typedef T DistMap;
1204 1200
      static DistMap *createDistMap(const Digraph &) { return 0; };
1205 1201
      SetDistMapBase(const TR &b) : TR(b) {}
1206 1202
    };
1207
    ///\brief \ref named-func-param "Named parameter"
1208
    ///for setting DistMap object.
1203

	
1204
    ///\brief \ref named-templ-param "Named parameter" for setting
1205
    ///the distance map.
1209 1206
    ///
1210
    ///\ref named-func-param "Named parameter"
1211
    ///for setting DistMap object.
1207
    ///\ref named-templ-param "Named parameter" function for setting
1208
    ///the map that stores the distances of the nodes calculated
1209
    ///by the algorithm.
1212 1210
    template<class T>
1213 1211
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1214 1212
    {
1215 1213
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1216 1214
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1217 1215
    }
1218 1216

	
1219 1217
    template<class T>
1220 1218
    struct SetProcessedMapBase : public Base {
1221 1219
      typedef T ProcessedMap;
1222 1220
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1223 1221
      SetProcessedMapBase(const TR &b) : TR(b) {}
1224 1222
    };
1225
    ///\brief \ref named-func-param "Named parameter"
1226
    ///for setting ProcessedMap object.
1223

	
1224
    ///\brief \ref named-func-param "Named parameter" for setting
1225
    ///the processed map.
1227 1226
    ///
1228
    /// \ref named-func-param "Named parameter"
1229
    ///for setting ProcessedMap object.
1227
    ///\ref named-templ-param "Named parameter" function for setting
1228
    ///the map that indicates which nodes are processed.
1230 1229
    template<class T>
1231 1230
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1232 1231
    {
1233 1232
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1234 1233
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1235 1234
    }
1236 1235

	
1237 1236
    template<class T>
1238 1237
    struct SetPathBase : public Base {
1239 1238
      typedef T Path;
1240 1239
      SetPathBase(const TR &b) : TR(b) {}
1241 1240
    };
1241

	
1242 1242
    ///\brief \ref named-func-param "Named parameter"
1243 1243
    ///for getting the shortest path to the target node.
1244 1244
    ///
1245 1245
    ///\ref named-func-param "Named parameter"
1246 1246
    ///for getting the shortest path to the target node.
1247 1247
    template<class T>
1248 1248
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1249 1249
    {
1250 1250
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1251 1251
      return DijkstraWizard<SetPathBase<T> >(*this);
1252 1252
    }
1253 1253

	
1254 1254
    ///\brief \ref named-func-param "Named parameter"
1255 1255
    ///for getting the distance of the target node.
1256 1256
    ///
1257 1257
    ///\ref named-func-param "Named parameter"
1258 1258
    ///for getting the distance of the target node.
1259 1259
    DijkstraWizard dist(const Value &d)
1260 1260
    {
1261 1261
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1262 1262
      return *this;
1263 1263
    }
1264 1264

	
1265 1265
  };
1266 1266

	
1267 1267
  ///Function-type interface for Dijkstra algorithm.
1268 1268

	
1269 1269
  /// \ingroup shortest_path
1270 1270
  ///Function-type interface for Dijkstra algorithm.
1271 1271
  ///
1272 1272
  ///This function also has several \ref named-func-param "named parameters",
1273 1273
  ///they are declared as the members of class \ref DijkstraWizard.
1274 1274
  ///The following examples show how to use these parameters.
1275 1275
  ///\code
1276 1276
  ///  // Compute shortest path from node s to each node
1277 1277
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1278 1278
  ///
1279 1279
  ///  // Compute shortest path from s to t
1280 1280
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1281 1281
  ///\endcode
1282 1282
  ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()"
1283 1283
  ///to the end of the parameter list.
1284 1284
  ///\sa DijkstraWizard
1285 1285
  ///\sa Dijkstra
1286 1286
  template<typename GR, typename LEN>
1287 1287
  DijkstraWizard<DijkstraWizardBase<GR,LEN> >
1288 1288
  dijkstra(const GR &digraph, const LEN &length)
1289 1289
  {
1290 1290
    return DijkstraWizard<DijkstraWizardBase<GR,LEN> >(digraph,length);
1291 1291
  }
1292 1292

	
1293 1293
} //END OF NAMESPACE LEMON
1294 1294

	
1295 1295
#endif
Ignore white space 24576 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
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_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25 25

	
26 26
#include <lemon/core.h>
27 27

	
28 28
///\file
29 29
///\ingroup maps
30 30
///\brief Miscellaneous property maps
31 31

	
32 32
#include <map>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup maps
37 37
  /// @{
38 38

	
39 39
  /// Base class of maps.
40 40

	
41 41
  /// Base class of maps. It provides the necessary type definitions
42 42
  /// required by the map %concepts.
43 43
  template<typename K, typename V>
44 44
  class MapBase {
45 45
  public:
46 46
    /// \brief The key type of the map.
47 47
    typedef K Key;
48 48
    /// \brief The value type of the map.
49 49
    /// (The type of objects associated with the keys).
50 50
    typedef V Value;
51 51
  };
52 52

	
53 53

	
54 54
  /// Null map. (a.k.a. DoNothingMap)
55 55

	
56 56
  /// This map can be used if you have to provide a map only for
57 57
  /// its type definitions, or if you have to provide a writable map,
58 58
  /// but data written to it is not required (i.e. it will be sent to
59 59
  /// <tt>/dev/null</tt>).
60 60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 61
  ///
62 62
  /// \sa ConstMap
63 63
  template<typename K, typename V>
64 64
  class NullMap : public MapBase<K, V> {
65 65
  public:
66 66
    ///\e
67 67
    typedef K Key;
68 68
    ///\e
69 69
    typedef V Value;
70 70

	
71 71
    /// Gives back a default constructed element.
72 72
    Value operator[](const Key&) const { return Value(); }
73 73
    /// Absorbs the value.
74 74
    void set(const Key&, const Value&) {}
75 75
  };
76 76

	
77 77
  /// Returns a \c NullMap class
78 78

	
79 79
  /// This function just returns a \c NullMap class.
80 80
  /// \relates NullMap
81 81
  template <typename K, typename V>
82 82
  NullMap<K, V> nullMap() {
83 83
    return NullMap<K, V>();
84 84
  }
85 85

	
86 86

	
87 87
  /// Constant map.
88 88

	
89 89
  /// This \ref concepts::ReadMap "readable map" assigns a specified
90 90
  /// value to each key.
91 91
  ///
92 92
  /// In other aspects it is equivalent to \c NullMap.
93 93
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
94 94
  /// concept, but it absorbs the data written to it.
95 95
  ///
96 96
  /// The simplest way of using this map is through the constMap()
97 97
  /// function.
98 98
  ///
99 99
  /// \sa NullMap
100 100
  /// \sa IdentityMap
101 101
  template<typename K, typename V>
102 102
  class ConstMap : public MapBase<K, V> {
103 103
  private:
104 104
    V _value;
105 105
  public:
106 106
    ///\e
107 107
    typedef K Key;
108 108
    ///\e
109 109
    typedef V Value;
110 110

	
111 111
    /// Default constructor
112 112

	
113 113
    /// Default constructor.
114 114
    /// The value of the map will be default constructed.
115 115
    ConstMap() {}
116 116

	
117 117
    /// Constructor with specified initial value
118 118

	
119 119
    /// Constructor with specified initial value.
120 120
    /// \param v The initial value of the map.
121 121
    ConstMap(const Value &v) : _value(v) {}
122 122

	
123 123
    /// Gives back the specified value.
124 124
    Value operator[](const Key&) const { return _value; }
125 125

	
126 126
    /// Absorbs the value.
127 127
    void set(const Key&, const Value&) {}
128 128

	
129 129
    /// Sets the value that is assigned to each key.
130 130
    void setAll(const Value &v) {
131 131
      _value = v;
132 132
    }
133 133

	
134 134
    template<typename V1>
135 135
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
136 136
  };
137 137

	
138 138
  /// Returns a \c ConstMap class
139 139

	
140 140
  /// This function just returns a \c ConstMap class.
141 141
  /// \relates ConstMap
142 142
  template<typename K, typename V>
143 143
  inline ConstMap<K, V> constMap(const V &v) {
144 144
    return ConstMap<K, V>(v);
145 145
  }
146 146

	
147 147
  template<typename K, typename V>
148 148
  inline ConstMap<K, V> constMap() {
149 149
    return ConstMap<K, V>();
150 150
  }
151 151

	
152 152

	
153 153
  template<typename T, T v>
154 154
  struct Const {};
155 155

	
156 156
  /// Constant map with inlined constant value.
157 157

	
158 158
  /// This \ref concepts::ReadMap "readable map" assigns a specified
159 159
  /// value to each key.
160 160
  ///
161 161
  /// In other aspects it is equivalent to \c NullMap.
162 162
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
163 163
  /// concept, but it absorbs the data written to it.
164 164
  ///
165 165
  /// The simplest way of using this map is through the constMap()
166 166
  /// function.
167 167
  ///
168 168
  /// \sa NullMap
169 169
  /// \sa IdentityMap
170 170
  template<typename K, typename V, V v>
171 171
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
172 172
  public:
173 173
    ///\e
174 174
    typedef K Key;
175 175
    ///\e
176 176
    typedef V Value;
177 177

	
178 178
    /// Constructor.
179 179
    ConstMap() {}
180 180

	
181 181
    /// Gives back the specified value.
182 182
    Value operator[](const Key&) const { return v; }
183 183

	
184 184
    /// Absorbs the value.
185 185
    void set(const Key&, const Value&) {}
186 186
  };
187 187

	
188 188
  /// Returns a \c ConstMap class with inlined constant value
189 189

	
190 190
  /// This function just returns a \c ConstMap class with inlined
191 191
  /// constant value.
192 192
  /// \relates ConstMap
193 193
  template<typename K, typename V, V v>
194 194
  inline ConstMap<K, Const<V, v> > constMap() {
195 195
    return ConstMap<K, Const<V, v> >();
196 196
  }
197 197

	
198 198

	
199 199
  /// Identity map.
200 200

	
201 201
  /// This \ref concepts::ReadMap "read-only map" gives back the given
202 202
  /// key as value without any modification.
203 203
  ///
204 204
  /// \sa ConstMap
205 205
  template <typename T>
206 206
  class IdentityMap : public MapBase<T, T> {
207 207
  public:
208 208
    ///\e
209 209
    typedef T Key;
210 210
    ///\e
211 211
    typedef T Value;
212 212

	
213 213
    /// Gives back the given value without any modification.
214 214
    Value operator[](const Key &k) const {
215 215
      return k;
216 216
    }
217 217
  };
218 218

	
219 219
  /// Returns an \c IdentityMap class
220 220

	
221 221
  /// This function just returns an \c IdentityMap class.
222 222
  /// \relates IdentityMap
223 223
  template<typename T>
224 224
  inline IdentityMap<T> identityMap() {
225 225
    return IdentityMap<T>();
226 226
  }
227 227

	
228 228

	
229 229
  /// \brief Map for storing values for integer keys from the range
230 230
  /// <tt>[0..size-1]</tt>.
231 231
  ///
232 232
  /// This map is essentially a wrapper for \c std::vector. It assigns
233 233
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
234 234
  /// It can be used with some data structures, for example
235 235
  /// \c UnionFind, \c BinHeap, when the used items are small
236 236
  /// integers. This map conforms the \ref concepts::ReferenceMap
237 237
  /// "ReferenceMap" concept.
238 238
  ///
239 239
  /// The simplest way of using this map is through the rangeMap()
240 240
  /// function.
241 241
  template <typename V>
242 242
  class RangeMap : public MapBase<int, V> {
243 243
    template <typename V1>
244 244
    friend class RangeMap;
245 245
  private:
246 246

	
247 247
    typedef std::vector<V> Vector;
248 248
    Vector _vector;
249 249

	
250 250
  public:
251 251

	
252 252
    /// Key type
253 253
    typedef int Key;
254 254
    /// Value type
255 255
    typedef V Value;
256 256
    /// Reference type
257 257
    typedef typename Vector::reference Reference;
258 258
    /// Const reference type
259 259
    typedef typename Vector::const_reference ConstReference;
260 260

	
261 261
    typedef True ReferenceMapTag;
262 262

	
263 263
  public:
264 264

	
265 265
    /// Constructor with specified default value.
266 266
    RangeMap(int size = 0, const Value &value = Value())
267 267
      : _vector(size, value) {}
268 268

	
269 269
    /// Constructs the map from an appropriate \c std::vector.
270 270
    template <typename V1>
271 271
    RangeMap(const std::vector<V1>& vector)
272 272
      : _vector(vector.begin(), vector.end()) {}
273 273

	
274 274
    /// Constructs the map from another \c RangeMap.
275 275
    template <typename V1>
276 276
    RangeMap(const RangeMap<V1> &c)
277 277
      : _vector(c._vector.begin(), c._vector.end()) {}
278 278

	
279 279
    /// Returns the size of the map.
280 280
    int size() {
281 281
      return _vector.size();
282 282
    }
283 283

	
284 284
    /// Resizes the map.
285 285

	
286 286
    /// Resizes the underlying \c std::vector container, so changes the
287 287
    /// keyset of the map.
288 288
    /// \param size The new size of the map. The new keyset will be the
289 289
    /// range <tt>[0..size-1]</tt>.
290 290
    /// \param value The default value to assign to the new keys.
291 291
    void resize(int size, const Value &value = Value()) {
292 292
      _vector.resize(size, value);
293 293
    }
294 294

	
295 295
  private:
296 296

	
297 297
    RangeMap& operator=(const RangeMap&);
298 298

	
299 299
  public:
300 300

	
301 301
    ///\e
302 302
    Reference operator[](const Key &k) {
303 303
      return _vector[k];
304 304
    }
305 305

	
306 306
    ///\e
307 307
    ConstReference operator[](const Key &k) const {
308 308
      return _vector[k];
309 309
    }
310 310

	
311 311
    ///\e
312 312
    void set(const Key &k, const Value &v) {
313 313
      _vector[k] = v;
314 314
    }
315 315
  };
316 316

	
317 317
  /// Returns a \c RangeMap class
318 318

	
319 319
  /// This function just returns a \c RangeMap class.
320 320
  /// \relates RangeMap
321 321
  template<typename V>
322 322
  inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
323 323
    return RangeMap<V>(size, value);
324 324
  }
325 325

	
326 326
  /// \brief Returns a \c RangeMap class created from an appropriate
327 327
  /// \c std::vector
328 328

	
329 329
  /// This function just returns a \c RangeMap class created from an
330 330
  /// appropriate \c std::vector.
331 331
  /// \relates RangeMap
332 332
  template<typename V>
333 333
  inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
334 334
    return RangeMap<V>(vector);
335 335
  }
336 336

	
337 337

	
338 338
  /// Map type based on \c std::map
339 339

	
340 340
  /// This map is essentially a wrapper for \c std::map with addition
341 341
  /// that you can specify a default value for the keys that are not
342 342
  /// stored actually. This value can be different from the default
343 343
  /// contructed value (i.e. \c %Value()).
344 344
  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
345 345
  /// concept.
346 346
  ///
347 347
  /// This map is useful if a default value should be assigned to most of
348 348
  /// the keys and different values should be assigned only to a few
349 349
  /// keys (i.e. the map is "sparse").
350 350
  /// The name of this type also refers to this important usage.
351 351
  ///
352 352
  /// Apart form that this map can be used in many other cases since it
353 353
  /// is based on \c std::map, which is a general associative container.
354 354
  /// However keep in mind that it is usually not as efficient as other
355 355
  /// maps.
356 356
  ///
357 357
  /// The simplest way of using this map is through the sparseMap()
358 358
  /// function.
359 359
  template <typename K, typename V, typename Comp = std::less<K> >
360 360
  class SparseMap : public MapBase<K, V> {
361 361
    template <typename K1, typename V1, typename C1>
362 362
    friend class SparseMap;
363 363
  public:
364 364

	
365 365
    /// Key type
366 366
    typedef K Key;
367 367
    /// Value type
368 368
    typedef V Value;
369 369
    /// Reference type
370 370
    typedef Value& Reference;
371 371
    /// Const reference type
372 372
    typedef const Value& ConstReference;
373 373

	
374 374
    typedef True ReferenceMapTag;
375 375

	
376 376
  private:
377 377

	
378 378
    typedef std::map<K, V, Comp> Map;
379 379
    Map _map;
380 380
    Value _value;
381 381

	
382 382
  public:
383 383

	
384 384
    /// \brief Constructor with specified default value.
385 385
    SparseMap(const Value &value = Value()) : _value(value) {}
386 386
    /// \brief Constructs the map from an appropriate \c std::map, and
387 387
    /// explicitly specifies a default value.
388 388
    template <typename V1, typename Comp1>
389 389
    SparseMap(const std::map<Key, V1, Comp1> &map,
390 390
              const Value &value = Value())
391 391
      : _map(map.begin(), map.end()), _value(value) {}
392 392

	
393 393
    /// \brief Constructs the map from another \c SparseMap.
394 394
    template<typename V1, typename Comp1>
395 395
    SparseMap(const SparseMap<Key, V1, Comp1> &c)
396 396
      : _map(c._map.begin(), c._map.end()), _value(c._value) {}
397 397

	
398 398
  private:
399 399

	
400 400
    SparseMap& operator=(const SparseMap&);
401 401

	
402 402
  public:
403 403

	
404 404
    ///\e
405 405
    Reference operator[](const Key &k) {
406 406
      typename Map::iterator it = _map.lower_bound(k);
407 407
      if (it != _map.end() && !_map.key_comp()(k, it->first))
408 408
        return it->second;
409 409
      else
410 410
        return _map.insert(it, std::make_pair(k, _value))->second;
411 411
    }
412 412

	
413 413
    ///\e
414 414
    ConstReference operator[](const Key &k) const {
415 415
      typename Map::const_iterator it = _map.find(k);
416 416
      if (it != _map.end())
417 417
        return it->second;
418 418
      else
419 419
        return _value;
420 420
    }
421 421

	
422 422
    ///\e
423 423
    void set(const Key &k, const Value &v) {
424 424
      typename Map::iterator it = _map.lower_bound(k);
425 425
      if (it != _map.end() && !_map.key_comp()(k, it->first))
426 426
        it->second = v;
427 427
      else
428 428
        _map.insert(it, std::make_pair(k, v));
429 429
    }
430 430

	
431 431
    ///\e
432 432
    void setAll(const Value &v) {
433 433
      _value = v;
434 434
      _map.clear();
435 435
    }
436 436
  };
437 437

	
438 438
  /// Returns a \c SparseMap class
439 439

	
440 440
  /// This function just returns a \c SparseMap class with specified
441 441
  /// default value.
442 442
  /// \relates SparseMap
443 443
  template<typename K, typename V, typename Compare>
444 444
  inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
445 445
    return SparseMap<K, V, Compare>(value);
446 446
  }
447 447

	
448 448
  template<typename K, typename V>
449 449
  inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
450 450
    return SparseMap<K, V, std::less<K> >(value);
451 451
  }
452 452

	
453 453
  /// \brief Returns a \c SparseMap class created from an appropriate
454 454
  /// \c std::map
455 455

	
456 456
  /// This function just returns a \c SparseMap class created from an
457 457
  /// appropriate \c std::map.
458 458
  /// \relates SparseMap
459 459
  template<typename K, typename V, typename Compare>
460 460
  inline SparseMap<K, V, Compare>
461 461
    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
462 462
  {
463 463
    return SparseMap<K, V, Compare>(map, value);
464 464
  }
465 465

	
466 466
  /// @}
467 467

	
468 468
  /// \addtogroup map_adaptors
469 469
  /// @{
470 470

	
471 471
  /// Composition of two maps
472 472

	
473 473
  /// This \ref concepts::ReadMap "read-only map" returns the
474 474
  /// composition of two given maps. That is to say, if \c m1 is of
475 475
  /// type \c M1 and \c m2 is of \c M2, then for
476 476
  /// \code
477 477
  ///   ComposeMap<M1, M2> cm(m1,m2);
478 478
  /// \endcode
479 479
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
480 480
  ///
481 481
  /// The \c Key type of the map is inherited from \c M2 and the
482 482
  /// \c Value type is from \c M1.
483 483
  /// \c M2::Value must be convertible to \c M1::Key.
484 484
  ///
485 485
  /// The simplest way of using this map is through the composeMap()
486 486
  /// function.
487 487
  ///
488 488
  /// \sa CombineMap
489 489
  template <typename M1, typename M2>
490 490
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
491 491
    const M1 &_m1;
492 492
    const M2 &_m2;
493 493
  public:
494 494
    ///\e
495 495
    typedef typename M2::Key Key;
496 496
    ///\e
497 497
    typedef typename M1::Value Value;
498 498

	
499 499
    /// Constructor
500 500
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
501 501

	
502 502
    ///\e
503 503
    typename MapTraits<M1>::ConstReturnValue
504 504
    operator[](const Key &k) const { return _m1[_m2[k]]; }
505 505
  };
506 506

	
507 507
  /// Returns a \c ComposeMap class
508 508

	
509 509
  /// This function just returns a \c ComposeMap class.
510 510
  ///
511 511
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
512 512
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
513 513
  /// will be equal to <tt>m1[m2[x]]</tt>.
514 514
  ///
515 515
  /// \relates ComposeMap
516 516
  template <typename M1, typename M2>
517 517
  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
518 518
    return ComposeMap<M1, M2>(m1, m2);
519 519
  }
520 520

	
521 521

	
522 522
  /// Combination of two maps using an STL (binary) functor.
523 523

	
524 524
  /// This \ref concepts::ReadMap "read-only map" takes two maps and a
525 525
  /// binary functor and returns the combination of the two given maps
526 526
  /// using the functor.
527 527
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
528 528
  /// and \c f is of \c F, then for
529 529
  /// \code
530 530
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
531 531
  /// \endcode
532 532
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
533 533
  ///
534 534
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
535 535
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
536 536
  /// \c M2::Value and \c M1::Value must be convertible to the
537 537
  /// corresponding input parameter of \c F and the return type of \c F
538 538
  /// must be convertible to \c V.
539 539
  ///
540 540
  /// The simplest way of using this map is through the combineMap()
541 541
  /// function.
542 542
  ///
543 543
  /// \sa ComposeMap
544 544
  template<typename M1, typename M2, typename F,
545 545
           typename V = typename F::result_type>
546 546
  class CombineMap : public MapBase<typename M1::Key, V> {
547 547
    const M1 &_m1;
548 548
    const M2 &_m2;
549 549
    F _f;
550 550
  public:
551 551
    ///\e
552 552
    typedef typename M1::Key Key;
553 553
    ///\e
554 554
    typedef V Value;
555 555

	
556 556
    /// Constructor
557 557
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
558 558
      : _m1(m1), _m2(m2), _f(f) {}
559 559
    ///\e
560 560
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
561 561
  };
562 562

	
563 563
  /// Returns a \c CombineMap class
564 564

	
565 565
  /// This function just returns a \c CombineMap class.
566 566
  ///
567 567
  /// For example, if \c m1 and \c m2 are both maps with \c double
568 568
  /// values, then
569 569
  /// \code
570 570
  ///   combineMap(m1,m2,std::plus<double>())
571 571
  /// \endcode
572 572
  /// is equivalent to
573 573
  /// \code
574 574
  ///   addMap(m1,m2)
575 575
  /// \endcode
576 576
  ///
577 577
  /// This function is specialized for adaptable binary function
578 578
  /// classes and C++ functions.
579 579
  ///
580 580
  /// \relates CombineMap
581 581
  template<typename M1, typename M2, typename F, typename V>
582 582
  inline CombineMap<M1, M2, F, V>
583 583
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
584 584
    return CombineMap<M1, M2, F, V>(m1,m2,f);
585 585
  }
586 586

	
587 587
  template<typename M1, typename M2, typename F>
588 588
  inline CombineMap<M1, M2, F, typename F::result_type>
589 589
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
590 590
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
591 591
  }
592 592

	
593 593
  template<typename M1, typename M2, typename K1, typename K2, typename V>
594 594
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
595 595
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
596 596
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
597 597
  }
598 598

	
599 599

	
600 600
  /// Converts an STL style (unary) functor to a map
601 601

	
602 602
  /// This \ref concepts::ReadMap "read-only map" returns the value
603 603
  /// of a given functor. Actually, it just wraps the functor and
604 604
  /// provides the \c Key and \c Value typedefs.
605 605
  ///
606 606
  /// Template parameters \c K and \c V will become its \c Key and
607 607
  /// \c Value. In most cases they have to be given explicitly because
608 608
  /// a functor typically does not provide \c argument_type and
609 609
  /// \c result_type typedefs.
610 610
  /// Parameter \c F is the type of the used functor.
611 611
  ///
612 612
  /// The simplest way of using this map is through the functorToMap()
613 613
  /// function.
614 614
  ///
615 615
  /// \sa MapToFunctor
616 616
  template<typename F,
617 617
           typename K = typename F::argument_type,
618 618
           typename V = typename F::result_type>
619 619
  class FunctorToMap : public MapBase<K, V> {
620 620
    F _f;
621 621
  public:
622 622
    ///\e
623 623
    typedef K Key;
624 624
    ///\e
625 625
    typedef V Value;
626 626

	
627 627
    /// Constructor
628 628
    FunctorToMap(const F &f = F()) : _f(f) {}
629 629
    ///\e
630 630
    Value operator[](const Key &k) const { return _f(k); }
631 631
  };
632 632

	
633 633
  /// Returns a \c FunctorToMap class
634 634

	
635 635
  /// This function just returns a \c FunctorToMap class.
636 636
  ///
637 637
  /// This function is specialized for adaptable binary function
638 638
  /// classes and C++ functions.
639 639
  ///
640 640
  /// \relates FunctorToMap
641 641
  template<typename K, typename V, typename F>
642 642
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
643 643
    return FunctorToMap<F, K, V>(f);
644 644
  }
645 645

	
646 646
  template <typename F>
647 647
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
648 648
    functorToMap(const F &f)
649 649
  {
650 650
    return FunctorToMap<F, typename F::argument_type,
651 651
      typename F::result_type>(f);
652 652
  }
653 653

	
654 654
  template <typename K, typename V>
655 655
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
656 656
    return FunctorToMap<V (*)(K), K, V>(f);
657 657
  }
658 658

	
659 659

	
660 660
  /// Converts a map to an STL style (unary) functor
661 661

	
662 662
  /// This class converts a map to an STL style (unary) functor.
663 663
  /// That is it provides an <tt>operator()</tt> to read its values.
664 664
  ///
665 665
  /// For the sake of convenience it also works as a usual
666 666
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
667 667
  /// and the \c Key and \c Value typedefs also exist.
668 668
  ///
669 669
  /// The simplest way of using this map is through the mapToFunctor()
670 670
  /// function.
671 671
  ///
672 672
  ///\sa FunctorToMap
673 673
  template <typename M>
674 674
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
675 675
    const M &_m;
676 676
  public:
677 677
    ///\e
678 678
    typedef typename M::Key Key;
679 679
    ///\e
680 680
    typedef typename M::Value Value;
681 681

	
682 682
    typedef typename M::Key argument_type;
683 683
    typedef typename M::Value result_type;
684 684

	
685 685
    /// Constructor
686 686
    MapToFunctor(const M &m) : _m(m) {}
687 687
    ///\e
688 688
    Value operator()(const Key &k) const { return _m[k]; }
689 689
    ///\e
690 690
    Value operator[](const Key &k) const { return _m[k]; }
691 691
  };
692 692

	
693 693
  /// Returns a \c MapToFunctor class
694 694

	
695 695
  /// This function just returns a \c MapToFunctor class.
696 696
  /// \relates MapToFunctor
697 697
  template<typename M>
698 698
  inline MapToFunctor<M> mapToFunctor(const M &m) {
699 699
    return MapToFunctor<M>(m);
700 700
  }
701 701

	
702 702

	
703 703
  /// \brief Map adaptor to convert the \c Value type of a map to
704 704
  /// another type using the default conversion.
705 705

	
706 706
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
707 707
  /// "readable map" to another type using the default conversion.
708 708
  /// The \c Key type of it is inherited from \c M and the \c Value
709 709
  /// type is \c V.
710 710
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
711 711
  ///
712 712
  /// The simplest way of using this map is through the convertMap()
713 713
  /// function.
714 714
  template <typename M, typename V>
715 715
  class ConvertMap : public MapBase<typename M::Key, V> {
716 716
    const M &_m;
717 717
  public:
718 718
    ///\e
719 719
    typedef typename M::Key Key;
720 720
    ///\e
721 721
    typedef V Value;
722 722

	
723 723
    /// Constructor
724 724

	
725 725
    /// Constructor.
726 726
    /// \param m The underlying map.
727 727
    ConvertMap(const M &m) : _m(m) {}
728 728

	
729 729
    ///\e
730 730
    Value operator[](const Key &k) const { return _m[k]; }
731 731
  };
732 732

	
733 733
  /// Returns a \c ConvertMap class
734 734

	
735 735
  /// This function just returns a \c ConvertMap class.
736 736
  /// \relates ConvertMap
737 737
  template<typename V, typename M>
738 738
  inline ConvertMap<M, V> convertMap(const M &map) {
739 739
    return ConvertMap<M, V>(map);
740 740
  }
741 741

	
742 742

	
743 743
  /// Applies all map setting operations to two maps
744 744

	
745 745
  /// This map has two \ref concepts::WriteMap "writable map" parameters
746 746
  /// and each write request will be passed to both of them.
747 747
  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
748 748
  /// operations will return the corresponding values of \c M1.
749 749
  ///
750 750
  /// The \c Key and \c Value types are inherited from \c M1.
751 751
  /// The \c Key and \c Value of \c M2 must be convertible from those
752 752
  /// of \c M1.
753 753
  ///
754 754
  /// The simplest way of using this map is through the forkMap()
755 755
  /// function.
756 756
  template<typename  M1, typename M2>
757 757
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
758 758
    M1 &_m1;
759 759
    M2 &_m2;
760 760
  public:
761 761
    ///\e
762 762
    typedef typename M1::Key Key;
763 763
    ///\e
764 764
    typedef typename M1::Value Value;
765 765

	
766 766
    /// Constructor
767 767
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
768 768
    /// Returns the value associated with the given key in the first map.
769 769
    Value operator[](const Key &k) const { return _m1[k]; }
770 770
    /// Sets the value associated with the given key in both maps.
771 771
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
772 772
  };
773 773

	
774 774
  /// Returns a \c ForkMap class
775 775

	
776 776
  /// This function just returns a \c ForkMap class.
777 777
  /// \relates ForkMap
778 778
  template <typename M1, typename M2>
779 779
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
780 780
    return ForkMap<M1,M2>(m1,m2);
781 781
  }
782 782

	
783 783

	
784 784
  /// Sum of two maps
785 785

	
786 786
  /// This \ref concepts::ReadMap "read-only map" returns the sum
787 787
  /// of the values of the two given maps.
788 788
  /// Its \c Key and \c Value types are inherited from \c M1.
789 789
  /// The \c Key and \c Value of \c M2 must be convertible to those of
790 790
  /// \c M1.
791 791
  ///
792 792
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
793 793
  /// \code
794 794
  ///   AddMap<M1,M2> am(m1,m2);
795 795
  /// \endcode
796 796
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
797 797
  ///
798 798
  /// The simplest way of using this map is through the addMap()
799 799
  /// function.
800 800
  ///
801 801
  /// \sa SubMap, MulMap, DivMap
802 802
  /// \sa ShiftMap, ShiftWriteMap
803 803
  template<typename M1, typename M2>
804 804
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
805 805
    const M1 &_m1;
806 806
    const M2 &_m2;
807 807
  public:
808 808
    ///\e
809 809
    typedef typename M1::Key Key;
810 810
    ///\e
811 811
    typedef typename M1::Value Value;
812 812

	
813 813
    /// Constructor
814 814
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
815 815
    ///\e
816 816
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
817 817
  };
818 818

	
819 819
  /// Returns an \c AddMap class
820 820

	
821 821
  /// This function just returns an \c AddMap class.
822 822
  ///
823 823
  /// For example, if \c m1 and \c m2 are both maps with \c double
824 824
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
825 825
  /// <tt>m1[x]+m2[x]</tt>.
826 826
  ///
827 827
  /// \relates AddMap
828 828
  template<typename M1, typename M2>
829 829
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
830 830
    return AddMap<M1, M2>(m1,m2);
831 831
  }
832 832

	
833 833

	
834 834
  /// Difference of two maps
835 835

	
836 836
  /// This \ref concepts::ReadMap "read-only map" returns the difference
837 837
  /// of the values of the two given maps.
838 838
  /// Its \c Key and \c Value types are inherited from \c M1.
839 839
  /// The \c Key and \c Value of \c M2 must be convertible to those of
840 840
  /// \c M1.
841 841
  ///
842 842
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
843 843
  /// \code
844 844
  ///   SubMap<M1,M2> sm(m1,m2);
845 845
  /// \endcode
846 846
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
847 847
  ///
848 848
  /// The simplest way of using this map is through the subMap()
849 849
  /// function.
850 850
  ///
851 851
  /// \sa AddMap, MulMap, DivMap
852 852
  template<typename M1, typename M2>
853 853
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
854 854
    const M1 &_m1;
855 855
    const M2 &_m2;
856 856
  public:
857 857
    ///\e
858 858
    typedef typename M1::Key Key;
859 859
    ///\e
860 860
    typedef typename M1::Value Value;
861 861

	
862 862
    /// Constructor
863 863
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
864 864
    ///\e
865 865
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
866 866
  };
867 867

	
868 868
  /// Returns a \c SubMap class
869 869

	
870 870
  /// This function just returns a \c SubMap class.
871 871
  ///
872 872
  /// For example, if \c m1 and \c m2 are both maps with \c double
873 873
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
874 874
  /// <tt>m1[x]-m2[x]</tt>.
875 875
  ///
876 876
  /// \relates SubMap
877 877
  template<typename M1, typename M2>
878 878
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
879 879
    return SubMap<M1, M2>(m1,m2);
880 880
  }
881 881

	
882 882

	
883 883
  /// Product of two maps
884 884

	
885 885
  /// This \ref concepts::ReadMap "read-only map" returns the product
886 886
  /// of the values of the two given maps.
887 887
  /// Its \c Key and \c Value types are inherited from \c M1.
888 888
  /// The \c Key and \c Value of \c M2 must be convertible to those of
889 889
  /// \c M1.
890 890
  ///
891 891
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
892 892
  /// \code
893 893
  ///   MulMap<M1,M2> mm(m1,m2);
894 894
  /// \endcode
895 895
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
896 896
  ///
897 897
  /// The simplest way of using this map is through the mulMap()
898 898
  /// function.
899 899
  ///
900 900
  /// \sa AddMap, SubMap, DivMap
901 901
  /// \sa ScaleMap, ScaleWriteMap
902 902
  template<typename M1, typename M2>
903 903
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
904 904
    const M1 &_m1;
905 905
    const M2 &_m2;
906 906
  public:
907 907
    ///\e
908 908
    typedef typename M1::Key Key;
909 909
    ///\e
910 910
    typedef typename M1::Value Value;
911 911

	
912 912
    /// Constructor
913 913
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
914 914
    ///\e
915 915
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
916 916
  };
917 917

	
918 918
  /// Returns a \c MulMap class
919 919

	
920 920
  /// This function just returns a \c MulMap class.
921 921
  ///
922 922
  /// For example, if \c m1 and \c m2 are both maps with \c double
923 923
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
924 924
  /// <tt>m1[x]*m2[x]</tt>.
925 925
  ///
926 926
  /// \relates MulMap
927 927
  template<typename M1, typename M2>
928 928
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
929 929
    return MulMap<M1, M2>(m1,m2);
930 930
  }
931 931

	
932 932

	
933 933
  /// Quotient of two maps
934 934

	
935 935
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
936 936
  /// of the values of the two given maps.
937 937
  /// Its \c Key and \c Value types are inherited from \c M1.
938 938
  /// The \c Key and \c Value of \c M2 must be convertible to those of
939 939
  /// \c M1.
940 940
  ///
941 941
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
942 942
  /// \code
943 943
  ///   DivMap<M1,M2> dm(m1,m2);
944 944
  /// \endcode
945 945
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
946 946
  ///
947 947
  /// The simplest way of using this map is through the divMap()
948 948
  /// function.
949 949
  ///
950 950
  /// \sa AddMap, SubMap, MulMap
951 951
  template<typename M1, typename M2>
952 952
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
953 953
    const M1 &_m1;
954 954
    const M2 &_m2;
955 955
  public:
956 956
    ///\e
957 957
    typedef typename M1::Key Key;
958 958
    ///\e
959 959
    typedef typename M1::Value Value;
960 960

	
961 961
    /// Constructor
962 962
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
963 963
    ///\e
964 964
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
965 965
  };
966 966

	
967 967
  /// Returns a \c DivMap class
968 968

	
969 969
  /// This function just returns a \c DivMap class.
970 970
  ///
971 971
  /// For example, if \c m1 and \c m2 are both maps with \c double
972 972
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
973 973
  /// <tt>m1[x]/m2[x]</tt>.
974 974
  ///
975 975
  /// \relates DivMap
976 976
  template<typename M1, typename M2>
977 977
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
978 978
    return DivMap<M1, M2>(m1,m2);
979 979
  }
980 980

	
981 981

	
982 982
  /// Shifts a map with a constant.
983 983

	
984 984
  /// This \ref concepts::ReadMap "read-only map" returns the sum of
985 985
  /// the given map and a constant value (i.e. it shifts the map with
986 986
  /// the constant). Its \c Key and \c Value are inherited from \c M.
987 987
  ///
988 988
  /// Actually,
989 989
  /// \code
990 990
  ///   ShiftMap<M> sh(m,v);
991 991
  /// \endcode
992 992
  /// is equivalent to
993 993
  /// \code
994 994
  ///   ConstMap<M::Key, M::Value> cm(v);
995 995
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
996 996
  /// \endcode
997 997
  ///
998 998
  /// The simplest way of using this map is through the shiftMap()
999 999
  /// function.
1000 1000
  ///
1001 1001
  /// \sa ShiftWriteMap
1002 1002
  template<typename M, typename C = typename M::Value>
1003 1003
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
1004 1004
    const M &_m;
1005 1005
    C _v;
1006 1006
  public:
1007 1007
    ///\e
1008 1008
    typedef typename M::Key Key;
1009 1009
    ///\e
1010 1010
    typedef typename M::Value Value;
1011 1011

	
1012 1012
    /// Constructor
1013 1013

	
1014 1014
    /// Constructor.
1015 1015
    /// \param m The undelying map.
1016 1016
    /// \param v The constant value.
1017 1017
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1018 1018
    ///\e
1019 1019
    Value operator[](const Key &k) const { return _m[k]+_v; }
1020 1020
  };
1021 1021

	
1022 1022
  /// Shifts a map with a constant (read-write version).
1023 1023

	
1024 1024
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1025 1025
  /// of the given map and a constant value (i.e. it shifts the map with
1026 1026
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1027 1027
  /// It makes also possible to write the map.
1028 1028
  ///
1029 1029
  /// The simplest way of using this map is through the shiftWriteMap()
1030 1030
  /// function.
1031 1031
  ///
1032 1032
  /// \sa ShiftMap
1033 1033
  template<typename M, typename C = typename M::Value>
1034 1034
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1035 1035
    M &_m;
1036 1036
    C _v;
1037 1037
  public:
1038 1038
    ///\e
1039 1039
    typedef typename M::Key Key;
1040 1040
    ///\e
1041 1041
    typedef typename M::Value Value;
1042 1042

	
1043 1043
    /// Constructor
1044 1044

	
1045 1045
    /// Constructor.
1046 1046
    /// \param m The undelying map.
1047 1047
    /// \param v The constant value.
1048 1048
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1049 1049
    ///\e
1050 1050
    Value operator[](const Key &k) const { return _m[k]+_v; }
1051 1051
    ///\e
1052 1052
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1053 1053
  };
1054 1054

	
1055 1055
  /// Returns a \c ShiftMap class
1056 1056

	
1057 1057
  /// This function just returns a \c ShiftMap class.
1058 1058
  ///
1059 1059
  /// For example, if \c m is a map with \c double values and \c v is
1060 1060
  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1061 1061
  /// <tt>m[x]+v</tt>.
1062 1062
  ///
1063 1063
  /// \relates ShiftMap
1064 1064
  template<typename M, typename C>
1065 1065
  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1066 1066
    return ShiftMap<M, C>(m,v);
1067 1067
  }
1068 1068

	
1069 1069
  /// Returns a \c ShiftWriteMap class
1070 1070

	
1071 1071
  /// This function just returns a \c ShiftWriteMap class.
1072 1072
  ///
1073 1073
  /// For example, if \c m is a map with \c double values and \c v is
1074 1074
  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1075 1075
  /// <tt>m[x]+v</tt>.
1076 1076
  /// Moreover it makes also possible to write the map.
1077 1077
  ///
1078 1078
  /// \relates ShiftWriteMap
1079 1079
  template<typename M, typename C>
1080 1080
  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1081 1081
    return ShiftWriteMap<M, C>(m,v);
1082 1082
  }
1083 1083

	
1084 1084

	
1085 1085
  /// Scales a map with a constant.
1086 1086

	
1087 1087
  /// This \ref concepts::ReadMap "read-only map" returns the value of
1088 1088
  /// the given map multiplied from the left side with a constant value.
1089 1089
  /// Its \c Key and \c Value are inherited from \c M.
1090 1090
  ///
1091 1091
  /// Actually,
1092 1092
  /// \code
1093 1093
  ///   ScaleMap<M> sc(m,v);
1094 1094
  /// \endcode
1095 1095
  /// is equivalent to
1096 1096
  /// \code
1097 1097
  ///   ConstMap<M::Key, M::Value> cm(v);
1098 1098
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1099 1099
  /// \endcode
1100 1100
  ///
1101 1101
  /// The simplest way of using this map is through the scaleMap()
1102 1102
  /// function.
1103 1103
  ///
1104 1104
  /// \sa ScaleWriteMap
1105 1105
  template<typename M, typename C = typename M::Value>
1106 1106
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1107 1107
    const M &_m;
1108 1108
    C _v;
1109 1109
  public:
1110 1110
    ///\e
1111 1111
    typedef typename M::Key Key;
1112 1112
    ///\e
1113 1113
    typedef typename M::Value Value;
1114 1114

	
1115 1115
    /// Constructor
1116 1116

	
1117 1117
    /// Constructor.
1118 1118
    /// \param m The undelying map.
1119 1119
    /// \param v The constant value.
1120 1120
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1121 1121
    ///\e
1122 1122
    Value operator[](const Key &k) const { return _v*_m[k]; }
1123 1123
  };
1124 1124

	
1125 1125
  /// Scales a map with a constant (read-write version).
1126 1126

	
1127 1127
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1128 1128
  /// the given map multiplied from the left side with a constant value.
1129 1129
  /// Its \c Key and \c Value are inherited from \c M.
1130 1130
  /// It can also be used as write map if the \c / operator is defined
1131 1131
  /// between \c Value and \c C and the given multiplier is not zero.
1132 1132
  ///
1133 1133
  /// The simplest way of using this map is through the scaleWriteMap()
1134 1134
  /// function.
1135 1135
  ///
1136 1136
  /// \sa ScaleMap
1137 1137
  template<typename M, typename C = typename M::Value>
1138 1138
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1139 1139
    M &_m;
1140 1140
    C _v;
1141 1141
  public:
1142 1142
    ///\e
1143 1143
    typedef typename M::Key Key;
1144 1144
    ///\e
1145 1145
    typedef typename M::Value Value;
1146 1146

	
1147 1147
    /// Constructor
1148 1148

	
1149 1149
    /// Constructor.
1150 1150
    /// \param m The undelying map.
1151 1151
    /// \param v The constant value.
1152 1152
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1153 1153
    ///\e
1154 1154
    Value operator[](const Key &k) const { return _v*_m[k]; }
1155 1155
    ///\e
1156 1156
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1157 1157
  };
1158 1158

	
1159 1159
  /// Returns a \c ScaleMap class
1160 1160

	
1161 1161
  /// This function just returns a \c ScaleMap class.
1162 1162
  ///
1163 1163
  /// For example, if \c m is a map with \c double values and \c v is
1164 1164
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1165 1165
  /// <tt>v*m[x]</tt>.
1166 1166
  ///
1167 1167
  /// \relates ScaleMap
1168 1168
  template<typename M, typename C>
1169 1169
  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1170 1170
    return ScaleMap<M, C>(m,v);
1171 1171
  }
1172 1172

	
1173 1173
  /// Returns a \c ScaleWriteMap class
1174 1174

	
1175 1175
  /// This function just returns a \c ScaleWriteMap class.
1176 1176
  ///
1177 1177
  /// For example, if \c m is a map with \c double values and \c v is
1178 1178
  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1179 1179
  /// <tt>v*m[x]</tt>.
1180 1180
  /// Moreover it makes also possible to write the map.
1181 1181
  ///
1182 1182
  /// \relates ScaleWriteMap
1183 1183
  template<typename M, typename C>
1184 1184
  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1185 1185
    return ScaleWriteMap<M, C>(m,v);
1186 1186
  }
1187 1187

	
1188 1188

	
1189 1189
  /// Negative of a map
1190 1190

	
1191 1191
  /// This \ref concepts::ReadMap "read-only map" returns the negative
1192 1192
  /// of the values of the given map (using the unary \c - operator).
1193 1193
  /// Its \c Key and \c Value are inherited from \c M.
1194 1194
  ///
1195 1195
  /// If M::Value is \c int, \c double etc., then
1196 1196
  /// \code
1197 1197
  ///   NegMap<M> neg(m);
1198 1198
  /// \endcode
1199 1199
  /// is equivalent to
1200 1200
  /// \code
1201 1201
  ///   ScaleMap<M> neg(m,-1);
1202 1202
  /// \endcode
1203 1203
  ///
1204 1204
  /// The simplest way of using this map is through the negMap()
1205 1205
  /// function.
1206 1206
  ///
1207 1207
  /// \sa NegWriteMap
1208 1208
  template<typename M>
1209 1209
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1210 1210
    const M& _m;
1211 1211
  public:
1212 1212
    ///\e
1213 1213
    typedef typename M::Key Key;
1214 1214
    ///\e
1215 1215
    typedef typename M::Value Value;
1216 1216

	
1217 1217
    /// Constructor
1218 1218
    NegMap(const M &m) : _m(m) {}
1219 1219
    ///\e
1220 1220
    Value operator[](const Key &k) const { return -_m[k]; }
1221 1221
  };
1222 1222

	
1223 1223
  /// Negative of a map (read-write version)
1224 1224

	
1225 1225
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1226 1226
  /// negative of the values of the given map (using the unary \c -
1227 1227
  /// operator).
1228 1228
  /// Its \c Key and \c Value are inherited from \c M.
1229 1229
  /// It makes also possible to write the map.
1230 1230
  ///
1231 1231
  /// If M::Value is \c int, \c double etc., then
1232 1232
  /// \code
1233 1233
  ///   NegWriteMap<M> neg(m);
1234 1234
  /// \endcode
1235 1235
  /// is equivalent to
1236 1236
  /// \code
1237 1237
  ///   ScaleWriteMap<M> neg(m,-1);
1238 1238
  /// \endcode
1239 1239
  ///
1240 1240
  /// The simplest way of using this map is through the negWriteMap()
1241 1241
  /// function.
1242 1242
  ///
1243 1243
  /// \sa NegMap
1244 1244
  template<typename M>
1245 1245
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1246 1246
    M &_m;
1247 1247
  public:
1248 1248
    ///\e
1249 1249
    typedef typename M::Key Key;
1250 1250
    ///\e
1251 1251
    typedef typename M::Value Value;
1252 1252

	
1253 1253
    /// Constructor
1254 1254
    NegWriteMap(M &m) : _m(m) {}
1255 1255
    ///\e
1256 1256
    Value operator[](const Key &k) const { return -_m[k]; }
1257 1257
    ///\e
1258 1258
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1259 1259
  };
1260 1260

	
1261 1261
  /// Returns a \c NegMap class
1262 1262

	
1263 1263
  /// This function just returns a \c NegMap class.
1264 1264
  ///
1265 1265
  /// For example, if \c m is a map with \c double values, then
1266 1266
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1267 1267
  ///
1268 1268
  /// \relates NegMap
1269 1269
  template <typename M>
1270 1270
  inline NegMap<M> negMap(const M &m) {
1271 1271
    return NegMap<M>(m);
1272 1272
  }
1273 1273

	
1274 1274
  /// Returns a \c NegWriteMap class
1275 1275

	
1276 1276
  /// This function just returns a \c NegWriteMap class.
1277 1277
  ///
1278 1278
  /// For example, if \c m is a map with \c double values, then
1279 1279
  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1280 1280
  /// Moreover it makes also possible to write the map.
1281 1281
  ///
1282 1282
  /// \relates NegWriteMap
1283 1283
  template <typename M>
1284 1284
  inline NegWriteMap<M> negWriteMap(M &m) {
1285 1285
    return NegWriteMap<M>(m);
1286 1286
  }
1287 1287

	
1288 1288

	
1289 1289
  /// Absolute value of a map
1290 1290

	
1291 1291
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1292 1292
  /// value of the values of the given map.
1293 1293
  /// Its \c Key and \c Value are inherited from \c M.
1294 1294
  /// \c Value must be comparable to \c 0 and the unary \c -
1295 1295
  /// operator must be defined for it, of course.
1296 1296
  ///
1297 1297
  /// The simplest way of using this map is through the absMap()
1298 1298
  /// function.
1299 1299
  template<typename M>
1300 1300
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1301 1301
    const M &_m;
1302 1302
  public:
1303 1303
    ///\e
1304 1304
    typedef typename M::Key Key;
1305 1305
    ///\e
1306 1306
    typedef typename M::Value Value;
1307 1307

	
1308 1308
    /// Constructor
1309 1309
    AbsMap(const M &m) : _m(m) {}
1310 1310
    ///\e
1311 1311
    Value operator[](const Key &k) const {
1312 1312
      Value tmp = _m[k];
1313 1313
      return tmp >= 0 ? tmp : -tmp;
1314 1314
    }
1315 1315

	
1316 1316
  };
1317 1317

	
1318 1318
  /// Returns an \c AbsMap class
1319 1319

	
1320 1320
  /// This function just returns an \c AbsMap class.
1321 1321
  ///
1322 1322
  /// For example, if \c m is a map with \c double values, then
1323 1323
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1324 1324
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1325 1325
  /// negative.
1326 1326
  ///
1327 1327
  /// \relates AbsMap
1328 1328
  template<typename M>
1329 1329
  inline AbsMap<M> absMap(const M &m) {
1330 1330
    return AbsMap<M>(m);
1331 1331
  }
1332 1332

	
1333 1333
  /// @}
1334 1334

	
1335 1335
  // Logical maps and map adaptors:
1336 1336

	
1337 1337
  /// \addtogroup maps
1338 1338
  /// @{
1339 1339

	
1340 1340
  /// Constant \c true map.
1341 1341

	
1342 1342
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1343 1343
  /// each key.
1344 1344
  ///
1345 1345
  /// Note that
1346 1346
  /// \code
1347 1347
  ///   TrueMap<K> tm;
1348 1348
  /// \endcode
1349 1349
  /// is equivalent to
1350 1350
  /// \code
1351 1351
  ///   ConstMap<K,bool> tm(true);
1352 1352
  /// \endcode
1353 1353
  ///
1354 1354
  /// \sa FalseMap
1355 1355
  /// \sa ConstMap
1356 1356
  template <typename K>
1357 1357
  class TrueMap : public MapBase<K, bool> {
1358 1358
  public:
1359 1359
    ///\e
1360 1360
    typedef K Key;
1361 1361
    ///\e
1362 1362
    typedef bool Value;
1363 1363

	
1364 1364
    /// Gives back \c true.
1365 1365
    Value operator[](const Key&) const { return true; }
1366 1366
  };
1367 1367

	
1368 1368
  /// Returns a \c TrueMap class
1369 1369

	
1370 1370
  /// This function just returns a \c TrueMap class.
1371 1371
  /// \relates TrueMap
1372 1372
  template<typename K>
1373 1373
  inline TrueMap<K> trueMap() {
1374 1374
    return TrueMap<K>();
1375 1375
  }
1376 1376

	
1377 1377

	
1378 1378
  /// Constant \c false map.
1379 1379

	
1380 1380
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1381 1381
  /// each key.
1382 1382
  ///
1383 1383
  /// Note that
1384 1384
  /// \code
1385 1385
  ///   FalseMap<K> fm;
1386 1386
  /// \endcode
1387 1387
  /// is equivalent to
1388 1388
  /// \code
1389 1389
  ///   ConstMap<K,bool> fm(false);
1390 1390
  /// \endcode
1391 1391
  ///
1392 1392
  /// \sa TrueMap
1393 1393
  /// \sa ConstMap
1394 1394
  template <typename K>
1395 1395
  class FalseMap : public MapBase<K, bool> {
1396 1396
  public:
1397 1397
    ///\e
1398 1398
    typedef K Key;
1399 1399
    ///\e
1400 1400
    typedef bool Value;
1401 1401

	
1402 1402
    /// Gives back \c false.
1403 1403
    Value operator[](const Key&) const { return false; }
1404 1404
  };
1405 1405

	
1406 1406
  /// Returns a \c FalseMap class
1407 1407

	
1408 1408
  /// This function just returns a \c FalseMap class.
1409 1409
  /// \relates FalseMap
1410 1410
  template<typename K>
1411 1411
  inline FalseMap<K> falseMap() {
1412 1412
    return FalseMap<K>();
1413 1413
  }
1414 1414

	
1415 1415
  /// @}
1416 1416

	
1417 1417
  /// \addtogroup map_adaptors
1418 1418
  /// @{
1419 1419

	
1420 1420
  /// Logical 'and' of two maps
1421 1421

	
1422 1422
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1423 1423
  /// 'and' of the values of the two given maps.
1424 1424
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1425 1425
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1426 1426
  ///
1427 1427
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1428 1428
  /// \code
1429 1429
  ///   AndMap<M1,M2> am(m1,m2);
1430 1430
  /// \endcode
1431 1431
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1432 1432
  ///
1433 1433
  /// The simplest way of using this map is through the andMap()
1434 1434
  /// function.
1435 1435
  ///
1436 1436
  /// \sa OrMap
1437 1437
  /// \sa NotMap, NotWriteMap
1438 1438
  template<typename M1, typename M2>
1439 1439
  class AndMap : public MapBase<typename M1::Key, bool> {
1440 1440
    const M1 &_m1;
1441 1441
    const M2 &_m2;
1442 1442
  public:
1443 1443
    ///\e
1444 1444
    typedef typename M1::Key Key;
1445 1445
    ///\e
1446 1446
    typedef bool Value;
1447 1447

	
1448 1448
    /// Constructor
1449 1449
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1450 1450
    ///\e
1451 1451
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1452 1452
  };
1453 1453

	
1454 1454
  /// Returns an \c AndMap class
1455 1455

	
1456 1456
  /// This function just returns an \c AndMap class.
1457 1457
  ///
1458 1458
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1459 1459
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1460 1460
  /// <tt>m1[x]&&m2[x]</tt>.
1461 1461
  ///
1462 1462
  /// \relates AndMap
1463 1463
  template<typename M1, typename M2>
1464 1464
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1465 1465
    return AndMap<M1, M2>(m1,m2);
1466 1466
  }
1467 1467

	
1468 1468

	
1469 1469
  /// Logical 'or' of two maps
1470 1470

	
1471 1471
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1472 1472
  /// 'or' of the values of the two given maps.
1473 1473
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1474 1474
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1475 1475
  ///
1476 1476
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1477 1477
  /// \code
1478 1478
  ///   OrMap<M1,M2> om(m1,m2);
1479 1479
  /// \endcode
1480 1480
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1481 1481
  ///
1482 1482
  /// The simplest way of using this map is through the orMap()
1483 1483
  /// function.
1484 1484
  ///
1485 1485
  /// \sa AndMap
1486 1486
  /// \sa NotMap, NotWriteMap
1487 1487
  template<typename M1, typename M2>
1488 1488
  class OrMap : public MapBase<typename M1::Key, bool> {
1489 1489
    const M1 &_m1;
1490 1490
    const M2 &_m2;
1491 1491
  public:
1492 1492
    ///\e
1493 1493
    typedef typename M1::Key Key;
1494 1494
    ///\e
1495 1495
    typedef bool Value;
1496 1496

	
1497 1497
    /// Constructor
1498 1498
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1499 1499
    ///\e
1500 1500
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1501 1501
  };
1502 1502

	
1503 1503
  /// Returns an \c OrMap class
1504 1504

	
1505 1505
  /// This function just returns an \c OrMap class.
1506 1506
  ///
1507 1507
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1508 1508
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1509 1509
  /// <tt>m1[x]||m2[x]</tt>.
1510 1510
  ///
1511 1511
  /// \relates OrMap
1512 1512
  template<typename M1, typename M2>
1513 1513
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1514 1514
    return OrMap<M1, M2>(m1,m2);
1515 1515
  }
1516 1516

	
1517 1517

	
1518 1518
  /// Logical 'not' of a map
1519 1519

	
1520 1520
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1521 1521
  /// negation of the values of the given map.
1522 1522
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1523 1523
  ///
1524 1524
  /// The simplest way of using this map is through the notMap()
1525 1525
  /// function.
1526 1526
  ///
1527 1527
  /// \sa NotWriteMap
1528 1528
  template <typename M>
1529 1529
  class NotMap : public MapBase<typename M::Key, bool> {
1530 1530
    const M &_m;
1531 1531
  public:
1532 1532
    ///\e
1533 1533
    typedef typename M::Key Key;
1534 1534
    ///\e
1535 1535
    typedef bool Value;
1536 1536

	
1537 1537
    /// Constructor
1538 1538
    NotMap(const M &m) : _m(m) {}
1539 1539
    ///\e
1540 1540
    Value operator[](const Key &k) const { return !_m[k]; }
1541 1541
  };
1542 1542

	
1543 1543
  /// Logical 'not' of a map (read-write version)
1544 1544

	
1545 1545
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1546 1546
  /// logical negation of the values of the given map.
1547 1547
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1548 1548
  /// It makes also possible to write the map. When a value is set,
1549 1549
  /// the opposite value is set to the original map.
1550 1550
  ///
1551 1551
  /// The simplest way of using this map is through the notWriteMap()
1552 1552
  /// function.
1553 1553
  ///
1554 1554
  /// \sa NotMap
1555 1555
  template <typename M>
1556 1556
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1557 1557
    M &_m;
1558 1558
  public:
1559 1559
    ///\e
1560 1560
    typedef typename M::Key Key;
1561 1561
    ///\e
1562 1562
    typedef bool Value;
1563 1563

	
1564 1564
    /// Constructor
1565 1565
    NotWriteMap(M &m) : _m(m) {}
1566 1566
    ///\e
1567 1567
    Value operator[](const Key &k) const { return !_m[k]; }
1568 1568
    ///\e
1569 1569
    void set(const Key &k, bool v) { _m.set(k, !v); }
1570 1570
  };
1571 1571

	
1572 1572
  /// Returns a \c NotMap class
1573 1573

	
1574 1574
  /// This function just returns a \c NotMap class.
1575 1575
  ///
1576 1576
  /// For example, if \c m is a map with \c bool values, then
1577 1577
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1578 1578
  ///
1579 1579
  /// \relates NotMap
1580 1580
  template <typename M>
1581 1581
  inline NotMap<M> notMap(const M &m) {
1582 1582
    return NotMap<M>(m);
1583 1583
  }
1584 1584

	
1585 1585
  /// Returns a \c NotWriteMap class
1586 1586

	
1587 1587
  /// This function just returns a \c NotWriteMap class.
1588 1588
  ///
1589 1589
  /// For example, if \c m is a map with \c bool values, then
1590 1590
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1591 1591
  /// Moreover it makes also possible to write the map.
1592 1592
  ///
1593 1593
  /// \relates NotWriteMap
1594 1594
  template <typename M>
1595 1595
  inline NotWriteMap<M> notWriteMap(M &m) {
1596 1596
    return NotWriteMap<M>(m);
1597 1597
  }
1598 1598

	
1599 1599

	
1600 1600
  /// Combination of two maps using the \c == operator
1601 1601

	
1602 1602
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1603 1603
  /// the keys for which the corresponding values of the two maps are
1604 1604
  /// equal.
1605 1605
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1606 1606
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1607 1607
  ///
1608 1608
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1609 1609
  /// \code
1610 1610
  ///   EqualMap<M1,M2> em(m1,m2);
1611 1611
  /// \endcode
1612 1612
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1613 1613
  ///
1614 1614
  /// The simplest way of using this map is through the equalMap()
1615 1615
  /// function.
1616 1616
  ///
1617 1617
  /// \sa LessMap
1618 1618
  template<typename M1, typename M2>
1619 1619
  class EqualMap : public MapBase<typename M1::Key, bool> {
1620 1620
    const M1 &_m1;
1621 1621
    const M2 &_m2;
1622 1622
  public:
1623 1623
    ///\e
1624 1624
    typedef typename M1::Key Key;
1625 1625
    ///\e
1626 1626
    typedef bool Value;
1627 1627

	
1628 1628
    /// Constructor
1629 1629
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1630 1630
    ///\e
1631 1631
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1632 1632
  };
1633 1633

	
1634 1634
  /// Returns an \c EqualMap class
1635 1635

	
1636 1636
  /// This function just returns an \c EqualMap class.
1637 1637
  ///
1638 1638
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1639 1639
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1640 1640
  /// <tt>m1[x]==m2[x]</tt>.
1641 1641
  ///
1642 1642
  /// \relates EqualMap
1643 1643
  template<typename M1, typename M2>
1644 1644
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1645 1645
    return EqualMap<M1, M2>(m1,m2);
1646 1646
  }
1647 1647

	
1648 1648

	
1649 1649
  /// Combination of two maps using the \c < operator
1650 1650

	
1651 1651
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1652 1652
  /// the keys for which the corresponding value of the first map is
1653 1653
  /// less then the value of the second map.
1654 1654
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1655 1655
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1656 1656
  ///
1657 1657
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1658 1658
  /// \code
1659 1659
  ///   LessMap<M1,M2> lm(m1,m2);
1660 1660
  /// \endcode
1661 1661
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1662 1662
  ///
1663 1663
  /// The simplest way of using this map is through the lessMap()
1664 1664
  /// function.
1665 1665
  ///
1666 1666
  /// \sa EqualMap
1667 1667
  template<typename M1, typename M2>
1668 1668
  class LessMap : public MapBase<typename M1::Key, bool> {
1669 1669
    const M1 &_m1;
1670 1670
    const M2 &_m2;
1671 1671
  public:
1672 1672
    ///\e
1673 1673
    typedef typename M1::Key Key;
1674 1674
    ///\e
1675 1675
    typedef bool Value;
1676 1676

	
1677 1677
    /// Constructor
1678 1678
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1679 1679
    ///\e
1680 1680
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1681 1681
  };
1682 1682

	
1683 1683
  /// Returns an \c LessMap class
1684 1684

	
1685 1685
  /// This function just returns an \c LessMap class.
1686 1686
  ///
1687 1687
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1688 1688
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1689 1689
  /// <tt>m1[x]<m2[x]</tt>.
1690 1690
  ///
1691 1691
  /// \relates LessMap
1692 1692
  template<typename M1, typename M2>
1693 1693
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1694 1694
    return LessMap<M1, M2>(m1,m2);
1695 1695
  }
1696 1696

	
1697 1697
  namespace _maps_bits {
1698 1698

	
1699 1699
    template <typename _Iterator, typename Enable = void>
1700 1700
    struct IteratorTraits {
1701 1701
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1702 1702
    };
1703 1703

	
1704 1704
    template <typename _Iterator>
1705 1705
    struct IteratorTraits<_Iterator,
1706 1706
      typename exists<typename _Iterator::container_type>::type>
1707 1707
    {
1708 1708
      typedef typename _Iterator::container_type::value_type Value;
1709 1709
    };
1710 1710

	
1711 1711
  }
1712 1712

	
1713 1713
  /// @}
1714 1714

	
1715 1715
  /// \addtogroup maps
1716 1716
  /// @{
1717 1717

	
1718 1718
  /// \brief Writable bool map for logging each \c true assigned element
1719 1719
  ///
1720 1720
  /// A \ref concepts::WriteMap "writable" bool map for logging
1721 1721
  /// each \c true assigned element, i.e it copies subsequently each
1722 1722
  /// keys set to \c true to the given iterator.
1723 1723
  /// The most important usage of it is storing certain nodes or arcs
1724 1724
  /// that were marked \c true by an algorithm.
1725 1725
  ///
1726 1726
  /// There are several algorithms that provide solutions through bool
1727 1727
  /// maps and most of them assign \c true at most once for each key.
1728 1728
  /// In these cases it is a natural request to store each \c true
1729 1729
  /// assigned elements (in order of the assignment), which can be
1730 1730
  /// easily done with LoggerBoolMap.
1731 1731
  ///
1732 1732
  /// The simplest way of using this map is through the loggerBoolMap()
1733 1733
  /// function.
1734 1734
  ///
1735 1735
  /// \tparam IT The type of the iterator.
1736 1736
  /// \tparam KEY The key type of the map. The default value set
1737 1737
  /// according to the iterator type should work in most cases.
1738 1738
  ///
1739 1739
  /// \note The container of the iterator must contain enough space
1740 1740
  /// for the elements or the iterator should be an inserter iterator.
1741 1741
#ifdef DOXYGEN
1742 1742
  template <typename IT, typename KEY>
1743 1743
#else
1744 1744
  template <typename IT,
1745 1745
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1746 1746
#endif
1747 1747
  class LoggerBoolMap : public MapBase<KEY, bool> {
1748 1748
  public:
1749 1749

	
1750 1750
    ///\e
1751 1751
    typedef KEY Key;
1752 1752
    ///\e
1753 1753
    typedef bool Value;
1754 1754
    ///\e
1755 1755
    typedef IT Iterator;
1756 1756

	
1757 1757
    /// Constructor
1758 1758
    LoggerBoolMap(Iterator it)
1759 1759
      : _begin(it), _end(it) {}
1760 1760

	
1761 1761
    /// Gives back the given iterator set for the first key
1762 1762
    Iterator begin() const {
1763 1763
      return _begin;
1764 1764
    }
1765 1765

	
1766 1766
    /// Gives back the the 'after the last' iterator
1767 1767
    Iterator end() const {
1768 1768
      return _end;
1769 1769
    }
1770 1770

	
1771 1771
    /// The set function of the map
1772 1772
    void set(const Key& key, Value value) {
1773 1773
      if (value) {
1774 1774
        *_end++ = key;
1775 1775
      }
1776 1776
    }
1777 1777

	
1778 1778
  private:
1779 1779
    Iterator _begin;
1780 1780
    Iterator _end;
1781 1781
  };
1782 1782

	
1783 1783
  /// Returns a \c LoggerBoolMap class
1784 1784

	
1785 1785
  /// This function just returns a \c LoggerBoolMap class.
1786 1786
  ///
1787 1787
  /// The most important usage of it is storing certain nodes or arcs
1788 1788
  /// that were marked \c true by an algorithm.
1789 1789
  /// For example it makes easier to store the nodes in the processing
1790 1790
  /// order of Dfs algorithm, as the following examples show.
1791 1791
  /// \code
1792 1792
  ///   std::vector<Node> v;
1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1793
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1794 1794
  /// \endcode
1795 1795
  /// \code
1796 1796
  ///   std::vector<Node> v(countNodes(g));
1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1797
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1798 1798
  /// \endcode
1799 1799
  ///
1800 1800
  /// \note The container of the iterator must contain enough space
1801 1801
  /// for the elements or the iterator should be an inserter iterator.
1802 1802
  ///
1803 1803
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1804 1804
  /// it cannot be used when a readable map is needed, for example as
1805 1805
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1806 1806
  ///
1807 1807
  /// \relates LoggerBoolMap
1808 1808
  template<typename Iterator>
1809 1809
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1810 1810
    return LoggerBoolMap<Iterator>(it);
1811 1811
  }
1812 1812

	
1813 1813
  /// @}
1814 1814

	
1815 1815
  /// \addtogroup graph_maps
1816 1816
  /// @{
1817 1817

	
1818 1818
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1819
  ///
1820 1820
  /// IdMap provides a unique and immutable id for each item of the
1821 1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1822 1822
  ///  - \b unique: different items get different ids,
1823 1823
  ///  - \b immutable: the id of an item does not change (even if you
1824 1824
  ///    delete other nodes).
1825 1825
  ///
1826 1826
  /// Using this map you get access (i.e. can read) the inner id values of
1827 1827
  /// the items stored in the graph, which is returned by the \c id()
1828 1828
  /// function of the graph. This map can be inverted with its member
1829 1829
  /// class \c InverseMap or with the \c operator() member.
1830 1830
  ///
1831 1831
  /// \tparam GR The graph type.
1832 1832
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833 1833
  /// \c GR::Edge).
1834 1834
  ///
1835 1835
  /// \see RangeIdMap
1836 1836
  template <typename GR, typename K>
1837 1837
  class IdMap : public MapBase<K, int> {
1838 1838
  public:
1839 1839
    /// The graph type of IdMap.
1840 1840
    typedef GR Graph;
1841 1841
    typedef GR Digraph;
1842 1842
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1843 1843
    typedef K Item;
1844 1844
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1845 1845
    typedef K Key;
1846 1846
    /// The value type of IdMap.
1847 1847
    typedef int Value;
1848 1848

	
1849 1849
    /// \brief Constructor.
1850 1850
    ///
1851 1851
    /// Constructor of the map.
1852 1852
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1853 1853

	
1854 1854
    /// \brief Gives back the \e id of the item.
1855 1855
    ///
1856 1856
    /// Gives back the immutable and unique \e id of the item.
1857 1857
    int operator[](const Item& item) const { return _graph->id(item);}
1858 1858

	
1859 1859
    /// \brief Gives back the \e item by its id.
1860 1860
    ///
1861 1861
    /// Gives back the \e item by its id.
1862 1862
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1863 1863

	
1864 1864
  private:
1865 1865
    const Graph* _graph;
1866 1866

	
1867 1867
  public:
1868 1868

	
1869 1869
    /// \brief This class represents the inverse of its owner (IdMap).
1870 1870
    ///
1871 1871
    /// This class represents the inverse of its owner (IdMap).
1872 1872
    /// \see inverse()
1873 1873
    class InverseMap {
1874 1874
    public:
1875 1875

	
1876 1876
      /// \brief Constructor.
1877 1877
      ///
1878 1878
      /// Constructor for creating an id-to-item map.
1879 1879
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1880 1880

	
1881 1881
      /// \brief Constructor.
1882 1882
      ///
1883 1883
      /// Constructor for creating an id-to-item map.
1884 1884
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1885 1885

	
1886 1886
      /// \brief Gives back the given item from its id.
1887 1887
      ///
1888 1888
      /// Gives back the given item from its id.
1889 1889
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1890

	
1891 1891
    private:
1892 1892
      const Graph* _graph;
1893 1893
    };
1894 1894

	
1895 1895
    /// \brief Gives back the inverse of the map.
1896 1896
    ///
1897 1897
    /// Gives back the inverse of the IdMap.
1898 1898
    InverseMap inverse() const { return InverseMap(*_graph);}
1899 1899
  };
1900 1900

	
1901 1901

	
1902 1902
  /// \brief General cross reference graph map type.
1903 1903

	
1904 1904
  /// This class provides simple invertable graph maps.
1905 1905
  /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
1906 1906
  /// and if a key is set to a new value then store it
1907 1907
  /// in the inverse map.
1908 1908
  ///
1909 1909
  /// The values of the map can be accessed
1910 1910
  /// with stl compatible forward iterator.
1911 1911
  ///
1912 1912
  /// \tparam GR The graph type.
1913 1913
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1914 1914
  /// \c GR::Edge).
1915 1915
  /// \tparam V The value type of the map.
1916 1916
  ///
1917 1917
  /// \see IterableValueMap
1918 1918
  template <typename GR, typename K, typename V>
1919 1919
  class CrossRefMap
1920 1920
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1921 1921
  private:
1922 1922

	
1923 1923
    typedef typename ItemSetTraits<GR, K>::
1924 1924
      template Map<V>::Type Map;
1925 1925

	
1926 1926
    typedef std::map<V, K> Container;
1927 1927
    Container _inv_map;
1928 1928

	
1929 1929
  public:
1930 1930

	
1931 1931
    /// The graph type of CrossRefMap.
1932 1932
    typedef GR Graph;
1933 1933
    typedef GR Digraph;
1934 1934
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1935
    typedef K Item;
1936 1936
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1937
    typedef K Key;
1938 1938
    /// The value type of CrossRefMap.
1939 1939
    typedef V Value;
1940 1940

	
1941 1941
    /// \brief Constructor.
1942 1942
    ///
1943 1943
    /// Construct a new CrossRefMap for the given graph.
1944 1944
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1945 1945

	
1946 1946
    /// \brief Forward iterator for values.
1947 1947
    ///
1948 1948
    /// This iterator is an stl compatible forward
1949 1949
    /// iterator on the values of the map. The values can
1950 1950
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1951 1951
    class ValueIterator
1952 1952
      : public std::iterator<std::forward_iterator_tag, Value> {
1953 1953
      friend class CrossRefMap;
1954 1954
    private:
1955 1955
      ValueIterator(typename Container::const_iterator _it)
1956 1956
        : it(_it) {}
1957 1957
    public:
1958 1958

	
1959 1959
      ValueIterator() {}
1960 1960

	
1961 1961
      ValueIterator& operator++() { ++it; return *this; }
1962 1962
      ValueIterator operator++(int) {
1963 1963
        ValueIterator tmp(*this);
1964 1964
        operator++();
1965 1965
        return tmp;
1966 1966
      }
1967 1967

	
1968 1968
      const Value& operator*() const { return it->first; }
1969 1969
      const Value* operator->() const { return &(it->first); }
1970 1970

	
1971 1971
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1972 1972
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1973 1973

	
1974 1974
    private:
1975 1975
      typename Container::const_iterator it;
1976 1976
    };
1977 1977

	
1978 1978
    /// \brief Returns an iterator to the first value.
1979 1979
    ///
1980 1980
    /// Returns an stl compatible iterator to the
1981 1981
    /// first value of the map. The values of the
1982 1982
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1983 1983
    /// range.
1984 1984
    ValueIterator beginValue() const {
1985 1985
      return ValueIterator(_inv_map.begin());
1986 1986
    }
1987 1987

	
1988 1988
    /// \brief Returns an iterator after the last value.
1989 1989
    ///
1990 1990
    /// Returns an stl compatible iterator after the
1991 1991
    /// last value of the map. The values of the
1992 1992
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1993 1993
    /// range.
1994 1994
    ValueIterator endValue() const {
1995 1995
      return ValueIterator(_inv_map.end());
1996 1996
    }
1997 1997

	
1998 1998
    /// \brief Sets the value associated with the given key.
1999 1999
    ///
2000 2000
    /// Sets the value associated with the given key.
2001 2001
    void set(const Key& key, const Value& val) {
2002 2002
      Value oldval = Map::operator[](key);
2003 2003
      typename Container::iterator it = _inv_map.find(oldval);
2004 2004
      if (it != _inv_map.end() && it->second == key) {
2005 2005
        _inv_map.erase(it);
2006 2006
      }
2007 2007
      _inv_map.insert(make_pair(val, key));
2008 2008
      Map::set(key, val);
2009 2009
    }
2010 2010

	
2011 2011
    /// \brief Returns the value associated with the given key.
2012 2012
    ///
2013 2013
    /// Returns the value associated with the given key.
2014 2014
    typename MapTraits<Map>::ConstReturnValue
2015 2015
    operator[](const Key& key) const {
2016 2016
      return Map::operator[](key);
2017 2017
    }
2018 2018

	
2019 2019
    /// \brief Gives back the item by its value.
2020 2020
    ///
2021 2021
    /// Gives back the item by its value.
2022 2022
    Key operator()(const Value& key) const {
2023 2023
      typename Container::const_iterator it = _inv_map.find(key);
2024 2024
      return it != _inv_map.end() ? it->second : INVALID;
2025 2025
    }
2026 2026

	
2027 2027
  protected:
2028 2028

	
2029 2029
    /// \brief Erase the key from the map and the inverse map.
2030 2030
    ///
2031 2031
    /// Erase the key from the map and the inverse map. It is called by the
2032 2032
    /// \c AlterationNotifier.
2033 2033
    virtual void erase(const Key& key) {
2034 2034
      Value val = Map::operator[](key);
2035 2035
      typename Container::iterator it = _inv_map.find(val);
2036 2036
      if (it != _inv_map.end() && it->second == key) {
2037 2037
        _inv_map.erase(it);
2038 2038
      }
2039 2039
      Map::erase(key);
2040 2040
    }
2041 2041

	
2042 2042
    /// \brief Erase more keys from the map and the inverse map.
2043 2043
    ///
2044 2044
    /// Erase more keys from the map and the inverse map. It is called by the
2045 2045
    /// \c AlterationNotifier.
2046 2046
    virtual void erase(const std::vector<Key>& keys) {
2047 2047
      for (int i = 0; i < int(keys.size()); ++i) {
2048 2048
        Value val = Map::operator[](keys[i]);
2049 2049
        typename Container::iterator it = _inv_map.find(val);
2050 2050
        if (it != _inv_map.end() && it->second == keys[i]) {
2051 2051
          _inv_map.erase(it);
2052 2052
        }
2053 2053
      }
2054 2054
      Map::erase(keys);
2055 2055
    }
2056 2056

	
2057 2057
    /// \brief Clear the keys from the map and the inverse map.
2058 2058
    ///
2059 2059
    /// Clear the keys from the map and the inverse map. It is called by the
2060 2060
    /// \c AlterationNotifier.
2061 2061
    virtual void clear() {
2062 2062
      _inv_map.clear();
2063 2063
      Map::clear();
2064 2064
    }
2065 2065

	
2066 2066
  public:
2067 2067

	
2068 2068
    /// \brief The inverse map type.
2069 2069
    ///
2070 2070
    /// The inverse of this map. The subscript operator of the map
2071 2071
    /// gives back the item that was last assigned to the value.
2072 2072
    class InverseMap {
2073 2073
    public:
2074 2074
      /// \brief Constructor
2075 2075
      ///
2076 2076
      /// Constructor of the InverseMap.
2077 2077
      explicit InverseMap(const CrossRefMap& inverted)
2078 2078
        : _inverted(inverted) {}
2079 2079

	
2080 2080
      /// The value type of the InverseMap.
2081 2081
      typedef typename CrossRefMap::Key Value;
2082 2082
      /// The key type of the InverseMap.
2083 2083
      typedef typename CrossRefMap::Value Key;
2084 2084

	
2085 2085
      /// \brief Subscript operator.
2086 2086
      ///
2087 2087
      /// Subscript operator. It gives back the item
2088 2088
      /// that was last assigned to the given value.
2089 2089
      Value operator[](const Key& key) const {
2090 2090
        return _inverted(key);
2091 2091
      }
2092 2092

	
2093 2093
    private:
2094 2094
      const CrossRefMap& _inverted;
2095 2095
    };
2096 2096

	
2097 2097
    /// \brief It gives back the read-only inverse map.
2098 2098
    ///
2099 2099
    /// It gives back the read-only inverse map.
2100 2100
    InverseMap inverse() const {
2101 2101
      return InverseMap(*this);
2102 2102
    }
2103 2103

	
2104 2104
  };
2105 2105

	
2106 2106
  /// \brief Provides continuous and unique ID for the
2107 2107
  /// items of a graph.
2108 2108
  ///
2109 2109
  /// RangeIdMap provides a unique and continuous
2110 2110
  /// ID for each item of a given type (\c Node, \c Arc or
2111 2111
  /// \c Edge) in a graph. This id is
2112 2112
  ///  - \b unique: different items get different ids,
2113 2113
  ///  - \b continuous: the range of the ids is the set of integers
2114 2114
  ///    between 0 and \c n-1, where \c n is the number of the items of
2115 2115
  ///    this type (\c Node, \c Arc or \c Edge).
2116 2116
  ///  - So, the ids can change when deleting an item of the same type.
2117 2117
  ///
2118 2118
  /// Thus this id is not (necessarily) the same as what can get using
2119 2119
  /// the \c id() function of the graph or \ref IdMap.
2120 2120
  /// This map can be inverted with its member class \c InverseMap,
2121 2121
  /// or with the \c operator() member.
2122 2122
  ///
2123 2123
  /// \tparam GR The graph type.
2124 2124
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2125 2125
  /// \c GR::Edge).
2126 2126
  ///
2127 2127
  /// \see IdMap
2128 2128
  template <typename GR, typename K>
2129 2129
  class RangeIdMap
2130 2130
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2131 2131

	
2132 2132
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2133 2133

	
2134 2134
  public:
2135 2135
    /// The graph type of RangeIdMap.
2136 2136
    typedef GR Graph;
2137 2137
    typedef GR Digraph;
2138 2138
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2139 2139
    typedef K Item;
2140 2140
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2141 2141
    typedef K Key;
2142 2142
    /// The value type of RangeIdMap.
2143 2143
    typedef int Value;
2144 2144

	
2145 2145
    /// \brief Constructor.
2146 2146
    ///
2147 2147
    /// Constructor.
2148 2148
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2149 2149
      Item it;
2150 2150
      const typename Map::Notifier* nf = Map::notifier();
2151 2151
      for (nf->first(it); it != INVALID; nf->next(it)) {
2152 2152
        Map::set(it, _inv_map.size());
2153 2153
        _inv_map.push_back(it);
2154 2154
      }
2155 2155
    }
2156 2156

	
2157 2157
  protected:
2158 2158

	
2159 2159
    /// \brief Adds a new key to the map.
2160 2160
    ///
2161 2161
    /// Add a new key to the map. It is called by the
2162 2162
    /// \c AlterationNotifier.
2163 2163
    virtual void add(const Item& item) {
2164 2164
      Map::add(item);
2165 2165
      Map::set(item, _inv_map.size());
2166 2166
      _inv_map.push_back(item);
2167 2167
    }
2168 2168

	
2169 2169
    /// \brief Add more new keys to the map.
2170 2170
    ///
2171 2171
    /// Add more new keys to the map. It is called by the
2172 2172
    /// \c AlterationNotifier.
2173 2173
    virtual void add(const std::vector<Item>& items) {
2174 2174
      Map::add(items);
2175 2175
      for (int i = 0; i < int(items.size()); ++i) {
2176 2176
        Map::set(items[i], _inv_map.size());
2177 2177
        _inv_map.push_back(items[i]);
2178 2178
      }
2179 2179
    }
2180 2180

	
2181 2181
    /// \brief Erase the key from the map.
2182 2182
    ///
2183 2183
    /// Erase the key from the map. It is called by the
2184 2184
    /// \c AlterationNotifier.
2185 2185
    virtual void erase(const Item& item) {
2186 2186
      Map::set(_inv_map.back(), Map::operator[](item));
2187 2187
      _inv_map[Map::operator[](item)] = _inv_map.back();
2188 2188
      _inv_map.pop_back();
2189 2189
      Map::erase(item);
2190 2190
    }
2191 2191

	
2192 2192
    /// \brief Erase more keys from the map.
2193 2193
    ///
2194 2194
    /// Erase more keys from the map. It is called by the
2195 2195
    /// \c AlterationNotifier.
2196 2196
    virtual void erase(const std::vector<Item>& items) {
2197 2197
      for (int i = 0; i < int(items.size()); ++i) {
2198 2198
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2199 2199
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2200 2200
        _inv_map.pop_back();
2201 2201
      }
2202 2202
      Map::erase(items);
2203 2203
    }
2204 2204

	
2205 2205
    /// \brief Build the unique map.
2206 2206
    ///
2207 2207
    /// Build the unique map. It is called by the
2208 2208
    /// \c AlterationNotifier.
2209 2209
    virtual void build() {
2210 2210
      Map::build();
2211 2211
      Item it;
2212 2212
      const typename Map::Notifier* nf = Map::notifier();
2213 2213
      for (nf->first(it); it != INVALID; nf->next(it)) {
2214 2214
        Map::set(it, _inv_map.size());
2215 2215
        _inv_map.push_back(it);
2216 2216
      }
2217 2217
    }
2218 2218

	
2219 2219
    /// \brief Clear the keys from the map.
2220 2220
    ///
2221 2221
    /// Clear the keys from the map. It is called by the
2222 2222
    /// \c AlterationNotifier.
2223 2223
    virtual void clear() {
2224 2224
      _inv_map.clear();
2225 2225
      Map::clear();
2226 2226
    }
2227 2227

	
2228 2228
  public:
2229 2229

	
2230 2230
    /// \brief Returns the maximal value plus one.
2231 2231
    ///
2232 2232
    /// Returns the maximal value plus one in the map.
2233 2233
    unsigned int size() const {
2234 2234
      return _inv_map.size();
2235 2235
    }
2236 2236

	
2237 2237
    /// \brief Swaps the position of the two items in the map.
2238 2238
    ///
2239 2239
    /// Swaps the position of the two items in the map.
2240 2240
    void swap(const Item& p, const Item& q) {
2241 2241
      int pi = Map::operator[](p);
2242 2242
      int qi = Map::operator[](q);
2243 2243
      Map::set(p, qi);
2244 2244
      _inv_map[qi] = p;
2245 2245
      Map::set(q, pi);
2246 2246
      _inv_map[pi] = q;
2247 2247
    }
2248 2248

	
2249 2249
    /// \brief Gives back the \e RangeId of the item
2250 2250
    ///
2251 2251
    /// Gives back the \e RangeId of the item.
2252 2252
    int operator[](const Item& item) const {
2253 2253
      return Map::operator[](item);
2254 2254
    }
2255 2255

	
2256 2256
    /// \brief Gives back the item belonging to a \e RangeId
2257 2257
    /// 
2258 2258
    /// Gives back the item belonging to a \e RangeId.
2259 2259
    Item operator()(int id) const {
2260 2260
      return _inv_map[id];
2261 2261
    }
2262 2262

	
2263 2263
  private:
2264 2264

	
2265 2265
    typedef std::vector<Item> Container;
2266 2266
    Container _inv_map;
2267 2267

	
2268 2268
  public:
2269 2269

	
2270 2270
    /// \brief The inverse map type of RangeIdMap.
2271 2271
    ///
2272 2272
    /// The inverse map type of RangeIdMap.
2273 2273
    class InverseMap {
2274 2274
    public:
2275 2275
      /// \brief Constructor
2276 2276
      ///
2277 2277
      /// Constructor of the InverseMap.
2278 2278
      explicit InverseMap(const RangeIdMap& inverted)
2279 2279
        : _inverted(inverted) {}
2280 2280

	
2281 2281

	
2282 2282
      /// The value type of the InverseMap.
2283 2283
      typedef typename RangeIdMap::Key Value;
2284 2284
      /// The key type of the InverseMap.
2285 2285
      typedef typename RangeIdMap::Value Key;
2286 2286

	
2287 2287
      /// \brief Subscript operator.
2288 2288
      ///
2289 2289
      /// Subscript operator. It gives back the item
2290 2290
      /// that the descriptor currently belongs to.
2291 2291
      Value operator[](const Key& key) const {
2292 2292
        return _inverted(key);
2293 2293
      }
2294 2294

	
2295 2295
      /// \brief Size of the map.
2296 2296
      ///
2297 2297
      /// Returns the size of the map.
2298 2298
      unsigned int size() const {
2299 2299
        return _inverted.size();
2300 2300
      }
2301 2301

	
2302 2302
    private:
2303 2303
      const RangeIdMap& _inverted;
2304 2304
    };
2305 2305

	
2306 2306
    /// \brief Gives back the inverse of the map.
2307 2307
    ///
2308 2308
    /// Gives back the inverse of the map.
2309 2309
    const InverseMap inverse() const {
2310 2310
      return InverseMap(*this);
2311 2311
    }
2312 2312
  };
2313 2313

	
2314 2314
  /// \brief Map of the source nodes of arcs in a digraph.
2315 2315
  ///
2316 2316
  /// SourceMap provides access for the source node of each arc in a digraph,
2317 2317
  /// which is returned by the \c source() function of the digraph.
2318 2318
  /// \tparam GR The digraph type.
2319 2319
  /// \see TargetMap
2320 2320
  template <typename GR>
2321 2321
  class SourceMap {
2322 2322
  public:
2323 2323

	
2324 2324
    ///\e
2325 2325
    typedef typename GR::Arc Key;
2326 2326
    ///\e
2327 2327
    typedef typename GR::Node Value;
2328 2328

	
2329 2329
    /// \brief Constructor
2330 2330
    ///
2331 2331
    /// Constructor.
2332 2332
    /// \param digraph The digraph that the map belongs to.
2333 2333
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
2334 2334

	
2335 2335
    /// \brief Returns the source node of the given arc.
2336 2336
    ///
2337 2337
    /// Returns the source node of the given arc.
2338 2338
    Value operator[](const Key& arc) const {
2339 2339
      return _graph.source(arc);
2340 2340
    }
2341 2341

	
2342 2342
  private:
2343 2343
    const GR& _graph;
2344 2344
  };
2345 2345

	
2346 2346
  /// \brief Returns a \c SourceMap class.
2347 2347
  ///
2348 2348
  /// This function just returns an \c SourceMap class.
2349 2349
  /// \relates SourceMap
2350 2350
  template <typename GR>
2351 2351
  inline SourceMap<GR> sourceMap(const GR& graph) {
2352 2352
    return SourceMap<GR>(graph);
2353 2353
  }
2354 2354

	
2355 2355
  /// \brief Map of the target nodes of arcs in a digraph.
2356 2356
  ///
2357 2357
  /// TargetMap provides access for the target node of each arc in a digraph,
2358 2358
  /// which is returned by the \c target() function of the digraph.
2359 2359
  /// \tparam GR The digraph type.
2360 2360
  /// \see SourceMap
2361 2361
  template <typename GR>
2362 2362
  class TargetMap {
2363 2363
  public:
2364 2364

	
2365 2365
    ///\e
2366 2366
    typedef typename GR::Arc Key;
2367 2367
    ///\e
2368 2368
    typedef typename GR::Node Value;
2369 2369

	
2370 2370
    /// \brief Constructor
2371 2371
    ///
2372 2372
    /// Constructor.
2373 2373
    /// \param digraph The digraph that the map belongs to.
2374 2374
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
2375 2375

	
2376 2376
    /// \brief Returns the target node of the given arc.
2377 2377
    ///
2378 2378
    /// Returns the target node of the given arc.
2379 2379
    Value operator[](const Key& e) const {
2380 2380
      return _graph.target(e);
2381 2381
    }
2382 2382

	
2383 2383
  private:
2384 2384
    const GR& _graph;
2385 2385
  };
2386 2386

	
2387 2387
  /// \brief Returns a \c TargetMap class.
2388 2388
  ///
2389 2389
  /// This function just returns a \c TargetMap class.
2390 2390
  /// \relates TargetMap
2391 2391
  template <typename GR>
2392 2392
  inline TargetMap<GR> targetMap(const GR& graph) {
2393 2393
    return TargetMap<GR>(graph);
2394 2394
  }
2395 2395

	
2396 2396
  /// \brief Map of the "forward" directed arc view of edges in a graph.
2397 2397
  ///
2398 2398
  /// ForwardMap provides access for the "forward" directed arc view of
2399 2399
  /// each edge in a graph, which is returned by the \c direct() function
2400 2400
  /// of the graph with \c true parameter.
2401 2401
  /// \tparam GR The graph type.
2402 2402
  /// \see BackwardMap
2403 2403
  template <typename GR>
2404 2404
  class ForwardMap {
2405 2405
  public:
2406 2406

	
2407 2407
    typedef typename GR::Arc Value;
2408 2408
    typedef typename GR::Edge Key;
2409 2409

	
2410 2410
    /// \brief Constructor
2411 2411
    ///
2412 2412
    /// Constructor.
2413 2413
    /// \param graph The graph that the map belongs to.
2414 2414
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
2415 2415

	
2416 2416
    /// \brief Returns the "forward" directed arc view of the given edge.
2417 2417
    ///
2418 2418
    /// Returns the "forward" directed arc view of the given edge.
2419 2419
    Value operator[](const Key& key) const {
2420 2420
      return _graph.direct(key, true);
2421 2421
    }
2422 2422

	
2423 2423
  private:
2424 2424
    const GR& _graph;
2425 2425
  };
2426 2426

	
2427 2427
  /// \brief Returns a \c ForwardMap class.
2428 2428
  ///
2429 2429
  /// This function just returns an \c ForwardMap class.
2430 2430
  /// \relates ForwardMap
2431 2431
  template <typename GR>
2432 2432
  inline ForwardMap<GR> forwardMap(const GR& graph) {
2433 2433
    return ForwardMap<GR>(graph);
2434 2434
  }
2435 2435

	
2436 2436
  /// \brief Map of the "backward" directed arc view of edges in a graph.
2437 2437
  ///
2438 2438
  /// BackwardMap provides access for the "backward" directed arc view of
2439 2439
  /// each edge in a graph, which is returned by the \c direct() function
2440 2440
  /// of the graph with \c false parameter.
2441 2441
  /// \tparam GR The graph type.
2442 2442
  /// \see ForwardMap
2443 2443
  template <typename GR>
2444 2444
  class BackwardMap {
2445 2445
  public:
2446 2446

	
2447 2447
    typedef typename GR::Arc Value;
2448 2448
    typedef typename GR::Edge Key;
2449 2449

	
2450 2450
    /// \brief Constructor
2451 2451
    ///
2452 2452
    /// Constructor.
2453 2453
    /// \param graph The graph that the map belongs to.
2454 2454
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
2455 2455

	
2456 2456
    /// \brief Returns the "backward" directed arc view of the given edge.
2457 2457
    ///
2458 2458
    /// Returns the "backward" directed arc view of the given edge.
2459 2459
    Value operator[](const Key& key) const {
2460 2460
      return _graph.direct(key, false);
2461 2461
    }
2462 2462

	
2463 2463
  private:
2464 2464
    const GR& _graph;
2465 2465
  };
2466 2466

	
2467 2467
  /// \brief Returns a \c BackwardMap class
2468 2468

	
2469 2469
  /// This function just returns a \c BackwardMap class.
2470 2470
  /// \relates BackwardMap
2471 2471
  template <typename GR>
2472 2472
  inline BackwardMap<GR> backwardMap(const GR& graph) {
2473 2473
    return BackwardMap<GR>(graph);
2474 2474
  }
2475 2475

	
2476 2476
  /// \brief Map of the in-degrees of nodes in a digraph.
2477 2477
  ///
2478 2478
  /// This map returns the in-degree of a node. Once it is constructed,
2479 2479
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2480 2480
  /// in constant time. On the other hand, the values are updated automatically
2481 2481
  /// whenever the digraph changes.
2482 2482
  ///
2483 2483
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2484 2484
  /// may provide alternative ways to modify the digraph.
2485 2485
  /// The correct behavior of InDegMap is not guarantied if these additional
2486 2486
  /// features are used. For example the functions
2487 2487
  /// \ref ListDigraph::changeSource() "changeSource()",
2488 2488
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2489 2489
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2490 2490
  /// of \ref ListDigraph will \e not update the degree values correctly.
2491 2491
  ///
2492 2492
  /// \sa OutDegMap
2493 2493
  template <typename GR>
2494 2494
  class InDegMap
2495 2495
    : protected ItemSetTraits<GR, typename GR::Arc>
2496 2496
      ::ItemNotifier::ObserverBase {
2497 2497

	
2498 2498
  public:
2499 2499
    
2500 2500
    /// The graph type of InDegMap
2501 2501
    typedef GR Graph;
2502 2502
    typedef GR Digraph;
2503 2503
    /// The key type
2504 2504
    typedef typename Digraph::Node Key;
2505 2505
    /// The value type
2506 2506
    typedef int Value;
2507 2507

	
2508 2508
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2509 2509
    ::ItemNotifier::ObserverBase Parent;
2510 2510

	
2511 2511
  private:
2512 2512

	
2513 2513
    class AutoNodeMap
2514 2514
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2515 2515
    public:
2516 2516

	
2517 2517
      typedef typename ItemSetTraits<Digraph, Key>::
2518 2518
      template Map<int>::Type Parent;
2519 2519

	
2520 2520
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2521 2521

	
2522 2522
      virtual void add(const Key& key) {
2523 2523
        Parent::add(key);
2524 2524
        Parent::set(key, 0);
2525 2525
      }
2526 2526

	
2527 2527
      virtual void add(const std::vector<Key>& keys) {
2528 2528
        Parent::add(keys);
2529 2529
        for (int i = 0; i < int(keys.size()); ++i) {
2530 2530
          Parent::set(keys[i], 0);
2531 2531
        }
2532 2532
      }
2533 2533

	
2534 2534
      virtual void build() {
2535 2535
        Parent::build();
2536 2536
        Key it;
2537 2537
        typename Parent::Notifier* nf = Parent::notifier();
2538 2538
        for (nf->first(it); it != INVALID; nf->next(it)) {
2539 2539
          Parent::set(it, 0);
2540 2540
        }
2541 2541
      }
2542 2542
    };
2543 2543

	
2544 2544
  public:
2545 2545

	
2546 2546
    /// \brief Constructor.
2547 2547
    ///
2548 2548
    /// Constructor for creating an in-degree map.
2549 2549
    explicit InDegMap(const Digraph& graph)
2550 2550
      : _digraph(graph), _deg(graph) {
2551 2551
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2552 2552

	
2553 2553
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2554 2554
        _deg[it] = countInArcs(_digraph, it);
2555 2555
      }
2556 2556
    }
2557 2557

	
2558 2558
    /// \brief Gives back the in-degree of a Node.
2559 2559
    ///
2560 2560
    /// Gives back the in-degree of a Node.
2561 2561
    int operator[](const Key& key) const {
2562 2562
      return _deg[key];
2563 2563
    }
2564 2564

	
2565 2565
  protected:
2566 2566

	
2567 2567
    typedef typename Digraph::Arc Arc;
2568 2568

	
2569 2569
    virtual void add(const Arc& arc) {
2570 2570
      ++_deg[_digraph.target(arc)];
2571 2571
    }
2572 2572

	
2573 2573
    virtual void add(const std::vector<Arc>& arcs) {
2574 2574
      for (int i = 0; i < int(arcs.size()); ++i) {
2575 2575
        ++_deg[_digraph.target(arcs[i])];
2576 2576
      }
2577 2577
    }
2578 2578

	
2579 2579
    virtual void erase(const Arc& arc) {
2580 2580
      --_deg[_digraph.target(arc)];
2581 2581
    }
2582 2582

	
2583 2583
    virtual void erase(const std::vector<Arc>& arcs) {
2584 2584
      for (int i = 0; i < int(arcs.size()); ++i) {
2585 2585
        --_deg[_digraph.target(arcs[i])];
2586 2586
      }
2587 2587
    }
2588 2588

	
2589 2589
    virtual void build() {
2590 2590
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2591 2591
        _deg[it] = countInArcs(_digraph, it);
2592 2592
      }
2593 2593
    }
2594 2594

	
2595 2595
    virtual void clear() {
2596 2596
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2597 2597
        _deg[it] = 0;
2598 2598
      }
2599 2599
    }
2600 2600
  private:
2601 2601

	
2602 2602
    const Digraph& _digraph;
2603 2603
    AutoNodeMap _deg;
2604 2604
  };
2605 2605

	
2606 2606
  /// \brief Map of the out-degrees of nodes in a digraph.
2607 2607
  ///
2608 2608
  /// This map returns the out-degree of a node. Once it is constructed,
2609 2609
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2610 2610
  /// in constant time. On the other hand, the values are updated automatically
2611 2611
  /// whenever the digraph changes.
2612 2612
  ///
2613 2613
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2614 2614
  /// may provide alternative ways to modify the digraph.
2615 2615
  /// The correct behavior of OutDegMap is not guarantied if these additional
2616 2616
  /// features are used. For example the functions
2617 2617
  /// \ref ListDigraph::changeSource() "changeSource()",
2618 2618
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2619 2619
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2620 2620
  /// of \ref ListDigraph will \e not update the degree values correctly.
2621 2621
  ///
2622 2622
  /// \sa InDegMap
2623 2623
  template <typename GR>
2624 2624
  class OutDegMap
2625 2625
    : protected ItemSetTraits<GR, typename GR::Arc>
2626 2626
      ::ItemNotifier::ObserverBase {
2627 2627

	
2628 2628
  public:
2629 2629

	
2630 2630
    /// The graph type of OutDegMap
2631 2631
    typedef GR Graph;
2632 2632
    typedef GR Digraph;
2633 2633
    /// The key type
2634 2634
    typedef typename Digraph::Node Key;
2635 2635
    /// The value type
2636 2636
    typedef int Value;
2637 2637

	
2638 2638
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2639 2639
    ::ItemNotifier::ObserverBase Parent;
2640 2640

	
2641 2641
  private:
2642 2642

	
2643 2643
    class AutoNodeMap
2644 2644
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2645 2645
    public:
2646 2646

	
2647 2647
      typedef typename ItemSetTraits<Digraph, Key>::
2648 2648
      template Map<int>::Type Parent;
2649 2649

	
2650 2650
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2651 2651

	
2652 2652
      virtual void add(const Key& key) {
2653 2653
        Parent::add(key);
2654 2654
        Parent::set(key, 0);
2655 2655
      }
2656 2656
      virtual void add(const std::vector<Key>& keys) {
2657 2657
        Parent::add(keys);
2658 2658
        for (int i = 0; i < int(keys.size()); ++i) {
2659 2659
          Parent::set(keys[i], 0);
2660 2660
        }
2661 2661
      }
2662 2662
      virtual void build() {
2663 2663
        Parent::build();
2664 2664
        Key it;
2665 2665
        typename Parent::Notifier* nf = Parent::notifier();
2666 2666
        for (nf->first(it); it != INVALID; nf->next(it)) {
2667 2667
          Parent::set(it, 0);
2668 2668
        }
2669 2669
      }
2670 2670
    };
2671 2671

	
2672 2672
  public:
2673 2673

	
2674 2674
    /// \brief Constructor.
2675 2675
    ///
2676 2676
    /// Constructor for creating an out-degree map.
2677 2677
    explicit OutDegMap(const Digraph& graph)
2678 2678
      : _digraph(graph), _deg(graph) {
2679 2679
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2680 2680

	
2681 2681
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2682 2682
        _deg[it] = countOutArcs(_digraph, it);
2683 2683
      }
2684 2684
    }
2685 2685

	
2686 2686
    /// \brief Gives back the out-degree of a Node.
2687 2687
    ///
2688 2688
    /// Gives back the out-degree of a Node.
2689 2689
    int operator[](const Key& key) const {
2690 2690
      return _deg[key];
2691 2691
    }
2692 2692

	
2693 2693
  protected:
2694 2694

	
2695 2695
    typedef typename Digraph::Arc Arc;
2696 2696

	
2697 2697
    virtual void add(const Arc& arc) {
2698 2698
      ++_deg[_digraph.source(arc)];
2699 2699
    }
2700 2700

	
2701 2701
    virtual void add(const std::vector<Arc>& arcs) {
2702 2702
      for (int i = 0; i < int(arcs.size()); ++i) {
2703 2703
        ++_deg[_digraph.source(arcs[i])];
2704 2704
      }
2705 2705
    }
2706 2706

	
2707 2707
    virtual void erase(const Arc& arc) {
2708 2708
      --_deg[_digraph.source(arc)];
2709 2709
    }
2710 2710

	
2711 2711
    virtual void erase(const std::vector<Arc>& arcs) {
2712 2712
      for (int i = 0; i < int(arcs.size()); ++i) {
2713 2713
        --_deg[_digraph.source(arcs[i])];
2714 2714
      }
2715 2715
    }
2716 2716

	
2717 2717
    virtual void build() {
2718 2718
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2719 2719
        _deg[it] = countOutArcs(_digraph, it);
2720 2720
      }
2721 2721
    }
2722 2722

	
2723 2723
    virtual void clear() {
2724 2724
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2725 2725
        _deg[it] = 0;
2726 2726
      }
2727 2727
    }
2728 2728
  private:
2729 2729

	
2730 2730
    const Digraph& _digraph;
2731 2731
    AutoNodeMap _deg;
2732 2732
  };
2733 2733

	
2734 2734
  /// \brief Potential difference map
2735 2735
  ///
2736 2736
  /// PotentialDifferenceMap returns the difference between the potentials of
2737 2737
  /// the source and target nodes of each arc in a digraph, i.e. it returns
2738 2738
  /// \code
2739 2739
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2740 2740
  /// \endcode
2741 2741
  /// \tparam GR The digraph type.
2742 2742
  /// \tparam POT A node map storing the potentials.
2743 2743
  template <typename GR, typename POT>
2744 2744
  class PotentialDifferenceMap {
2745 2745
  public:
2746 2746
    /// Key type
2747 2747
    typedef typename GR::Arc Key;
2748 2748
    /// Value type
2749 2749
    typedef typename POT::Value Value;
2750 2750

	
2751 2751
    /// \brief Constructor
2752 2752
    ///
2753 2753
    /// Contructor of the map.
2754 2754
    explicit PotentialDifferenceMap(const GR& gr,
2755 2755
                                    const POT& potential)
2756 2756
      : _digraph(gr), _potential(potential) {}
2757 2757

	
2758 2758
    /// \brief Returns the potential difference for the given arc.
2759 2759
    ///
2760 2760
    /// Returns the potential difference for the given arc, i.e.
2761 2761
    /// \code
2762 2762
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2763 2763
    /// \endcode
2764 2764
    Value operator[](const Key& arc) const {
2765 2765
      return _potential[_digraph.target(arc)] -
2766 2766
        _potential[_digraph.source(arc)];
2767 2767
    }
2768 2768

	
2769 2769
  private:
2770 2770
    const GR& _digraph;
2771 2771
    const POT& _potential;
2772 2772
  };
2773 2773

	
2774 2774
  /// \brief Returns a PotentialDifferenceMap.
2775 2775
  ///
2776 2776
  /// This function just returns a PotentialDifferenceMap.
2777 2777
  /// \relates PotentialDifferenceMap
2778 2778
  template <typename GR, typename POT>
2779 2779
  PotentialDifferenceMap<GR, POT>
2780 2780
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2781 2781
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2782 2782
  }
2783 2783

	
2784 2784
  /// @}
2785 2785
}
2786 2786

	
2787 2787
#endif // LEMON_MAPS_H
0 comments (0 inline)