gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge #298
0 13 0
merge default
0 files changed with 655 insertions and 332 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -235,319 +235,341 @@
235 235
LEMON provides flexible data structures to work with paths.
236 236
All of them have similar interfaces and they can be copied easily with
237 237
assignment operators and copy constructors. This makes it easy and
238 238
efficient to have e.g. the Dijkstra algorithm to store its result in
239 239
any kind of path structure.
240 240

	
241 241
\sa \ref concepts::Path "Path concept"
242 242
*/
243 243

	
244 244
/**
245 245
@defgroup heaps Heap Structures
246 246
@ingroup datas
247 247
\brief %Heap structures implemented in LEMON.
248 248

	
249 249
This group contains the heap structures implemented in LEMON.
250 250

	
251 251
LEMON provides several heap classes. They are efficient implementations
252 252
of the abstract data type \e priority \e queue. They store items with
253 253
specified values called \e priorities in such a way that finding and
254 254
removing the item with minimum priority are efficient.
255 255
The basic operations are adding and erasing items, changing the priority
256 256
of an item, etc.
257 257

	
258 258
Heaps are crucial in several algorithms, such as Dijkstra and Prim.
259 259
The heap implementations have the same interface, thus any of them can be
260 260
used easily in such algorithms.
261 261

	
262 262
\sa \ref concepts::Heap "Heap concept"
263 263
*/
264 264

	
265 265
/**
266 266
@defgroup matrices Matrices
267 267
@ingroup datas
268 268
\brief Two dimensional data storages implemented in LEMON.
269 269

	
270 270
This group contains two dimensional data storages implemented in LEMON.
271 271
*/
272 272

	
273 273
/**
274 274
@defgroup auxdat Auxiliary Data Structures
275 275
@ingroup datas
276 276
\brief Auxiliary data structures implemented in LEMON.
277 277

	
278 278
This group contains some data structures implemented in LEMON in
279 279
order to make it easier to implement combinatorial algorithms.
280 280
*/
281 281

	
282 282
/**
283
@defgroup geomdat Geometric Data Structures
284
@ingroup auxdat
285
\brief Geometric data structures implemented in LEMON.
286

	
287
This group contains geometric data structures implemented in LEMON.
288

	
289
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
290
   vector with the usual operations.
291
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
292
   rectangular bounding box of a set of \ref lemon::dim2::Point
293
   "dim2::Point"'s.
294
*/
295

	
296
/**
297
@defgroup matrices Matrices
298
@ingroup auxdat
299
\brief Two dimensional data storages implemented in LEMON.
300

	
301
This group contains two dimensional data storages implemented in LEMON.
302
*/
303

	
304
/**
283 305
@defgroup algs Algorithms
284 306
\brief This group contains the several algorithms
285 307
implemented in LEMON.
286 308

	
287 309
This group contains the several algorithms
288 310
implemented in LEMON.
289 311
*/
290 312

	
291 313
/**
292 314
@defgroup search Graph Search
293 315
@ingroup algs
294 316
\brief Common graph search algorithms.
295 317

	
296 318
This group contains the common graph search algorithms, namely
297 319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
298 320
*/
299 321

	
300 322
/**
301 323
@defgroup shortest_path Shortest Path Algorithms
302 324
@ingroup algs
303 325
\brief Algorithms for finding shortest paths.
304 326

	
305 327
This group contains the algorithms for finding shortest paths in digraphs.
306 328

	
307 329
 - \ref Dijkstra algorithm for finding shortest paths from a source node
308 330
   when all arc lengths are non-negative.
309 331
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
310 332
   from a source node when arc lenghts can be either positive or negative,
311 333
   but the digraph should not contain directed cycles with negative total
312 334
   length.
313 335
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
314 336
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
315 337
   lenghts can be either positive or negative, but the digraph should
316 338
   not contain directed cycles with negative total length.
317 339
 - \ref Suurballe A successive shortest path algorithm for finding
318 340
   arc-disjoint paths between two nodes having minimum total length.
319 341
*/
320 342

	
321 343
/**
344
@defgroup spantree Minimum Spanning Tree Algorithms
345
@ingroup algs
346
\brief Algorithms for finding minimum cost spanning trees and arborescences.
347

	
348
This group contains the algorithms for finding minimum cost spanning
349
trees and arborescences.
350
*/
351

	
352
/**
322 353
@defgroup max_flow Maximum Flow Algorithms
323 354
@ingroup algs
324 355
\brief Algorithms for finding maximum flows.
325 356

	
326 357
This group contains the algorithms for finding maximum flows and
327 358
feasible circulations.
328 359

	
329 360
The \e maximum \e flow \e problem is to find a flow of maximum value between
330 361
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
331 362
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
332 363
\f$s, t \in V\f$ source and target nodes.
333 364
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
334 365
following optimization problem.
335 366

	
336 367
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
337 368
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
338 369
    \quad \forall u\in V\setminus\{s,t\} \f]
339 370
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
340 371

	
341 372
LEMON contains several algorithms for solving maximum flow problems:
342 373
- \ref EdmondsKarp Edmonds-Karp algorithm.
343 374
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
344 375
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
345 376
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
346 377

	
347 378
In most cases the \ref Preflow "Preflow" algorithm provides the
348 379
fastest method for computing a maximum flow. All implementations
349 380
also provide functions to query the minimum cut, which is the dual
350 381
problem of maximum flow.
351 382

	
352 383
\ref Circulation is a preflow push-relabel algorithm implemented directly 
353 384
for finding feasible circulations, which is a somewhat different problem,
354 385
but it is strongly related to maximum flow.
355 386
For more information, see \ref Circulation.
356 387
*/
357 388

	
358 389
/**
359 390
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
360 391
@ingroup algs
361 392

	
362 393
\brief Algorithms for finding minimum cost flows and circulations.
363 394

	
364 395
This group contains the algorithms for finding minimum cost flows and
365 396
circulations. For more information about this problem and its dual
366 397
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
367 398

	
368 399
LEMON contains several algorithms for this problem.
369 400
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
370 401
   pivot strategies.
371 402
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
372 403
   cost scaling.
373 404
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
374 405
   capacity scaling.
375 406
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
376 407
 - \ref CycleCanceling Cycle-Canceling algorithms.
377 408

	
378 409
In general NetworkSimplex is the most efficient implementation,
379 410
but in special cases other algorithms could be faster.
380 411
For example, if the total supply and/or capacities are rather small,
381 412
CapacityScaling is usually the fastest algorithm (without effective scaling).
382 413
*/
383 414

	
384 415
/**
385 416
@defgroup min_cut Minimum Cut Algorithms
386 417
@ingroup algs
387 418

	
388 419
\brief Algorithms for finding minimum cut in graphs.
389 420

	
390 421
This group contains the algorithms for finding minimum cut in graphs.
391 422

	
392 423
The \e minimum \e cut \e problem is to find a non-empty and non-complete
393 424
\f$X\f$ subset of the nodes with minimum overall capacity on
394 425
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
395 426
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
396 427
cut is the \f$X\f$ solution of the next optimization problem:
397 428

	
398 429
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
399
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
430
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
400 431

	
401 432
LEMON contains several algorithms related to minimum cut problems:
402 433

	
403 434
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
404 435
  in directed graphs.
405 436
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
406 437
  calculating minimum cut in undirected graphs.
407 438
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
408 439
  all-pairs minimum cut in undirected graphs.
409 440

	
410 441
If you want to find minimum cut just between two distinict nodes,
411 442
see the \ref max_flow "maximum flow problem".
412 443
*/
413 444

	
414 445
/**
415
@defgroup graph_properties Connectivity and Other Graph Properties
416
@ingroup algs
417
\brief Algorithms for discovering the graph properties
418

	
419
This group contains the algorithms for discovering the graph properties
420
like connectivity, bipartiteness, euler property, simplicity etc.
421

	
422
\image html edge_biconnected_components.png
423
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
424
*/
425

	
426
/**
427
@defgroup planar Planarity Embedding and Drawing
428
@ingroup algs
429
\brief Algorithms for planarity checking, embedding and drawing
430

	
431
This group contains the algorithms for planarity checking,
432
embedding and drawing.
433

	
434
\image html planar.png
435
\image latex planar.eps "Plane graph" width=\textwidth
436
*/
437

	
438
/**
439 446
@defgroup matching Matching Algorithms
440 447
@ingroup algs
441 448
\brief Algorithms for finding matchings in graphs and bipartite graphs.
442 449

	
443 450
This group contains the algorithms for calculating
444 451
matchings in graphs and bipartite graphs. The general matching problem is
445 452
finding a subset of the edges for which each node has at most one incident
446 453
edge.
447 454

	
448 455
There are several different algorithms for calculate matchings in
449 456
graphs.  The matching problems in bipartite graphs are generally
450 457
easier than in general graphs. The goal of the matching optimization
451 458
can be finding maximum cardinality, maximum weight or minimum cost
452 459
matching. The search can be constrained to find perfect or
453 460
maximum cardinality matching.
454 461

	
455 462
The matching algorithms implemented in LEMON:
456 463
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
457 464
  for calculating maximum cardinality matching in bipartite graphs.
458 465
- \ref PrBipartiteMatching Push-relabel algorithm
459 466
  for calculating maximum cardinality matching in bipartite graphs.
460 467
- \ref MaxWeightedBipartiteMatching
461 468
  Successive shortest path algorithm for calculating maximum weighted
462 469
  matching and maximum weighted bipartite matching in bipartite graphs.
463 470
- \ref MinCostMaxBipartiteMatching
464 471
  Successive shortest path algorithm for calculating minimum cost maximum
465 472
  matching in bipartite graphs.
466 473
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
467 474
  maximum cardinality matching in general graphs.
468 475
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
469 476
  maximum weighted matching in general graphs.
470 477
- \ref MaxWeightedPerfectMatching
471 478
  Edmond's blossom shrinking algorithm for calculating maximum weighted
472 479
  perfect matching in general graphs.
473 480

	
474 481
\image html bipartite_matching.png
475 482
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
476 483
*/
477 484

	
478 485
/**
479
@defgroup spantree Minimum Spanning Tree Algorithms
486
@defgroup graph_properties Connectivity and Other Graph Properties
480 487
@ingroup algs
481
\brief Algorithms for finding minimum cost spanning trees and arborescences.
488
\brief Algorithms for discovering the graph properties
482 489

	
483
This group contains the algorithms for finding minimum cost spanning
484
trees and arborescences.
490
This group contains the algorithms for discovering the graph properties
491
like connectivity, bipartiteness, euler property, simplicity etc.
492

	
493
\image html connected_components.png
494
\image latex connected_components.eps "Connected components" width=\textwidth
495
*/
496

	
497
/**
498
@defgroup planar Planarity Embedding and Drawing
499
@ingroup algs
500
\brief Algorithms for planarity checking, embedding and drawing
501

	
502
This group contains the algorithms for planarity checking,
503
embedding and drawing.
504

	
505
\image html planar.png
506
\image latex planar.eps "Plane graph" width=\textwidth
507
*/
508

	
509
/**
510
@defgroup approx Approximation Algorithms
511
@ingroup algs
512
\brief Approximation algorithms.
513

	
514
This group contains the approximation and heuristic algorithms
515
implemented in LEMON.
485 516
*/
486 517

	
487 518
/**
488 519
@defgroup auxalg Auxiliary Algorithms
489 520
@ingroup algs
490 521
\brief Auxiliary algorithms implemented in LEMON.
491 522

	
492 523
This group contains some algorithms implemented in LEMON
493 524
in order to make it easier to implement complex algorithms.
494 525
*/
495 526

	
496 527
/**
497
@defgroup approx Approximation Algorithms
498
@ingroup algs
499
\brief Approximation algorithms.
500

	
501
This group contains the approximation and heuristic algorithms
502
implemented in LEMON.
503
*/
504

	
505
/**
506 528
@defgroup gen_opt_group General Optimization Tools
507 529
\brief This group contains some general optimization frameworks
508 530
implemented in LEMON.
509 531

	
510 532
This group contains some general optimization frameworks
511 533
implemented in LEMON.
512 534
*/
513 535

	
514 536
/**
515 537
@defgroup lp_group Lp and Mip Solvers
516 538
@ingroup gen_opt_group
517 539
\brief Lp and Mip solver interfaces for LEMON.
518 540

	
519 541
This group contains Lp and Mip solver interfaces for LEMON. The
520 542
various LP solvers could be used in the same manner with this
521 543
interface.
522 544
*/
523 545

	
524 546
/**
525 547
@defgroup lp_utils Tools for Lp and Mip Solvers
526 548
@ingroup lp_group
527 549
\brief Helper tools to the Lp and Mip solvers.
528 550

	
529 551
This group adds some helper tools to general optimization framework
530 552
implemented in LEMON.
531 553
*/
532 554

	
533 555
/**
534 556
@defgroup metah Metaheuristics
535 557
@ingroup gen_opt_group
536 558
\brief Metaheuristics for LEMON library.
537 559

	
538 560
This group contains some metaheuristic optimization tools.
539 561
*/
540 562

	
541 563
/**
542 564
@defgroup utils Tools and Utilities
543 565
\brief Tools and utilities for programming in LEMON
544 566

	
545 567
Tools and utilities for programming in LEMON.
546 568
*/
547 569

	
548 570
/**
549 571
@defgroup gutils Basic Graph Utilities
550 572
@ingroup utils
551 573
\brief Simple basic graph utilities.
552 574

	
553 575
This group contains some simple basic graph utilities.
... ...
@@ -563,131 +585,131 @@
563 585
*/
564 586

	
565 587
/**
566 588
@defgroup timecount Time Measuring and Counting
567 589
@ingroup misc
568 590
\brief Simple tools for measuring the performance of algorithms.
569 591

	
570 592
This group contains simple tools for measuring the performance
571 593
of algorithms.
572 594
*/
573 595

	
574 596
/**
575 597
@defgroup exceptions Exceptions
576 598
@ingroup utils
577 599
\brief Exceptions defined in LEMON.
578 600

	
579 601
This group contains the exceptions defined in LEMON.
580 602
*/
581 603

	
582 604
/**
583 605
@defgroup io_group Input-Output
584 606
\brief Graph Input-Output methods
585 607

	
586 608
This group contains the tools for importing and exporting graphs
587 609
and graph related data. Now it supports the \ref lgf-format
588 610
"LEMON Graph Format", the \c DIMACS format and the encapsulated
589 611
postscript (EPS) format.
590 612
*/
591 613

	
592 614
/**
593 615
@defgroup lemon_io LEMON Graph Format
594 616
@ingroup io_group
595 617
\brief Reading and writing LEMON Graph Format.
596 618

	
597 619
This group contains methods for reading and writing
598 620
\ref lgf-format "LEMON Graph Format".
599 621
*/
600 622

	
601 623
/**
602 624
@defgroup eps_io Postscript Exporting
603 625
@ingroup io_group
604 626
\brief General \c EPS drawer and graph exporter
605 627

	
606 628
This group contains general \c EPS drawing methods and special
607 629
graph exporting tools.
608 630
*/
609 631

	
610 632
/**
611
@defgroup dimacs_group DIMACS format
633
@defgroup dimacs_group DIMACS Format
612 634
@ingroup io_group
613 635
\brief Read and write files in DIMACS format
614 636

	
615 637
Tools to read a digraph from or write it to a file in DIMACS format data.
616 638
*/
617 639

	
618 640
/**
619 641
@defgroup nauty_group NAUTY Format
620 642
@ingroup io_group
621 643
\brief Read \e Nauty format
622 644

	
623 645
Tool to read graphs from \e Nauty format data.
624 646
*/
625 647

	
626 648
/**
627 649
@defgroup concept Concepts
628 650
\brief Skeleton classes and concept checking classes
629 651

	
630 652
This group contains the data/algorithm skeletons and concept checking
631 653
classes implemented in LEMON.
632 654

	
633 655
The purpose of the classes in this group is fourfold.
634 656

	
635 657
- These classes contain the documentations of the %concepts. In order
636 658
  to avoid document multiplications, an implementation of a concept
637 659
  simply refers to the corresponding concept class.
638 660

	
639 661
- These classes declare every functions, <tt>typedef</tt>s etc. an
640 662
  implementation of the %concepts should provide, however completely
641 663
  without implementations and real data structures behind the
642 664
  interface. On the other hand they should provide nothing else. All
643 665
  the algorithms working on a data structure meeting a certain concept
644 666
  should compile with these classes. (Though it will not run properly,
645 667
  of course.) In this way it is easily to check if an algorithm
646 668
  doesn't use any extra feature of a certain implementation.
647 669

	
648 670
- The concept descriptor classes also provide a <em>checker class</em>
649 671
  that makes it possible to check whether a certain implementation of a
650 672
  concept indeed provides all the required features.
651 673

	
652 674
- Finally, They can serve as a skeleton of a new implementation of a concept.
653 675
*/
654 676

	
655 677
/**
656 678
@defgroup graph_concepts Graph Structure Concepts
657 679
@ingroup concept
658 680
\brief Skeleton and concept checking classes for graph structures
659 681

	
660 682
This group contains the skeletons and concept checking classes of LEMON's
661 683
graph structures and helper classes used to implement these.
662 684
*/
663 685

	
664 686
/**
665 687
@defgroup map_concepts Map Concepts
666 688
@ingroup concept
667 689
\brief Skeleton and concept checking classes for maps
668 690

	
669 691
This group contains the skeletons and concept checking classes of maps.
670 692
*/
671 693

	
672 694
/**
695
@defgroup tools Standalone Utility Applications
696

	
697
Some utility applications are listed here.
698

	
699
The standard compilation procedure (<tt>./configure;make</tt>) will compile
700
them, as well.
701
*/
702

	
703
/**
673 704
\anchor demoprograms
674 705

	
675 706
@defgroup demos Demo Programs
676 707

	
677 708
Some demo programs are listed here. Their full source codes can be found in
678 709
the \c demo subdirectory of the source tree.
679 710

	
680 711
In order to compile them, use the <tt>make demo</tt> or the
681 712
<tt>make check</tt> commands.
682 713
*/
683 714

	
684
/**
685
@defgroup tools Standalone Utility Applications
686

	
687
Some utility applications are listed here.
688

	
689
The standard compilation procedure (<tt>./configure;make</tt>) will compile
690
them, as well.
691
*/
692

	
693 715
}
Ignore white space 96 line context
... ...
@@ -2,146 +2,147 @@
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

	
... ...
@@ -180,157 +181,157 @@
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
    }
... ...
@@ -368,98 +369,98 @@
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
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
417
    ///If you need better control on the execution, you have to call
418
    ///\ref init() first, 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++;
... ...
@@ -692,485 +693,481 @@
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);
... ...
@@ -1219,97 +1216,97 @@
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> >
... ...
@@ -1380,98 +1377,98 @@
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
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1425
    /// If you need better control on the execution, you have to call
1426
    /// \ref init() first, 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 {
... ...
@@ -1690,63 +1687,63 @@
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 6 line context
... ...
@@ -4,96 +4,98 @@
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_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25

	
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
//\file
30 30
//\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  // \ingroup graphbits
35 35
  //
36 36
  // \brief Extender for maps
37 37
  template <typename _Map>
38 38
  class MapExtender : public _Map {
39 39
    typedef _Map Parent;
40 40
    typedef typename Parent::GraphType GraphType;
41 41

	
42 42
  public:
43 43

	
44 44
    typedef MapExtender Map;
45 45
    typedef typename Parent::Key Item;
46 46

	
47 47
    typedef typename Parent::Key Key;
48 48
    typedef typename Parent::Value Value;
49 49
    typedef typename Parent::Reference Reference;
50 50
    typedef typename Parent::ConstReference ConstReference;
51 51

	
52
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
53

	
52 54
    class MapIt;
53 55
    class ConstMapIt;
54 56

	
55 57
    friend class MapIt;
56 58
    friend class ConstMapIt;
57 59

	
58 60
  public:
59 61

	
60 62
    MapExtender(const GraphType& graph)
61 63
      : Parent(graph) {}
62 64

	
63 65
    MapExtender(const GraphType& graph, const Value& value)
64 66
      : Parent(graph, value) {}
65 67

	
66 68
  private:
67 69
    MapExtender& operator=(const MapExtender& cmap) {
68 70
      return operator=<MapExtender>(cmap);
69 71
    }
70 72

	
71 73
    template <typename CMap>
72 74
    MapExtender& operator=(const CMap& cmap) {
73 75
      Parent::operator=(cmap);
74 76
      return *this;
75 77
    }
76 78

	
77 79
  public:
78 80
    class MapIt : public Item {
79 81
      typedef Item Parent;
80 82

	
81 83
    public:
82 84

	
83 85
      typedef typename Map::Value Value;
84 86

	
85 87
      MapIt() {}
86 88

	
87 89
      MapIt(Invalid i) : Parent(i) { }
88 90

	
89 91
      explicit MapIt(Map& _map) : map(_map) {
90 92
        map.notifier()->first(*this);
91 93
      }
92 94

	
93 95
      MapIt(const Map& _map, const Item& item)
94 96
        : Parent(item), map(_map) {}
95 97

	
96 98
      MapIt& operator++() {
97 99
        map.notifier()->next(*this);
98 100
        return *this;
99 101
      }
... ...
@@ -146,96 +148,98 @@
146 148
      const Map& map;
147 149
    };
148 150

	
149 151
    class ItemIt : public Item {
150 152
      typedef Item Parent;
151 153

	
152 154
    public:
153 155

	
154 156
      ItemIt() {}
155 157

	
156 158
      ItemIt(Invalid i) : Parent(i) { }
157 159

	
158 160
      explicit ItemIt(Map& _map) : map(_map) {
159 161
        map.notifier()->first(*this);
160 162
      }
161 163

	
162 164
      ItemIt(const Map& _map, const Item& item)
163 165
        : Parent(item), map(_map) {}
164 166

	
165 167
      ItemIt& operator++() {
166 168
        map.notifier()->next(*this);
167 169
        return *this;
168 170
      }
169 171

	
170 172
    protected:
171 173
      const Map& map;
172 174

	
173 175
    };
174 176
  };
175 177

	
176 178
  // \ingroup graphbits
177 179
  //
178 180
  // \brief Extender for maps which use a subset of the items.
179 181
  template <typename _Graph, typename _Map>
180 182
  class SubMapExtender : public _Map {
181 183
    typedef _Map Parent;
182 184
    typedef _Graph GraphType;
183 185

	
184 186
  public:
185 187

	
186 188
    typedef SubMapExtender Map;
187 189
    typedef typename Parent::Key Item;
188 190

	
189 191
    typedef typename Parent::Key Key;
190 192
    typedef typename Parent::Value Value;
191 193
    typedef typename Parent::Reference Reference;
192 194
    typedef typename Parent::ConstReference ConstReference;
193 195

	
196
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
197

	
194 198
    class MapIt;
195 199
    class ConstMapIt;
196 200

	
197 201
    friend class MapIt;
198 202
    friend class ConstMapIt;
199 203

	
200 204
  public:
201 205

	
202 206
    SubMapExtender(const GraphType& _graph)
203 207
      : Parent(_graph), graph(_graph) {}
204 208

	
205 209
    SubMapExtender(const GraphType& _graph, const Value& _value)
206 210
      : Parent(_graph, _value), graph(_graph) {}
207 211

	
208 212
  private:
209 213
    SubMapExtender& operator=(const SubMapExtender& cmap) {
210 214
      return operator=<MapExtender>(cmap);
211 215
    }
212 216

	
213 217
    template <typename CMap>
214 218
    SubMapExtender& operator=(const CMap& cmap) {
215 219
      checkConcept<concepts::ReadMap<Key, Value>, CMap>();
216 220
      Item it;
217 221
      for (graph.first(it); it != INVALID; graph.next(it)) {
218 222
        Parent::set(it, cmap[it]);
219 223
      }
220 224
      return *this;
221 225
    }
222 226

	
223 227
  public:
224 228
    class MapIt : public Item {
225 229
      typedef Item Parent;
226 230

	
227 231
    public:
228 232
      typedef typename Map::Value Value;
229 233

	
230 234
      MapIt() {}
231 235

	
232 236
      MapIt(Invalid i) : Parent(i) { }
233 237

	
234 238
      explicit MapIt(Map& _map) : map(_map) {
235 239
        map.graph.first(*this);
236 240
      }
237 241

	
238 242
      MapIt(const Map& _map, const Item& item)
239 243
        : Parent(item), map(_map) {}
240 244

	
241 245
      MapIt& operator++() {
Ignore white space 6 line context
... ...
@@ -27,114 +27,121 @@
27 27
///\file
28 28
///\brief Push-relabel algorithm for finding a feasible circulation.
29 29
///
30 30
namespace lemon {
31 31

	
32 32
  /// \brief Default traits class of Circulation class.
33 33
  ///
34 34
  /// Default traits class of Circulation class.
35 35
  ///
36 36
  /// \tparam GR Type of the digraph the algorithm runs on.
37 37
  /// \tparam LM The type of the lower bound map.
38 38
  /// \tparam UM The type of the upper bound (capacity) map.
39 39
  /// \tparam SM The type of the supply map.
40 40
  template <typename GR, typename LM,
41 41
            typename UM, typename SM>
42 42
  struct CirculationDefaultTraits {
43 43

	
44 44
    /// \brief The type of the digraph the algorithm runs on.
45 45
    typedef GR Digraph;
46 46

	
47 47
    /// \brief The type of the lower bound map.
48 48
    ///
49 49
    /// The type of the map that stores the lower bounds on the arcs.
50 50
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
51 51
    typedef LM LowerMap;
52 52

	
53 53
    /// \brief The type of the upper bound (capacity) map.
54 54
    ///
55 55
    /// The type of the map that stores the upper bounds (capacities)
56 56
    /// on the arcs.
57 57
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
58 58
    typedef UM UpperMap;
59 59

	
60 60
    /// \brief The type of supply map.
61 61
    ///
62 62
    /// The type of the map that stores the signed supply values of the 
63 63
    /// nodes. 
64 64
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
65 65
    typedef SM SupplyMap;
66 66

	
67 67
    /// \brief The type of the flow and supply values.
68 68
    typedef typename SupplyMap::Value Value;
69 69

	
70 70
    /// \brief The type of the map that stores the flow values.
71 71
    ///
72 72
    /// The type of the map that stores the flow values.
73 73
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
74 74
    /// concept.
75
#ifdef DOXYGEN
76
    typedef GR::ArcMap<Value> FlowMap;
77
#else
75 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79
#endif
76 80

	
77 81
    /// \brief Instantiates a FlowMap.
78 82
    ///
79 83
    /// This function instantiates a \ref FlowMap.
80 84
    /// \param digraph The digraph for which we would like to define
81 85
    /// the flow map.
82 86
    static FlowMap* createFlowMap(const Digraph& digraph) {
83 87
      return new FlowMap(digraph);
84 88
    }
85 89

	
86 90
    /// \brief The elevator type used by the algorithm.
87 91
    ///
88 92
    /// The elevator type used by the algorithm.
89 93
    ///
90
    /// \sa Elevator
91
    /// \sa LinkedElevator
94
    /// \sa Elevator, LinkedElevator
95
#ifdef DOXYGEN
96
    typedef lemon::Elevator<GR, GR::Node> Elevator;
97
#else
92 98
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
99
#endif
93 100

	
94 101
    /// \brief Instantiates an Elevator.
95 102
    ///
96 103
    /// This function instantiates an \ref Elevator.
97 104
    /// \param digraph The digraph for which we would like to define
98 105
    /// the elevator.
99 106
    /// \param max_level The maximum level of the elevator.
100 107
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
101 108
      return new Elevator(digraph, max_level);
102 109
    }
103 110

	
104 111
    /// \brief The tolerance used by the algorithm
105 112
    ///
106 113
    /// The tolerance used by the algorithm to handle inexact computation.
107 114
    typedef lemon::Tolerance<Value> Tolerance;
108 115

	
109 116
  };
110 117

	
111 118
  /**
112 119
     \brief Push-relabel algorithm for the network circulation problem.
113 120

	
114 121
     \ingroup max_flow
115 122
     This class implements a push-relabel algorithm for the \e network
116 123
     \e circulation problem.
117 124
     It is to find a feasible circulation when lower and upper bounds
118 125
     are given for the flow values on the arcs and lower bounds are
119 126
     given for the difference between the outgoing and incoming flow
120 127
     at the nodes.
121 128

	
122 129
     The exact formulation of this problem is the following.
123 130
     Let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$
124 131
     \f$upper: A\rightarrow\mathbf{R}\cup\{\infty\}\f$ denote the lower and
125 132
     upper bounds on the arcs, for which \f$lower(uv) \leq upper(uv)\f$
126 133
     holds for all \f$uv\in A\f$, and \f$sup: V\rightarrow\mathbf{R}\f$
127 134
     denotes the signed supply values of the nodes.
128 135
     If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
129 136
     supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
130 137
     \f$-sup(u)\f$ demand.
131 138
     A feasible circulation is an \f$f: A\rightarrow\mathbf{R}\f$
132 139
     solution of the following problem.
133 140

	
134 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
135 142
     \geq sup(u) \quad \forall u\in V, \f]
136 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
137 144
     
138 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
139 146
     zero or negative in order to have a feasible solution (since the sum
140 147
     of the expressions on the left-hand side of the inequalities is zero).
... ...
@@ -424,98 +431,98 @@
424 431
    }
425 432

	
426 433
    /// \brief Sets the elevator used by algorithm.
427 434
    ///
428 435
    /// Sets the elevator used by algorithm.
429 436
    /// If you don't use this function before calling \ref run() or
430 437
    /// \ref init(), an instance will be allocated automatically.
431 438
    /// The destructor deallocates this automatically allocated elevator,
432 439
    /// of course.
433 440
    /// \return <tt>(*this)</tt>
434 441
    Circulation& elevator(Elevator& elevator) {
435 442
      if (_local_level) {
436 443
        delete _level;
437 444
        _local_level = false;
438 445
      }
439 446
      _level = &elevator;
440 447
      return *this;
441 448
    }
442 449

	
443 450
    /// \brief Returns a const reference to the elevator.
444 451
    ///
445 452
    /// Returns a const reference to the elevator.
446 453
    ///
447 454
    /// \pre Either \ref run() or \ref init() must be called before
448 455
    /// using this function.
449 456
    const Elevator& elevator() const {
450 457
      return *_level;
451 458
    }
452 459

	
453 460
    /// \brief Sets the tolerance used by the algorithm.
454 461
    ///
455 462
    /// Sets the tolerance object used by the algorithm.
456 463
    /// \return <tt>(*this)</tt>
457 464
    Circulation& tolerance(const Tolerance& tolerance) {
458 465
      _tol = tolerance;
459 466
      return *this;
460 467
    }
461 468

	
462 469
    /// \brief Returns a const reference to the tolerance.
463 470
    ///
464 471
    /// Returns a const reference to the tolerance object used by
465 472
    /// the algorithm.
466 473
    const Tolerance& tolerance() const {
467 474
      return _tol;
468 475
    }
469 476

	
470 477
    /// \name Execution Control
471 478
    /// The simplest way to execute the algorithm is to call \ref run().\n
472
    /// If you need more control on the initial solution or the execution,
473
    /// first you have to call one of the \ref init() functions, then
479
    /// If you need better control on the initial solution or the execution,
480
    /// you have to call one of the \ref init() functions first, then
474 481
    /// the \ref start() function.
475 482

	
476 483
    ///@{
477 484

	
478 485
    /// Initializes the internal data structures.
479 486

	
480 487
    /// Initializes the internal data structures and sets all flow values
481 488
    /// to the lower bound.
482 489
    void init()
483 490
    {
484 491
      LEMON_DEBUG(checkBoundMaps(),
485 492
        "Upper bounds must be greater or equal to the lower bounds");
486 493

	
487 494
      createStructures();
488 495

	
489 496
      for(NodeIt n(_g);n!=INVALID;++n) {
490 497
        (*_excess)[n] = (*_supply)[n];
491 498
      }
492 499

	
493 500
      for (ArcIt e(_g);e!=INVALID;++e) {
494 501
        _flow->set(e, (*_lo)[e]);
495 502
        (*_excess)[_g.target(e)] += (*_flow)[e];
496 503
        (*_excess)[_g.source(e)] -= (*_flow)[e];
497 504
      }
498 505

	
499 506
      // global relabeling tested, but in general case it provides
500 507
      // worse performance for random digraphs
501 508
      _level->initStart();
502 509
      for(NodeIt n(_g);n!=INVALID;++n)
503 510
        _level->initAddItem(n);
504 511
      _level->initFinish();
505 512
      for(NodeIt n(_g);n!=INVALID;++n)
506 513
        if(_tol.positive((*_excess)[n]))
507 514
          _level->activate(n);
508 515
    }
509 516

	
510 517
    /// Initializes the internal data structures using a greedy approach.
511 518

	
512 519
    /// Initializes the internal data structures using a greedy approach
513 520
    /// to construct the initial solution.
514 521
    void greedyInit()
515 522
    {
516 523
      LEMON_DEBUG(checkBoundMaps(),
517 524
        "Upper bounds must be greater or equal to the lower bounds");
518 525

	
519 526
      createStructures();
520 527

	
521 528
      for(NodeIt n(_g);n!=INVALID;++n) {
Ignore white space 6 line context
... ...
@@ -137,80 +137,81 @@
137 137

	
138 138
      template<typename _ReadWriteMap>
139 139
      struct Constraints {
140 140
        void constraints() {
141 141
          checkConcept<ReadMap<K, T>, _ReadWriteMap >();
142 142
          checkConcept<WriteMap<K, T>, _ReadWriteMap >();
143 143
        }
144 144
      };
145 145
    };
146 146

	
147 147

	
148 148
    /// Dereferable map concept
149 149

	
150 150
    /// Dereferable map concept.
151 151
    ///
152 152
    template<typename K, typename T, typename R, typename CR>
153 153
    class ReferenceMap : public ReadWriteMap<K,T>
154 154
    {
155 155
    public:
156 156
      /// Tag for reference maps.
157 157
      typedef True ReferenceMapTag;
158 158
      /// The key type of the map.
159 159
      typedef K Key;
160 160
      /// \brief The value type of the map.
161 161
      /// (The type of objects associated with the keys).
162 162
      typedef T Value;
163 163
      /// The reference type of the map.
164 164
      typedef R Reference;
165 165
      /// The const reference type of the map.
166 166
      typedef CR ConstReference;
167 167

	
168 168
    public:
169 169

	
170 170
      /// Returns a reference to the value associated with the given key.
171 171
      Reference operator[](const Key &) {
172 172
        return *static_cast<Value *>(0);
173 173
      }
174 174

	
175 175
      /// Returns a const reference to the value associated with the given key.
176 176
      ConstReference operator[](const Key &) const {
177 177
        return *static_cast<Value *>(0);
178 178
      }
179 179

	
180 180
      /// Sets the value associated with the given key.
181 181
      void set(const Key &k,const Value &t) { operator[](k)=t; }
182 182

	
183 183
      template<typename _ReferenceMap>
184 184
      struct Constraints {
185
        void constraints() {
185
        typename enable_if<typename _ReferenceMap::ReferenceMapTag, void>::type
186
        constraints() {
186 187
          checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
187 188
          ref = m[key];
188 189
          m[key] = val;
189 190
          m[key] = ref;
190 191
          m[key] = cref;
191 192
          own_ref = m[own_key];
192 193
          m[own_key] = own_val;
193 194
          m[own_key] = own_ref;
194 195
          m[own_key] = own_cref;
195 196
          m[key] = m[own_key];
196 197
          m[own_key] = m[key];
197 198
        }
198 199
        const Key& key;
199 200
        Value& val;
200 201
        Reference ref;
201 202
        ConstReference cref;
202 203
        const typename _ReferenceMap::Key& own_key;
203 204
        typename _ReferenceMap::Value& own_val;
204 205
        typename _ReferenceMap::Reference own_ref;
205 206
        typename _ReferenceMap::ConstReference own_cref;
206 207
        _ReferenceMap& m;
207 208
      };
208 209
    };
209 210

	
210 211
    // @}
211 212

	
212 213
  } //namespace concepts
213 214

	
214 215
} //namespace lemon
215 216

	
216 217
#endif
Ignore white space 6 line context
... ...
@@ -2,146 +2,147 @@
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

	
... ...
@@ -179,157 +180,157 @@
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

	
... ...
@@ -366,98 +367,98 @@
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
    ///If you need more control on the execution, first you have to call
415
    ///\ref init(), then you can add a source node with \ref addSource()
415
    ///If you need better control on the execution, you have to call
416
    ///\ref init() first, 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

	
... ...
@@ -624,485 +625,479 @@
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);
... ...
@@ -1163,97 +1158,97 @@
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> >
... ...
@@ -1324,98 +1319,98 @@
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
    /// If you need more control on the execution, first you have to call
1373
    /// \ref init(), then you can add a source node with \ref addSource()
1367
    /// If you need better control on the execution, you have to call
1368
    /// \ref init() first, 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
    ///
... ...
@@ -1575,63 +1570,63 @@
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 6 line context
... ...
@@ -25,228 +25,232 @@
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;
... ...
@@ -259,235 +263,236 @@
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
    }
... ...
@@ -539,98 +544,98 @@
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
    ///If you need more control on the execution, first you have to call
588
    ///\ref init(), then you can add several source nodes with
592
    ///If you need better control on the execution, you have to call
593
    ///\ref init() first, 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();
... ...
@@ -756,534 +761,529 @@
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
  {
Ignore white space 6 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_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

	
24
///\ingroup misc
24
///\ingroup geomdat
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27
///
28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29
/// a two dimensional vector with the usual operations.
30
///
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
32
/// the rectangular bounding box of a set of
33
/// \ref lemon::dim2::Point "dim2::Point"'s.
34 27

	
35 28
namespace lemon {
36 29

	
37 30
  ///Tools for handling two dimensional coordinates
38 31

	
39 32
  ///This namespace is a storage of several
40 33
  ///tools for handling two dimensional coordinates
41 34
  namespace dim2 {
42 35

	
43
  /// \addtogroup misc
36
  /// \addtogroup geomdat
44 37
  /// @{
45 38

	
46 39
  /// Two dimensional vector (plain vector)
47 40

	
48 41
  /// A simple two dimensional vector (plain vector) implementation
49 42
  /// with the usual vector operations.
50 43
  template<typename T>
51 44
    class Point {
52 45

	
53 46
    public:
54 47

	
55 48
      typedef T Value;
56 49

	
57 50
      ///First coordinate
58 51
      T x;
59 52
      ///Second coordinate
60 53
      T y;
61 54

	
62 55
      ///Default constructor
63 56
      Point() {}
64 57

	
65 58
      ///Construct an instance from coordinates
66 59
      Point(T a, T b) : x(a), y(b) { }
67 60

	
68 61
      ///Returns the dimension of the vector (i.e. returns 2).
69 62

	
70 63
      ///The dimension of the vector.
71 64
      ///This function always returns 2.
72 65
      int size() const { return 2; }
73 66

	
74 67
      ///Subscripting operator
75 68

	
76 69
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
77 70
      ///
78 71
      T& operator[](int idx) { return idx == 0 ? x : y; }
79 72

	
80 73
      ///Const subscripting operator
81 74

	
82 75
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
83 76
      ///
84 77
      const T& operator[](int idx) const { return idx == 0 ? x : y; }
85 78

	
86 79
      ///Conversion constructor
87 80
      template<class TT> Point(const Point<TT> &p) : x(p.x), y(p.y) {}
88 81

	
89 82
      ///Give back the square of the norm of the vector
90 83
      T normSquare() const {
91 84
        return x*x+y*y;
Ignore white space 6 line context
... ...
@@ -314,197 +314,197 @@
314 314
	  }
315 315
	  tn = (*_pred)[tn];
316 316
	} else {
317 317
	  if ((*_weight)[sn] <= value) {
318 318
	    rn = sn;
319 319
            s_root = true;
320 320
	    value = (*_weight)[sn];
321 321
	  }
322 322
	  sn = (*_pred)[sn];
323 323
	}
324 324
      }
325 325

	
326 326
      typename Graph::template NodeMap<bool> reached(_graph, false);
327 327
      reached[_root] = true;
328 328
      cutMap.set(_root, !s_root);
329 329
      reached[rn] = true;
330 330
      cutMap.set(rn, s_root);
331 331

	
332 332
      std::vector<Node> st;
333 333
      for (NodeIt n(_graph); n != INVALID; ++n) {
334 334
	st.clear();
335 335
        Node nn = n;
336 336
	while (!reached[nn]) {
337 337
	  st.push_back(nn);
338 338
	  nn = (*_pred)[nn];
339 339
	}
340 340
	while (!st.empty()) {
341 341
	  cutMap.set(st.back(), cutMap[nn]);
342 342
	  st.pop_back();
343 343
	}
344 344
      }
345 345
      
346 346
      return value;
347 347
    }
348 348

	
349 349
    ///@}
350 350

	
351 351
    friend class MinCutNodeIt;
352 352

	
353 353
    /// Iterate on the nodes of a minimum cut
354 354
    
355 355
    /// This iterator class lists the nodes of a minimum cut found by
356 356
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
357 357
    /// and call its \ref GomoryHu::run() "run()" method.
358 358
    ///
359 359
    /// This example counts the nodes in the minimum cut separating \c s from
360 360
    /// \c t.
361 361
    /// \code
362
    /// GomoruHu<Graph> gom(g, capacities);
362
    /// GomoryHu<Graph> gom(g, capacities);
363 363
    /// gom.run();
364 364
    /// int cnt=0;
365
    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
365
    /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
366 366
    /// \endcode
367 367
    class MinCutNodeIt
368 368
    {
369 369
      bool _side;
370 370
      typename Graph::NodeIt _node_it;
371 371
      typename Graph::template NodeMap<bool> _cut;
372 372
    public:
373 373
      /// Constructor
374 374

	
375 375
      /// Constructor.
376 376
      ///
377 377
      MinCutNodeIt(GomoryHu const &gomory,
378 378
                   ///< The GomoryHu class. You must call its
379 379
                   ///  run() method
380 380
                   ///  before initializing this iterator.
381 381
                   const Node& s, ///< The base node.
382 382
                   const Node& t,
383 383
                   ///< The node you want to separate from node \c s.
384 384
                   bool side=true
385 385
                   ///< If it is \c true (default) then the iterator lists
386 386
                   ///  the nodes of the component containing \c s,
387 387
                   ///  otherwise it lists the other component.
388 388
                   /// \note As the minimum cut is not always unique,
389 389
                   /// \code
390 390
                   /// MinCutNodeIt(gomory, s, t, true);
391 391
                   /// \endcode
392 392
                   /// and
393 393
                   /// \code
394 394
                   /// MinCutNodeIt(gomory, t, s, false);
395 395
                   /// \endcode
396 396
                   /// does not necessarily give the same set of nodes.
397 397
                   /// However it is ensured that
398 398
                   /// \code
399 399
                   /// MinCutNodeIt(gomory, s, t, true);
400 400
                   /// \endcode
401 401
                   /// and
402 402
                   /// \code
403 403
                   /// MinCutNodeIt(gomory, s, t, false);
404 404
                   /// \endcode
405 405
                   /// together list each node exactly once.
406 406
                   )
407 407
        : _side(side), _cut(gomory._graph)
408 408
      {
409 409
        gomory.minCutMap(s,t,_cut);
410 410
        for(_node_it=typename Graph::NodeIt(gomory._graph);
411 411
            _node_it!=INVALID && _cut[_node_it]!=_side;
412 412
            ++_node_it) {}
413 413
      }
414 414
      /// Conversion to \c Node
415 415

	
416 416
      /// Conversion to \c Node.
417 417
      ///
418 418
      operator typename Graph::Node() const
419 419
      {
420 420
        return _node_it;
421 421
      }
422 422
      bool operator==(Invalid) { return _node_it==INVALID; }
423 423
      bool operator!=(Invalid) { return _node_it!=INVALID; }
424 424
      /// Next node
425 425

	
426 426
      /// Next node.
427 427
      ///
428 428
      MinCutNodeIt &operator++()
429 429
      {
430 430
        for(++_node_it;_node_it!=INVALID&&_cut[_node_it]!=_side;++_node_it) {}
431 431
        return *this;
432 432
      }
433 433
      /// Postfix incrementation
434 434

	
435 435
      /// Postfix incrementation.
436 436
      ///
437 437
      /// \warning This incrementation
438 438
      /// returns a \c Node, not a \c MinCutNodeIt, as one may
439 439
      /// expect.
440 440
      typename Graph::Node operator++(int)
441 441
      {
442 442
        typename Graph::Node n=*this;
443 443
        ++(*this);
444 444
        return n;
445 445
      }
446 446
    };
447 447
    
448 448
    friend class MinCutEdgeIt;
449 449
    
450 450
    /// Iterate on the edges of a minimum cut
451 451
    
452 452
    /// This iterator class lists the edges of a minimum cut found by
453 453
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
454 454
    /// and call its \ref GomoryHu::run() "run()" method.
455 455
    ///
456 456
    /// This example computes the value of the minimum cut separating \c s from
457 457
    /// \c t.
458 458
    /// \code
459
    /// GomoruHu<Graph> gom(g, capacities);
459
    /// GomoryHu<Graph> gom(g, capacities);
460 460
    /// gom.run();
461 461
    /// int value=0;
462
    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
462
    /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
463 463
    ///   value+=capacities[e];
464 464
    /// \endcode
465 465
    /// The result will be the same as the value returned by
466 466
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
467 467
    class MinCutEdgeIt
468 468
    {
469 469
      bool _side;
470 470
      const Graph &_graph;
471 471
      typename Graph::NodeIt _node_it;
472 472
      typename Graph::OutArcIt _arc_it;
473 473
      typename Graph::template NodeMap<bool> _cut;
474 474
      void step()
475 475
      {
476 476
        ++_arc_it;
477 477
        while(_node_it!=INVALID && _arc_it==INVALID)
478 478
          {
479 479
            for(++_node_it;_node_it!=INVALID&&!_cut[_node_it];++_node_it) {}
480 480
            if(_node_it!=INVALID)
481 481
              _arc_it=typename Graph::OutArcIt(_graph,_node_it);
482 482
          }
483 483
      }
484 484
      
485 485
    public:
486 486
      /// Constructor
487 487

	
488 488
      /// Constructor.
489 489
      ///
490 490
      MinCutEdgeIt(GomoryHu const &gomory,
491 491
                   ///< The GomoryHu class. You must call its
492 492
                   ///  run() method
493 493
                   ///  before initializing this iterator.
494 494
                   const Node& s,  ///< The base node.
495 495
                   const Node& t,
496 496
                   ///< The node you want to separate from node \c s.
497 497
                   bool side=true
498 498
                   ///< If it is \c true (default) then the listed arcs
499 499
                   ///  will be oriented from the
500 500
                   ///  nodes of the component containing \c s,
501 501
                   ///  otherwise they will be oriented in the opposite
502 502
                   ///  direction.
503 503
                   )
504 504
        : _graph(gomory._graph), _cut(_graph)
505 505
      {
506 506
        gomory.minCutMap(s,t,_cut);
507 507
        if(!side)
508 508
          for(typename Graph::NodeIt n(_graph);n!=INVALID;++n)
509 509
            _cut[n]=!_cut[n];
510 510

	
Ignore white space 6 line context
... ...
@@ -11,273 +11,273 @@
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
#include <map>
26 26

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

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

	
33 33
namespace lemon {
34 34

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

	
38 38
  /// Base class of maps.
39 39

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

	
52 52

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

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

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

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

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

	
85 85

	
86 86
  /// Constant map.
87 87

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

	
110 110
    /// Default constructor
111 111

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

	
116 116
    /// Constructor with specified initial value
117 117

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

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

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

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

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

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

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

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

	
151 151

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

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

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

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

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

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

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

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

	
197 197

	
198 198
  /// Identity map.
199 199

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

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

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

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

	
227 227

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

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

	
249 249
  public:
250 250

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

	
260 260
    typedef True ReferenceMapTag;
261 261

	
262 262
  public:
263 263

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

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

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

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

	
283 283
    /// Resizes the map.
... ...
@@ -295,97 +295,97 @@
295 295

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

	
298 298
  public:
299 299

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

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

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

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

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

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

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

	
336 336

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

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

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

	
373 373
    typedef True ReferenceMapTag;
374 374

	
375 375
  private:
376 376

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

	
381 381
  public:
382 382

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

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

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

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

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

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

	
701 701

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

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

	
722 722
    /// Constructor
723 723

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

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

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

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

	
741 741

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

	
744 744
  /// This map has two \ref concepts::WriteMap "writable map" parameters
745 745
  /// and each write request will be passed to both of them.
746 746
  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
747 747
  /// operations will return the corresponding values of \c M1.
748 748
  ///
749 749
  /// The \c Key and \c Value types are inherited from \c M1.
750 750
  /// The \c Key and \c Value of \c M2 must be convertible from those
751 751
  /// of \c M1.
752 752
  ///
753 753
  /// The simplest way of using this map is through the forkMap()
754 754
  /// function.
755 755
  template<typename  M1, typename M2>
756 756
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
757 757
    M1 &_m1;
... ...
@@ -1744,444 +1744,483 @@
1744 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1745 1745
#endif
1746 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1747 1747
  public:
1748 1748

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

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

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

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

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

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

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

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

	
1812 1812
  /// @}
1813 1813

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

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

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

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

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

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

	
1866 1866
  public:
1867 1867

	
1868
    /// \brief This class represents the inverse of its owner (IdMap).
1868
    /// \brief The inverse map type of IdMap.
1869 1869
    ///
1870
    /// This class represents the inverse of its owner (IdMap).
1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871
    /// an item by its id.
1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1871 1873
    /// \see inverse()
1872 1874
    class InverseMap {
1873 1875
    public:
1874 1876

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

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

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

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

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

	
1902
  /// \brief Returns an \c IdMap class.
1903
  ///
1904
  /// This function just returns an \c IdMap class.
1905
  /// \relates IdMap
1906
  template <typename K, typename GR>
1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908
    return IdMap<GR, K>(graph);
1909
  }
1900 1910

	
1901 1911
  /// \brief General cross reference graph map type.
1902 1912

	
1903 1913
  /// This class provides simple invertable graph maps.
1904 1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1905 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1906
  /// The values of the map can be accessed
1907
  /// with stl compatible forward iterator.
1916
  /// The graph items can be accessed by their values either using
1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  /// 
1920
  /// This map is intended to be used when all associated values are
1921
  /// different (the map is actually invertable) or there are only a few
1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more 
1924
  /// suitable and more efficient for such cases. It provides iterators
1925
  /// to traverse the items with the same associated value, however
1926
  /// it does not have \c InverseMap.
1908 1927
  ///
1909 1928
  /// This type is not reference map, so it cannot be modified with
1910 1929
  /// the subscript operator.
1911 1930
  ///
1912 1931
  /// \tparam GR The graph type.
1913 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1914 1933
  /// \c GR::Edge).
1915 1934
  /// \tparam V The value type of the map.
1916 1935
  ///
1917 1936
  /// \see IterableValueMap
1918 1937
  template <typename GR, typename K, typename V>
1919 1938
  class CrossRefMap
1920 1939
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1921 1940
  private:
1922 1941

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

	
1926 1945
    typedef std::multimap<V, K> Container;
1927 1946
    Container _inv_map;
1928 1947

	
1929 1948
  public:
1930 1949

	
1931 1950
    /// The graph type of CrossRefMap.
1932 1951
    typedef GR Graph;
1933 1952
    typedef GR Digraph;
1934 1953
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1954
    typedef K Item;
1936 1955
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1956
    typedef K Key;
1938 1957
    /// The value type of CrossRefMap.
1939 1958
    typedef V Value;
1940 1959

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

	
1946 1965
    /// \brief Forward iterator for values.
1947 1966
    ///
1948
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1949 1968
    /// iterator on the values of the map. The values can
1950 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1951 1970
    /// They are considered with multiplicity, so each value is
1952 1971
    /// traversed for each item it is assigned to.
1953
    class ValueIterator
1972
    class ValueIt
1954 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1955 1974
      friend class CrossRefMap;
1956 1975
    private:
1957
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1958 1977
        : it(_it) {}
1959 1978
    public:
1960 1979

	
1961
      ValueIterator() {}
1962

	
1963
      ValueIterator& operator++() { ++it; return *this; }
1964
      ValueIterator operator++(int) {
1965
        ValueIterator tmp(*this);
1980
      /// Constructor
1981
      ValueIt() {}
1982

	
1983
      /// \e
1984
      ValueIt& operator++() { ++it; return *this; }
1985
      /// \e
1986
      ValueIt operator++(int) {
1987
        ValueIt tmp(*this);
1966 1988
        operator++();
1967 1989
        return tmp;
1968 1990
      }
1969 1991

	
1992
      /// \e
1970 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1971 1995
      const Value* operator->() const { return &(it->first); }
1972 1996

	
1973
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1974
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1997
      /// \e
1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999
      /// \e
2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1975 2001

	
1976 2002
    private:
1977 2003
      typename Container::const_iterator it;
1978 2004
    };
2005
    
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
1979 2008

	
1980 2009
    /// \brief Returns an iterator to the first value.
1981 2010
    ///
1982
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1983 2012
    /// first value of the map. The values of the
1984 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1985 2014
    /// range.
1986
    ValueIterator beginValue() const {
1987
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1988 2017
    }
1989 2018

	
1990 2019
    /// \brief Returns an iterator after the last value.
1991 2020
    ///
1992
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1993 2022
    /// last value of the map. The values of the
1994 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1995 2024
    /// range.
1996
    ValueIterator endValue() const {
1997
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1998 2027
    }
1999 2028

	
2000 2029
    /// \brief Sets the value associated with the given key.
2001 2030
    ///
2002 2031
    /// Sets the value associated with the given key.
2003 2032
    void set(const Key& key, const Value& val) {
2004 2033
      Value oldval = Map::operator[](key);
2005 2034
      typename Container::iterator it;
2006 2035
      for (it = _inv_map.equal_range(oldval).first;
2007 2036
           it != _inv_map.equal_range(oldval).second; ++it) {
2008 2037
        if (it->second == key) {
2009 2038
          _inv_map.erase(it);
2010 2039
          break;
2011 2040
        }
2012 2041
      }
2013 2042
      _inv_map.insert(std::make_pair(val, key));
2014 2043
      Map::set(key, val);
2015 2044
    }
2016 2045

	
2017 2046
    /// \brief Returns the value associated with the given key.
2018 2047
    ///
2019 2048
    /// Returns the value associated with the given key.
2020 2049
    typename MapTraits<Map>::ConstReturnValue
2021 2050
    operator[](const Key& key) const {
2022 2051
      return Map::operator[](key);
2023 2052
    }
2024 2053

	
2025 2054
    /// \brief Gives back an item by its value.
2026 2055
    ///
2027 2056
    /// This function gives back an item that is assigned to
2028 2057
    /// the given value or \c INVALID if no such item exists.
2029 2058
    /// If there are more items with the same associated value,
2030 2059
    /// only one of them is returned.
2031 2060
    Key operator()(const Value& val) const {
2032 2061
      typename Container::const_iterator it = _inv_map.find(val);
2033 2062
      return it != _inv_map.end() ? it->second : INVALID;
2034 2063
    }
2064
    
2065
    /// \brief Returns the number of items with the given value.
2066
    ///
2067
    /// This function returns the number of items with the given value
2068
    /// associated with it.
2069
    int count(const Value &val) const {
2070
      return _inv_map.count(val);
2071
    }
2035 2072

	
2036 2073
  protected:
2037 2074

	
2038 2075
    /// \brief Erase the key from the map and the inverse map.
2039 2076
    ///
2040 2077
    /// Erase the key from the map and the inverse map. It is called by the
2041 2078
    /// \c AlterationNotifier.
2042 2079
    virtual void erase(const Key& key) {
2043 2080
      Value val = Map::operator[](key);
2044 2081
      typename Container::iterator it;
2045 2082
      for (it = _inv_map.equal_range(val).first;
2046 2083
           it != _inv_map.equal_range(val).second; ++it) {
2047 2084
        if (it->second == key) {
2048 2085
          _inv_map.erase(it);
2049 2086
          break;
2050 2087
        }
2051 2088
      }
2052 2089
      Map::erase(key);
2053 2090
    }
2054 2091

	
2055 2092
    /// \brief Erase more keys from the map and the inverse map.
2056 2093
    ///
2057 2094
    /// Erase more keys from the map and the inverse map. It is called by the
2058 2095
    /// \c AlterationNotifier.
2059 2096
    virtual void erase(const std::vector<Key>& keys) {
2060 2097
      for (int i = 0; i < int(keys.size()); ++i) {
2061 2098
        Value val = Map::operator[](keys[i]);
2062 2099
        typename Container::iterator it;
2063 2100
        for (it = _inv_map.equal_range(val).first;
2064 2101
             it != _inv_map.equal_range(val).second; ++it) {
2065 2102
          if (it->second == keys[i]) {
2066 2103
            _inv_map.erase(it);
2067 2104
            break;
2068 2105
          }
2069 2106
        }
2070 2107
      }
2071 2108
      Map::erase(keys);
2072 2109
    }
2073 2110

	
2074 2111
    /// \brief Clear the keys from the map and the inverse map.
2075 2112
    ///
2076 2113
    /// Clear the keys from the map and the inverse map. It is called by the
2077 2114
    /// \c AlterationNotifier.
2078 2115
    virtual void clear() {
2079 2116
      _inv_map.clear();
2080 2117
      Map::clear();
2081 2118
    }
2082 2119

	
2083 2120
  public:
2084 2121

	
2085
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2086 2123
    ///
2087
    /// The inverse of this map. The subscript operator of the map
2088
    /// gives back the item that was last assigned to the value.
2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125
    /// back an item by its value.
2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
    /// \see inverse()
2089 2128
    class InverseMap {
2090 2129
    public:
2091 2130
      /// \brief Constructor
2092 2131
      ///
2093 2132
      /// Constructor of the InverseMap.
2094 2133
      explicit InverseMap(const CrossRefMap& inverted)
2095 2134
        : _inverted(inverted) {}
2096 2135

	
2097 2136
      /// The value type of the InverseMap.
2098 2137
      typedef typename CrossRefMap::Key Value;
2099 2138
      /// The key type of the InverseMap.
2100 2139
      typedef typename CrossRefMap::Value Key;
2101 2140

	
2102 2141
      /// \brief Subscript operator.
2103 2142
      ///
2104 2143
      /// Subscript operator. It gives back an item
2105 2144
      /// that is assigned to the given value or \c INVALID
2106 2145
      /// if no such item exists.
2107 2146
      Value operator[](const Key& key) const {
2108 2147
        return _inverted(key);
2109 2148
      }
2110 2149

	
2111 2150
    private:
2112 2151
      const CrossRefMap& _inverted;
2113 2152
    };
2114 2153

	
2115
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2116 2155
    ///
2117
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2118 2157
    InverseMap inverse() const {
2119 2158
      return InverseMap(*this);
2120 2159
    }
2121 2160

	
2122 2161
  };
2123 2162

	
2124
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2125 2164
  /// items of a graph.
2126 2165
  ///
2127 2166
  /// RangeIdMap provides a unique and continuous
2128
  /// ID for each item of a given type (\c Node, \c Arc or
2167
  /// id for each item of a given type (\c Node, \c Arc or
2129 2168
  /// \c Edge) in a graph. This id is
2130 2169
  ///  - \b unique: different items get different ids,
2131 2170
  ///  - \b continuous: the range of the ids is the set of integers
2132 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2133 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2134 2173
  ///  - So, the ids can change when deleting an item of the same type.
2135 2174
  ///
2136 2175
  /// Thus this id is not (necessarily) the same as what can get using
2137 2176
  /// the \c id() function of the graph or \ref IdMap.
2138 2177
  /// This map can be inverted with its member class \c InverseMap,
2139
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2140 2179
  ///
2141 2180
  /// \tparam GR The graph type.
2142 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2143 2182
  /// \c GR::Edge).
2144 2183
  ///
2145 2184
  /// \see IdMap
2146 2185
  template <typename GR, typename K>
2147 2186
  class RangeIdMap
2148 2187
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2149 2188

	
2150 2189
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2151 2190

	
2152 2191
  public:
2153 2192
    /// The graph type of RangeIdMap.
2154 2193
    typedef GR Graph;
2155 2194
    typedef GR Digraph;
2156 2195
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2157 2196
    typedef K Item;
2158 2197
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2159 2198
    typedef K Key;
2160 2199
    /// The value type of RangeIdMap.
2161 2200
    typedef int Value;
2162 2201

	
2163 2202
    /// \brief Constructor.
2164 2203
    ///
2165 2204
    /// Constructor.
2166 2205
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2167 2206
      Item it;
2168 2207
      const typename Map::Notifier* nf = Map::notifier();
2169 2208
      for (nf->first(it); it != INVALID; nf->next(it)) {
2170 2209
        Map::set(it, _inv_map.size());
2171 2210
        _inv_map.push_back(it);
2172 2211
      }
2173 2212
    }
2174 2213

	
2175 2214
  protected:
2176 2215

	
2177 2216
    /// \brief Adds a new key to the map.
2178 2217
    ///
2179 2218
    /// Add a new key to the map. It is called by the
2180 2219
    /// \c AlterationNotifier.
2181 2220
    virtual void add(const Item& item) {
2182 2221
      Map::add(item);
2183 2222
      Map::set(item, _inv_map.size());
2184 2223
      _inv_map.push_back(item);
2185 2224
    }
2186 2225

	
2187 2226
    /// \brief Add more new keys to the map.
... ...
@@ -2219,167 +2258,178 @@
2219 2258
      }
2220 2259
      Map::erase(items);
2221 2260
    }
2222 2261

	
2223 2262
    /// \brief Build the unique map.
2224 2263
    ///
2225 2264
    /// Build the unique map. It is called by the
2226 2265
    /// \c AlterationNotifier.
2227 2266
    virtual void build() {
2228 2267
      Map::build();
2229 2268
      Item it;
2230 2269
      const typename Map::Notifier* nf = Map::notifier();
2231 2270
      for (nf->first(it); it != INVALID; nf->next(it)) {
2232 2271
        Map::set(it, _inv_map.size());
2233 2272
        _inv_map.push_back(it);
2234 2273
      }
2235 2274
    }
2236 2275

	
2237 2276
    /// \brief Clear the keys from the map.
2238 2277
    ///
2239 2278
    /// Clear the keys from the map. It is called by the
2240 2279
    /// \c AlterationNotifier.
2241 2280
    virtual void clear() {
2242 2281
      _inv_map.clear();
2243 2282
      Map::clear();
2244 2283
    }
2245 2284

	
2246 2285
  public:
2247 2286

	
2248 2287
    /// \brief Returns the maximal value plus one.
2249 2288
    ///
2250 2289
    /// Returns the maximal value plus one in the map.
2251 2290
    unsigned int size() const {
2252 2291
      return _inv_map.size();
2253 2292
    }
2254 2293

	
2255 2294
    /// \brief Swaps the position of the two items in the map.
2256 2295
    ///
2257 2296
    /// Swaps the position of the two items in the map.
2258 2297
    void swap(const Item& p, const Item& q) {
2259 2298
      int pi = Map::operator[](p);
2260 2299
      int qi = Map::operator[](q);
2261 2300
      Map::set(p, qi);
2262 2301
      _inv_map[qi] = p;
2263 2302
      Map::set(q, pi);
2264 2303
      _inv_map[pi] = q;
2265 2304
    }
2266 2305

	
2267
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2268 2307
    ///
2269
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2270 2309
    int operator[](const Item& item) const {
2271 2310
      return Map::operator[](item);
2272 2311
    }
2273 2312

	
2274
    /// \brief Gives back the item belonging to a \e RangeId
2313
    /// \brief Gives back the item belonging to a \e range \e id
2275 2314
    ///
2276
    /// Gives back the item belonging to a \e RangeId.
2315
    /// Gives back the item belonging to the given \e range \e id.
2277 2316
    Item operator()(int id) const {
2278 2317
      return _inv_map[id];
2279 2318
    }
2280 2319

	
2281 2320
  private:
2282 2321

	
2283 2322
    typedef std::vector<Item> Container;
2284 2323
    Container _inv_map;
2285 2324

	
2286 2325
  public:
2287 2326

	
2288 2327
    /// \brief The inverse map type of RangeIdMap.
2289 2328
    ///
2290
    /// The inverse map type of RangeIdMap.
2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330
    /// back an item by its \e range \e id.
2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2291 2332
    class InverseMap {
2292 2333
    public:
2293 2334
      /// \brief Constructor
2294 2335
      ///
2295 2336
      /// Constructor of the InverseMap.
2296 2337
      explicit InverseMap(const RangeIdMap& inverted)
2297 2338
        : _inverted(inverted) {}
2298 2339

	
2299 2340

	
2300 2341
      /// The value type of the InverseMap.
2301 2342
      typedef typename RangeIdMap::Key Value;
2302 2343
      /// The key type of the InverseMap.
2303 2344
      typedef typename RangeIdMap::Value Key;
2304 2345

	
2305 2346
      /// \brief Subscript operator.
2306 2347
      ///
2307 2348
      /// Subscript operator. It gives back the item
2308
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2309 2350
      Value operator[](const Key& key) const {
2310 2351
        return _inverted(key);
2311 2352
      }
2312 2353

	
2313 2354
      /// \brief Size of the map.
2314 2355
      ///
2315 2356
      /// Returns the size of the map.
2316 2357
      unsigned int size() const {
2317 2358
        return _inverted.size();
2318 2359
      }
2319 2360

	
2320 2361
    private:
2321 2362
      const RangeIdMap& _inverted;
2322 2363
    };
2323 2364

	
2324 2365
    /// \brief Gives back the inverse of the map.
2325 2366
    ///
2326
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2327 2368
    const InverseMap inverse() const {
2328 2369
      return InverseMap(*this);
2329 2370
    }
2330 2371
  };
2331 2372

	
2373
  /// \brief Returns a \c RangeIdMap class.
2374
  ///
2375
  /// This function just returns an \c RangeIdMap class.
2376
  /// \relates RangeIdMap
2377
  template <typename K, typename GR>
2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
    return RangeIdMap<GR, K>(graph);
2380
  }
2381
  
2332 2382
  /// \brief Dynamic iterable \c bool map.
2333 2383
  ///
2334 2384
  /// This class provides a special graph map type which can store a
2335 2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2336 2386
  /// For both \c true and \c false values it is possible to iterate on
2337
  /// the keys.
2387
  /// the keys mapped to the value.
2338 2388
  ///
2339 2389
  /// This type is a reference map, so it can be modified with the
2340 2390
  /// subscript operator.
2341 2391
  ///
2342 2392
  /// \tparam GR The graph type.
2343 2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2344 2394
  /// \c GR::Edge).
2345 2395
  ///
2346 2396
  /// \see IterableIntMap, IterableValueMap
2347 2397
  /// \see CrossRefMap
2348 2398
  template <typename GR, typename K>
2349 2399
  class IterableBoolMap
2350 2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2351 2401
  private:
2352 2402
    typedef GR Graph;
2353 2403

	
2354 2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2355 2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2356 2406

	
2357 2407
    std::vector<K> _array;
2358 2408
    int _sep;
2359 2409

	
2360 2410
  public:
2361 2411

	
2362 2412
    /// Indicates that the map is reference map.
2363 2413
    typedef True ReferenceMapTag;
2364 2414

	
2365 2415
    /// The key type
2366 2416
    typedef K Key;
2367 2417
    /// The value type
2368 2418
    typedef bool Value;
2369 2419
    /// The const reference type.
2370 2420
    typedef const Value& ConstReference;
2371 2421

	
2372 2422
  private:
2373 2423

	
2374 2424
    int position(const Key& key) const {
2375 2425
      return Parent::operator[](key);
2376 2426
    }
2377 2427

	
2378 2428
  public:
2379 2429

	
2380 2430
    /// \brief Reference to the value of the map.
2381 2431
    ///
2382 2432
    /// This class is similar to the \c bool type. It can be converted to
2383 2433
    /// \c bool and it provides the same operators.
2384 2434
    class Reference {
2385 2435
      friend class IterableBoolMap;
... ...
@@ -2658,96 +2708,101 @@
2658 2708
          _array[_sep] = _array.back();
2659 2709
          _array.pop_back();
2660 2710
        } else {
2661 2711
          Parent::set(_array.back(), pos);
2662 2712
          _array[pos] = _array.back();
2663 2713
          _array.pop_back();
2664 2714
        }
2665 2715
      }
2666 2716
      Parent::erase(keys);
2667 2717
    }
2668 2718

	
2669 2719
    virtual void build() {
2670 2720
      Parent::build();
2671 2721
      typename Parent::Notifier* nf = Parent::notifier();
2672 2722
      Key it;
2673 2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2674 2724
        Parent::set(it, _array.size());
2675 2725
        _array.push_back(it);
2676 2726
      }
2677 2727
      _sep = 0;
2678 2728
    }
2679 2729

	
2680 2730
    virtual void clear() {
2681 2731
      _array.clear();
2682 2732
      _sep = 0;
2683 2733
      Parent::clear();
2684 2734
    }
2685 2735

	
2686 2736
  };
2687 2737

	
2688 2738

	
2689 2739
  namespace _maps_bits {
2690 2740
    template <typename Item>
2691 2741
    struct IterableIntMapNode {
2692 2742
      IterableIntMapNode() : value(-1) {}
2693 2743
      IterableIntMapNode(int _value) : value(_value) {}
2694 2744
      Item prev, next;
2695 2745
      int value;
2696 2746
    };
2697 2747
  }
2698 2748

	
2699 2749
  /// \brief Dynamic iterable integer map.
2700 2750
  ///
2701 2751
  /// This class provides a special graph map type which can store an
2702 2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2703 2753
  /// For each non-negative value it is possible to iterate on the keys
2704 2754
  /// mapped to the value.
2705 2755
  ///
2756
  /// This map is intended to be used with small integer values, for which
2757
  /// it is efficient, and supports iteration only for non-negative values.
2758
  /// If you need large values and/or iteration for negative integers,
2759
  /// consider to use \ref IterableValueMap instead.
2760
  ///
2706 2761
  /// This type is a reference map, so it can be modified with the
2707 2762
  /// subscript operator.
2708 2763
  ///
2709 2764
  /// \note The size of the data structure depends on the largest
2710 2765
  /// value in the map.
2711 2766
  ///
2712 2767
  /// \tparam GR The graph type.
2713 2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2714 2769
  /// \c GR::Edge).
2715 2770
  ///
2716 2771
  /// \see IterableBoolMap, IterableValueMap
2717 2772
  /// \see CrossRefMap
2718 2773
  template <typename GR, typename K>
2719 2774
  class IterableIntMap
2720 2775
    : protected ItemSetTraits<GR, K>::
2721 2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2722 2777
  public:
2723 2778
    typedef typename ItemSetTraits<GR, K>::
2724 2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2725 2780

	
2726 2781
    /// The key type
2727 2782
    typedef K Key;
2728 2783
    /// The value type
2729 2784
    typedef int Value;
2730 2785
    /// The graph type
2731 2786
    typedef GR Graph;
2732 2787

	
2733 2788
    /// \brief Constructor of the map.
2734 2789
    ///
2735 2790
    /// Constructor of the map. It sets all values to -1.
2736 2791
    explicit IterableIntMap(const Graph& graph)
2737 2792
      : Parent(graph) {}
2738 2793

	
2739 2794
    /// \brief Constructor of the map with a given value.
2740 2795
    ///
2741 2796
    /// Constructor of the map with a given value.
2742 2797
    explicit IterableIntMap(const Graph& graph, int value)
2743 2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2744 2799
      if (value >= 0) {
2745 2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2746 2801
          lace(it);
2747 2802
        }
2748 2803
      }
2749 2804
    }
2750 2805

	
2751 2806
  private:
2752 2807

	
2753 2808
    void unlace(const Key& key) {
... ...
@@ -2939,231 +2994,240 @@
2939 2994

	
2940 2995
      /// \brief Increment operator.
2941 2996
      ///
2942 2997
      /// Increment operator.
2943 2998
      ItemIt& operator++() {
2944 2999
        Parent::operator=(_map->IterableIntMap::Parent::
2945 3000
                          operator[](static_cast<Parent&>(*this)).next);
2946 3001
        return *this;
2947 3002
      }
2948 3003

	
2949 3004
    private:
2950 3005
      const IterableIntMap* _map;
2951 3006
    };
2952 3007

	
2953 3008
  protected:
2954 3009

	
2955 3010
    virtual void erase(const Key& key) {
2956 3011
      unlace(key);
2957 3012
      Parent::erase(key);
2958 3013
    }
2959 3014

	
2960 3015
    virtual void erase(const std::vector<Key>& keys) {
2961 3016
      for (int i = 0; i < int(keys.size()); ++i) {
2962 3017
        unlace(keys[i]);
2963 3018
      }
2964 3019
      Parent::erase(keys);
2965 3020
    }
2966 3021

	
2967 3022
    virtual void clear() {
2968 3023
      _first.clear();
2969 3024
      Parent::clear();
2970 3025
    }
2971 3026

	
2972 3027
  private:
2973 3028
    std::vector<Key> _first;
2974 3029
  };
2975 3030

	
2976 3031
  namespace _maps_bits {
2977 3032
    template <typename Item, typename Value>
2978 3033
    struct IterableValueMapNode {
2979 3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
2980 3035
      Item prev, next;
2981 3036
      Value value;
2982 3037
    };
2983 3038
  }
2984 3039

	
2985 3040
  /// \brief Dynamic iterable map for comparable values.
2986 3041
  ///
2987
  /// This class provides a special graph map type which can store an
3042
  /// This class provides a special graph map type which can store a
2988 3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
2989 3044
  /// For each value it is possible to iterate on the keys mapped to
2990
  /// the value.
3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047
  /// The map stores a linked list for each value, which contains
3048
  /// the items mapped to the value, and the used values are stored
3049
  /// in balanced binary tree (\c std::map).
2991 3050
  ///
2992
  /// The map stores for each value a linked list with
2993
  /// the items which mapped to the value, and the values are stored
2994
  /// in balanced binary tree. The values of the map can be accessed
2995
  /// with stl compatible forward iterator.
3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
  /// specialized for \c bool and \c int values, respectively.
2996 3053
  ///
2997 3054
  /// This type is not reference map, so it cannot be modified with
2998 3055
  /// the subscript operator.
2999 3056
  ///
3000 3057
  /// \tparam GR The graph type.
3001 3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3002 3059
  /// \c GR::Edge).
3003 3060
  /// \tparam V The value type of the map. It can be any comparable
3004 3061
  /// value type.
3005 3062
  ///
3006 3063
  /// \see IterableBoolMap, IterableIntMap
3007 3064
  /// \see CrossRefMap
3008 3065
  template <typename GR, typename K, typename V>
3009 3066
  class IterableValueMap
3010 3067
    : protected ItemSetTraits<GR, K>::
3011 3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3012 3069
  public:
3013 3070
    typedef typename ItemSetTraits<GR, K>::
3014 3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3015 3072

	
3016 3073
    /// The key type
3017 3074
    typedef K Key;
3018 3075
    /// The value type
3019 3076
    typedef V Value;
3020 3077
    /// The graph type
3021 3078
    typedef GR Graph;
3022 3079

	
3023 3080
  public:
3024 3081

	
3025 3082
    /// \brief Constructor of the map with a given value.
3026 3083
    ///
3027 3084
    /// Constructor of the map with a given value.
3028 3085
    explicit IterableValueMap(const Graph& graph,
3029 3086
                              const Value& value = Value())
3030 3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3031 3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3032 3089
        lace(it);
3033 3090
      }
3034 3091
    }
3035 3092

	
3036 3093
  protected:
3037 3094

	
3038 3095
    void unlace(const Key& key) {
3039 3096
      typename Parent::Value& node = Parent::operator[](key);
3040 3097
      if (node.prev != INVALID) {
3041 3098
        Parent::operator[](node.prev).next = node.next;
3042 3099
      } else {
3043 3100
        if (node.next != INVALID) {
3044 3101
          _first[node.value] = node.next;
3045 3102
        } else {
3046 3103
          _first.erase(node.value);
3047 3104
        }
3048 3105
      }
3049 3106
      if (node.next != INVALID) {
3050 3107
        Parent::operator[](node.next).prev = node.prev;
3051 3108
      }
3052 3109
    }
3053 3110

	
3054 3111
    void lace(const Key& key) {
3055 3112
      typename Parent::Value& node = Parent::operator[](key);
3056 3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3057 3114
      if (it == _first.end()) {
3058 3115
        node.prev = node.next = INVALID;
3059 3116
        _first.insert(std::make_pair(node.value, key));
3060 3117
      } else {
3061 3118
        node.prev = INVALID;
3062 3119
        node.next = it->second;
3063 3120
        if (node.next != INVALID) {
3064 3121
          Parent::operator[](node.next).prev = key;
3065 3122
        }
3066 3123
        it->second = key;
3067 3124
      }
3068 3125
    }
3069 3126

	
3070 3127
  public:
3071 3128

	
3072 3129
    /// \brief Forward iterator for values.
3073 3130
    ///
3074
    /// This iterator is an stl compatible forward
3131
    /// This iterator is an STL compatible forward
3075 3132
    /// iterator on the values of the map. The values can
3076 3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3077
    class ValueIterator
3134
    class ValueIt
3078 3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3079 3136
      friend class IterableValueMap;
3080 3137
    private:
3081
      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3082 3139
        : it(_it) {}
3083 3140
    public:
3084 3141

	
3085
      ValueIterator() {}
3086

	
3087
      ValueIterator& operator++() { ++it; return *this; }
3088
      ValueIterator operator++(int) {
3089
        ValueIterator tmp(*this);
3142
      /// Constructor
3143
      ValueIt() {}
3144

	
3145
      /// \e
3146
      ValueIt& operator++() { ++it; return *this; }
3147
      /// \e
3148
      ValueIt operator++(int) {
3149
        ValueIt tmp(*this);
3090 3150
        operator++();
3091 3151
        return tmp;
3092 3152
      }
3093 3153

	
3154
      /// \e
3094 3155
      const Value& operator*() const { return it->first; }
3156
      /// \e
3095 3157
      const Value* operator->() const { return &(it->first); }
3096 3158

	
3097
      bool operator==(ValueIterator jt) const { return it == jt.it; }
3098
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
3159
      /// \e
3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161
      /// \e
3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3099 3163

	
3100 3164
    private:
3101 3165
      typename std::map<Value, Key>::const_iterator it;
3102 3166
    };
3103 3167

	
3104 3168
    /// \brief Returns an iterator to the first value.
3105 3169
    ///
3106
    /// Returns an stl compatible iterator to the
3170
    /// Returns an STL compatible iterator to the
3107 3171
    /// first value of the map. The values of the
3108 3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3109 3173
    /// range.
3110
    ValueIterator beginValue() const {
3111
      return ValueIterator(_first.begin());
3174
    ValueIt beginValue() const {
3175
      return ValueIt(_first.begin());
3112 3176
    }
3113 3177

	
3114 3178
    /// \brief Returns an iterator after the last value.
3115 3179
    ///
3116
    /// Returns an stl compatible iterator after the
3180
    /// Returns an STL compatible iterator after the
3117 3181
    /// last value of the map. The values of the
3118 3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3119 3183
    /// range.
3120
    ValueIterator endValue() const {
3121
      return ValueIterator(_first.end());
3184
    ValueIt endValue() const {
3185
      return ValueIt(_first.end());
3122 3186
    }
3123 3187

	
3124 3188
    /// \brief Set operation of the map.
3125 3189
    ///
3126 3190
    /// Set operation of the map.
3127 3191
    void set(const Key& key, const Value& value) {
3128 3192
      unlace(key);
3129 3193
      Parent::operator[](key).value = value;
3130 3194
      lace(key);
3131 3195
    }
3132 3196

	
3133 3197
    /// \brief Const subscript operator of the map.
3134 3198
    ///
3135 3199
    /// Const subscript operator of the map.
3136 3200
    const Value& operator[](const Key& key) const {
3137 3201
      return Parent::operator[](key).value;
3138 3202
    }
3139 3203

	
3140 3204
    /// \brief Iterator for the keys with the same value.
3141 3205
    ///
3142 3206
    /// Iterator for the keys with the same value. It works
3143 3207
    /// like a graph item iterator, it can be converted to
3144 3208
    /// the item type of the map, incremented with \c ++ operator, and
3145 3209
    /// if the iterator leaves the last valid item, it will be equal to
3146 3210
    /// \c INVALID.
3147 3211
    class ItemIt : public Key {
3148 3212
    public:
3149 3213
      typedef Key Parent;
3150 3214

	
3151 3215
      /// \brief Invalid constructor \& conversion.
3152 3216
      ///
3153 3217
      /// This constructor initializes the iterator to be invalid.
3154 3218
      /// \sa Invalid for more details.
3155 3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3156 3220

	
3157 3221
      /// \brief Creates an iterator with a value.
3158 3222
      ///
3159 3223
      /// Creates an iterator with a value. It iterates on the
3160 3224
      /// keys which have the given value.
3161 3225
      /// \param map The IterableValueMap
3162 3226
      /// \param value The value
3163 3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3164 3228
        typename std::map<Value, Key>::const_iterator it =
3165 3229
          map._first.find(value);
3166 3230
        if (it == map._first.end()) {
3167 3231
          Parent::operator=(INVALID);
3168 3232
        } else {
3169 3233
          Parent::operator=(it->second);
... ...
@@ -3191,221 +3255,225 @@
3191 3255
      unlace(key);
3192 3256
    }
3193 3257

	
3194 3258
    virtual void add(const std::vector<Key>& keys) {
3195 3259
      Parent::add(keys);
3196 3260
      for (int i = 0; i < int(keys.size()); ++i) {
3197 3261
        lace(keys[i]);
3198 3262
      }
3199 3263
    }
3200 3264

	
3201 3265
    virtual void erase(const Key& key) {
3202 3266
      unlace(key);
3203 3267
      Parent::erase(key);
3204 3268
    }
3205 3269

	
3206 3270
    virtual void erase(const std::vector<Key>& keys) {
3207 3271
      for (int i = 0; i < int(keys.size()); ++i) {
3208 3272
        unlace(keys[i]);
3209 3273
      }
3210 3274
      Parent::erase(keys);
3211 3275
    }
3212 3276

	
3213 3277
    virtual void build() {
3214 3278
      Parent::build();
3215 3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3216 3280
        lace(it);
3217 3281
      }
3218 3282
    }
3219 3283

	
3220 3284
    virtual void clear() {
3221 3285
      _first.clear();
3222 3286
      Parent::clear();
3223 3287
    }
3224 3288

	
3225 3289
  private:
3226 3290
    std::map<Value, Key> _first;
3227 3291
  };
3228 3292

	
3229 3293
  /// \brief Map of the source nodes of arcs in a digraph.
3230 3294
  ///
3231 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
3232 3296
  /// which is returned by the \c source() function of the digraph.
3233 3297
  /// \tparam GR The digraph type.
3234 3298
  /// \see TargetMap
3235 3299
  template <typename GR>
3236 3300
  class SourceMap {
3237 3301
  public:
3238 3302

	
3239
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
3240 3304
    typedef typename GR::Arc Key;
3241
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
3242 3306
    typedef typename GR::Node Value;
3243 3307

	
3244 3308
    /// \brief Constructor
3245 3309
    ///
3246 3310
    /// Constructor.
3247 3311
    /// \param digraph The digraph that the map belongs to.
3248 3312
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
3249 3313

	
3250 3314
    /// \brief Returns the source node of the given arc.
3251 3315
    ///
3252 3316
    /// Returns the source node of the given arc.
3253 3317
    Value operator[](const Key& arc) const {
3254 3318
      return _graph.source(arc);
3255 3319
    }
3256 3320

	
3257 3321
  private:
3258 3322
    const GR& _graph;
3259 3323
  };
3260 3324

	
3261 3325
  /// \brief Returns a \c SourceMap class.
3262 3326
  ///
3263 3327
  /// This function just returns an \c SourceMap class.
3264 3328
  /// \relates SourceMap
3265 3329
  template <typename GR>
3266 3330
  inline SourceMap<GR> sourceMap(const GR& graph) {
3267 3331
    return SourceMap<GR>(graph);
3268 3332
  }
3269 3333

	
3270 3334
  /// \brief Map of the target nodes of arcs in a digraph.
3271 3335
  ///
3272 3336
  /// TargetMap provides access for the target node of each arc in a digraph,
3273 3337
  /// which is returned by the \c target() function of the digraph.
3274 3338
  /// \tparam GR The digraph type.
3275 3339
  /// \see SourceMap
3276 3340
  template <typename GR>
3277 3341
  class TargetMap {
3278 3342
  public:
3279 3343

	
3280
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
3281 3345
    typedef typename GR::Arc Key;
3282
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
3283 3347
    typedef typename GR::Node Value;
3284 3348

	
3285 3349
    /// \brief Constructor
3286 3350
    ///
3287 3351
    /// Constructor.
3288 3352
    /// \param digraph The digraph that the map belongs to.
3289 3353
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
3290 3354

	
3291 3355
    /// \brief Returns the target node of the given arc.
3292 3356
    ///
3293 3357
    /// Returns the target node of the given arc.
3294 3358
    Value operator[](const Key& e) const {
3295 3359
      return _graph.target(e);
3296 3360
    }
3297 3361

	
3298 3362
  private:
3299 3363
    const GR& _graph;
3300 3364
  };
3301 3365

	
3302 3366
  /// \brief Returns a \c TargetMap class.
3303 3367
  ///
3304 3368
  /// This function just returns a \c TargetMap class.
3305 3369
  /// \relates TargetMap
3306 3370
  template <typename GR>
3307 3371
  inline TargetMap<GR> targetMap(const GR& graph) {
3308 3372
    return TargetMap<GR>(graph);
3309 3373
  }
3310 3374

	
3311 3375
  /// \brief Map of the "forward" directed arc view of edges in a graph.
3312 3376
  ///
3313 3377
  /// ForwardMap provides access for the "forward" directed arc view of
3314 3378
  /// each edge in a graph, which is returned by the \c direct() function
3315 3379
  /// of the graph with \c true parameter.
3316 3380
  /// \tparam GR The graph type.
3317 3381
  /// \see BackwardMap
3318 3382
  template <typename GR>
3319 3383
  class ForwardMap {
3320 3384
  public:
3321 3385

	
3386
    /// The key type (the \c Edge type of the digraph).
3387
    typedef typename GR::Edge Key;
3388
    /// The value type (the \c Arc type of the digraph).
3322 3389
    typedef typename GR::Arc Value;
3323
    typedef typename GR::Edge Key;
3324 3390

	
3325 3391
    /// \brief Constructor
3326 3392
    ///
3327 3393
    /// Constructor.
3328 3394
    /// \param graph The graph that the map belongs to.
3329 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
3330 3396

	
3331 3397
    /// \brief Returns the "forward" directed arc view of the given edge.
3332 3398
    ///
3333 3399
    /// Returns the "forward" directed arc view of the given edge.
3334 3400
    Value operator[](const Key& key) const {
3335 3401
      return _graph.direct(key, true);
3336 3402
    }
3337 3403

	
3338 3404
  private:
3339 3405
    const GR& _graph;
3340 3406
  };
3341 3407

	
3342 3408
  /// \brief Returns a \c ForwardMap class.
3343 3409
  ///
3344 3410
  /// This function just returns an \c ForwardMap class.
3345 3411
  /// \relates ForwardMap
3346 3412
  template <typename GR>
3347 3413
  inline ForwardMap<GR> forwardMap(const GR& graph) {
3348 3414
    return ForwardMap<GR>(graph);
3349 3415
  }
3350 3416

	
3351 3417
  /// \brief Map of the "backward" directed arc view of edges in a graph.
3352 3418
  ///
3353 3419
  /// BackwardMap provides access for the "backward" directed arc view of
3354 3420
  /// each edge in a graph, which is returned by the \c direct() function
3355 3421
  /// of the graph with \c false parameter.
3356 3422
  /// \tparam GR The graph type.
3357 3423
  /// \see ForwardMap
3358 3424
  template <typename GR>
3359 3425
  class BackwardMap {
3360 3426
  public:
3361 3427

	
3428
    /// The key type (the \c Edge type of the digraph).
3429
    typedef typename GR::Edge Key;
3430
    /// The value type (the \c Arc type of the digraph).
3362 3431
    typedef typename GR::Arc Value;
3363
    typedef typename GR::Edge Key;
3364 3432

	
3365 3433
    /// \brief Constructor
3366 3434
    ///
3367 3435
    /// Constructor.
3368 3436
    /// \param graph The graph that the map belongs to.
3369 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
3370 3438

	
3371 3439
    /// \brief Returns the "backward" directed arc view of the given edge.
3372 3440
    ///
3373 3441
    /// Returns the "backward" directed arc view of the given edge.
3374 3442
    Value operator[](const Key& key) const {
3375 3443
      return _graph.direct(key, false);
3376 3444
    }
3377 3445

	
3378 3446
  private:
3379 3447
    const GR& _graph;
3380 3448
  };
3381 3449

	
3382 3450
  /// \brief Returns a \c BackwardMap class
3383 3451

	
3384 3452
  /// This function just returns a \c BackwardMap class.
3385 3453
  /// \relates BackwardMap
3386 3454
  template <typename GR>
3387 3455
  inline BackwardMap<GR> backwardMap(const GR& graph) {
3388 3456
    return BackwardMap<GR>(graph);
3389 3457
  }
3390 3458

	
3391 3459
  /// \brief Map of the in-degrees of nodes in a digraph.
3392 3460
  ///
3393 3461
  /// This map returns the in-degree of a node. Once it is constructed,
3394 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3395 3463
  /// in constant time. On the other hand, the values are updated automatically
3396 3464
  /// whenever the digraph changes.
3397 3465
  ///
3398 3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3399 3467
  /// may provide alternative ways to modify the digraph.
3400 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
3401 3469
  /// features are used. For example the functions
3402 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
3403 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3404 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3405 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
3406 3474
  ///
3407 3475
  /// \sa OutDegMap
3408 3476
  template <typename GR>
3409 3477
  class InDegMap
3410 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
3411 3479
      ::ItemNotifier::ObserverBase {
Ignore white space 6 line context
... ...
@@ -443,98 +443,98 @@
443 443
    };
444 444

	
445 445
    /// @}
446 446

	
447 447
    /// \brief Constructor.
448 448
    ///
449 449
    /// \param digraph The digraph the algorithm will run on.
450 450
    /// \param cost The cost map used by the algorithm.
451 451
    MinCostArborescence(const Digraph& digraph, const CostMap& cost)
452 452
      : _digraph(&digraph), _cost(&cost), _pred(0), local_pred(false),
453 453
        _arborescence(0), local_arborescence(false),
454 454
        _arc_order(0), _node_order(0), _cost_arcs(0),
455 455
        _heap_cross_ref(0), _heap(0) {}
456 456

	
457 457
    /// \brief Destructor.
458 458
    ~MinCostArborescence() {
459 459
      destroyStructures();
460 460
    }
461 461

	
462 462
    /// \brief Sets the arborescence map.
463 463
    ///
464 464
    /// Sets the arborescence map.
465 465
    /// \return <tt>(*this)</tt>
466 466
    MinCostArborescence& arborescenceMap(ArborescenceMap& m) {
467 467
      if (local_arborescence) {
468 468
        delete _arborescence;
469 469
      }
470 470
      local_arborescence = false;
471 471
      _arborescence = &m;
472 472
      return *this;
473 473
    }
474 474

	
475 475
    /// \brief Sets the predecessor map.
476 476
    ///
477 477
    /// Sets the predecessor map.
478 478
    /// \return <tt>(*this)</tt>
479 479
    MinCostArborescence& predMap(PredMap& m) {
480 480
      if (local_pred) {
481 481
        delete _pred;
482 482
      }
483 483
      local_pred = false;
484 484
      _pred = &m;
485 485
      return *this;
486 486
    }
487 487

	
488 488
    /// \name Execution Control
489 489
    /// The simplest way to execute the algorithm is to use
490 490
    /// one of the member functions called \c run(...). \n
491
    /// If you need more control on the execution,
492
    /// first you must call \ref init(), then you can add several
491
    /// If you need better control on the execution,
492
    /// you have to call \ref init() first, then you can add several
493 493
    /// source nodes with \ref addSource().
494 494
    /// Finally \ref start() will perform the arborescence
495 495
    /// computation.
496 496

	
497 497
    ///@{
498 498

	
499 499
    /// \brief Initializes the internal data structures.
500 500
    ///
501 501
    /// Initializes the internal data structures.
502 502
    ///
503 503
    void init() {
504 504
      createStructures();
505 505
      _heap->clear();
506 506
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
507 507
        (*_cost_arcs)[it].arc = INVALID;
508 508
        (*_node_order)[it] = -3;
509 509
        (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
510 510
        _pred->set(it, INVALID);
511 511
      }
512 512
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
513 513
        _arborescence->set(it, false);
514 514
        (*_arc_order)[it] = -1;
515 515
      }
516 516
      _dual_node_list.clear();
517 517
      _dual_variables.clear();
518 518
    }
519 519

	
520 520
    /// \brief Adds a new source node.
521 521
    ///
522 522
    /// Adds a new source node to the algorithm.
523 523
    void addSource(Node source) {
524 524
      std::vector<Node> nodes;
525 525
      nodes.push_back(source);
526 526
      while (!nodes.empty()) {
527 527
        Node node = nodes.back();
528 528
        nodes.pop_back();
529 529
        for (OutArcIt it(*_digraph, node); it != INVALID; ++it) {
530 530
          Node target = _digraph->target(it);
531 531
          if ((*_node_order)[target] == -3) {
532 532
            (*_node_order)[target] = -2;
533 533
            nodes.push_back(target);
534 534
            queue.push_back(target);
535 535
          }
536 536
        }
537 537
      }
538 538
      (*_node_order)[source] = -1;
539 539
    }
540 540

	
Ignore white space 6 line context
... ...
@@ -7,114 +7,121 @@
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_PREFLOW_H
20 20
#define LEMON_PREFLOW_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24

	
25 25
/// \file
26 26
/// \ingroup max_flow
27 27
/// \brief Implementation of the preflow algorithm.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  /// \brief Default traits class of Preflow class.
32 32
  ///
33 33
  /// Default traits class of Preflow class.
34 34
  /// \tparam GR Digraph type.
35 35
  /// \tparam CAP Capacity map type.
36 36
  template <typename GR, typename CAP>
37 37
  struct PreflowDefaultTraits {
38 38

	
39 39
    /// \brief The type of the digraph the algorithm runs on.
40 40
    typedef GR Digraph;
41 41

	
42 42
    /// \brief The type of the map that stores the arc capacities.
43 43
    ///
44 44
    /// The type of the map that stores the arc capacities.
45 45
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
46 46
    typedef CAP CapacityMap;
47 47

	
48 48
    /// \brief The type of the flow values.
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#ifdef DOXYGEN
56
    typedef GR::ArcMap<Value> FlowMap;
57
#else
55 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59
#endif
56 60

	
57 61
    /// \brief Instantiates a FlowMap.
58 62
    ///
59 63
    /// This function instantiates a \ref FlowMap.
60 64
    /// \param digraph The digraph for which we would like to define
61 65
    /// the flow map.
62 66
    static FlowMap* createFlowMap(const Digraph& digraph) {
63 67
      return new FlowMap(digraph);
64 68
    }
65 69

	
66 70
    /// \brief The elevator type used by Preflow algorithm.
67 71
    ///
68 72
    /// The elevator type used by Preflow algorithm.
69 73
    ///
70
    /// \sa Elevator
71
    /// \sa LinkedElevator
72
    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
74
    /// \sa Elevator, LinkedElevator
75
#ifdef DOXYGEN
76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77
#else
78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79
#endif
73 80

	
74 81
    /// \brief Instantiates an Elevator.
75 82
    ///
76 83
    /// This function instantiates an \ref Elevator.
77 84
    /// \param digraph The digraph for which we would like to define
78 85
    /// the elevator.
79 86
    /// \param max_level The maximum level of the elevator.
80 87
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
81 88
      return new Elevator(digraph, max_level);
82 89
    }
83 90

	
84 91
    /// \brief The tolerance used by the algorithm
85 92
    ///
86 93
    /// The tolerance used by the algorithm to handle inexact computation.
87 94
    typedef lemon::Tolerance<Value> Tolerance;
88 95

	
89 96
  };
90 97

	
91 98

	
92 99
  /// \ingroup max_flow
93 100
  ///
94 101
  /// \brief %Preflow algorithm class.
95 102
  ///
96 103
  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
97 104
  /// \e push-relabel algorithm producing a \ref max_flow
98 105
  /// "flow of maximum value" in a digraph.
99 106
  /// The preflow algorithms are the fastest known maximum
100 107
  /// flow algorithms. The current implementation uses a mixture of the
101 108
  /// \e "highest label" and the \e "bound decrease" heuristics.
102 109
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
103 110
  ///
104 111
  /// The algorithm consists of two phases. After the first phase
105 112
  /// the maximum flow value and the minimum cut is obtained. The
106 113
  /// second phase constructs a feasible maximum flow on each arc.
107 114
  ///
108 115
  /// \tparam GR The type of the digraph the algorithm runs on.
109 116
  /// \tparam CAP The type of the capacity map. The default map
110 117
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
111 118
#ifdef DOXYGEN
112 119
  template <typename GR, typename CAP, typename TR>
113 120
#else
114 121
  template <typename GR,
115 122
            typename CAP = typename GR::template ArcMap<int>,
116 123
            typename TR = PreflowDefaultTraits<GR, CAP> >
117 124
#endif
118 125
  class Preflow {
119 126
  public:
120 127

	
... ...
@@ -346,98 +353,98 @@
346 353

	
347 354
    /// \brief Sets the elevator used by algorithm.
348 355
    ///
349 356
    /// Sets the elevator used by algorithm.
350 357
    /// If you don't use this function before calling \ref run() or
351 358
    /// \ref init(), an instance will be allocated automatically.
352 359
    /// The destructor deallocates this automatically allocated elevator,
353 360
    /// of course.
354 361
    /// \return <tt>(*this)</tt>
355 362
    Preflow& elevator(Elevator& elevator) {
356 363
      if (_local_level) {
357 364
        delete _level;
358 365
        _local_level = false;
359 366
      }
360 367
      _level = &elevator;
361 368
      return *this;
362 369
    }
363 370

	
364 371
    /// \brief Returns a const reference to the elevator.
365 372
    ///
366 373
    /// Returns a const reference to the elevator.
367 374
    ///
368 375
    /// \pre Either \ref run() or \ref init() must be called before
369 376
    /// using this function.
370 377
    const Elevator& elevator() const {
371 378
      return *_level;
372 379
    }
373 380

	
374 381
    /// \brief Sets the tolerance used by the algorithm.
375 382
    ///
376 383
    /// Sets the tolerance object used by the algorithm.
377 384
    /// \return <tt>(*this)</tt>
378 385
    Preflow& tolerance(const Tolerance& tolerance) {
379 386
      _tolerance = tolerance;
380 387
      return *this;
381 388
    }
382 389

	
383 390
    /// \brief Returns a const reference to the tolerance.
384 391
    ///
385 392
    /// Returns a const reference to the tolerance object used by
386 393
    /// the algorithm.
387 394
    const Tolerance& tolerance() const {
388 395
      return _tolerance;
389 396
    }
390 397

	
391 398
    /// \name Execution Control
392 399
    /// The simplest way to execute the preflow algorithm is to use
393 400
    /// \ref run() or \ref runMinCut().\n
394
    /// If you need more control on the initial solution or the execution,
395
    /// first you have to call one of the \ref init() functions, then
401
    /// If you need better control on the initial solution or the execution,
402
    /// you have to call one of the \ref init() functions first, then
396 403
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
397 404

	
398 405
    ///@{
399 406

	
400 407
    /// \brief Initializes the internal data structures.
401 408
    ///
402 409
    /// Initializes the internal data structures and sets the initial
403 410
    /// flow to zero on each arc.
404 411
    void init() {
405 412
      createStructures();
406 413

	
407 414
      _phase = true;
408 415
      for (NodeIt n(_graph); n != INVALID; ++n) {
409 416
        (*_excess)[n] = 0;
410 417
      }
411 418

	
412 419
      for (ArcIt e(_graph); e != INVALID; ++e) {
413 420
        _flow->set(e, 0);
414 421
      }
415 422

	
416 423
      typename Digraph::template NodeMap<bool> reached(_graph, false);
417 424

	
418 425
      _level->initStart();
419 426
      _level->initAddItem(_target);
420 427

	
421 428
      std::vector<Node> queue;
422 429
      reached[_source] = true;
423 430

	
424 431
      queue.push_back(_target);
425 432
      reached[_target] = true;
426 433
      while (!queue.empty()) {
427 434
        _level->initNewLevel();
428 435
        std::vector<Node> nqueue;
429 436
        for (int i = 0; i < int(queue.size()); ++i) {
430 437
          Node n = queue[i];
431 438
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
432 439
            Node u = _graph.source(e);
433 440
            if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
434 441
              reached[u] = true;
435 442
              _level->initAddItem(u);
436 443
              nqueue.push_back(u);
437 444
            }
438 445
          }
439 446
        }
440 447
        queue.swap(nqueue);
441 448
      }
442 449
      _level->initFinish();
443 450

	
Ignore white space 6 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
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
25 26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
26 29

	
27 30
#include "test_tools.h"
28 31

	
29 32
using namespace lemon;
30 33
using namespace lemon::concepts;
31 34

	
32 35
struct A {};
33 36
inline bool operator<(A, A) { return true; }
34 37
struct B {};
35 38

	
36 39
class C {
37 40
  int x;
38 41
public:
39 42
  C(int _x) : x(_x) {}
40 43
};
41 44

	
42 45
class F {
43 46
public:
44 47
  typedef A argument_type;
45 48
  typedef B result_type;
46 49

	
47 50
  B operator()(const A&) const { return B(); }
48 51
private:
49 52
  F& operator=(const F&);
50 53
};
51 54

	
52 55
int func(A) { return 3; }
53 56

	
54 57
int binc(int a, B) { return a+1; }
55 58

	
56 59
typedef ReadMap<A, double> DoubleMap;
57 60
typedef ReadWriteMap<A, double> DoubleWriteMap;
58 61
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
59 62

	
60 63
typedef ReadMap<A, bool> BoolMap;
61 64
typedef ReadWriteMap<A, bool> BoolWriteMap;
62 65
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
63 66

	
67
template<typename Map1, typename Map2, typename ItemIt>
68
void compareMap(const Map1& map1, const Map2& map2, ItemIt it) {
69
  for (; it != INVALID; ++it)
70
    check(map1[it] == map2[it], "The maps are not equal");
71
}
72

	
64 73
int main()
65 74
{
66 75
  // Map concepts
67 76
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
68 77
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
69 78
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
70 79
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
71 80
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
72 81
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
73 82
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
74 83
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
75 84

	
76 85
  // NullMap
77 86
  {
78 87
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
79 88
    NullMap<A,B> map1;
80 89
    NullMap<A,B> map2 = map1;
81 90
    map1 = nullMap<A,B>();
82 91
  }
83 92

	
84 93
  // ConstMap
85 94
  {
86 95
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
87 96
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
88 97
    ConstMap<A,B> map1;
89 98
    ConstMap<A,B> map2 = B();
90 99
    ConstMap<A,B> map3 = map1;
91 100
    map1 = constMap<A>(B());
92 101
    map1 = constMap<A,B>();
93 102
    map1.setAll(B());
94 103
    ConstMap<A,C> map4(C(1));
95 104
    ConstMap<A,C> map5 = map4;
96 105
    map4 = constMap<A>(C(2));
97 106
    map4.setAll(C(3));
98 107

	
99 108
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
100 109
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
101 110

	
102 111
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
103 112
    ConstMap<A,Const<int,10> > map6;
104 113
    ConstMap<A,Const<int,10> > map7 = map6;
105 114
    map6 = constMap<A,int,10>();
106 115
    map7 = constMap<A,Const<int,10> >();
107 116
    check(map6[A()] == 10 && map7[A()] == 10,
108 117
          "Something is wrong with ConstMap");
109 118
  }
110 119

	
111 120
  // IdentityMap
... ...
@@ -284,115 +293,335 @@
284 293
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
285 294
          "Something is wrong with NegWriteMap");
286 295
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
287 296
          "Something is wrong with AbsMap");
288 297
  }
289 298

	
290 299
  // Logical maps:
291 300
  // - TrueMap, FalseMap
292 301
  // - AndMap, OrMap
293 302
  // - NotMap, NotWriteMap
294 303
  // - EqualMap, LessMap
295 304
  {
296 305
    checkConcept<BoolMap, TrueMap<A> >();
297 306
    checkConcept<BoolMap, FalseMap<A> >();
298 307
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
299 308
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
300 309
    checkConcept<BoolMap, NotMap<BoolMap> >();
301 310
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
302 311
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
303 312
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
304 313

	
305 314
    TrueMap<int> tm;
306 315
    FalseMap<int> fm;
307 316
    RangeMap<bool> rm(2);
308 317
    rm[0] = true; rm[1] = false;
309 318
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
310 319
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
311 320
          "Something is wrong with AndMap");
312 321
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
313 322
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
314 323
          "Something is wrong with OrMap");
315 324
    check(!notMap(rm)[0] && notMap(rm)[1],
316 325
          "Something is wrong with NotMap");
317 326
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
318 327
          "Something is wrong with NotWriteMap");
319 328

	
320 329
    ConstMap<int, double> cm(2.0);
321 330
    IdentityMap<int> im;
322 331
    ConvertMap<IdentityMap<int>, double> id(im);
323 332
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
324 333
          "Something is wrong with LessMap");
325 334
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
326 335
          "Something is wrong with EqualMap");
327 336
  }
328 337

	
329 338
  // LoggerBoolMap
330 339
  {
331 340
    typedef std::vector<int> vec;
341
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
342
    checkConcept<WriteMap<int, bool>,
343
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
344

	
332 345
    vec v1;
333 346
    vec v2(10);
334 347
    LoggerBoolMap<std::back_insert_iterator<vec> >
335 348
      map1(std::back_inserter(v1));
336 349
    LoggerBoolMap<vec::iterator> map2(v2.begin());
337 350
    map1.set(10, false);
338 351
    map1.set(20, true);   map2.set(20, true);
339 352
    map1.set(30, false);  map2.set(40, false);
340 353
    map1.set(50, true);   map2.set(50, true);
341 354
    map1.set(60, true);   map2.set(60, true);
342 355
    check(v1.size() == 3 && v2.size() == 10 &&
343 356
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
344 357
          v2[0]==20 && v2[1]==50 && v2[2]==60,
345 358
          "Something is wrong with LoggerBoolMap");
346 359

	
347 360
    int i = 0;
348 361
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
349 362
          it != map2.end(); ++it )
350 363
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
364
    
365
    typedef ListDigraph Graph;
366
    DIGRAPH_TYPEDEFS(Graph);
367
    Graph gr;
368

	
369
    Node n0 = gr.addNode();
370
    Node n1 = gr.addNode();
371
    Node n2 = gr.addNode();
372
    Node n3 = gr.addNode();
373
    
374
    gr.addArc(n3, n0);
375
    gr.addArc(n3, n2);
376
    gr.addArc(n0, n2);
377
    gr.addArc(n2, n1);
378
    gr.addArc(n0, n1);
379
    
380
    {
381
      std::vector<Node> v;
382
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
383

	
384
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
385
            "Something is wrong with LoggerBoolMap");
386
    }
387
    {
388
      std::vector<Node> v(countNodes(gr));
389
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
390
      
391
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
392
            "Something is wrong with LoggerBoolMap");
393
    }
394
  }
395
  
396
  // IdMap, RangeIdMap
397
  {
398
    typedef ListDigraph Graph;
399
    DIGRAPH_TYPEDEFS(Graph);
400

	
401
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
402
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
403
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
404
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
405
    
406
    Graph gr;
407
    IdMap<Graph, Node> nmap(gr);
408
    IdMap<Graph, Arc> amap(gr);
409
    RangeIdMap<Graph, Node> nrmap(gr);
410
    RangeIdMap<Graph, Arc> armap(gr);
411
    
412
    Node n0 = gr.addNode();
413
    Node n1 = gr.addNode();
414
    Node n2 = gr.addNode();
415
    
416
    Arc a0 = gr.addArc(n0, n1);
417
    Arc a1 = gr.addArc(n0, n2);
418
    Arc a2 = gr.addArc(n2, n1);
419
    Arc a3 = gr.addArc(n2, n0);
420
    
421
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
422
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
423
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
424

	
425
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
426
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
427
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
428
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
429

	
430
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
431
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
432
    
433
    check(nrmap.size() == 3 && armap.size() == 4,
434
          "Wrong RangeIdMap::size()");
435

	
436
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
437
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
438
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
439
    
440
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
441
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
442
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
443
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
444

	
445
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
446
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
447
    
448
    gr.erase(n1);
449
    
450
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
451
    nrmap.swap(n2, n0);
452
    if (armap[a1] == 1) armap.swap(a1, a3);
453
    armap.swap(a3, a1);
454
    
455
    check(nrmap.size() == 2 && armap.size() == 2,
456
          "Wrong RangeIdMap::size()");
457

	
458
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
459
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
460
    
461
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
462
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
463

	
464
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
465
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
466
  }
467
  
468
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
469
  {
470
    typedef ListGraph Graph;
471
    GRAPH_TYPEDEFS(Graph);
472
    
473
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
474
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
475
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
476
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
477
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
478
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
479

	
480
    Graph gr;
481
    Node n0 = gr.addNode();
482
    Node n1 = gr.addNode();
483
    Node n2 = gr.addNode();
484
    
485
    gr.addEdge(n0,n1);
486
    gr.addEdge(n1,n2);
487
    gr.addEdge(n0,n2);
488
    gr.addEdge(n2,n1);
489
    gr.addEdge(n1,n2);
490
    gr.addEdge(n0,n1);
491
    
492
    for (EdgeIt e(gr); e != INVALID; ++e) {
493
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
494
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
495
    }
496
    
497
    compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
498
               targetMap(orienter(gr, constMap<Edge, bool>(false))),
499
               EdgeIt(gr));
500

	
501
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
502
    Digraph dgr(gr, constMap<Edge, bool>(true));
503
    OutDegMap<Digraph> odm(dgr);
504
    InDegMap<Digraph> idm(dgr);
505
    
506
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
507
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
508
   
509
    gr.addEdge(n2, n0);
510

	
511
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
512
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
513
  }
514
  
515
  // CrossRefMap
516
  {
517
    typedef ListDigraph Graph;
518
    DIGRAPH_TYPEDEFS(Graph);
519

	
520
    checkConcept<ReadWriteMap<Node, int>,
521
                 CrossRefMap<Graph, Node, int> >();
522
    checkConcept<ReadWriteMap<Node, bool>,
523
                 CrossRefMap<Graph, Node, bool> >();
524
    checkConcept<ReadWriteMap<Node, double>,
525
                 CrossRefMap<Graph, Node, double> >();
526
    
527
    Graph gr;
528
    typedef CrossRefMap<Graph, Node, char> CRMap;
529
    CRMap map(gr);
530
    
531
    Node n0 = gr.addNode();
532
    Node n1 = gr.addNode();
533
    Node n2 = gr.addNode();
534
    
535
    map.set(n0, 'A');
536
    map.set(n1, 'B');
537
    map.set(n2, 'C');
538
    
539
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
540
          "Wrong CrossRefMap");
541
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
542
          "Wrong CrossRefMap");
543
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
544
          "Wrong CrossRefMap");
545
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
546
          "Wrong CrossRefMap::count()");
547
    
548
    CRMap::ValueIt it = map.beginValue();
549
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
550
          it == map.endValue(), "Wrong value iterator");
551
    
552
    map.set(n2, 'A');
553

	
554
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
555
          "Wrong CrossRefMap");
556
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
557
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
558
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
559
          "Wrong CrossRefMap");
560
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
561
          "Wrong CrossRefMap::count()");
562

	
563
    it = map.beginValue();
564
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
565
          it == map.endValue(), "Wrong value iterator");
566

	
567
    map.set(n0, 'C');
568

	
569
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
570
          "Wrong CrossRefMap");
571
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
572
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
573
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
574
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
575
          "Wrong CrossRefMap::count()");
576

	
577
    it = map.beginValue();
578
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
579
          it == map.endValue(), "Wrong value iterator");
351 580
  }
352 581

	
353 582
  // CrossRefMap
354 583
  {
355 584
    typedef SmartDigraph Graph;
356 585
    DIGRAPH_TYPEDEFS(Graph);
357 586

	
358 587
    checkConcept<ReadWriteMap<Node, int>,
359 588
                 CrossRefMap<Graph, Node, int> >();
360 589
    
361 590
    Graph gr;
362 591
    typedef CrossRefMap<Graph, Node, char> CRMap;
363 592
    typedef CRMap::ValueIterator ValueIt;
364 593
    CRMap map(gr);
365 594
    
366 595
    Node n0 = gr.addNode();
367 596
    Node n1 = gr.addNode();
368 597
    Node n2 = gr.addNode();
369 598
    
370 599
    map.set(n0, 'A');
371 600
    map.set(n1, 'B');
372 601
    map.set(n2, 'C');
373 602
    map.set(n2, 'A');
374 603
    map.set(n0, 'C');
375 604

	
376 605
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
377 606
          "Wrong CrossRefMap");
378 607
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
379 608
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
380 609
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
381 610

	
382 611
    ValueIt it = map.beginValue();
383 612
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 613
          it == map.endValue(), "Wrong value iterator");
385 614
  }
386 615
  
387 616
  // Iterable bool map
388 617
  {
389 618
    typedef SmartGraph Graph;
390 619
    typedef SmartGraph::Node Item;
391 620

	
392 621
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
393 622
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
394 623

	
395 624
    const int num = 10;
396 625
    Graph g;
397 626
    std::vector<Item> items;
398 627
    for (int i = 0; i < num; ++i) {
... ...
@@ -501,75 +730,75 @@
501 730
    check(map1.size() == 2, "Wrong size");
502 731

	
503 732
    int n = 0;
504 733
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
505 734
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
506 735
      ++n;
507 736
    }
508 737
    check(n == (num + 1) / 2, "Wrong number");
509 738

	
510 739
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
511 740
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
512 741
      ++n;
513 742
    }
514 743
    check(n == num, "Wrong number");
515 744

	
516 745
  }
517 746

	
518 747
  // Iterable value map
519 748
  {
520 749
    typedef SmartGraph Graph;
521 750
    typedef SmartGraph::Node Item;
522 751
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
523 752

	
524 753
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
525 754

	
526 755
    const int num = 10;
527 756
    Graph g;
528 757
    std::vector<Item> items;
529 758
    for (int i = 0; i < num; ++i) {
530 759
      items.push_back(g.addNode());
531 760
    }
532 761

	
533 762
    Ivm map1(g, 0.0);
534 763
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
535 764
    check(*map1.beginValue() == 0.0, "Wrong value");
536 765

	
537 766
    for (int i = 0; i < num; ++i) {
538 767
      map1.set(items[i], static_cast<double>(i));
539 768
    }
540 769
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
541 770

	
542 771
    for (int i = 0; i < num; ++i) {
543 772
      Ivm::ItemIt it(map1, static_cast<double>(i));
544 773
      check(static_cast<Item>(it) == items[i], "Wrong value");
545 774
      ++it;
546 775
      check(static_cast<Item>(it) == INVALID, "Wrong value");
547 776
    }
548 777

	
549
    for (Ivm::ValueIterator vit = map1.beginValue();
778
    for (Ivm::ValueIt vit = map1.beginValue();
550 779
         vit != map1.endValue(); ++vit) {
551 780
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
552
            "Wrong ValueIterator");
781
            "Wrong ValueIt");
553 782
    }
554 783

	
555 784
    for (int i = 0; i < num; ++i) {
556 785
      map1.set(items[i], static_cast<double>(i % 2));
557 786
    }
558 787
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
559 788

	
560 789
    int n = 0;
561 790
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
562 791
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
563 792
      ++n;
564 793
    }
565 794
    check(n == (num + 1) / 2, "Wrong number");
566 795

	
567 796
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
568 797
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
569 798
      ++n;
570 799
    }
571 800
    check(n == num, "Wrong number");
572 801

	
573 802
  }
574 803
  return 0;
575 804
}
0 comments (0 inline)