↑ Collapse diff ↑
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
///\ingroup demos
20 20
///\file
21 21
///\brief Argument parser demo
... ...
@@ -56,33 +56,33 @@
56 56
  // Bundle -gr* options into a group
57 57
  ap.optionGroup("gr", "gra")
58 58
    .optionGroup("gr", "grb")
59 59
    .optionGroup("gr", "grc");
60 60
  // Set the group mandatory
61 61
  ap.mandatoryGroup("gr");
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

	
68 68
  // Throw an exception when problems occurs. The default behavior is to
69 69
  // exit(1) on these cases, but this makes Valgrind falsely warn
70 70
  // about memory leaks.
71 71
  ap.throwOnProblems();
72
  
72

	
73 73
  // Perform the parsing process
74 74
  // (in case of any error it terminates the program)
75 75
  // The try {} construct is necessary only if the ap.trowOnProblems()
76 76
  // setting is in use.
77 77
  try {
78 78
    ap.parse();
79 79
  } catch (ArgParserException &) { return 1; }
80 80

	
81 81
  // Check each option if it has been given and print its value
82 82
  std::cout << "Parameters of '" << ap.commandName() << "':\n";
83 83

	
84 84
  std::cout << "  Value of -n: " << i << std::endl;
85 85
  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
86 86
  if(ap.given("val2")) {
87 87
    d = ap["val2"];
88 88
    std::cout << "  Value of -val2: " << d << std::endl;
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
namespace lemon {
20 20

	
21 21
/**
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
/**
20 20
\mainpage LEMON Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24 24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25 25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26 26
It is a C++ template library providing efficient implementations of common
27 27
data structures and algorithms with focus on combinatorial optimization
28
tasks connected mainly with graphs and networks. 
28
tasks connected mainly with graphs and networks.
29 29

	
30 30
<b>
31 31
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
32 32
project.
33 33
You are free to use it in your commercial or
34 34
non-commercial applications under very permissive
35 35
\ref license "license terms".
36 36
</b>
37 37

	
38
The project is maintained by the 
38
The project is maintained by the
39 39
<a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
40 40
Combinatorial Optimization</a> \ref egres
41 41
at the Operations Research Department of the
42 42
<a href="http://www.elte.hu/en/">E&ouml;tv&ouml;s Lor&aacute;nd University</a>,
43 43
Budapest, Hungary.
44 44
LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
45 45
initiative \ref coinor.
46 46

	
47 47
\section howtoread How to Read the Documentation
48 48

	
49 49
If you would like to get to know the library, see
50 50
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
51 51

	
52 52
If you are interested in starting to use the library, see the <a class="el"
53 53
href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation
54 54
Guide</a>.
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
namespace lemon {
20 20

	
21 21
/**
... ...
@@ -68,33 +68,33 @@
68 68
\section mcf_dual Dual Solution
69 69

	
70 70
The dual solution of the minimum cost flow problem is represented by
71 71
node potentials \f$\pi: V\rightarrow\mathbf{R}\f$.
72 72
An \f$f: A\rightarrow\mathbf{R}\f$ primal feasible solution is optimal
73 73
if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials
74 74
the following \e complementary \e slackness optimality conditions hold.
75 75

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81 81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84
 
84

	
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

	
89 89
All algorithms provide dual solution (node potentials), as well,
90 90
if an optimal flow is found.
91 91

	
92 92

	
93 93
\section mcf_eq Equality Form
94 94

	
95 95
The above \ref mcf_def "definition" is actually more general than the
96 96
usual formulation of the minimum cost flow problem, in which strict
97 97
equalities are required in the supply/demand contraints.
98 98

	
99 99
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
100 100
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) =
... ...
@@ -106,33 +106,33 @@
106 106
The \ref min_cost_flow_algs "algorithms" in LEMON support the general
107 107
form, so if you need the equality form, you have to ensure this additional
108 108
contraint manually.
109 109

	
110 110

	
111 111
\section mcf_leq Opposite Inequalites (LEQ Form)
112 112

	
113 113
Another possible definition of the minimum cost flow problem is
114 114
when there are <em>"less or equal"</em> (LEQ) supply/demand constraints,
115 115
instead of the <em>"greater or equal"</em> (GEQ) constraints.
116 116

	
117 117
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
118 118
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
119 119
    sup(u) \quad \forall u\in V \f]
120 120
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
121 121

	
122
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

	
129 129
You could easily transform this case to the \ref mcf_def "GEQ form"
130 130
of the problem by reversing the direction of the arcs and taking the
131 131
negative of the supply values (e.g. using \ref ReverseDigraph and
132 132
\ref NegMap adaptors).
133 133
However \ref NetworkSimplex algorithm also supports this form directly
134 134
for the sake of convenience.
135 135

	
136 136
Note that the optimality conditions for this supply constraint type are
137 137
slightly differ from the conditions that are discussed for the GEQ form,
138 138
namely the potentials have to be non-negative instead of non-positive.
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_ADAPTORS_H
20 20
#define LEMON_ADAPTORS_H
21 21

	
... ...
@@ -408,33 +408,33 @@
408 408
    typedef DigraphAdaptorBase<DGR> Parent;
409 409
  public:
410 410
    typedef DGR Digraph;
411 411
    typedef NF NodeFilterMap;
412 412
    typedef AF ArcFilterMap;
413 413

	
414 414
    typedef SubDigraphBase Adaptor;
415 415
  protected:
416 416
    NF* _node_filter;
417 417
    AF* _arc_filter;
418 418
    SubDigraphBase()
419 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
420 420

	
421 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
422 422
      Parent::initialize(digraph);
423 423
      _node_filter = &node_filter;
424
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
425 425
    }
426 426

	
427 427
  public:
428 428

	
429 429
    typedef typename Parent::Node Node;
430 430
    typedef typename Parent::Arc Arc;
431 431

	
432 432
    void first(Node& i) const {
433 433
      Parent::first(i);
434 434
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
435 435
    }
436 436

	
437 437
    void first(Arc& i) const {
438 438
      Parent::first(i);
439 439
      while (i != INVALID && (!(*_arc_filter)[i]
440 440
                              || !(*_node_filter)[Parent::source(i)]
... ...
@@ -495,62 +495,62 @@
495 495
    typedef FindArcTagIndicator<DGR> FindArcTag;
496 496
    Arc findArc(const Node& source, const Node& target,
497 497
                const Arc& prev = INVALID) const {
498 498
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
499 499
        return INVALID;
500 500
      }
501 501
      Arc arc = Parent::findArc(source, target, prev);
502 502
      while (arc != INVALID && !(*_arc_filter)[arc]) {
503 503
        arc = Parent::findArc(source, target, arc);
504 504
      }
505 505
      return arc;
506 506
    }
507 507

	
508 508
  public:
509 509

	
510 510
    template <typename V>
511
    class NodeMap 
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
513
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511
    class NodeMap
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
514 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
515
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
515
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
516 516

	
517 517
    public:
518 518
      typedef V Value;
519 519

	
520 520
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
521 521
        : Parent(adaptor) {}
522 522
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
523 523
        : Parent(adaptor, value) {}
524 524

	
525 525
    private:
526 526
      NodeMap& operator=(const NodeMap& cmap) {
527 527
        return operator=<NodeMap>(cmap);
528 528
      }
529 529

	
530 530
      template <typename CMap>
531 531
      NodeMap& operator=(const CMap& cmap) {
532 532
        Parent::operator=(cmap);
533 533
        return *this;
534 534
      }
535 535
    };
536 536

	
537 537
    template <typename V>
538
    class ArcMap 
538
    class ArcMap
539 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
540
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
540
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
541 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
542 542
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
543 543

	
544 544
    public:
545 545
      typedef V Value;
546 546

	
547 547
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
548 548
        : Parent(adaptor) {}
549 549
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
550 550
        : Parent(adaptor, value) {}
551 551

	
552 552
    private:
553 553
      ArcMap& operator=(const ArcMap& cmap) {
554 554
        return operator=<ArcMap>(cmap);
555 555
      }
556 556

	
... ...
@@ -569,33 +569,33 @@
569 569
    typedef DigraphAdaptorBase<DGR> Parent;
570 570
  public:
571 571
    typedef DGR Digraph;
572 572
    typedef NF NodeFilterMap;
573 573
    typedef AF ArcFilterMap;
574 574

	
575 575
    typedef SubDigraphBase Adaptor;
576 576
  protected:
577 577
    NF* _node_filter;
578 578
    AF* _arc_filter;
579 579
    SubDigraphBase()
580 580
      : Parent(), _node_filter(0), _arc_filter(0) { }
581 581

	
582 582
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
583 583
      Parent::initialize(digraph);
584 584
      _node_filter = &node_filter;
585
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
586 586
    }
587 587

	
588 588
  public:
589 589

	
590 590
    typedef typename Parent::Node Node;
591 591
    typedef typename Parent::Arc Arc;
592 592

	
593 593
    void first(Node& i) const {
594 594
      Parent::first(i);
595 595
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
596 596
    }
597 597

	
598 598
    void first(Arc& i) const {
599 599
      Parent::first(i);
600 600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
601 601
    }
... ...
@@ -638,60 +638,60 @@
638 638
    typedef False ArcNumTag;
639 639

	
640 640
    typedef FindArcTagIndicator<DGR> FindArcTag;
641 641
    Arc findArc(const Node& source, const Node& target,
642 642
                const Arc& prev = INVALID) const {
643 643
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
644 644
        return INVALID;
645 645
      }
646 646
      Arc arc = Parent::findArc(source, target, prev);
647 647
      while (arc != INVALID && !(*_arc_filter)[arc]) {
648 648
        arc = Parent::findArc(source, target, arc);
649 649
      }
650 650
      return arc;
651 651
    }
652 652

	
653 653
    template <typename V>
654
    class NodeMap 
654
    class NodeMap
655 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
656 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
658 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
659 659

	
660 660
    public:
661 661
      typedef V Value;
662 662

	
663 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
664 664
        : Parent(adaptor) {}
665 665
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
666 666
        : Parent(adaptor, value) {}
667 667

	
668 668
    private:
669 669
      NodeMap& operator=(const NodeMap& cmap) {
670 670
        return operator=<NodeMap>(cmap);
671 671
      }
672 672

	
673 673
      template <typename CMap>
674 674
      NodeMap& operator=(const CMap& cmap) {
675 675
        Parent::operator=(cmap);
676 676
        return *this;
677 677
      }
678 678
    };
679 679

	
680 680
    template <typename V>
681
    class ArcMap 
681
    class ArcMap
682 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
683 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
684 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
685 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
686 686

	
687 687
    public:
688 688
      typedef V Value;
689 689

	
690 690
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
691 691
        : Parent(adaptor) {}
692 692
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
693 693
        : Parent(adaptor, value) {}
694 694

	
695 695
    private:
696 696
      ArcMap& operator=(const ArcMap& cmap) {
697 697
        return operator=<ArcMap>(cmap);
... ...
@@ -1008,90 +1008,90 @@
1008 1008
    }
1009 1009

	
1010 1010
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1011 1011
    Edge findEdge(const Node& u, const Node& v,
1012 1012
                  const Edge& prev = INVALID) const {
1013 1013
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1014 1014
        return INVALID;
1015 1015
      }
1016 1016
      Edge edge = Parent::findEdge(u, v, prev);
1017 1017
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1018 1018
        edge = Parent::findEdge(u, v, edge);
1019 1019
      }
1020 1020
      return edge;
1021 1021
    }
1022 1022

	
1023 1023
    template <typename V>
1024
    class NodeMap 
1024
    class NodeMap
1025 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1026 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1028 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1029 1029

	
1030 1030
    public:
1031 1031
      typedef V Value;
1032 1032

	
1033 1033
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1034 1034
        : Parent(adaptor) {}
1035 1035
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1036 1036
        : Parent(adaptor, value) {}
1037 1037

	
1038 1038
    private:
1039 1039
      NodeMap& operator=(const NodeMap& cmap) {
1040 1040
        return operator=<NodeMap>(cmap);
1041 1041
      }
1042 1042

	
1043 1043
      template <typename CMap>
1044 1044
      NodeMap& operator=(const CMap& cmap) {
1045 1045
        Parent::operator=(cmap);
1046 1046
        return *this;
1047 1047
      }
1048 1048
    };
1049 1049

	
1050 1050
    template <typename V>
1051
    class ArcMap 
1051
    class ArcMap
1052 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1053 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1055 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1056 1056

	
1057 1057
    public:
1058 1058
      typedef V Value;
1059 1059

	
1060 1060
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1061 1061
        : Parent(adaptor) {}
1062 1062
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1063 1063
        : Parent(adaptor, value) {}
1064 1064

	
1065 1065
    private:
1066 1066
      ArcMap& operator=(const ArcMap& cmap) {
1067 1067
        return operator=<ArcMap>(cmap);
1068 1068
      }
1069 1069

	
1070 1070
      template <typename CMap>
1071 1071
      ArcMap& operator=(const CMap& cmap) {
1072 1072
        Parent::operator=(cmap);
1073 1073
        return *this;
1074 1074
      }
1075 1075
    };
1076 1076

	
1077 1077
    template <typename V>
1078
    class EdgeMap 
1078
    class EdgeMap
1079 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1080 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1082 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1083 1083

	
1084 1084
    public:
1085 1085
      typedef V Value;
1086 1086

	
1087 1087
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1088 1088
        : Parent(adaptor) {}
1089 1089

	
1090 1090
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1091 1091
        : Parent(adaptor, value) {}
1092 1092

	
1093 1093
    private:
1094 1094
      EdgeMap& operator=(const EdgeMap& cmap) {
1095 1095
        return operator=<EdgeMap>(cmap);
1096 1096
      }
1097 1097

	
... ...
@@ -1104,34 +1104,34 @@
1104 1104

	
1105 1105
  };
1106 1106

	
1107 1107
  template <typename GR, typename NF, typename EF>
1108 1108
  class SubGraphBase<GR, NF, EF, false>
1109 1109
    : public GraphAdaptorBase<GR> {
1110 1110
    typedef GraphAdaptorBase<GR> Parent;
1111 1111
  public:
1112 1112
    typedef GR Graph;
1113 1113
    typedef NF NodeFilterMap;
1114 1114
    typedef EF EdgeFilterMap;
1115 1115

	
1116 1116
    typedef SubGraphBase Adaptor;
1117 1117
  protected:
1118 1118
    NF* _node_filter;
1119 1119
    EF* _edge_filter;
1120
    SubGraphBase() 
1121
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1120
    SubGraphBase()
1121
          : Parent(), _node_filter(0), _edge_filter(0) { }
1122 1122

	
1123 1123
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1124 1124
      Parent::initialize(graph);
1125 1125
      _node_filter = &node_filter;
1126 1126
      _edge_filter = &edge_filter;
1127 1127
    }
1128 1128

	
1129 1129
  public:
1130 1130

	
1131 1131
    typedef typename Parent::Node Node;
1132 1132
    typedef typename Parent::Arc Arc;
1133 1133
    typedef typename Parent::Edge Edge;
1134 1134

	
1135 1135
    void first(Node& i) const {
1136 1136
      Parent::first(i);
1137 1137
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
... ...
@@ -1206,91 +1206,91 @@
1206 1206
        arc = Parent::findArc(u, v, arc);
1207 1207
      }
1208 1208
      return arc;
1209 1209
    }
1210 1210

	
1211 1211
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1212 1212
    Edge findEdge(const Node& u, const Node& v,
1213 1213
                  const Edge& prev = INVALID) const {
1214 1214
      Edge edge = Parent::findEdge(u, v, prev);
1215 1215
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1216 1216
        edge = Parent::findEdge(u, v, edge);
1217 1217
      }
1218 1218
      return edge;
1219 1219
    }
1220 1220

	
1221 1221
    template <typename V>
1222
    class NodeMap 
1222
    class NodeMap
1223 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1224 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1226 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1227 1227

	
1228 1228
    public:
1229 1229
      typedef V Value;
1230 1230

	
1231 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1232 1232
        : Parent(adaptor) {}
1233 1233
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1234 1234
        : Parent(adaptor, value) {}
1235 1235

	
1236 1236
    private:
1237 1237
      NodeMap& operator=(const NodeMap& cmap) {
1238 1238
        return operator=<NodeMap>(cmap);
1239 1239
      }
1240 1240

	
1241 1241
      template <typename CMap>
1242 1242
      NodeMap& operator=(const CMap& cmap) {
1243 1243
        Parent::operator=(cmap);
1244 1244
        return *this;
1245 1245
      }
1246 1246
    };
1247 1247

	
1248 1248
    template <typename V>
1249
    class ArcMap 
1249
    class ArcMap
1250 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1251 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1253 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1254 1254

	
1255 1255
    public:
1256 1256
      typedef V Value;
1257 1257

	
1258 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1259 1259
        : Parent(adaptor) {}
1260 1260
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1261 1261
        : Parent(adaptor, value) {}
1262 1262

	
1263 1263
    private:
1264 1264
      ArcMap& operator=(const ArcMap& cmap) {
1265 1265
        return operator=<ArcMap>(cmap);
1266 1266
      }
1267 1267

	
1268 1268
      template <typename CMap>
1269 1269
      ArcMap& operator=(const CMap& cmap) {
1270 1270
        Parent::operator=(cmap);
1271 1271
        return *this;
1272 1272
      }
1273 1273
    };
1274 1274

	
1275 1275
    template <typename V>
1276
    class EdgeMap 
1276
    class EdgeMap
1277 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1278 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1280
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1281 1281

	
1282 1282
    public:
1283 1283
      typedef V Value;
1284 1284

	
1285 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1286 1286
        : Parent(adaptor) {}
1287 1287

	
1288 1288
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1289 1289
        : Parent(adaptor, value) {}
1290 1290

	
1291 1291
    private:
1292 1292
      EdgeMap& operator=(const EdgeMap& cmap) {
1293 1293
        return operator=<EdgeMap>(cmap);
1294 1294
      }
1295 1295

	
1296 1296
      template <typename CMap>
... ...
@@ -1491,54 +1491,54 @@
1491 1491
  ///
1492 1492
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1493 1493
  /// adapted (di)graph are convertible to each other.
1494 1494
#ifdef DOXYGEN
1495 1495
  template<typename GR, typename NF>
1496 1496
  class FilterNodes {
1497 1497
#else
1498 1498
  template<typename GR,
1499 1499
           typename NF = typename GR::template NodeMap<bool>,
1500 1500
           typename Enable = void>
1501 1501
  class FilterNodes :
1502 1502
    public DigraphAdaptorExtender<
1503 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1504 1504
                     true> > {
1505 1505
#endif
1506 1506
    typedef DigraphAdaptorExtender<
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1508 1508
                     true> > Parent;
1509 1509

	
1510 1510
  public:
1511 1511

	
1512 1512
    typedef GR Digraph;
1513 1513
    typedef NF NodeFilterMap;
1514 1514

	
1515 1515
    typedef typename Parent::Node Node;
1516 1516

	
1517 1517
  protected:
1518 1518
    ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1519 1519

	
1520 1520
    FilterNodes() : const_true_map() {}
1521 1521

	
1522 1522
  public:
1523 1523

	
1524 1524
    /// \brief Constructor
1525 1525
    ///
1526 1526
    /// Creates a subgraph for the given digraph or graph with the
1527 1527
    /// given node filter map.
1528
    FilterNodes(GR& graph, NF& node_filter) 
1528
    FilterNodes(GR& graph, NF& node_filter)
1529 1529
      : Parent(), const_true_map()
1530 1530
    {
1531 1531
      Parent::initialize(graph, node_filter, const_true_map);
1532 1532
    }
1533 1533

	
1534 1534
    /// \brief Sets the status of the given node
1535 1535
    ///
1536 1536
    /// This function sets the status of the given node.
1537 1537
    /// It is done by simply setting the assigned value of \c n
1538 1538
    /// to \c v in the node filter map.
1539 1539
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1540 1540

	
1541 1541
    /// \brief Returns the status of the given node
1542 1542
    ///
1543 1543
    /// This function returns the status of the given node.
1544 1544
    /// It is \c true if the given node is enabled (i.e. not hidden).
... ...
@@ -1550,37 +1550,37 @@
1550 1550
    /// jumps over it.
1551 1551
    /// It is the same as \ref status() "status(n, false)".
1552 1552
    void disable(const Node& n) const { Parent::status(n, false); }
1553 1553

	
1554 1554
    /// \brief Enables the given node
1555 1555
    ///
1556 1556
    /// This function enables the given node.
1557 1557
    /// It is the same as \ref status() "status(n, true)".
1558 1558
    void enable(const Node& n) const { Parent::status(n, true); }
1559 1559

	
1560 1560
  };
1561 1561

	
1562 1562
  template<typename GR, typename NF>
1563 1563
  class FilterNodes<GR, NF,
1564 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1565 1565
    public GraphAdaptorExtender<
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1567 1567
                   true> > {
1568 1568

	
1569 1569
    typedef GraphAdaptorExtender<
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1571 1571
                   true> > Parent;
1572 1572

	
1573 1573
  public:
1574 1574

	
1575 1575
    typedef GR Graph;
1576 1576
    typedef NF NodeFilterMap;
1577 1577

	
1578 1578
    typedef typename Parent::Node Node;
1579 1579

	
1580 1580
  protected:
1581 1581
    ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1582 1582

	
1583 1583
    FilterNodes() : const_true_map() {}
1584 1584

	
1585 1585
  public:
1586 1586

	
... ...
@@ -1640,33 +1640,33 @@
1640 1640
  ///
1641 1641
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1642 1642
  /// digraph are convertible to each other.
1643 1643
#ifdef DOXYGEN
1644 1644
  template<typename DGR,
1645 1645
           typename AF>
1646 1646
  class FilterArcs {
1647 1647
#else
1648 1648
  template<typename DGR,
1649 1649
           typename AF = typename DGR::template ArcMap<bool> >
1650 1650
  class FilterArcs :
1651 1651
    public DigraphAdaptorExtender<
1652 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1653 1653
                     AF, false> > {
1654 1654
#endif
1655 1655
    typedef DigraphAdaptorExtender<
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1657 1657
                     AF, false> > Parent;
1658 1658

	
1659 1659
  public:
1660 1660

	
1661 1661
    /// The type of the adapted digraph.
1662 1662
    typedef DGR Digraph;
1663 1663
    /// The type of the arc filter map.
1664 1664
    typedef AF ArcFilterMap;
1665 1665

	
1666 1666
    typedef typename Parent::Arc Arc;
1667 1667

	
1668 1668
  protected:
1669 1669
    ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1670 1670

	
1671 1671
    FilterArcs() : const_true_map() {}
1672 1672

	
... ...
@@ -1748,62 +1748,62 @@
1748 1748
  /// \tparam EF The type of the edge filter map.
1749 1749
  /// It must be a \c bool (or convertible) edge map of the
1750 1750
  /// adapted graph. The default type is
1751 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1752 1752
  ///
1753 1753
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1754 1754
  /// adapted graph are convertible to each other.
1755 1755
#ifdef DOXYGEN
1756 1756
  template<typename GR,
1757 1757
           typename EF>
1758 1758
  class FilterEdges {
1759 1759
#else
1760 1760
  template<typename GR,
1761 1761
           typename EF = typename GR::template EdgeMap<bool> >
1762 1762
  class FilterEdges :
1763 1763
    public GraphAdaptorExtender<
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1765 1765
                   EF, false> > {
1766 1766
#endif
1767 1767
    typedef GraphAdaptorExtender<
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1769 1769
                   EF, false> > Parent;
1770 1770

	
1771 1771
  public:
1772 1772

	
1773 1773
    /// The type of the adapted graph.
1774 1774
    typedef GR Graph;
1775 1775
    /// The type of the edge filter map.
1776 1776
    typedef EF EdgeFilterMap;
1777 1777

	
1778 1778
    typedef typename Parent::Edge Edge;
1779 1779

	
1780 1780
  protected:
1781 1781
    ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1782 1782

	
1783 1783
    FilterEdges() : const_true_map(true) {
1784 1784
      Parent::setNodeFilterMap(const_true_map);
1785 1785
    }
1786 1786

	
1787 1787
  public:
1788 1788

	
1789 1789
    /// \brief Constructor
1790 1790
    ///
1791 1791
    /// Creates a subgraph for the given graph with the given edge
1792 1792
    /// filter map.
1793
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1794 1794
      : Parent(), const_true_map() {
1795 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1796 1796
    }
1797 1797

	
1798 1798
    /// \brief Sets the status of the given edge
1799 1799
    ///
1800 1800
    /// This function sets the status of the given edge.
1801 1801
    /// It is done by simply setting the assigned value of \c e
1802 1802
    /// to \c v in the edge filter map.
1803 1803
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1804 1804

	
1805 1805
    /// \brief Returns the status of the given edge
1806 1806
    ///
1807 1807
    /// This function returns the status of the given edge.
1808 1808
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1809 1809
    bool status(const Edge& e) const { return Parent::status(e); }
... ...
@@ -1845,33 +1845,33 @@
1845 1845
  class UndirectorBase {
1846 1846
  public:
1847 1847
    typedef DGR Digraph;
1848 1848
    typedef UndirectorBase Adaptor;
1849 1849

	
1850 1850
    typedef True UndirectedTag;
1851 1851

	
1852 1852
    typedef typename Digraph::Arc Edge;
1853 1853
    typedef typename Digraph::Node Node;
1854 1854

	
1855 1855
    class Arc {
1856 1856
      friend class UndirectorBase;
1857 1857
    protected:
1858 1858
      Edge _edge;
1859 1859
      bool _forward;
1860 1860

	
1861
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1862 1862
        : _edge(edge), _forward(forward) {}
1863 1863

	
1864 1864
    public:
1865 1865
      Arc() {}
1866 1866

	
1867 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
1868 1868

	
1869 1869
      operator const Edge&() const { return _edge; }
1870 1870

	
1871 1871
      bool operator==(const Arc &other) const {
1872 1872
        return _forward == other._forward && _edge == other._edge;
1873 1873
      }
1874 1874
      bool operator!=(const Arc &other) const {
1875 1875
        return _forward != other._forward || _edge != other._edge;
1876 1876
      }
1877 1877
      bool operator<(const Arc &other) const {
... ...
@@ -2085,33 +2085,33 @@
2085 2085

	
2086 2086
    public:
2087 2087

	
2088 2088
      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
2089 2089

	
2090 2090
      typedef V Value;
2091 2091
      typedef Arc Key;
2092 2092
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
2093 2093
      typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
2094 2094
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
2095 2095
      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2096 2096

	
2097 2097
      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2098 2098
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2099 2099

	
2100 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2101
        : _forward(*adaptor._digraph, value), 
2101
        : _forward(*adaptor._digraph, value),
2102 2102
          _backward(*adaptor._digraph, value) {}
2103 2103

	
2104 2104
      void set(const Arc& a, const V& value) {
2105 2105
        if (direction(a)) {
2106 2106
          _forward.set(a, value);
2107 2107
        } else {
2108 2108
          _backward.set(a, value);
2109 2109
        }
2110 2110
      }
2111 2111

	
2112 2112
      ConstReturnValue operator[](const Arc& a) const {
2113 2113
        if (direction(a)) {
2114 2114
          return _forward[a];
2115 2115
        } else {
2116 2116
          return _backward[a];
2117 2117
        }
... ...
@@ -2203,33 +2203,33 @@
2203 2203
        return operator=<EdgeMap>(cmap);
2204 2204
      }
2205 2205

	
2206 2206
      template <typename CMap>
2207 2207
      EdgeMap& operator=(const CMap& cmap) {
2208 2208
        Parent::operator=(cmap);
2209 2209
        return *this;
2210 2210
      }
2211 2211

	
2212 2212
    };
2213 2213

	
2214 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2215 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2216 2216

	
2217 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2218 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2219
    
2219

	
2220 2220
    typedef EdgeNotifier ArcNotifier;
2221 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2222 2222

	
2223 2223
  protected:
2224 2224

	
2225 2225
    UndirectorBase() : _digraph(0) {}
2226 2226

	
2227 2227
    DGR* _digraph;
2228 2228

	
2229 2229
    void initialize(DGR& digraph) {
2230 2230
      _digraph = &digraph;
2231 2231
    }
2232 2232

	
2233 2233
  };
2234 2234

	
2235 2235
  /// \ingroup graph_adaptors
... ...
@@ -2715,33 +2715,33 @@
2715 2715
  /// capacity map.
2716 2716
  ///
2717 2717
  /// \note This adaptor is implemented using Undirector and FilterArcs
2718 2718
  /// adaptors.
2719 2719
  ///
2720 2720
  /// \note The \c Node type of this adaptor and the adapted digraph are
2721 2721
  /// convertible to each other, moreover the \c Arc type of the adaptor
2722 2722
  /// is convertible to the \c Arc type of the adapted digraph.
2723 2723
#ifdef DOXYGEN
2724 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2725 2725
  class ResidualDigraph
2726 2726
#else
2727 2727
  template<typename DGR,
2728 2728
           typename CM = typename DGR::template ArcMap<int>,
2729 2729
           typename FM = CM,
2730 2730
           typename TL = Tolerance<typename CM::Value> >
2731
  class ResidualDigraph 
2731
  class ResidualDigraph
2732 2732
    : public SubDigraph<
2733 2733
        Undirector<const DGR>,
2734 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2735 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2736 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2737 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2738 2738
#endif
2739 2739
  {
2740 2740
  public:
2741 2741

	
2742 2742
    /// The type of the underlying digraph.
2743 2743
    typedef DGR Digraph;
2744 2744
    /// The type of the capacity map.
2745 2745
    typedef CM CapacityMap;
2746 2746
    /// The type of the flow map.
2747 2747
    typedef FM FlowMap;
... ...
@@ -2772,33 +2772,33 @@
2772 2772
    FlowMap* _flow;
2773 2773

	
2774 2774
    Undirected _graph;
2775 2775
    NodeFilter _node_filter;
2776 2776
    ForwardFilter _forward_filter;
2777 2777
    BackwardFilter _backward_filter;
2778 2778
    ArcFilter _arc_filter;
2779 2779

	
2780 2780
  public:
2781 2781

	
2782 2782
    /// \brief Constructor
2783 2783
    ///
2784 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2785 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2786 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2787 2787
                    FM& flow, const TL& tolerance = Tolerance())
2788
      : Parent(), _capacity(&capacity), _flow(&flow), 
2788
      : Parent(), _capacity(&capacity), _flow(&flow),
2789 2789
        _graph(digraph), _node_filter(),
2790 2790
        _forward_filter(capacity, flow, tolerance),
2791 2791
        _backward_filter(capacity, flow, tolerance),
2792 2792
        _arc_filter(_forward_filter, _backward_filter)
2793 2793
    {
2794 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
2795 2795
    }
2796 2796

	
2797 2797
    typedef typename Parent::Arc Arc;
2798 2798

	
2799 2799
    /// \brief Returns the residual capacity of the given arc.
2800 2800
    ///
2801 2801
    /// Returns the residual capacity of the given arc.
2802 2802
    Value residualCapacity(const Arc& a) const {
2803 2803
      if (Undirected::direction(a)) {
2804 2804
        return (*_capacity)[a] - (*_flow)[a];
... ...
@@ -2854,33 +2854,33 @@
2854 2854

	
2855 2855
    /// \brief Residual capacity map.
2856 2856
    ///
2857 2857
    /// This map adaptor class can be used for obtaining the residual
2858 2858
    /// capacities as an arc map of the residual digraph.
2859 2859
    /// Its value type is inherited from the capacity map.
2860 2860
    class ResidualCapacity {
2861 2861
    protected:
2862 2862
      const Adaptor* _adaptor;
2863 2863
    public:
2864 2864
      /// The key type of the map
2865 2865
      typedef Arc Key;
2866 2866
      /// The value type of the map
2867 2867
      typedef typename CapacityMap::Value Value;
2868 2868

	
2869 2869
      /// Constructor
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2871 2871
        : _adaptor(&adaptor) {}
2872 2872

	
2873 2873
      /// Returns the value associated with the given residual arc
2874 2874
      Value operator[](const Arc& a) const {
2875 2875
        return _adaptor->residualCapacity(a);
2876 2876
      }
2877 2877

	
2878 2878
    };
2879 2879

	
2880 2880
    /// \brief Returns a residual capacity map
2881 2881
    ///
2882 2882
    /// This function just returns a residual capacity map.
2883 2883
    ResidualCapacity residualCapacity() const {
2884 2884
      return ResidualCapacity(*this);
2885 2885
    }
2886 2886

	
... ...
@@ -3434,33 +3434,33 @@
3434 3434
      return Parent::arc(n);
3435 3435
    }
3436 3436

	
3437 3437
    /// \brief Returns the arc that corresponds to the given original arc.
3438 3438
    ///
3439 3439
    /// Returns the arc in the adaptor that corresponds to the given
3440 3440
    /// original arc.
3441 3441
    static Arc arc(const DigraphArc& a) {
3442 3442
      return Parent::arc(a);
3443 3443
    }
3444 3444

	
3445 3445
    /// \brief Node map combined from two original node maps
3446 3446
    ///
3447 3447
    /// This map adaptor class adapts two node maps of the original digraph
3448 3448
    /// to get a node map of the split digraph.
3449 3449
    /// Its value type is inherited from the first node map type (\c IN).
3450
    /// \tparam IN The type of the node map for the in-nodes. 
3450
    /// \tparam IN The type of the node map for the in-nodes.
3451 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3452 3452
    template <typename IN, typename OUT>
3453 3453
    class CombinedNodeMap {
3454 3454
    public:
3455 3455

	
3456 3456
      /// The key type of the map
3457 3457
      typedef Node Key;
3458 3458
      /// The value type of the map
3459 3459
      typedef typename IN::Value Value;
3460 3460

	
3461 3461
      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3462 3462
      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3463 3463
      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3464 3464
      typedef typename MapTraits<IN>::ReturnValue Reference;
3465 3465
      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3466 3466

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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 <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

	
23 23
  void ArgParser::_terminate(ArgParserException::Reason reason) const
24 24
  {
25 25
    if(_exit_on_problems)
26 26
      exit(1);
27 27
    else throw(ArgParserException(reason));
28 28
  }
29
  
30
  
29

	
30

	
31 31
  void ArgParser::_showHelp(void *p)
32 32
  {
33 33
    (static_cast<ArgParser*>(p))->showHelp();
34 34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
35 35
  }
36 36

	
37 37
  ArgParser::ArgParser(int argc, const char * const *argv)
38 38
    :_argc(argc), _argv(argv), _command_name(argv[0]),
39 39
    _exit_on_problems(true) {
40 40
    funcOption("-help","Print a short help message",_showHelp,this);
41 41
    synonym("help","-help");
42 42
    synonym("h","-help");
43 43
  }
44 44

	
45 45
  ArgParser::~ArgParser()
46 46
  {
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_ARG_PARSER_H
20 20
#define LEMON_ARG_PARSER_H
21 21

	
... ...
@@ -29,36 +29,36 @@
29 29
#include <lemon/assert.h>
30 30

	
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Exception used by ArgParser
38 38
  class ArgParserException : public Exception {
39 39
  public:
40 40
    enum Reason {
41 41
      HELP,         /// <tt>--help</tt> option was given
42 42
      UNKNOWN_OPT,  /// Unknown option was given
43 43
      INVALID_OPT   /// Invalid combination of options
44 44
    };
45
    
45

	
46 46
  private:
47 47
    Reason _reason;
48
    
48

	
49 49
  public:
50 50
    ///Constructor
51 51
    ArgParserException(Reason r) throw() : _reason(r) {}
52 52
    ///Virtual destructor
53 53
    virtual ~ArgParserException() throw() {}
54 54
    ///A short description of the exception
55 55
    virtual const char* what() const throw() {
56 56
      switch(_reason)
57 57
        {
58 58
        case HELP:
59 59
          return "lemon::ArgParseException: ask for help";
60 60
          break;
61 61
        case UNKNOWN_OPT:
62 62
          return "lemon::ArgParseException: unknown option";
63 63
          break;
64 64
        case INVALID_OPT:
... ...
@@ -128,47 +128,47 @@
128 128

	
129 129
    typedef std::map<std::string,GroupData> Groups;
130 130
    Groups _groups;
131 131

	
132 132
    struct OtherArg
133 133
    {
134 134
      std::string name;
135 135
      std::string help;
136 136
      OtherArg(std::string n, std::string h) :name(n), help(h) {}
137 137

	
138 138
    };
139 139

	
140 140
    std::vector<OtherArg> _others_help;
141 141
    std::vector<std::string> _file_args;
142 142
    std::string _command_name;
143 143

	
144
    
144

	
145 145
  private:
146 146
    //Bind a function to an option.
147 147

	
148 148
    //\param name The name of the option. The leading '-' must be omitted.
149 149
    //\param help A help string.
150 150
    //\retval func The function to be called when the option is given. It
151 151
    //  must be of type "void f(void *)"
152 152
    //\param data Data to be passed to \c func
153 153
    ArgParser &funcOption(const std::string &name,
154 154
                    const std::string &help,
155 155
                    void (*func)(void *),void *data);
156 156

	
157 157
    bool _exit_on_problems;
158
    
158

	
159 159
    void _terminate(ArgParserException::Reason reason) const;
160 160

	
161 161
  public:
162 162

	
163 163
    ///Constructor
164 164
    ArgParser(int argc, const char * const *argv);
165 165

	
166 166
    ~ArgParser();
167 167

	
168 168
    ///\name Options
169 169
    ///
170 170

	
171 171
    ///@{
172 172

	
173 173
    ///Add a new integer type option
174 174

	
... ...
@@ -410,24 +410,24 @@
410 410
    ///Give back the value of an option
411 411

	
412 412
    ///Give back the value of an option.
413 413
    ///\sa RefType
414 414
    RefType operator[](const std::string &n) const
415 415
    {
416 416
      return RefType(*this, n);
417 417
    }
418 418

	
419 419
    ///Give back the non-option type arguments.
420 420

	
421 421
    ///Give back a reference to a vector consisting of the program arguments
422 422
    ///not starting with a '-' character.
423 423
    const std::vector<std::string> &files() const { return _file_args; }
424 424

	
425 425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems() 
426
    void throwOnProblems()
427 427
    {
428 428
      _exit_on_problems=false;
429 429
    }
430 430
  };
431 431
}
432 432

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

	
... ...
@@ -23,42 +23,42 @@
23 23
/// \file
24 24
/// \brief Bellman-Ford 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/tolerance.h>
32 32
#include <lemon/path.h>
33 33

	
34 34
#include <limits>
35 35

	
36 36
namespace lemon {
37 37

	
38 38
  /// \brief Default operation traits for the BellmanFord algorithm class.
39
  ///  
39
  ///
40 40
  /// This operation traits class defines all computational operations
41 41
  /// and constants that are used in the Bellman-Ford algorithm.
42 42
  /// The default implementation is based on the \c numeric_limits class.
43 43
  /// If the numeric type does not have infinity value, then the maximum
44 44
  /// value is used as extremal infinity value.
45 45
  ///
46 46
  /// \see BellmanFordToleranceOperationTraits
47 47
  template <
48
    typename V, 
48
    typename V,
49 49
    bool has_inf = std::numeric_limits<V>::has_infinity>
50 50
  struct BellmanFordDefaultOperationTraits {
51 51
    /// \brief Value type for the algorithm.
52 52
    typedef V Value;
53 53
    /// \brief Gives back the zero value of the type.
54 54
    static Value zero() {
55 55
      return static_cast<Value>(0);
56 56
    }
57 57
    /// \brief Gives back the positive infinity value of the type.
58 58
    static Value infinity() {
59 59
      return std::numeric_limits<Value>::infinity();
60 60
    }
61 61
    /// \brief Gives back the sum of the given two elements.
62 62
    static Value plus(const Value& left, const Value& right) {
63 63
      return left + right;
64 64
    }
... ...
@@ -73,33 +73,33 @@
73 73
  struct BellmanFordDefaultOperationTraits<V, false> {
74 74
    typedef V Value;
75 75
    static Value zero() {
76 76
      return static_cast<Value>(0);
77 77
    }
78 78
    static Value infinity() {
79 79
      return std::numeric_limits<Value>::max();
80 80
    }
81 81
    static Value plus(const Value& left, const Value& right) {
82 82
      if (left == infinity() || right == infinity()) return infinity();
83 83
      return left + right;
84 84
    }
85 85
    static bool less(const Value& left, const Value& right) {
86 86
      return left < right;
87 87
    }
88 88
  };
89
  
89

	
90 90
  /// \brief Operation traits for the BellmanFord algorithm class
91 91
  /// using tolerance.
92 92
  ///
93 93
  /// This operation traits class defines all computational operations
94 94
  /// and constants that are used in the Bellman-Ford algorithm.
95 95
  /// The only difference between this implementation and
96 96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97 97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98 98
  /// function.
99 99
  ///
100 100
  /// \tparam V The value type.
101 101
  /// \tparam eps The epsilon value for the \ref less() function.
102 102
  /// By default, it is the epsilon value used by \ref Tolerance
103 103
  /// "Tolerance<V>".
104 104
  ///
105 105
  /// \see BellmanFordDefaultOperationTraits
... ...
@@ -126,131 +126,131 @@
126 126
      return left + right;
127 127
    }
128 128
    /// \brief Gives back \c true only if the first value is less than
129 129
    /// the second.
130 130
    static bool less(const Value& left, const Value& right) {
131 131
      return left + eps < right;
132 132
    }
133 133
  };
134 134

	
135 135
  /// \brief Default traits class of BellmanFord class.
136 136
  ///
137 137
  /// Default traits class of BellmanFord class.
138 138
  /// \param GR The type of the digraph.
139 139
  /// \param LEN The type of the length map.
140 140
  template<typename GR, typename LEN>
141 141
  struct BellmanFordDefaultTraits {
142
    /// The type of the digraph the algorithm runs on. 
142
    /// The type of the digraph the algorithm runs on.
143 143
    typedef GR Digraph;
144 144

	
145 145
    /// \brief The type of the map that stores the arc lengths.
146 146
    ///
147 147
    /// The type of the map that stores the arc lengths.
148 148
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
149 149
    typedef LEN LengthMap;
150 150

	
151 151
    /// The type of the arc lengths.
152 152
    typedef typename LEN::Value Value;
153 153

	
154 154
    /// \brief Operation traits for Bellman-Ford algorithm.
155 155
    ///
156 156
    /// It defines the used operations and the infinity value for the
157 157
    /// given \c Value type.
158 158
    /// \see BellmanFordDefaultOperationTraits,
159 159
    /// BellmanFordToleranceOperationTraits
160 160
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
161
 
162
    /// \brief The type of the map that stores the last arcs of the 
161

	
162
    /// \brief The type of the map that stores the last arcs of the
163 163
    /// shortest paths.
164
    /// 
164
    ///
165 165
    /// The type of the map that stores the last
166 166
    /// arcs of the shortest paths.
167 167
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
168 168
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
169 169

	
170 170
    /// \brief Instantiates a \c PredMap.
171
    /// 
172
    /// This function instantiates a \ref PredMap. 
171
    ///
172
    /// This function instantiates a \ref PredMap.
173 173
    /// \param g is the digraph to which we would like to define the
174 174
    /// \ref PredMap.
175 175
    static PredMap *createPredMap(const GR& g) {
176 176
      return new PredMap(g);
177 177
    }
178 178

	
179 179
    /// \brief The type of the map that stores the distances of the nodes.
180 180
    ///
181 181
    /// The type of the map that stores the distances of the nodes.
182 182
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
183 183
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
184 184

	
185 185
    /// \brief Instantiates a \c DistMap.
186 186
    ///
187
    /// This function instantiates a \ref DistMap. 
188
    /// \param g is the digraph to which we would like to define the 
187
    /// This function instantiates a \ref DistMap.
188
    /// \param g is the digraph to which we would like to define the
189 189
    /// \ref DistMap.
190 190
    static DistMap *createDistMap(const GR& g) {
191 191
      return new DistMap(g);
192 192
    }
193 193

	
194 194
  };
195
  
195

	
196 196
  /// \brief %BellmanFord algorithm class.
197 197
  ///
198 198
  /// \ingroup shortest_path
199
  /// This class provides an efficient implementation of the Bellman-Ford 
199
  /// This class provides an efficient implementation of the Bellman-Ford
200 200
  /// algorithm. The maximum time complexity of the algorithm is
201 201
  /// <tt>O(ne)</tt>.
202 202
  ///
203 203
  /// The Bellman-Ford algorithm solves the single-source shortest path
204 204
  /// problem when the arcs can have negative lengths, but the digraph
205 205
  /// should not contain directed cycles with negative total length.
206 206
  /// If all arc costs are non-negative, consider to use the Dijkstra
207 207
  /// algorithm instead, since it is more efficient.
208 208
  ///
209 209
  /// The arc lengths are passed to the algorithm using a
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any
211 211
  /// kind of length. The type of the length values is determined by the
212 212
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
213 213
  ///
214 214
  /// There is also a \ref bellmanFord() "function-type interface" for the
215 215
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
216 216
  /// it can be used easier.
217 217
  ///
218 218
  /// \tparam GR The type of the digraph the algorithm runs on.
219 219
  /// The default type is \ref ListDigraph.
220 220
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
221 221
  /// the lengths of the arcs. The default map type is
222 222
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
223 223
  /// \tparam TR The traits class that defines various types used by the
224 224
  /// algorithm. By default, it is \ref BellmanFordDefaultTraits
225 225
  /// "BellmanFordDefaultTraits<GR, LEN>".
226 226
  /// In most cases, this parameter should not be set directly,
227 227
  /// consider to use the named template parameters instead.
228 228
#ifdef DOXYGEN
229 229
  template <typename GR, typename LEN, typename TR>
230 230
#else
231 231
  template <typename GR=ListDigraph,
232 232
            typename LEN=typename GR::template ArcMap<int>,
233 233
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
234 234
#endif
235 235
  class BellmanFord {
236 236
  public:
237 237

	
238 238
    ///The type of the underlying digraph.
239 239
    typedef typename TR::Digraph Digraph;
240
    
240

	
241 241
    /// \brief The type of the arc lengths.
242 242
    typedef typename TR::LengthMap::Value Value;
243 243
    /// \brief The type of the map that stores the arc lengths.
244 244
    typedef typename TR::LengthMap LengthMap;
245 245
    /// \brief The type of the map that stores the last
246 246
    /// arcs of the shortest paths.
247 247
    typedef typename TR::PredMap PredMap;
248 248
    /// \brief The type of the map that stores the distances of the nodes.
249 249
    typedef typename TR::DistMap DistMap;
250 250
    /// The type of the paths.
251 251
    typedef PredMapPath<Digraph, PredMap> Path;
252 252
    ///\brief The \ref BellmanFordDefaultOperationTraits
253 253
    /// "operation traits class" of the algorithm.
254 254
    typedef typename TR::OperationTraits OperationTraits;
255 255

	
256 256
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
... ...
@@ -271,506 +271,506 @@
271 271
    PredMap *_pred;
272 272
    // Indicates if _pred is locally allocated (true) or not.
273 273
    bool _local_pred;
274 274
    // Pointer to the map of distances.
275 275
    DistMap *_dist;
276 276
    // Indicates if _dist is locally allocated (true) or not.
277 277
    bool _local_dist;
278 278

	
279 279
    typedef typename Digraph::template NodeMap<bool> MaskMap;
280 280
    MaskMap *_mask;
281 281

	
282 282
    std::vector<Node> _process;
283 283

	
284 284
    // Creates the maps if necessary.
285 285
    void create_maps() {
286 286
      if(!_pred) {
287
	_local_pred = true;
288
	_pred = Traits::createPredMap(*_gr);
287
        _local_pred = true;
288
        _pred = Traits::createPredMap(*_gr);
289 289
      }
290 290
      if(!_dist) {
291
	_local_dist = true;
292
	_dist = Traits::createDistMap(*_gr);
291
        _local_dist = true;
292
        _dist = Traits::createDistMap(*_gr);
293 293
      }
294 294
      if(!_mask) {
295 295
        _mask = new MaskMap(*_gr);
296 296
      }
297 297
    }
298
    
298

	
299 299
  public :
300
 
300

	
301 301
    typedef BellmanFord Create;
302 302

	
303 303
    /// \name Named Template Parameters
304 304

	
305 305
    ///@{
306 306

	
307 307
    template <class T>
308 308
    struct SetPredMapTraits : public Traits {
309 309
      typedef T PredMap;
310 310
      static PredMap *createPredMap(const Digraph&) {
311 311
        LEMON_ASSERT(false, "PredMap is not initialized");
312 312
        return 0; // ignore warnings
313 313
      }
314 314
    };
315 315

	
316 316
    /// \brief \ref named-templ-param "Named parameter" for setting
317 317
    /// \c PredMap type.
318 318
    ///
319 319
    /// \ref named-templ-param "Named parameter" for setting
320 320
    /// \c PredMap type.
321 321
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
322 322
    template <class T>
323
    struct SetPredMap 
323
    struct SetPredMap
324 324
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
325 325
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
326 326
    };
327
    
327

	
328 328
    template <class T>
329 329
    struct SetDistMapTraits : public Traits {
330 330
      typedef T DistMap;
331 331
      static DistMap *createDistMap(const Digraph&) {
332 332
        LEMON_ASSERT(false, "DistMap is not initialized");
333 333
        return 0; // ignore warnings
334 334
      }
335 335
    };
336 336

	
337 337
    /// \brief \ref named-templ-param "Named parameter" for setting
338 338
    /// \c DistMap type.
339 339
    ///
340 340
    /// \ref named-templ-param "Named parameter" for setting
341 341
    /// \c DistMap type.
342 342
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
343 343
    template <class T>
344
    struct SetDistMap 
344
    struct SetDistMap
345 345
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
346 346
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
347 347
    };
348 348

	
349 349
    template <class T>
350 350
    struct SetOperationTraitsTraits : public Traits {
351 351
      typedef T OperationTraits;
352 352
    };
353
    
354
    /// \brief \ref named-templ-param "Named parameter" for setting 
353

	
354
    /// \brief \ref named-templ-param "Named parameter" for setting
355 355
    /// \c OperationTraits type.
356 356
    ///
357 357
    /// \ref named-templ-param "Named parameter" for setting
358 358
    /// \c OperationTraits type.
359 359
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
360 360
    template <class T>
361 361
    struct SetOperationTraits
362 362
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
363 363
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
364 364
      Create;
365 365
    };
366
    
366

	
367 367
    ///@}
368 368

	
369 369
  protected:
370
    
370

	
371 371
    BellmanFord() {}
372 372

	
373
  public:      
374
    
373
  public:
374

	
375 375
    /// \brief Constructor.
376 376
    ///
377 377
    /// Constructor.
378 378
    /// \param g The digraph the algorithm runs on.
379 379
    /// \param length The length map used by the algorithm.
380 380
    BellmanFord(const Digraph& g, const LengthMap& length) :
381 381
      _gr(&g), _length(&length),
382 382
      _pred(0), _local_pred(false),
383 383
      _dist(0), _local_dist(false), _mask(0) {}
384
    
384

	
385 385
    ///Destructor.
386 386
    ~BellmanFord() {
387 387
      if(_local_pred) delete _pred;
388 388
      if(_local_dist) delete _dist;
389 389
      if(_mask) delete _mask;
390 390
    }
391 391

	
392 392
    /// \brief Sets the length map.
393 393
    ///
394 394
    /// Sets the length map.
395 395
    /// \return <tt>(*this)</tt>
396 396
    BellmanFord &lengthMap(const LengthMap &map) {
397 397
      _length = &map;
398 398
      return *this;
399 399
    }
400 400

	
401 401
    /// \brief Sets the map that stores the predecessor arcs.
402 402
    ///
403 403
    /// Sets the map that stores the predecessor arcs.
404 404
    /// If you don't use this function before calling \ref run()
405 405
    /// or \ref init(), an instance will be allocated automatically.
406 406
    /// The destructor deallocates this automatically allocated map,
407 407
    /// of course.
408 408
    /// \return <tt>(*this)</tt>
409 409
    BellmanFord &predMap(PredMap &map) {
410 410
      if(_local_pred) {
411
	delete _pred;
412
	_local_pred=false;
411
        delete _pred;
412
        _local_pred=false;
413 413
      }
414 414
      _pred = &map;
415 415
      return *this;
416 416
    }
417 417

	
418 418
    /// \brief Sets the map that stores the distances of the nodes.
419 419
    ///
420 420
    /// Sets the map that stores the distances of the nodes calculated
421 421
    /// by the algorithm.
422 422
    /// If you don't use this function before calling \ref run()
423 423
    /// or \ref init(), an instance will be allocated automatically.
424 424
    /// The destructor deallocates this automatically allocated map,
425 425
    /// of course.
426 426
    /// \return <tt>(*this)</tt>
427 427
    BellmanFord &distMap(DistMap &map) {
428 428
      if(_local_dist) {
429
	delete _dist;
430
	_local_dist=false;
429
        delete _dist;
430
        _local_dist=false;
431 431
      }
432 432
      _dist = &map;
433 433
      return *this;
434 434
    }
435 435

	
436 436
    /// \name Execution Control
437 437
    /// The simplest way to execute the Bellman-Ford algorithm is to use
438 438
    /// one of the member functions called \ref run().\n
439 439
    /// If you need better control on the execution, you have to call
440 440
    /// \ref init() first, then you can add several source nodes
441 441
    /// with \ref addSource(). Finally the actual path computation can be
442 442
    /// performed with \ref start(), \ref checkedStart() or
443 443
    /// \ref limitedStart().
444 444

	
445 445
    ///@{
446 446

	
447 447
    /// \brief Initializes the internal data structures.
448
    /// 
448
    ///
449 449
    /// Initializes the internal data structures. The optional parameter
450 450
    /// is the initial distance of each node.
451 451
    void init(const Value value = OperationTraits::infinity()) {
452 452
      create_maps();
453 453
      for (NodeIt it(*_gr); it != INVALID; ++it) {
454
	_pred->set(it, INVALID);
455
	_dist->set(it, value);
454
        _pred->set(it, INVALID);
455
        _dist->set(it, value);
456 456
      }
457 457
      _process.clear();
458 458
      if (OperationTraits::less(value, OperationTraits::infinity())) {
459
	for (NodeIt it(*_gr); it != INVALID; ++it) {
460
	  _process.push_back(it);
461
	  _mask->set(it, true);
462
	}
459
        for (NodeIt it(*_gr); it != INVALID; ++it) {
460
          _process.push_back(it);
461
          _mask->set(it, true);
462
        }
463 463
      } else {
464
	for (NodeIt it(*_gr); it != INVALID; ++it) {
465
	  _mask->set(it, false);
466
	}
464
        for (NodeIt it(*_gr); it != INVALID; ++it) {
465
          _mask->set(it, false);
466
        }
467 467
      }
468 468
    }
469
    
469

	
470 470
    /// \brief Adds a new source node.
471 471
    ///
472 472
    /// This function adds a new source node. The optional second parameter
473 473
    /// is the initial distance of the node.
474 474
    void addSource(Node source, Value dst = OperationTraits::zero()) {
475 475
      _dist->set(source, dst);
476 476
      if (!(*_mask)[source]) {
477
	_process.push_back(source);
478
	_mask->set(source, true);
477
        _process.push_back(source);
478
        _mask->set(source, true);
479 479
      }
480 480
    }
481 481

	
482 482
    /// \brief Executes one round from the Bellman-Ford algorithm.
483 483
    ///
484 484
    /// If the algoritm calculated the distances in the previous round
485 485
    /// exactly for the paths of at most \c k arcs, then this function
486 486
    /// will calculate the distances exactly for the paths of at most
487 487
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
488 488
    /// calculates the shortest path distances exactly for the paths
489 489
    /// consisting of at most \c k arcs.
490 490
    ///
491 491
    /// \warning The paths with limited arc number cannot be retrieved
492 492
    /// easily with \ref path() or \ref predArc() functions. If you also
493 493
    /// need the shortest paths and not only the distances, you should
494 494
    /// store the \ref predMap() "predecessor map" after each iteration
495 495
    /// and build the path manually.
496 496
    ///
497 497
    /// \return \c true when the algorithm have not found more shorter
498 498
    /// paths.
499 499
    ///
500 500
    /// \see ActiveIt
501 501
    bool processNextRound() {
502 502
      for (int i = 0; i < int(_process.size()); ++i) {
503
	_mask->set(_process[i], false);
503
        _mask->set(_process[i], false);
504 504
      }
505 505
      std::vector<Node> nextProcess;
506 506
      std::vector<Value> values(_process.size());
507 507
      for (int i = 0; i < int(_process.size()); ++i) {
508
	values[i] = (*_dist)[_process[i]];
508
        values[i] = (*_dist)[_process[i]];
509 509
      }
510 510
      for (int i = 0; i < int(_process.size()); ++i) {
511
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
	  Node target = _gr->target(it);
513
	  Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
	    _pred->set(target, it);
516
	    _dist->set(target, relaxed);
517
	    if (!(*_mask)[target]) {
518
	      _mask->set(target, true);
519
	      nextProcess.push_back(target);
520
	    }
521
	  }	  
522
	}
511
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
          Node target = _gr->target(it);
513
          Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
            _pred->set(target, it);
516
            _dist->set(target, relaxed);
517
            if (!(*_mask)[target]) {
518
              _mask->set(target, true);
519
              nextProcess.push_back(target);
520
            }
521
          }
522
        }
523 523
      }
524 524
      _process.swap(nextProcess);
525 525
      return _process.empty();
526 526
    }
527 527

	
528 528
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
529 529
    ///
530 530
    /// If the algorithm calculated the distances in the previous round
531 531
    /// at least for the paths of at most \c k arcs, then this function
532 532
    /// will calculate the distances at least for the paths of at most
533 533
    /// <tt>k+1</tt> arcs.
534 534
    /// This function does not make it possible to calculate the shortest
535 535
    /// path distances exactly for paths consisting of at most \c k arcs,
536 536
    /// this is why it is called weak round.
537 537
    ///
538 538
    /// \return \c true when the algorithm have not found more shorter
539 539
    /// paths.
540 540
    ///
541 541
    /// \see ActiveIt
542 542
    bool processNextWeakRound() {
543 543
      for (int i = 0; i < int(_process.size()); ++i) {
544
	_mask->set(_process[i], false);
544
        _mask->set(_process[i], false);
545 545
      }
546 546
      std::vector<Node> nextProcess;
547 547
      for (int i = 0; i < int(_process.size()); ++i) {
548
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
	  Node target = _gr->target(it);
550
	  Value relaxed = 
551
	    OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
	    _pred->set(target, it);
554
	    _dist->set(target, relaxed);
555
	    if (!(*_mask)[target]) {
556
	      _mask->set(target, true);
557
	      nextProcess.push_back(target);
558
	    }
559
	  }	  
560
	}
548
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
          Node target = _gr->target(it);
550
          Value relaxed =
551
            OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
            _pred->set(target, it);
554
            _dist->set(target, relaxed);
555
            if (!(*_mask)[target]) {
556
              _mask->set(target, true);
557
              nextProcess.push_back(target);
558
            }
559
          }
560
        }
561 561
      }
562 562
      _process.swap(nextProcess);
563 563
      return _process.empty();
564 564
    }
565 565

	
566 566
    /// \brief Executes the algorithm.
567 567
    ///
568 568
    /// Executes the algorithm.
569 569
    ///
570 570
    /// This method runs the Bellman-Ford algorithm from the root node(s)
571 571
    /// in order to compute the shortest path to each node.
572 572
    ///
573 573
    /// The algorithm computes
574 574
    /// - the shortest path tree (forest),
575 575
    /// - the distance of each node from the root(s).
576 576
    ///
577 577
    /// \pre init() must be called and at least one root node should be
578 578
    /// added with addSource() before using this function.
579 579
    void start() {
580 580
      int num = countNodes(*_gr) - 1;
581 581
      for (int i = 0; i < num; ++i) {
582
	if (processNextWeakRound()) break;
582
        if (processNextWeakRound()) break;
583 583
      }
584 584
    }
585 585

	
586 586
    /// \brief Executes the algorithm and checks the negative cycles.
587 587
    ///
588 588
    /// Executes the algorithm and checks the negative cycles.
589 589
    ///
590 590
    /// This method runs the Bellman-Ford algorithm from the root node(s)
591 591
    /// in order to compute the shortest path to each node and also checks
592 592
    /// if the digraph contains cycles with negative total length.
593 593
    ///
594
    /// The algorithm computes 
594
    /// The algorithm computes
595 595
    /// - the shortest path tree (forest),
596 596
    /// - the distance of each node from the root(s).
597
    /// 
597
    ///
598 598
    /// \return \c false if there is a negative cycle in the digraph.
599 599
    ///
600 600
    /// \pre init() must be called and at least one root node should be
601
    /// added with addSource() before using this function. 
601
    /// added with addSource() before using this function.
602 602
    bool checkedStart() {
603 603
      int num = countNodes(*_gr);
604 604
      for (int i = 0; i < num; ++i) {
605
	if (processNextWeakRound()) return true;
605
        if (processNextWeakRound()) return true;
606 606
      }
607 607
      return _process.empty();
608 608
    }
609 609

	
610 610
    /// \brief Executes the algorithm with arc number limit.
611 611
    ///
612 612
    /// Executes the algorithm with arc number limit.
613 613
    ///
614 614
    /// This method runs the Bellman-Ford algorithm from the root node(s)
615 615
    /// in order to compute the shortest path distance for each node
616 616
    /// using only the paths consisting of at most \c num arcs.
617 617
    ///
618 618
    /// The algorithm computes
619 619
    /// - the limited distance of each node from the root(s),
620 620
    /// - the predecessor arc for each node.
621 621
    ///
622 622
    /// \warning The paths with limited arc number cannot be retrieved
623 623
    /// easily with \ref path() or \ref predArc() functions. If you also
624 624
    /// need the shortest paths and not only the distances, you should
625 625
    /// store the \ref predMap() "predecessor map" after each iteration
626 626
    /// and build the path manually.
627 627
    ///
628 628
    /// \pre init() must be called and at least one root node should be
629
    /// added with addSource() before using this function. 
629
    /// added with addSource() before using this function.
630 630
    void limitedStart(int num) {
631 631
      for (int i = 0; i < num; ++i) {
632
	if (processNextRound()) break;
632
        if (processNextRound()) break;
633 633
      }
634 634
    }
635
    
635

	
636 636
    /// \brief Runs the algorithm from the given root node.
637
    ///    
637
    ///
638 638
    /// This method runs the Bellman-Ford algorithm from the given root
639 639
    /// node \c s in order to compute the shortest path to each node.
640 640
    ///
641 641
    /// The algorithm computes
642 642
    /// - the shortest path tree (forest),
643 643
    /// - the distance of each node from the root(s).
644 644
    ///
645 645
    /// \note bf.run(s) is just a shortcut of the following code.
646 646
    /// \code
647 647
    ///   bf.init();
648 648
    ///   bf.addSource(s);
649 649
    ///   bf.start();
650 650
    /// \endcode
651 651
    void run(Node s) {
652 652
      init();
653 653
      addSource(s);
654 654
      start();
655 655
    }
656
    
656

	
657 657
    /// \brief Runs the algorithm from the given root node with arc
658 658
    /// number limit.
659
    ///    
659
    ///
660 660
    /// This method runs the Bellman-Ford algorithm from the given root
661 661
    /// node \c s in order to compute the shortest path distance for each
662 662
    /// node using only the paths consisting of at most \c num arcs.
663 663
    ///
664 664
    /// The algorithm computes
665 665
    /// - the limited distance of each node from the root(s),
666 666
    /// - the predecessor arc for each node.
667 667
    ///
668 668
    /// \warning The paths with limited arc number cannot be retrieved
669 669
    /// easily with \ref path() or \ref predArc() functions. If you also
670 670
    /// need the shortest paths and not only the distances, you should
671 671
    /// store the \ref predMap() "predecessor map" after each iteration
672 672
    /// and build the path manually.
673 673
    ///
674 674
    /// \note bf.run(s, num) is just a shortcut of the following code.
675 675
    /// \code
676 676
    ///   bf.init();
677 677
    ///   bf.addSource(s);
678 678
    ///   bf.limitedStart(num);
679 679
    /// \endcode
680 680
    void run(Node s, int num) {
681 681
      init();
682 682
      addSource(s);
683 683
      limitedStart(num);
684 684
    }
685
    
685

	
686 686
    ///@}
687 687

	
688 688
    /// \brief LEMON iterator for getting the active nodes.
689 689
    ///
690 690
    /// This class provides a common style LEMON iterator that traverses
691 691
    /// the active nodes of the Bellman-Ford algorithm after the last
692 692
    /// phase. These nodes should be checked in the next phase to
693 693
    /// find augmenting arcs outgoing from them.
694 694
    class ActiveIt {
695 695
    public:
696 696

	
697 697
      /// \brief Constructor.
698 698
      ///
699 699
      /// Constructor for getting the active nodes of the given BellmanFord
700
      /// instance. 
700
      /// instance.
701 701
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
702 702
      {
703 703
        _index = _algorithm->_process.size() - 1;
704 704
      }
705 705

	
706 706
      /// \brief Invalid constructor.
707 707
      ///
708 708
      /// Invalid constructor.
709 709
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
710 710

	
711 711
      /// \brief Conversion to \c Node.
712 712
      ///
713 713
      /// Conversion to \c Node.
714
      operator Node() const { 
714
      operator Node() const {
715 715
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
716 716
      }
717 717

	
718 718
      /// \brief Increment operator.
719 719
      ///
720 720
      /// Increment operator.
721 721
      ActiveIt& operator++() {
722 722
        --_index;
723
        return *this; 
723
        return *this;
724 724
      }
725 725

	
726
      bool operator==(const ActiveIt& it) const { 
727
        return static_cast<Node>(*this) == static_cast<Node>(it); 
726
      bool operator==(const ActiveIt& it) const {
727
        return static_cast<Node>(*this) == static_cast<Node>(it);
728 728
      }
729
      bool operator!=(const ActiveIt& it) const { 
730
        return static_cast<Node>(*this) != static_cast<Node>(it); 
729
      bool operator!=(const ActiveIt& it) const {
730
        return static_cast<Node>(*this) != static_cast<Node>(it);
731 731
      }
732
      bool operator<(const ActiveIt& it) const { 
733
        return static_cast<Node>(*this) < static_cast<Node>(it); 
732
      bool operator<(const ActiveIt& it) const {
733
        return static_cast<Node>(*this) < static_cast<Node>(it);
734 734
      }
735
      
735

	
736 736
    private:
737 737
      const BellmanFord* _algorithm;
738 738
      int _index;
739 739
    };
740
    
740

	
741 741
    /// \name Query Functions
742 742
    /// The result of the Bellman-Ford algorithm can be obtained using these
743 743
    /// functions.\n
744 744
    /// Either \ref run() or \ref init() should be called before using them.
745
    
745

	
746 746
    ///@{
747 747

	
748 748
    /// \brief The shortest path to the given node.
749
    ///    
749
    ///
750 750
    /// Gives back the shortest path to the given node from the root(s).
751 751
    ///
752 752
    /// \warning \c t should be reached from the root(s).
753 753
    ///
754 754
    /// \pre Either \ref run() or \ref init() must be called before
755 755
    /// using this function.
756 756
    Path path(Node t) const
757 757
    {
758 758
      return Path(*_gr, *_pred, t);
759 759
    }
760
	  
760

	
761 761
    /// \brief The distance of the given node from the root(s).
762 762
    ///
763 763
    /// Returns the distance of the given node from the root(s).
764 764
    ///
765 765
    /// \warning If node \c v is not reached from the root(s), then
766 766
    /// the return value of this function is undefined.
767 767
    ///
768 768
    /// \pre Either \ref run() or \ref init() must be called before
769 769
    /// using this function.
770 770
    Value dist(Node v) const { return (*_dist)[v]; }
771 771

	
772 772
    /// \brief Returns the 'previous arc' of the shortest path tree for
773 773
    /// the given node.
774 774
    ///
775 775
    /// This function returns the 'previous arc' of the shortest path
776 776
    /// tree for node \c v, i.e. it returns the last arc of a
... ...
@@ -784,268 +784,268 @@
784 784
    /// using this function.
785 785
    Arc predArc(Node v) const { return (*_pred)[v]; }
786 786

	
787 787
    /// \brief Returns the 'previous node' of the shortest path tree for
788 788
    /// the given node.
789 789
    ///
790 790
    /// This function returns the 'previous node' of the shortest path
791 791
    /// tree for node \c v, i.e. it returns the last but one node of
792 792
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
793 793
    /// is not reached from the root(s) or if \c v is a root.
794 794
    ///
795 795
    /// The shortest path tree used here is equal to the shortest path
796 796
    /// tree used in \ref predArc() and \ref predMap().
797 797
    ///
798 798
    /// \pre Either \ref run() or \ref init() must be called before
799 799
    /// using this function.
800
    Node predNode(Node v) const { 
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
800
    Node predNode(Node v) const {
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]);
802 802
    }
803
    
803

	
804 804
    /// \brief Returns a const reference to the node map that stores the
805 805
    /// distances of the nodes.
806 806
    ///
807 807
    /// Returns a const reference to the node map that stores the distances
808 808
    /// of the nodes calculated by the algorithm.
809 809
    ///
810 810
    /// \pre Either \ref run() or \ref init() must be called before
811 811
    /// using this function.
812 812
    const DistMap &distMap() const { return *_dist;}
813
 
813

	
814 814
    /// \brief Returns a const reference to the node map that stores the
815 815
    /// predecessor arcs.
816 816
    ///
817 817
    /// Returns a const reference to the node map that stores the predecessor
818 818
    /// arcs, which form the shortest path tree (forest).
819 819
    ///
820 820
    /// \pre Either \ref run() or \ref init() must be called before
821 821
    /// using this function.
822 822
    const PredMap &predMap() const { return *_pred; }
823
 
823

	
824 824
    /// \brief Checks if a node is reached from the root(s).
825 825
    ///
826 826
    /// Returns \c true if \c v is reached from the root(s).
827 827
    ///
828 828
    /// \pre Either \ref run() or \ref init() must be called before
829 829
    /// using this function.
830 830
    bool reached(Node v) const {
831 831
      return (*_dist)[v] != OperationTraits::infinity();
832 832
    }
833 833

	
834 834
    /// \brief Gives back a negative cycle.
835
    ///    
835
    ///
836 836
    /// This function gives back a directed cycle with negative total
837 837
    /// length if the algorithm has already found one.
838 838
    /// Otherwise it gives back an empty path.
839 839
    lemon::Path<Digraph> negativeCycle() const {
840 840
      typename Digraph::template NodeMap<int> state(*_gr, -1);
841 841
      lemon::Path<Digraph> cycle;
842 842
      for (int i = 0; i < int(_process.size()); ++i) {
843 843
        if (state[_process[i]] != -1) continue;
844 844
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
845 845
             v = _gr->source((*_pred)[v])) {
846 846
          if (state[v] == i) {
847 847
            cycle.addFront((*_pred)[v]);
848 848
            for (Node u = _gr->source((*_pred)[v]); u != v;
849 849
                 u = _gr->source((*_pred)[u])) {
850 850
              cycle.addFront((*_pred)[u]);
851 851
            }
852 852
            return cycle;
853 853
          }
854 854
          else if (state[v] >= 0) {
855 855
            break;
856 856
          }
857 857
          state[v] = i;
858 858
        }
859 859
      }
860 860
      return cycle;
861 861
    }
862
    
862

	
863 863
    ///@}
864 864
  };
865
 
865

	
866 866
  /// \brief Default traits class of bellmanFord() function.
867 867
  ///
868 868
  /// Default traits class of bellmanFord() function.
869 869
  /// \tparam GR The type of the digraph.
870 870
  /// \tparam LEN The type of the length map.
871 871
  template <typename GR, typename LEN>
872 872
  struct BellmanFordWizardDefaultTraits {
873
    /// The type of the digraph the algorithm runs on. 
873
    /// The type of the digraph the algorithm runs on.
874 874
    typedef GR Digraph;
875 875

	
876 876
    /// \brief The type of the map that stores the arc lengths.
877 877
    ///
878 878
    /// The type of the map that stores the arc lengths.
879 879
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
880 880
    typedef LEN LengthMap;
881 881

	
882 882
    /// The type of the arc lengths.
883 883
    typedef typename LEN::Value Value;
884 884

	
885 885
    /// \brief Operation traits for Bellman-Ford algorithm.
886 886
    ///
887 887
    /// It defines the used operations and the infinity value for the
888 888
    /// given \c Value type.
889 889
    /// \see BellmanFordDefaultOperationTraits,
890 890
    /// BellmanFordToleranceOperationTraits
891 891
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
892 892

	
893 893
    /// \brief The type of the map that stores the last
894 894
    /// arcs of the shortest paths.
895
    /// 
895
    ///
896 896
    /// The type of the map that stores the last arcs of the shortest paths.
897 897
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
898 898
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
899 899

	
900 900
    /// \brief Instantiates a \c PredMap.
901
    /// 
901
    ///
902 902
    /// This function instantiates a \ref PredMap.
903 903
    /// \param g is the digraph to which we would like to define the
904 904
    /// \ref PredMap.
905 905
    static PredMap *createPredMap(const GR &g) {
906 906
      return new PredMap(g);
907 907
    }
908 908

	
909 909
    /// \brief The type of the map that stores the distances of the nodes.
910 910
    ///
911 911
    /// The type of the map that stores the distances of the nodes.
912 912
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
913 913
    typedef typename GR::template NodeMap<Value> DistMap;
914 914

	
915 915
    /// \brief Instantiates a \c DistMap.
916 916
    ///
917
    /// This function instantiates a \ref DistMap. 
917
    /// This function instantiates a \ref DistMap.
918 918
    /// \param g is the digraph to which we would like to define the
919 919
    /// \ref DistMap.
920 920
    static DistMap *createDistMap(const GR &g) {
921 921
      return new DistMap(g);
922 922
    }
923 923

	
924 924
    ///The type of the shortest paths.
925 925

	
926 926
    ///The type of the shortest paths.
927 927
    ///It must meet the \ref concepts::Path "Path" concept.
928 928
    typedef lemon::Path<Digraph> Path;
929 929
  };
930
  
930

	
931 931
  /// \brief Default traits class used by BellmanFordWizard.
932 932
  ///
933 933
  /// Default traits class used by BellmanFordWizard.
934 934
  /// \tparam GR The type of the digraph.
935 935
  /// \tparam LEN The type of the length map.
936 936
  template <typename GR, typename LEN>
937
  class BellmanFordWizardBase 
937
  class BellmanFordWizardBase
938 938
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
939 939

	
940 940
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
941 941
  protected:
942 942
    // Type of the nodes in the digraph.
943 943
    typedef typename Base::Digraph::Node Node;
944 944

	
945 945
    // Pointer to the underlying digraph.
946 946
    void *_graph;
947 947
    // Pointer to the length map
948 948
    void *_length;
949 949
    // Pointer to the map of predecessors arcs.
950 950
    void *_pred;
951 951
    // Pointer to the map of distances.
952 952
    void *_dist;
953 953
    //Pointer to the shortest path to the target node.
954 954
    void *_path;
955 955
    //Pointer to the distance of the target node.
956 956
    void *_di;
957 957

	
958 958
    public:
959 959
    /// Constructor.
960
    
960

	
961 961
    /// This constructor does not require parameters, it initiates
962 962
    /// all of the attributes to default values \c 0.
963 963
    BellmanFordWizardBase() :
964 964
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
965 965

	
966 966
    /// Constructor.
967
    
967

	
968 968
    /// This constructor requires two parameters,
969 969
    /// others are initiated to \c 0.
970 970
    /// \param gr The digraph the algorithm runs on.
971 971
    /// \param len The length map.
972
    BellmanFordWizardBase(const GR& gr, 
973
			  const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
972
    BellmanFordWizardBase(const GR& gr,
973
                          const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))),
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))),
976 976
      _pred(0), _dist(0), _path(0), _di(0) {}
977 977

	
978 978
  };
979
  
979

	
980 980
  /// \brief Auxiliary class for the function-type interface of the
981 981
  /// \ref BellmanFord "Bellman-Ford" algorithm.
982 982
  ///
983 983
  /// This auxiliary class is created to implement the
984 984
  /// \ref bellmanFord() "function-type interface" of the
985 985
  /// \ref BellmanFord "Bellman-Ford" algorithm.
986 986
  /// It does not have own \ref run() method, it uses the
987 987
  /// functions and features of the plain \ref BellmanFord.
988 988
  ///
989 989
  /// This class should only be used through the \ref bellmanFord()
990 990
  /// function, which makes it easier to use the algorithm.
991 991
  ///
992 992
  /// \tparam TR The traits class that defines various types used by the
993 993
  /// algorithm.
994 994
  template<class TR>
995 995
  class BellmanFordWizard : public TR {
996 996
    typedef TR Base;
997 997

	
998 998
    typedef typename TR::Digraph Digraph;
999 999

	
1000 1000
    typedef typename Digraph::Node Node;
1001 1001
    typedef typename Digraph::NodeIt NodeIt;
1002 1002
    typedef typename Digraph::Arc Arc;
1003 1003
    typedef typename Digraph::OutArcIt ArcIt;
1004
    
1004

	
1005 1005
    typedef typename TR::LengthMap LengthMap;
1006 1006
    typedef typename LengthMap::Value Value;
1007 1007
    typedef typename TR::PredMap PredMap;
1008 1008
    typedef typename TR::DistMap DistMap;
1009 1009
    typedef typename TR::Path Path;
1010 1010

	
1011 1011
  public:
1012 1012
    /// Constructor.
1013 1013
    BellmanFordWizard() : TR() {}
1014 1014

	
1015 1015
    /// \brief Constructor that requires parameters.
1016 1016
    ///
1017 1017
    /// Constructor that requires parameters.
1018 1018
    /// These parameters will be the default values for the traits class.
1019 1019
    /// \param gr The digraph the algorithm runs on.
1020 1020
    /// \param len The length map.
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len) 
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len)
1022 1022
      : TR(gr, len) {}
1023 1023

	
1024 1024
    /// \brief Copy constructor
1025 1025
    BellmanFordWizard(const TR &b) : TR(b) {}
1026 1026

	
1027 1027
    ~BellmanFordWizard() {}
1028 1028

	
1029 1029
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
1030
    ///    
1030
    ///
1031 1031
    /// This method runs the Bellman-Ford algorithm from the given source
1032 1032
    /// node in order to compute the shortest path to each node.
1033 1033
    void run(Node s) {
1034
      BellmanFord<Digraph,LengthMap,TR> 
1035
	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
1034
      BellmanFord<Digraph,LengthMap,TR>
1035
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1036 1036
           *reinterpret_cast<const LengthMap*>(Base::_length));
1037 1037
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1038 1038
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1039 1039
      bf.run(s);
1040 1040
    }
1041 1041

	
1042 1042
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
1043 1043
    /// between \c s and \c t.
1044 1044
    ///
1045 1045
    /// This method runs the Bellman-Ford algorithm from node \c s
1046 1046
    /// in order to compute the shortest path to node \c t.
1047 1047
    /// Actually, it computes the shortest path to each node, but using
1048 1048
    /// this function you can retrieve the distance and the shortest path
1049 1049
    /// for a single target node easier.
1050 1050
    ///
1051 1051
    /// \return \c true if \c t is reachable form \c s.
... ...
@@ -1054,51 +1054,51 @@
1054 1054
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1055 1055
           *reinterpret_cast<const LengthMap*>(Base::_length));
1056 1056
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1057 1057
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1058 1058
      bf.run(s);
1059 1059
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
1060 1060
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
1061 1061
      return bf.reached(t);
1062 1062
    }
1063 1063

	
1064 1064
    template<class T>
1065 1065
    struct SetPredMapBase : public Base {
1066 1066
      typedef T PredMap;
1067 1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1068
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1069
    };
1070
    
1070

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

	
1082 1082
    template<class T>
1083 1083
    struct SetDistMapBase : public Base {
1084 1084
      typedef T DistMap;
1085 1085
      static DistMap *createDistMap(const Digraph &) { return 0; };
1086 1086
      SetDistMapBase(const TR &b) : TR(b) {}
1087 1087
    };
1088
    
1088

	
1089 1089
    /// \brief \ref named-templ-param "Named parameter" for setting
1090 1090
    /// the distance map.
1091 1091
    ///
1092 1092
    /// \ref named-templ-param "Named parameter" for setting
1093 1093
    /// the map that stores the distances of the nodes calculated
1094 1094
    /// by the algorithm.
1095 1095
    template<class T>
1096 1096
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1097 1097
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1098 1098
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1099 1099
    }
1100 1100

	
1101 1101
    template<class T>
1102 1102
    struct SetPathBase : public Base {
1103 1103
      typedef T Path;
1104 1104
      SetPathBase(const TR &b) : TR(b) {}
... ...
@@ -1113,53 +1113,53 @@
1113 1113
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1114 1114
    {
1115 1115
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1116 1116
      return BellmanFordWizard<SetPathBase<T> >(*this);
1117 1117
    }
1118 1118

	
1119 1119
    /// \brief \ref named-func-param "Named parameter" for getting
1120 1120
    /// the distance of the target node.
1121 1121
    ///
1122 1122
    /// \ref named-func-param "Named parameter" for getting
1123 1123
    /// the distance of the target node.
1124 1124
    BellmanFordWizard dist(const Value &d)
1125 1125
    {
1126 1126
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1127 1127
      return *this;
1128 1128
    }
1129
    
1129

	
1130 1130
  };
1131
  
1131

	
1132 1132
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1133 1133
  /// algorithm.
1134 1134
  ///
1135 1135
  /// \ingroup shortest_path
1136 1136
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1137 1137
  /// algorithm.
1138 1138
  ///
1139
  /// This function also has several \ref named-templ-func-param 
1140
  /// "named parameters", they are declared as the members of class 
1139
  /// This function also has several \ref named-templ-func-param
1140
  /// "named parameters", they are declared as the members of class
1141 1141
  /// \ref BellmanFordWizard.
1142 1142
  /// The following examples show how to use these parameters.
1143 1143
  /// \code
1144 1144
  ///   // Compute shortest path from node s to each node
1145 1145
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1146 1146
  ///
1147 1147
  ///   // Compute shortest path from s to t
1148 1148
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1149 1149
  /// \endcode
1150 1150
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1151 1151
  /// to the end of the parameter list.
1152 1152
  /// \sa BellmanFordWizard
1153 1153
  /// \sa BellmanFord
1154 1154
  template<typename GR, typename LEN>
1155 1155
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1156 1156
  bellmanFord(const GR& digraph,
1157
	      const LEN& length)
1157
              const LEN& length)
1158 1158
  {
1159 1159
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1160 1160
  }
1161 1161

	
1162 1162
} //END OF NAMESPACE LEMON
1163 1163

	
1164 1164
#endif
1165 1165

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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

	
... ...
@@ -69,33 +69,34 @@
69 69

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

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

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

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

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

	
99 100
    ///The type of the map that stores the distances of the nodes.
100 101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 102
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -258,33 +259,34 @@
258 259
    };
259 260

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

	
280 282
    template <class T>
281 283
    struct SetProcessedMapTraits : public Traits {
282 284
      typedef T ProcessedMap;
283 285
      static ProcessedMap *createProcessedMap(const Digraph &)
284 286
      {
285 287
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
286 288
        return 0; // ignore warnings
287 289
      }
288 290
    };
289 291
    ///\brief \ref named-templ-param "Named parameter" for setting
290 292
    ///\c ProcessedMap type.
... ...
@@ -859,33 +861,34 @@
859 861

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

	
872 874
    ///The type of the map that indicates which nodes are reached.
873 875

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

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

	
887 890
    ///The type of the map that stores the distances of the nodes.
888 891

	
889 892
    ///The type of the map that stores the distances of the nodes.
890 893
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
891 894
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -1252,33 +1255,34 @@
1252 1255
  };
1253 1256
#endif
1254 1257

	
1255 1258
  /// \brief Default traits class of BfsVisit class.
1256 1259
  ///
1257 1260
  /// Default traits class of BfsVisit class.
1258 1261
  /// \tparam GR The type of the digraph the algorithm runs on.
1259 1262
  template<class GR>
1260 1263
  struct BfsVisitDefaultTraits {
1261 1264

	
1262 1265
    /// \brief The type of the digraph the algorithm runs on.
1263 1266
    typedef GR Digraph;
1264 1267

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

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

	
1280 1284
  };
1281 1285

	
1282 1286
  /// \ingroup search
1283 1287
  ///
1284 1288
  /// \brief BFS algorithm class with visitor interface.
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_BINOMIAL_HEAP_H
20 20
#define LEMON_BINOMIAL_HEAP_H
21 21

	
... ...
@@ -245,33 +245,33 @@
245 245
      if ( i >= 0 && _data[i].in ) {
246 246
        decrease( item, _data[_min].prio-1 );
247 247
        pop();
248 248
      }
249 249
    }
250 250

	
251 251
    /// \brief Decrease the priority of an item to the given value.
252 252
    ///
253 253
    /// This function decreases the priority of an item to the given value.
254 254
    /// \param item The item.
255 255
    /// \param value The priority.
256 256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257 257
    void decrease (Item item, const Prio& value) {
258 258
      int i=_iim[item];
259 259
      int p=_data[i].parent;
260 260
      _data[i].prio=value;
261
      
261

	
262 262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263 263
        _data[i].name=_data[p].name;
264 264
        _data[i].prio=_data[p].prio;
265 265
        _data[p].name=item;
266 266
        _data[p].prio=value;
267 267
        _iim[_data[i].name]=i;
268 268
        i=p;
269 269
        p=_data[p].parent;
270 270
      }
271 271
      _iim[item]=i;
272 272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273 273
    }
274 274

	
275 275
    /// \brief Increase the priority of an item to the given value.
276 276
    ///
277 277
    /// This function increases the priority of an item to the given value.
... ...
@@ -309,61 +309,61 @@
309 309
    /// \param st The state. It should not be \c IN_HEAP.
310 310
    void state(const Item& i, State st) {
311 311
      switch (st) {
312 312
      case POST_HEAP:
313 313
      case PRE_HEAP:
314 314
        if (state(i) == IN_HEAP) {
315 315
          erase(i);
316 316
        }
317 317
        _iim[i] = st;
318 318
        break;
319 319
      case IN_HEAP:
320 320
        break;
321 321
      }
322 322
    }
323 323

	
324 324
  private:
325
    
325

	
326 326
    // Find the minimum of the roots
327 327
    int findMin() {
328 328
      if( _head!=-1 ) {
329 329
        int min_loc=_head, min_val=_data[_head].prio;
330 330
        for( int x=_data[_head].right_neighbor; x!=-1;
331 331
             x=_data[x].right_neighbor ) {
332 332
          if( _comp( _data[x].prio,min_val ) ) {
333 333
            min_val=_data[x].prio;
334 334
            min_loc=x;
335 335
          }
336 336
        }
337 337
        return min_loc;
338 338
      }
339 339
      else return -1;
340 340
    }
341 341

	
342 342
    // Merge the heap with another heap starting at the given position
343 343
    void merge(int a) {
344 344
      if( _head==-1 || a==-1 ) return;
345 345
      if( _data[a].right_neighbor==-1 &&
346 346
          _data[a].degree<=_data[_head].degree ) {
347 347
        _data[a].right_neighbor=_head;
348 348
        _head=a;
349 349
      } else {
350 350
        interleave(a);
351 351
      }
352 352
      if( _data[_head].right_neighbor==-1 ) return;
353
      
353

	
354 354
      int x=_head;
355 355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356 356
      while( x_next!=-1 ) {
357 357
        if( _data[x].degree!=_data[x_next].degree ||
358 358
            ( _data[x_next].right_neighbor!=-1 &&
359 359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360 360
          x_prev=x;
361 361
          x=x_next;
362 362
        }
363 363
        else {
364 364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365 365
            if( x_prev==-1 ) {
366 366
              _head=x_next;
367 367
            } else {
368 368
              _data[x_prev].right_neighbor=x_next;
369 369
            }
... ...
@@ -371,46 +371,46 @@
371 371
            x=x_next;
372 372
          }
373 373
          else {
374 374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375 375
            fuse(x_next,x);
376 376
          }
377 377
        }
378 378
        x_next=_data[x].right_neighbor;
379 379
      }
380 380
    }
381 381

	
382 382
    // Interleave the elements of the given list into the list of the roots
383 383
    void interleave(int a) {
384 384
      int p=_head, q=a;
385 385
      int curr=_data.size();
386 386
      _data.push_back(Store());
387
      
387

	
388 388
      while( p!=-1 || q!=-1 ) {
389 389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390 390
          _data[curr].right_neighbor=p;
391 391
          curr=p;
392 392
          p=_data[p].right_neighbor;
393 393
        }
394 394
        else {
395 395
          _data[curr].right_neighbor=q;
396 396
          curr=q;
397 397
          q=_data[q].right_neighbor;
398 398
        }
399 399
      }
400
      
400

	
401 401
      _head=_data.back().right_neighbor;
402 402
      _data.pop_back();
403 403
    }
404 404

	
405 405
    // Lace node a under node b
406 406
    void fuse(int a, int b) {
407 407
      _data[a].parent=b;
408 408
      _data[a].right_neighbor=_data[b].child;
409 409
      _data[b].child=a;
410 410

	
411 411
      ++_data[b].degree;
412 412
    }
413 413

	
414 414
    // Unlace node a (if it has siblings)
415 415
    void unlace(int a) {
416 416
      int neighb=_data[a].right_neighbor;
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_ARRAY_MAP_H
20 20
#define LEMON_BITS_ARRAY_MAP_H
21 21

	
... ...
@@ -57,33 +57,33 @@
57 57
    typedef _Item Key;
58 58
    // The value type of the map.
59 59
    typedef _Value Value;
60 60

	
61 61
    // The const reference type of the map.
62 62
    typedef const _Value& ConstReference;
63 63
    // The reference type of the map.
64 64
    typedef _Value& Reference;
65 65

	
66 66
    // The map type.
67 67
    typedef ArrayMap Map;
68 68

	
69 69
    // The notifier type.
70 70
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
71 71

	
72 72
  private:
73
  
73

	
74 74
    // The MapBase of the Map which imlements the core regisitry function.
75 75
    typedef typename Notifier::ObserverBase Parent;
76 76

	
77 77
    typedef std::allocator<Value> Allocator;
78 78

	
79 79
  public:
80 80

	
81 81
    // \brief Graph initialized map constructor.
82 82
    //
83 83
    // Graph initialized map constructor.
84 84
    explicit ArrayMap(const GraphType& graph) {
85 85
      Parent::attach(graph.notifier(Item()));
86 86
      allocate_memory();
87 87
      Notifier* nf = Parent::notifier();
88 88
      Item it;
89 89
      for (nf->first(it); it != INVALID; nf->next(it)) {
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_DEFAULT_MAP_H
20 20
#define LEMON_BITS_DEFAULT_MAP_H
21 21

	
... ...
@@ -144,33 +144,33 @@
144 144

	
145 145
//   template <typename _Graph, typename _Item, typename _Value>
146 146
//   struct DefaultMapSelector {
147 147
//     typedef DebugMap<_Graph, _Item, _Value> Map;
148 148
//   };
149 149

	
150 150
// #endif
151 151

	
152 152
  // DefaultMap class
153 153
  template <typename _Graph, typename _Item, typename _Value>
154 154
  class DefaultMap
155 155
    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
156 156
    typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
157 157

	
158 158
  public:
159 159
    typedef DefaultMap<_Graph, _Item, _Value> Map;
160
    
160

	
161 161
    typedef typename Parent::GraphType GraphType;
162 162
    typedef typename Parent::Value Value;
163 163

	
164 164
    explicit DefaultMap(const GraphType& graph) : Parent(graph) {}
165 165
    DefaultMap(const GraphType& graph, const Value& value)
166 166
      : Parent(graph, value) {}
167 167

	
168 168
    DefaultMap& operator=(const DefaultMap& cmap) {
169 169
      return operator=<DefaultMap>(cmap);
170 170
    }
171 171

	
172 172
    template <typename CMap>
173 173
    DefaultMap& operator=(const CMap& cmap) {
174 174
      Parent::operator=(cmap);
175 175
      return *this;
176 176
    }
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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_EDGE_SET_EXTENDER_H
20 20
#define LEMON_BITS_EDGE_SET_EXTENDER_H
21 21

	
... ...
@@ -50,149 +50,149 @@
50 50
    }
51 51

	
52 52
    int maxId(Arc) const {
53 53
      return Parent::maxArcId();
54 54
    }
55 55

	
56 56
    Node fromId(int id, Node) const {
57 57
      return Parent::nodeFromId(id);
58 58
    }
59 59

	
60 60
    Arc fromId(int id, Arc) const {
61 61
      return Parent::arcFromId(id);
62 62
    }
63 63

	
64 64
    Node oppositeNode(const Node &n, const Arc &e) const {
65 65
      if (n == Parent::source(e))
66
	return Parent::target(e);
66
        return Parent::target(e);
67 67
      else if(n==Parent::target(e))
68
	return Parent::source(e);
68
        return Parent::source(e);
69 69
      else
70
	return INVALID;
70
        return INVALID;
71 71
    }
72 72

	
73 73

	
74 74
    // Alteration notifier extensions
75 75

	
76 76
    // The arc observer registry.
77 77
    typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;
78 78

	
79 79
  protected:
80 80

	
81 81
    mutable ArcNotifier arc_notifier;
82 82

	
83 83
  public:
84 84

	
85 85
    using Parent::notifier;
86 86

	
87 87
    // Gives back the arc alteration notifier.
88 88
    ArcNotifier& notifier(Arc) const {
89 89
      return arc_notifier;
90 90
    }
91 91

	
92 92
    // Iterable extensions
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
96 96
    public:
97 97

	
98 98
      NodeIt() {}
99 99

	
100 100
      NodeIt(Invalid i) : Node(i) { }
101 101

	
102 102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
103
	_graph.first(static_cast<Node&>(*this));
103
        _graph.first(static_cast<Node&>(*this));
104 104
      }
105 105

	
106
      NodeIt(const Digraph& _graph, const Node& node) 
107
	: Node(node), digraph(&_graph) {}
106
      NodeIt(const Digraph& _graph, const Node& node)
107
        : Node(node), digraph(&_graph) {}
108 108

	
109
      NodeIt& operator++() { 
110
	digraph->next(*this);
111
	return *this; 
109
      NodeIt& operator++() {
110
        digraph->next(*this);
111
        return *this;
112 112
      }
113 113

	
114 114
    };
115 115

	
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
119 119
    public:
120 120

	
121 121
      ArcIt() { }
122 122

	
123 123
      ArcIt(Invalid i) : Arc(i) { }
124 124

	
125 125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
126
	_graph.first(static_cast<Arc&>(*this));
126
        _graph.first(static_cast<Arc&>(*this));
127 127
      }
128 128

	
129
      ArcIt(const Digraph& _graph, const Arc& e) : 
130
	Arc(e), digraph(&_graph) { }
129
      ArcIt(const Digraph& _graph, const Arc& e) :
130
        Arc(e), digraph(&_graph) { }
131 131

	
132
      ArcIt& operator++() { 
133
	digraph->next(*this);
134
	return *this; 
132
      ArcIt& operator++() {
133
        digraph->next(*this);
134
        return *this;
135 135
      }
136 136

	
137 137
    };
138 138

	
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
142 142
    public:
143 143

	
144 144
      OutArcIt() { }
145 145

	
146 146
      OutArcIt(Invalid i) : Arc(i) { }
147 147

	
148
      OutArcIt(const Digraph& _graph, const Node& node) 
149
	: digraph(&_graph) {
150
	_graph.firstOut(*this, node);
148
      OutArcIt(const Digraph& _graph, const Node& node)
149
        : digraph(&_graph) {
150
        _graph.firstOut(*this, node);
151 151
      }
152 152

	
153
      OutArcIt(const Digraph& _graph, const Arc& arc) 
154
	: Arc(arc), digraph(&_graph) {}
153
      OutArcIt(const Digraph& _graph, const Arc& arc)
154
        : Arc(arc), digraph(&_graph) {}
155 155

	
156
      OutArcIt& operator++() { 
157
	digraph->nextOut(*this);
158
	return *this; 
156
      OutArcIt& operator++() {
157
        digraph->nextOut(*this);
158
        return *this;
159 159
      }
160 160

	
161 161
    };
162 162

	
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
166 166
    public:
167 167

	
168 168
      InArcIt() { }
169 169

	
170 170
      InArcIt(Invalid i) : Arc(i) { }
171 171

	
172
      InArcIt(const Digraph& _graph, const Node& node) 
173
	: digraph(&_graph) {
174
	_graph.firstIn(*this, node);
172
      InArcIt(const Digraph& _graph, const Node& node)
173
        : digraph(&_graph) {
174
        _graph.firstIn(*this, node);
175 175
      }
176 176

	
177
      InArcIt(const Digraph& _graph, const Arc& arc) : 
178
	Arc(arc), digraph(&_graph) {}
177
      InArcIt(const Digraph& _graph, const Arc& arc) :
178
        Arc(arc), digraph(&_graph) {}
179 179

	
180
      InArcIt& operator++() { 
181
	digraph->nextIn(*this);
182
	return *this; 
180
      InArcIt& operator++() {
181
        digraph->nextIn(*this);
182
        return *this;
183 183
      }
184 184

	
185 185
    };
186 186

	
187 187
    // \brief Base node of the iterator
188 188
    //
189 189
    // Returns the base node (ie. the source in this case) of the iterator
190 190
    Node baseNode(const OutArcIt &e) const {
191 191
      return Parent::source(static_cast<const Arc&>(e));
192 192
    }
193 193
    // \brief Running node of the iterator
194 194
    //
195 195
    // Returns the running node (ie. the target in this case) of the
196 196
    // iterator
197 197
    Node runningNode(const OutArcIt &e) const {
198 198
      return Parent::target(static_cast<const Arc&>(e));
... ...
@@ -202,65 +202,65 @@
202 202
    //
203 203
    // Returns the base node (ie. the target in this case) of the iterator
204 204
    Node baseNode(const InArcIt &e) const {
205 205
      return Parent::target(static_cast<const Arc&>(e));
206 206
    }
207 207
    // \brief Running node of the iterator
208 208
    //
209 209
    // Returns the running node (ie. the source in this case) of the
210 210
    // iterator
211 211
    Node runningNode(const InArcIt &e) const {
212 212
      return Parent::source(static_cast<const Arc&>(e));
213 213
    }
214 214

	
215 215
    using Parent::first;
216 216

	
217 217
    // Mappable extension
218
    
218

	
219 219
    template <typename _Value>
220
    class ArcMap 
220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
222 222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
223 223

	
224 224
    public:
225
      explicit ArcMap(const Digraph& _g) 
226
	: Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v) 
228
	: Parent(_g, _v) {}
225
      explicit ArcMap(const Digraph& _g)
226
        : Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v)
228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231
	return operator=<ArcMap>(cmap);
231
        return operator=<ArcMap>(cmap);
232 232
      }
233 233

	
234 234
      template <typename CMap>
235 235
      ArcMap& operator=(const CMap& cmap) {
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
239 239

	
240 240
    };
241 241

	
242 242

	
243 243
    // Alteration extension
244 244

	
245 245
    Arc addArc(const Node& from, const Node& to) {
246 246
      Arc arc = Parent::addArc(from, to);
247 247
      notifier(Arc()).add(arc);
248 248
      return arc;
249 249
    }
250
    
250

	
251 251
    void clear() {
252 252
      notifier(Arc()).clear();
253 253
      Parent::clear();
254 254
    }
255 255

	
256 256
    void erase(const Arc& arc) {
257 257
      notifier(Arc()).erase(arc);
258 258
      Parent::erase(arc);
259 259
    }
260 260

	
261 261
    ArcSetExtender() {
262 262
      arc_notifier.setContainer(*this);
263 263
    }
264 264

	
265 265
    ~ArcSetExtender() {
266 266
      arc_notifier.clear();
... ...
@@ -297,208 +297,208 @@
297 297
    }
298 298

	
299 299
    Node fromId(int id, Node) const {
300 300
      return Parent::nodeFromId(id);
301 301
    }
302 302

	
303 303
    Arc fromId(int id, Arc) const {
304 304
      return Parent::arcFromId(id);
305 305
    }
306 306

	
307 307
    Edge fromId(int id, Edge) const {
308 308
      return Parent::edgeFromId(id);
309 309
    }
310 310

	
311 311
    Node oppositeNode(const Node &n, const Edge &e) const {
312 312
      if( n == Parent::u(e))
313
	return Parent::v(e);
313
        return Parent::v(e);
314 314
      else if( n == Parent::v(e))
315
	return Parent::u(e);
315
        return Parent::u(e);
316 316
      else
317
	return INVALID;
317
        return INVALID;
318 318
    }
319 319

	
320 320
    Arc oppositeArc(const Arc &e) const {
321 321
      return Parent::direct(e, !Parent::direction(e));
322 322
    }
323 323

	
324 324
    using Parent::direct;
325 325
    Arc direct(const Edge &e, const Node &s) const {
326 326
      return Parent::direct(e, Parent::u(e) == s);
327 327
    }
328 328

	
329 329
    typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;
330 330
    typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;
331 331

	
332 332

	
333 333
  protected:
334 334

	
335 335
    mutable ArcNotifier arc_notifier;
336 336
    mutable EdgeNotifier edge_notifier;
337 337

	
338 338
  public:
339 339

	
340 340
    using Parent::notifier;
341
    
341

	
342 342
    ArcNotifier& notifier(Arc) const {
343 343
      return arc_notifier;
344 344
    }
345 345

	
346 346
    EdgeNotifier& notifier(Edge) const {
347 347
      return edge_notifier;
348 348
    }
349 349

	
350 350

	
351
    class NodeIt : public Node { 
351
    class NodeIt : public Node {
352 352
      const Graph* graph;
353 353
    public:
354 354

	
355 355
      NodeIt() {}
356 356

	
357 357
      NodeIt(Invalid i) : Node(i) { }
358 358

	
359 359
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
360
	_graph.first(static_cast<Node&>(*this));
360
        _graph.first(static_cast<Node&>(*this));
361 361
      }
362 362

	
363
      NodeIt(const Graph& _graph, const Node& node) 
364
	: Node(node), graph(&_graph) {}
363
      NodeIt(const Graph& _graph, const Node& node)
364
        : Node(node), graph(&_graph) {}
365 365

	
366
      NodeIt& operator++() { 
367
	graph->next(*this);
368
	return *this; 
366
      NodeIt& operator++() {
367
        graph->next(*this);
368
        return *this;
369 369
      }
370 370

	
371 371
    };
372 372

	
373 373

	
374
    class ArcIt : public Arc { 
374
    class ArcIt : public Arc {
375 375
      const Graph* graph;
376 376
    public:
377 377

	
378 378
      ArcIt() { }
379 379

	
380 380
      ArcIt(Invalid i) : Arc(i) { }
381 381

	
382 382
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
383
	_graph.first(static_cast<Arc&>(*this));
383
        _graph.first(static_cast<Arc&>(*this));
384 384
      }
385 385

	
386
      ArcIt(const Graph& _graph, const Arc& e) : 
387
	Arc(e), graph(&_graph) { }
386
      ArcIt(const Graph& _graph, const Arc& e) :
387
        Arc(e), graph(&_graph) { }
388 388

	
389
      ArcIt& operator++() { 
390
	graph->next(*this);
391
	return *this; 
389
      ArcIt& operator++() {
390
        graph->next(*this);
391
        return *this;
392 392
      }
393 393

	
394 394
    };
395 395

	
396 396

	
397
    class OutArcIt : public Arc { 
397
    class OutArcIt : public Arc {
398 398
      const Graph* graph;
399 399
    public:
400 400

	
401 401
      OutArcIt() { }
402 402

	
403 403
      OutArcIt(Invalid i) : Arc(i) { }
404 404

	
405
      OutArcIt(const Graph& _graph, const Node& node) 
406
	: graph(&_graph) {
407
	_graph.firstOut(*this, node);
405
      OutArcIt(const Graph& _graph, const Node& node)
406
        : graph(&_graph) {
407
        _graph.firstOut(*this, node);
408 408
      }
409 409

	
410
      OutArcIt(const Graph& _graph, const Arc& arc) 
411
	: Arc(arc), graph(&_graph) {}
410
      OutArcIt(const Graph& _graph, const Arc& arc)
411
        : Arc(arc), graph(&_graph) {}
412 412

	
413
      OutArcIt& operator++() { 
414
	graph->nextOut(*this);
415
	return *this; 
413
      OutArcIt& operator++() {
414
        graph->nextOut(*this);
415
        return *this;
416 416
      }
417 417

	
418 418
    };
419 419

	
420 420

	
421
    class InArcIt : public Arc { 
421
    class InArcIt : public Arc {
422 422
      const Graph* graph;
423 423
    public:
424 424

	
425 425
      InArcIt() { }
426 426

	
427 427
      InArcIt(Invalid i) : Arc(i) { }
428 428

	
429
      InArcIt(const Graph& _graph, const Node& node) 
430
	: graph(&_graph) {
431
	_graph.firstIn(*this, node);
429
      InArcIt(const Graph& _graph, const Node& node)
430
        : graph(&_graph) {
431
        _graph.firstIn(*this, node);
432 432
      }
433 433

	
434
      InArcIt(const Graph& _graph, const Arc& arc) : 
435
	Arc(arc), graph(&_graph) {}
434
      InArcIt(const Graph& _graph, const Arc& arc) :
435
        Arc(arc), graph(&_graph) {}
436 436

	
437
      InArcIt& operator++() { 
438
	graph->nextIn(*this);
439
	return *this; 
437
      InArcIt& operator++() {
438
        graph->nextIn(*this);
439
        return *this;
440 440
      }
441 441

	
442 442
    };
443 443

	
444 444

	
445
    class EdgeIt : public Parent::Edge { 
445
    class EdgeIt : public Parent::Edge {
446 446
      const Graph* graph;
447 447
    public:
448 448

	
449 449
      EdgeIt() { }
450 450

	
451 451
      EdgeIt(Invalid i) : Edge(i) { }
452 452

	
453 453
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
454
	_graph.first(static_cast<Edge&>(*this));
454
        _graph.first(static_cast<Edge&>(*this));
455 455
      }
456 456

	
457
      EdgeIt(const Graph& _graph, const Edge& e) : 
458
	Edge(e), graph(&_graph) { }
457
      EdgeIt(const Graph& _graph, const Edge& e) :
458
        Edge(e), graph(&_graph) { }
459 459

	
460
      EdgeIt& operator++() { 
461
	graph->next(*this);
462
	return *this; 
460
      EdgeIt& operator++() {
461
        graph->next(*this);
462
        return *this;
463 463
      }
464 464

	
465 465
    };
466 466

	
467 467
    class IncEdgeIt : public Parent::Edge {
468 468
      friend class EdgeSetExtender;
469 469
      const Graph* graph;
470 470
      bool direction;
471 471
    public:
472 472

	
473 473
      IncEdgeIt() { }
474 474

	
475 475
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
476 476

	
477 477
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
478
	_graph.firstInc(*this, direction, n);
478
        _graph.firstInc(*this, direction, n);
479 479
      }
480 480

	
481 481
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
482
	: graph(&_graph), Edge(ue) {
483
	direction = (_graph.source(ue) == n);
482
        : graph(&_graph), Edge(ue) {
483
        direction = (_graph.source(ue) == n);
484 484
      }
485 485

	
486 486
      IncEdgeIt& operator++() {
487
	graph->nextInc(*this, direction);
488
	return *this; 
487
        graph->nextInc(*this, direction);
488
        return *this;
489 489
      }
490 490
    };
491 491

	
492 492
    // \brief Base node of the iterator
493 493
    //
494 494
    // Returns the base node (ie. the source in this case) of the iterator
495 495
    Node baseNode(const OutArcIt &e) const {
496 496
      return Parent::source(static_cast<const Arc&>(e));
497 497
    }
498 498
    // \brief Running node of the iterator
499 499
    //
500 500
    // Returns the running node (ie. the target in this case) of the
501 501
    // iterator
502 502
    Node runningNode(const OutArcIt &e) const {
503 503
      return Parent::target(static_cast<const Arc&>(e));
504 504
    }
... ...
@@ -519,107 +519,107 @@
519 519

	
520 520
    // Base node of the iterator
521 521
    //
522 522
    // Returns the base node of the iterator
523 523
    Node baseNode(const IncEdgeIt &e) const {
524 524
      return e.direction ? u(e) : v(e);
525 525
    }
526 526
    // Running node of the iterator
527 527
    //
528 528
    // Returns the running node of the iterator
529 529
    Node runningNode(const IncEdgeIt &e) const {
530 530
      return e.direction ? v(e) : u(e);
531 531
    }
532 532

	
533 533

	
534 534
    template <typename _Value>
535
    class ArcMap 
535
    class ArcMap
536 536
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
537 537
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
538 538

	
539 539
    public:
540
      explicit ArcMap(const Graph& _g) 
541
	: Parent(_g) {}
542
      ArcMap(const Graph& _g, const _Value& _v) 
543
	: Parent(_g, _v) {}
540
      explicit ArcMap(const Graph& _g)
541
        : Parent(_g) {}
542
      ArcMap(const Graph& _g, const _Value& _v)
543
        : Parent(_g, _v) {}
544 544

	
545 545
      ArcMap& operator=(const ArcMap& cmap) {
546
	return operator=<ArcMap>(cmap);
546
        return operator=<ArcMap>(cmap);
547 547
      }
548 548

	
549 549
      template <typename CMap>
550 550
      ArcMap& operator=(const CMap& cmap) {
551 551
        Parent::operator=(cmap);
552
	return *this;
552
        return *this;
553 553
      }
554 554

	
555 555
    };
556 556

	
557 557

	
558 558
    template <typename _Value>
559
    class EdgeMap 
559
    class EdgeMap
560 560
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
561 561
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
562 562

	
563 563
    public:
564
      explicit EdgeMap(const Graph& _g) 
565
	: Parent(_g) {}
564
      explicit EdgeMap(const Graph& _g)
565
        : Parent(_g) {}
566 566

	
567
      EdgeMap(const Graph& _g, const _Value& _v) 
568
	: Parent(_g, _v) {}
567
      EdgeMap(const Graph& _g, const _Value& _v)
568
        : Parent(_g, _v) {}
569 569

	
570 570
      EdgeMap& operator=(const EdgeMap& cmap) {
571
	return operator=<EdgeMap>(cmap);
571
        return operator=<EdgeMap>(cmap);
572 572
      }
573 573

	
574 574
      template <typename CMap>
575 575
      EdgeMap& operator=(const CMap& cmap) {
576 576
        Parent::operator=(cmap);
577
	return *this;
577
        return *this;
578 578
      }
579 579

	
580 580
    };
581 581

	
582 582

	
583 583
    // Alteration extension
584 584

	
585 585
    Edge addEdge(const Node& from, const Node& to) {
586 586
      Edge edge = Parent::addEdge(from, to);
587 587
      notifier(Edge()).add(edge);
588 588
      std::vector<Arc> arcs;
589 589
      arcs.push_back(Parent::direct(edge, true));
590 590
      arcs.push_back(Parent::direct(edge, false));
591 591
      notifier(Arc()).add(arcs);
592 592
      return edge;
593 593
    }
594
    
594

	
595 595
    void clear() {
596 596
      notifier(Arc()).clear();
597 597
      notifier(Edge()).clear();
598 598
      Parent::clear();
599 599
    }
600 600

	
601 601
    void erase(const Edge& edge) {
602 602
      std::vector<Arc> arcs;
603 603
      arcs.push_back(Parent::direct(edge, true));
604 604
      arcs.push_back(Parent::direct(edge, false));
605 605
      notifier(Arc()).erase(arcs);
606 606
      notifier(Edge()).erase(edge);
607 607
      Parent::erase(edge);
608 608
    }
609 609

	
610 610

	
611 611
    EdgeSetExtender() {
612 612
      arc_notifier.setContainer(*this);
613 613
      edge_notifier.setContainer(*this);
614 614
    }
615 615

	
616 616
    ~EdgeSetExtender() {
617 617
      edge_notifier.clear();
618 618
      arc_notifier.clear();
619 619
    }
620
    
620

	
621 621
  };
622 622

	
623 623
}
624 624

	
625 625
#endif
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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_SOLVER_BITS_H
20 20
#define LEMON_BITS_SOLVER_BITS_H
21 21

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
///\file
20 20
///\brief Some basic non-inline functions and static global data.
21 21

	
... ...
@@ -83,33 +83,33 @@
83 83
      double tck=sysconf(_SC_CLK_TCK);
84 84
      times(&ts);
85 85
      utime=ts.tms_utime/tck;
86 86
      stime=ts.tms_stime/tck;
87 87
      cutime=ts.tms_cutime/tck;
88 88
      cstime=ts.tms_cstime/tck;
89 89
#endif
90 90
    }
91 91

	
92 92
    std::string getWinFormattedDate()
93 93
    {
94 94
      std::ostringstream os;
95 95
#ifdef WIN32
96 96
      SYSTEMTIME time;
97 97
      GetSystemTime(&time);
98 98
      char buf1[11], buf2[9], buf3[5];
99
	  if (GetDateFormat(MY_LOCALE, 0, &time,
99
          if (GetDateFormat(MY_LOCALE, 0, &time,
100 100
                        ("ddd MMM dd"), buf1, 11) &&
101 101
          GetTimeFormat(MY_LOCALE, 0, &time,
102 102
                        ("HH':'mm':'ss"), buf2, 9) &&
103 103
          GetDateFormat(MY_LOCALE, 0, &time,
104 104
                        ("yyyy"), buf3, 5)) {
105 105
        os << buf1 << ' ' << buf2 << ' ' << buf3;
106 106
      }
107 107
      else os << "unknown";
108 108
#else
109 109
      timeval tv;
110 110
      gettimeofday(&tv, 0);
111 111

	
112 112
      char cbuf[26];
113 113
      ctime_r(&tv.tv_sec,cbuf);
114 114
      os << cbuf;
115 115
#endif
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_BUCKET_HEAP_H
20 20
#define LEMON_BUCKET_HEAP_H
21 21

	
... ...
@@ -371,33 +371,33 @@
371 371

	
372 372
  }; // class BucketHeap
373 373

	
374 374
  /// \ingroup heaps
375 375
  ///
376 376
  /// \brief Simplified bucket heap data structure.
377 377
  ///
378 378
  /// This class implements a simplified \e bucket \e heap data
379 379
  /// structure. It does not provide some functionality, but it is
380 380
  /// faster and simpler than BucketHeap. The main difference is
381 381
  /// that BucketHeap stores a doubly-linked list for each key while
382 382
  /// this class stores only simply-linked lists. It supports erasing
383 383
  /// only for the item having minimum priority and it does not support
384 384
  /// key increasing and decreasing.
385 385
  ///
386 386
  /// Note that this implementation does not conform to the
387
  /// \ref concepts::Heap "heap concept" due to the lack of some 
387
  /// \ref concepts::Heap "heap concept" due to the lack of some
388 388
  /// functionality.
389 389
  ///
390 390
  /// \tparam IM A read-writable item map with \c int values, used
391 391
  /// internally to handle the cross references.
392 392
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
393 393
  /// The default is \e min-heap. If this parameter is set to \c false,
394 394
  /// then the comparison is reversed, so the top(), prio() and pop()
395 395
  /// functions deal with the item having maximum priority instead of the
396 396
  /// minimum.
397 397
  ///
398 398
  /// \sa BucketHeap
399 399
  template <typename IM, bool MIN = true >
400 400
  class SimpleBucketHeap {
401 401

	
402 402
  public:
403 403

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

	
... ...
@@ -120,33 +120,33 @@
120 120
    /// Enum type containing the problem type constants that can be
121 121
    /// returned by the \ref run() function of the algorithm.
122 122
    enum ProblemType {
123 123
      /// The problem has no feasible solution (flow).
124 124
      INFEASIBLE,
125 125
      /// The problem has optimal solution (i.e. it is feasible and
126 126
      /// bounded), and the algorithm has found optimal flow and node
127 127
      /// potentials (primal and dual solutions).
128 128
      OPTIMAL,
129 129
      /// The digraph contains an arc of negative cost and infinite
130 130
      /// upper bound. It means that the objective function is unbounded
131 131
      /// on that arc, however, note that it could actually be bounded
132 132
      /// over the feasible flows, but this algroithm cannot handle
133 133
      /// these cases.
134 134
      UNBOUNDED
135 135
    };
136
  
136

	
137 137
  private:
138 138

	
139 139
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
140 140

	
141 141
    typedef std::vector<int> IntVector;
142 142
    typedef std::vector<Value> ValueVector;
143 143
    typedef std::vector<Cost> CostVector;
144 144
    typedef std::vector<char> BoolVector;
145 145
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
146 146

	
147 147
  private:
148 148

	
149 149
    // Data related to the underlying digraph
150 150
    const GR &_graph;
151 151
    int _node_num;
152 152
    int _arc_num;
... ...
@@ -171,63 +171,63 @@
171 171
    ValueVector _lower;
172 172
    ValueVector _upper;
173 173
    CostVector _cost;
174 174
    ValueVector _supply;
175 175

	
176 176
    ValueVector _res_cap;
177 177
    CostVector _pi;
178 178
    ValueVector _excess;
179 179
    IntVector _excess_nodes;
180 180
    IntVector _deficit_nodes;
181 181

	
182 182
    Value _delta;
183 183
    int _factor;
184 184
    IntVector _pred;
185 185

	
186 186
  public:
187
  
187

	
188 188
    /// \brief Constant for infinite upper bounds (capacities).
189 189
    ///
190 190
    /// Constant for infinite upper bounds (capacities).
191 191
    /// It is \c std::numeric_limits<Value>::infinity() if available,
192 192
    /// \c std::numeric_limits<Value>::max() otherwise.
193 193
    const Value INF;
194 194

	
195 195
  private:
196 196

	
197 197
    // Special implementation of the Dijkstra algorithm for finding
198 198
    // shortest paths in the residual network of the digraph with
199 199
    // respect to the reduced arc costs and modifying the node
200 200
    // potentials according to the found distance labels.
201 201
    class ResidualDijkstra
202 202
    {
203 203
    private:
204 204

	
205 205
      int _node_num;
206 206
      bool _geq;
207 207
      const IntVector &_first_out;
208 208
      const IntVector &_target;
209 209
      const CostVector &_cost;
210 210
      const ValueVector &_res_cap;
211 211
      const ValueVector &_excess;
212 212
      CostVector &_pi;
213 213
      IntVector &_pred;
214
      
214

	
215 215
      IntVector _proc_nodes;
216 216
      CostVector _dist;
217
      
217

	
218 218
    public:
219 219

	
220 220
      ResidualDijkstra(CapacityScaling& cs) :
221 221
        _node_num(cs._node_num), _geq(cs._sum_supply < 0),
222 222
        _first_out(cs._first_out), _target(cs._target), _cost(cs._cost),
223 223
        _res_cap(cs._res_cap), _excess(cs._excess), _pi(cs._pi),
224 224
        _pred(cs._pred), _dist(cs._node_num)
225 225
      {}
226 226

	
227 227
      int run(int s, Value delta = 1) {
228 228
        RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP);
229 229
        Heap heap(heap_cross_ref);
230 230
        heap.push(s, 0);
231 231
        _pred[s] = -1;
232 232
        _proc_nodes.clear();
233 233

	
... ...
@@ -426,33 +426,33 @@
426 426
    /// assigned to \c t and all other nodes have zero supply value.
427 427
    ///
428 428
    /// \param s The source node.
429 429
    /// \param t The target node.
430 430
    /// \param k The required amount of flow from node \c s to node \c t
431 431
    /// (i.e. the supply of \c s and the demand of \c t).
432 432
    ///
433 433
    /// \return <tt>(*this)</tt>
434 434
    CapacityScaling& stSupply(const Node& s, const Node& t, Value k) {
435 435
      for (int i = 0; i != _node_num; ++i) {
436 436
        _supply[i] = 0;
437 437
      }
438 438
      _supply[_node_id[s]] =  k;
439 439
      _supply[_node_id[t]] = -k;
440 440
      return *this;
441 441
    }
442
    
442

	
443 443
    /// @}
444 444

	
445 445
    /// \name Execution control
446 446
    /// The algorithm can be executed using \ref run().
447 447

	
448 448
    /// @{
449 449

	
450 450
    /// \brief Run the algorithm.
451 451
    ///
452 452
    /// This function runs the algorithm.
453 453
    /// The paramters can be specified using functions \ref lowerMap(),
454 454
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
455 455
    /// For example,
456 456
    /// \code
457 457
    ///   CapacityScaling<ListDigraph> cs(graph);
458 458
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
... ...
@@ -562,33 +562,33 @@
562 562
      _node_num = countNodes(_graph);
563 563
      _arc_num = countArcs(_graph);
564 564
      _res_arc_num = 2 * (_arc_num + _node_num);
565 565
      _root = _node_num;
566 566
      ++_node_num;
567 567

	
568 568
      _first_out.resize(_node_num + 1);
569 569
      _forward.resize(_res_arc_num);
570 570
      _source.resize(_res_arc_num);
571 571
      _target.resize(_res_arc_num);
572 572
      _reverse.resize(_res_arc_num);
573 573

	
574 574
      _lower.resize(_res_arc_num);
575 575
      _upper.resize(_res_arc_num);
576 576
      _cost.resize(_res_arc_num);
577 577
      _supply.resize(_node_num);
578
      
578

	
579 579
      _res_cap.resize(_res_arc_num);
580 580
      _pi.resize(_node_num);
581 581
      _excess.resize(_node_num);
582 582
      _pred.resize(_node_num);
583 583

	
584 584
      // Copy the graph
585 585
      int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;
586 586
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
587 587
        _node_id[n] = i;
588 588
      }
589 589
      i = 0;
590 590
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
591 591
        _first_out[i] = j;
592 592
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
593 593
          _arc_idf[a] = j;
594 594
          _forward[j] = true;
... ...
@@ -606,33 +606,33 @@
606 606
        _target[j] = _root;
607 607
        _reverse[j] = k;
608 608
        _forward[k] = true;
609 609
        _source[k] = _root;
610 610
        _target[k] = i;
611 611
        _reverse[k] = j;
612 612
        ++j; ++k;
613 613
      }
614 614
      _first_out[i] = j;
615 615
      _first_out[_node_num] = k;
616 616
      for (ArcIt a(_graph); a != INVALID; ++a) {
617 617
        int fi = _arc_idf[a];
618 618
        int bi = _arc_idb[a];
619 619
        _reverse[fi] = bi;
620 620
        _reverse[bi] = fi;
621 621
      }
622
      
622

	
623 623
      // Reset parameters
624 624
      resetParams();
625 625
      return *this;
626 626
    }
627 627

	
628 628
    /// @}
629 629

	
630 630
    /// \name Query Functions
631 631
    /// The results of the algorithm can be obtained using these
632 632
    /// functions.\n
633 633
    /// The \ref run() function must be called before using them.
634 634

	
635 635
    /// @{
636 636

	
637 637
    /// \brief Return the total cost of the found flow.
638 638
    ///
... ...
@@ -715,33 +715,33 @@
715 715
    }
716 716

	
717 717
    /// @}
718 718

	
719 719
  private:
720 720

	
721 721
    // Initialize the algorithm
722 722
    ProblemType init() {
723 723
      if (_node_num <= 1) return INFEASIBLE;
724 724

	
725 725
      // Check the sum of supply values
726 726
      _sum_supply = 0;
727 727
      for (int i = 0; i != _root; ++i) {
728 728
        _sum_supply += _supply[i];
729 729
      }
730 730
      if (_sum_supply > 0) return INFEASIBLE;
731
      
731

	
732 732
      // Initialize vectors
733 733
      for (int i = 0; i != _root; ++i) {
734 734
        _pi[i] = 0;
735 735
        _excess[i] = _supply[i];
736 736
      }
737 737

	
738 738
      // Remove non-zero lower bounds
739 739
      const Value MAX = std::numeric_limits<Value>::max();
740 740
      int last_out;
741 741
      if (_have_lower) {
742 742
        for (int i = 0; i != _root; ++i) {
743 743
          last_out = _first_out[i+1];
744 744
          for (int j = _first_out[i]; j != last_out; ++j) {
745 745
            if (_forward[j]) {
746 746
              Value c = _lower[j];
747 747
              if (c >= 0) {
... ...
@@ -763,33 +763,33 @@
763 763
      }
764 764

	
765 765
      // Handle negative costs
766 766
      for (int i = 0; i != _root; ++i) {
767 767
        last_out = _first_out[i+1] - 1;
768 768
        for (int j = _first_out[i]; j != last_out; ++j) {
769 769
          Value rc = _res_cap[j];
770 770
          if (_cost[j] < 0 && rc > 0) {
771 771
            if (rc >= MAX) return UNBOUNDED;
772 772
            _excess[i] -= rc;
773 773
            _excess[_target[j]] += rc;
774 774
            _res_cap[j] = 0;
775 775
            _res_cap[_reverse[j]] += rc;
776 776
          }
777 777
        }
778 778
      }
779
      
779

	
780 780
      // Handle GEQ supply type
781 781
      if (_sum_supply < 0) {
782 782
        _pi[_root] = 0;
783 783
        _excess[_root] = -_sum_supply;
784 784
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
785 785
          int ra = _reverse[a];
786 786
          _res_cap[a] = -_sum_supply + 1;
787 787
          _res_cap[ra] = 0;
788 788
          _cost[a] = 0;
789 789
          _cost[ra] = 0;
790 790
        }
791 791
      } else {
792 792
        _pi[_root] = 0;
793 793
        _excess[_root] = 0;
794 794
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
795 795
          int ra = _reverse[a];
... ...
@@ -831,35 +831,35 @@
831 831
      else
832 832
        pt = startWithoutScaling();
833 833

	
834 834
      // Handle non-zero lower bounds
835 835
      if (_have_lower) {
836 836
        int limit = _first_out[_root];
837 837
        for (int j = 0; j != limit; ++j) {
838 838
          if (!_forward[j]) _res_cap[j] += _lower[j];
839 839
        }
840 840
      }
841 841

	
842 842
      // Shift potentials if necessary
843 843
      Cost pr = _pi[_root];
844 844
      if (_sum_supply < 0 || pr > 0) {
845 845
        for (int i = 0; i != _node_num; ++i) {
846 846
          _pi[i] -= pr;
847
        }        
847
        }
848 848
      }
849
      
849

	
850 850
      return pt;
851 851
    }
852 852

	
853 853
    // Execute the capacity scaling algorithm
854 854
    ProblemType startWithScaling() {
855 855
      // Perform capacity scaling phases
856 856
      int s, t;
857 857
      ResidualDijkstra _dijkstra(*this);
858 858
      while (true) {
859 859
        // Saturate all arcs not satisfying the optimality condition
860 860
        int last_out;
861 861
        for (int u = 0; u != _node_num; ++u) {
862 862
          last_out = _sum_supply < 0 ?
863 863
            _first_out[u+1] : _first_out[u+1] - 1;
864 864
          for (int a = _first_out[u]; a != last_out; ++a) {
865 865
            int v = _target[a];
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
// -*- C++ -*-
20 20
#ifndef LEMON_CBC_H
21 21
#define LEMON_CBC_H
... ...
@@ -108,23 +108,23 @@
108 108

	
109 109
    virtual ColTypes _getColType(int col) const;
110 110
    virtual void _setColType(int col, ColTypes col_type);
111 111

	
112 112
    virtual SolveExitStatus _solve();
113 113
    virtual ProblemType _getType() const;
114 114
    virtual Value _getSol(int i) const;
115 115
    virtual Value _getSolValue() const;
116 116

	
117 117
    virtual void _clear();
118 118

	
119 119
    virtual void _messageLevel(MessageLevel level);
120 120
    void _applyMessageLevel();
121 121

	
122 122
    int _message_level;
123 123

	
124
    
124

	
125 125

	
126 126
  };
127 127

	
128 128
}
129 129

	
130 130
#endif
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_CIRCULATION_H
20 20
#define LEMON_CIRCULATION_H
21 21

	
... ...
@@ -46,34 +46,34 @@
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
    /// The type of the map that stores the signed supply values of the 
63
    /// nodes. 
62
    /// The type of the map that stores the signed supply values of the
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 75
#ifdef DOXYGEN
76 76
    typedef GR::ArcMap<Value> FlowMap;
77 77
#else
78 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79 79
#endif
... ...
@@ -128,43 +128,43 @@
128 128

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

	
141 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
142 142
     \geq sup(u) \quad \forall u\in V, \f]
143 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
144
     
144

	
145 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
146 146
     zero or negative in order to have a feasible solution (since the sum
147 147
     of the expressions on the left-hand side of the inequalities is zero).
148 148
     It means that the total demand must be greater or equal to the total
149 149
     supply and all the supplies have to be carried out from the supply nodes,
150 150
     but there could be demands that are not satisfied.
151 151
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
152 152
     constraints have to be satisfied with equality, i.e. all demands
153 153
     have to be satisfied and all supplies have to be used.
154
     
154

	
155 155
     If you need the opposite inequalities in the supply/demand constraints
156 156
     (i.e. the total demand is less than the total supply and all the demands
157 157
     have to be satisfied while there could be supplies that are not used),
158 158
     then you could easily transform the problem to the above form by reversing
159 159
     the direction of the arcs and taking the negative of the supply values
160 160
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
161 161

	
162 162
     This algorithm either calculates a feasible circulation, or provides
163 163
     a \ref barrier() "barrier", which prooves that a feasible soultion
164 164
     cannot exist.
165 165

	
166 166
     Note that this algorithm also provides a feasible solution for the
167 167
     \ref min_cost_flow "minimum cost flow problem".
168 168

	
169 169
     \tparam GR The type of the digraph the algorithm runs on.
170 170
     \tparam LM The type of the lower bound map. The default
... ...
@@ -324,33 +324,33 @@
324 324
    };
325 325

	
326 326
    /// @}
327 327

	
328 328
  protected:
329 329

	
330 330
    Circulation() {}
331 331

	
332 332
  public:
333 333

	
334 334
    /// Constructor.
335 335

	
336 336
    /// The constructor of the class.
337 337
    ///
338 338
    /// \param graph The digraph the algorithm runs on.
339 339
    /// \param lower The lower bounds for the flow values on the arcs.
340
    /// \param upper The upper bounds (capacities) for the flow values 
340
    /// \param upper The upper bounds (capacities) for the flow values
341 341
    /// on the arcs.
342 342
    /// \param supply The signed supply values of the nodes.
343 343
    Circulation(const Digraph &graph, const LowerMap &lower,
344 344
                const UpperMap &upper, const SupplyMap &supply)
345 345
      : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
346 346
        _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
347 347
        _excess(NULL) {}
348 348

	
349 349
    /// Destructor.
350 350
    ~Circulation() {
351 351
      destroyStructures();
352 352
    }
353 353

	
354 354

	
355 355
  private:
356 356

	
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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 <lemon/clp.h>
20 20
#include <coin/ClpSimplex.hpp>
21 21

	
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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_CLP_H
20 20
#define LEMON_CLP_H
21 21

	
... ...
@@ -125,33 +125,33 @@
125 125
    virtual Value _getDual(int i) const;
126 126

	
127 127
    virtual Value _getPrimalValue() const;
128 128

	
129 129
    virtual Value _getPrimalRay(int i) const;
130 130
    virtual Value _getDualRay(int i) const;
131 131

	
132 132
    virtual VarStatus _getColStatus(int i) const;
133 133
    virtual VarStatus _getRowStatus(int i) const;
134 134

	
135 135
    virtual ProblemType _getPrimalType() const;
136 136
    virtual ProblemType _getDualType() const;
137 137

	
138 138
    virtual void _clear();
139 139

	
140 140
    virtual void _messageLevel(MessageLevel);
141
    
141

	
142 142
  public:
143 143

	
144 144
    ///Solves LP with primal simplex method.
145 145
    SolveExitStatus solvePrimal();
146 146

	
147 147
    ///Solves LP with dual simplex method.
148 148
    SolveExitStatus solveDual();
149 149

	
150 150
    ///Solves LP with barrier method.
151 151
    SolveExitStatus solveBarrier();
152 152

	
153 153
    ///Returns the constraint identifier understood by CLP.
154 154
    int clpRow(Row r) const { return rows(id(r)); }
155 155

	
156 156
    ///Returns the variable identifier understood by CLP.
157 157
    int clpCol(Col c) const { return cols(id(c)); }
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_CONCEPTS_DIGRAPH_H
20 20
#define LEMON_CONCEPTS_DIGRAPH_H
21 21

	
... ...
@@ -421,33 +421,33 @@
421 421

	
422 422
      /// \brief Standard graph map type for the nodes.
423 423
      ///
424 424
      /// Standard graph map type for the nodes.
425 425
      /// It conforms to the ReferenceMap concept.
426 426
      template<class T>
427 427
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
428 428
      public:
429 429

	
430 430
        /// Constructor
431 431
        explicit NodeMap(const Digraph&) { }
432 432
        /// Constructor with given initial value
433 433
        NodeMap(const Digraph&, T) { }
434 434

	
435 435
      private:
436 436
        ///Copy constructor
437
        NodeMap(const NodeMap& nm) : 
437
        NodeMap(const NodeMap& nm) :
438 438
          ReferenceMap<Node, T, T&, const T&>(nm) { }
439 439
        ///Assignment operator
440 440
        template <typename CMap>
441 441
        NodeMap& operator=(const CMap&) {
442 442
          checkConcept<ReadMap<Node, T>, CMap>();
443 443
          return *this;
444 444
        }
445 445
      };
446 446

	
447 447
      /// \brief Standard graph map type for the arcs.
448 448
      ///
449 449
      /// Standard graph map type for the arcs.
450 450
      /// It conforms to the ReferenceMap concept.
451 451
      template<class T>
452 452
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
453 453
      public:
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of undirected graphs.
... ...
@@ -30,33 +30,33 @@
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of undirected graphs.
37 37
    ///
38 38
    /// This class describes the common interface of all undirected
39 39
    /// graphs.
40 40
    ///
41 41
    /// Like all concept classes, it only provides an interface
42 42
    /// without any sensible implementation. So any general algorithm for
43 43
    /// undirected graphs should compile with this class, but it will not
44 44
    /// run properly, of course.
45 45
    /// An actual graph implementation like \ref ListGraph or
46
    /// \ref SmartGraph may have additional functionality.    
46
    /// \ref SmartGraph may have additional functionality.
47 47
    ///
48 48
    /// The undirected graphs also fulfill the concept of \ref Digraph
49 49
    /// "directed graphs", since each edge can also be regarded as two
50 50
    /// oppositely directed arcs.
51 51
    /// Undirected graphs provide an Edge type for the undirected edges and
52 52
    /// an Arc type for the directed arcs. The Arc type is convertible to
53 53
    /// Edge or inherited from it, i.e. the corresponding edge can be
54 54
    /// obtained from an arc.
55 55
    /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
56 56
    /// and ArcMap classes can be used for the arcs (just like in digraphs).
57 57
    /// Both InArcIt and OutArcIt iterates on the same edges but with
58 58
    /// opposite direction. IncEdgeIt also iterates on the same edges
59 59
    /// as OutArcIt and InArcIt, but it is not convertible to Arc,
60 60
    /// only to Edge.
61 61
    ///
62 62
    /// In LEMON, each undirected edge has an inherent orientation.
... ...
@@ -72,33 +72,33 @@
72 72
    /// \sa Digraph
73 73
    class Graph {
74 74
    private:
75 75
      /// Graphs are \e not copy constructible. Use DigraphCopy instead.
76 76
      Graph(const Graph&) {}
77 77
      /// \brief Assignment of a graph to another one is \e not allowed.
78 78
      /// Use DigraphCopy instead.
79 79
      void operator=(const Graph&) {}
80 80

	
81 81
    public:
82 82
      /// Default constructor.
83 83
      Graph() {}
84 84

	
85 85
      /// \brief Undirected graphs should be tagged with \c UndirectedTag.
86 86
      ///
87 87
      /// Undirected graphs should be tagged with \c UndirectedTag.
88
      /// 
88
      ///
89 89
      /// This tag helps the \c enable_if technics to make compile time
90 90
      /// specializations for undirected graphs.
91 91
      typedef True UndirectedTag;
92 92

	
93 93
      /// The node type of the graph
94 94

	
95 95
      /// This class identifies a node of the graph. It also serves
96 96
      /// as a base class of the node iterators,
97 97
      /// thus they convert to this type.
98 98
      class Node {
99 99
      public:
100 100
        /// Default constructor
101 101

	
102 102
        /// Default constructor.
103 103
        /// \warning It sets the object to an undefined value.
104 104
        Node() { }
... ...
@@ -347,33 +347,33 @@
347 347
        bool operator==(Arc) const { return true; }
348 348
        /// Inequality operator
349 349

	
350 350
        /// Inequality operator.
351 351
        bool operator!=(Arc) const { return true; }
352 352

	
353 353
        /// Artificial ordering operator.
354 354

	
355 355
        /// Artificial ordering operator.
356 356
        ///
357 357
        /// \note This operator only has to define some strict ordering of
358 358
        /// the arcs; this order has nothing to do with the iteration
359 359
        /// ordering of the arcs.
360 360
        bool operator<(Arc) const { return false; }
361 361

	
362 362
        /// Converison to \c Edge
363
        
363

	
364 364
        /// Converison to \c Edge.
365 365
        ///
366 366
        operator Edge() const { return Edge(); }
367 367
      };
368 368

	
369 369
      /// Iterator class for the arcs.
370 370

	
371 371
      /// This iterator goes through each directed arc of the graph.
372 372
      /// Its usage is quite simple, for example, you can count the number
373 373
      /// of arcs in a graph \c g of type \c %Graph as follows:
374 374
      ///\code
375 375
      /// int count=0;
376 376
      /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
377 377
      ///\endcode
378 378
      class ArcIt : public Arc {
379 379
      public:
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concepts of graph components.
... ...
@@ -25,33 +25,33 @@
25 25

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

	
29 29
#include <lemon/bits/alteration_notifier.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \brief Concept class for \c Node, \c Arc and \c Edge types.
35 35
    ///
36 36
    /// This class describes the concept of \c Node, \c Arc and \c Edge
37 37
    /// subtypes of digraph and graph types.
38 38
    ///
39 39
    /// \note This class is a template class so that we can use it to
40 40
    /// create graph skeleton classes. The reason for this is that \c Node
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same 
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same
42 42
    /// base class. For \c Node you should instantiate it with character
43 43
    /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
44 44
#ifndef DOXYGEN
45 45
    template <char sel = '0'>
46 46
#endif
47 47
    class GraphItem {
48 48
    public:
49 49
      /// \brief Default constructor.
50 50
      ///
51 51
      /// Default constructor.
52 52
      /// \warning The default constructor is not required to set
53 53
      /// the item to some well-defined value. So you should consider it
54 54
      /// as uninitialized.
55 55
      GraphItem() {}
56 56

	
57 57
      /// \brief Copy constructor.
... ...
@@ -76,66 +76,66 @@
76 76
      /// This operator makes the item invalid.
77 77
      GraphItem& operator=(Invalid) { return *this; }
78 78

	
79 79
      /// \brief Equality operator.
80 80
      ///
81 81
      /// Equality operator.
82 82
      bool operator==(const GraphItem&) const { return false; }
83 83

	
84 84
      /// \brief Inequality operator.
85 85
      ///
86 86
      /// Inequality operator.
87 87
      bool operator!=(const GraphItem&) const { return false; }
88 88

	
89 89
      /// \brief Ordering operator.
90 90
      ///
91 91
      /// This operator defines an ordering of the items.
92
      /// It makes possible to use graph item types as key types in 
92
      /// It makes possible to use graph item types as key types in
93 93
      /// associative containers (e.g. \c std::map).
94 94
      ///
95 95
      /// \note This operator only has to define some strict ordering of
96 96
      /// the items; this order has nothing to do with the iteration
97 97
      /// ordering of the items.
98 98
      bool operator<(const GraphItem&) const { return false; }
99 99

	
100 100
      template<typename _GraphItem>
101 101
      struct Constraints {
102 102
        void constraints() {
103 103
          _GraphItem i1;
104 104
          i1=INVALID;
105 105
          _GraphItem i2 = i1;
106 106
          _GraphItem i3 = INVALID;
107 107

	
108 108
          i1 = i2 = i3;
109 109

	
110 110
          bool b;
111 111
          b = (ia == ib) && (ia != ib);
112 112
          b = (ia == INVALID) && (ib != INVALID);
113 113
          b = (ia < ib);
114 114
        }
115 115

	
116 116
        const _GraphItem &ia;
117 117
        const _GraphItem &ib;
118 118
      };
119 119
    };
120 120

	
121 121
    /// \brief Base skeleton class for directed graphs.
122 122
    ///
123 123
    /// This class describes the base interface of directed graph types.
124 124
    /// All digraph %concepts have to conform to this class.
125
    /// It just provides types for nodes and arcs and functions 
125
    /// It just provides types for nodes and arcs and functions
126 126
    /// to get the source and the target nodes of arcs.
127 127
    class BaseDigraphComponent {
128 128
    public:
129 129

	
130 130
      typedef BaseDigraphComponent Digraph;
131 131

	
132 132
      /// \brief Node class of the digraph.
133 133
      ///
134 134
      /// This class represents the nodes of the digraph.
135 135
      typedef GraphItem<'n'> Node;
136 136

	
137 137
      /// \brief Arc class of the digraph.
138 138
      ///
139 139
      /// This class represents the arcs of the digraph.
140 140
      typedef GraphItem<'a'> Arc;
141 141

	
... ...
@@ -413,33 +413,33 @@
413 413
        void constraints() {
414 414
          checkConcept<IDableDigraphComponent<Base>, _Graph >();
415 415
          typename _Graph::Edge edge;
416 416
          int ueid = graph.id(edge);
417 417
          ueid = graph.id(edge);
418 418
          edge = graph.edgeFromId(ueid);
419 419
          ueid = graph.maxEdgeId();
420 420
          ignore_unused_variable_warning(ueid);
421 421
        }
422 422

	
423 423
        const _Graph& graph;
424 424
      };
425 425
    };
426 426

	
427 427
    /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
428 428
    ///
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and 
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and
430 430
    /// \c EdgeIt subtypes of digraph and graph types.
431 431
    template <typename GR, typename Item>
432 432
    class GraphItemIt : public Item {
433 433
    public:
434 434
      /// \brief Default constructor.
435 435
      ///
436 436
      /// Default constructor.
437 437
      /// \warning The default constructor is not required to set
438 438
      /// the iterator to some well-defined value. So you should consider it
439 439
      /// as uninitialized.
440 440
      GraphItemIt() {}
441 441

	
442 442
      /// \brief Copy constructor.
443 443
      ///
444 444
      /// Copy constructor.
445 445
      GraphItemIt(const GraphItemIt& it) : Item(it) {}
... ...
@@ -453,33 +453,33 @@
453 453
      ///
454 454
      /// Constructor for conversion from \c INVALID.
455 455
      /// It initializes the iterator to be invalid.
456 456
      /// \sa Invalid for more details.
457 457
      GraphItemIt(Invalid) {}
458 458

	
459 459
      /// \brief Assignment operator.
460 460
      ///
461 461
      /// Assignment operator for the iterator.
462 462
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
463 463

	
464 464
      /// \brief Increment the iterator.
465 465
      ///
466 466
      /// This operator increments the iterator, i.e. assigns it to the
467 467
      /// next item.
468 468
      GraphItemIt& operator++() { return *this; }
469
 
469

	
470 470
      /// \brief Equality operator
471 471
      ///
472 472
      /// Equality operator.
473 473
      /// Two iterators are equal if and only if they point to the
474 474
      /// same object or both are invalid.
475 475
      bool operator==(const GraphItemIt&) const { return true;}
476 476

	
477 477
      /// \brief Inequality operator
478 478
      ///
479 479
      /// Inequality operator.
480 480
      /// Two iterators are equal if and only if they point to the
481 481
      /// same object or both are invalid.
482 482
      bool operator!=(const GraphItemIt&) const { return true;}
483 483

	
484 484
      template<typename _GraphItemIt>
485 485
      struct Constraints {
... ...
@@ -488,65 +488,65 @@
488 488
          _GraphItemIt it1(g);
489 489
          _GraphItemIt it2;
490 490
          _GraphItemIt it3 = it1;
491 491
          _GraphItemIt it4 = INVALID;
492 492

	
493 493
          it2 = ++it1;
494 494
          ++it2 = it1;
495 495
          ++(++it1);
496 496

	
497 497
          Item bi = it1;
498 498
          bi = it2;
499 499
        }
500 500
        const GR& g;
501 501
      };
502 502
    };
503 503

	
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and 
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and
505 505
    /// \c IncEdgeIt types.
506 506
    ///
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt 
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt
508 508
    /// and \c IncEdgeIt subtypes of digraph and graph types.
509 509
    ///
510 510
    /// \note Since these iterator classes do not inherit from the same
511 511
    /// base class, there is an additional template parameter (selector)
512
    /// \c sel. For \c InArcIt you should instantiate it with character 
512
    /// \c sel. For \c InArcIt you should instantiate it with character
513 513
    /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
514 514
    template <typename GR,
515 515
              typename Item = typename GR::Arc,
516 516
              typename Base = typename GR::Node,
517 517
              char sel = '0'>
518 518
    class GraphIncIt : public Item {
519 519
    public:
520 520
      /// \brief Default constructor.
521 521
      ///
522 522
      /// Default constructor.
523 523
      /// \warning The default constructor is not required to set
524 524
      /// the iterator to some well-defined value. So you should consider it
525 525
      /// as uninitialized.
526 526
      GraphIncIt() {}
527 527

	
528 528
      /// \brief Copy constructor.
529 529
      ///
530 530
      /// Copy constructor.
531 531
      GraphIncIt(const GraphIncIt& it) : Item(it) {}
532 532

	
533
      /// \brief Constructor that sets the iterator to the first 
533
      /// \brief Constructor that sets the iterator to the first
534 534
      /// incoming or outgoing arc.
535 535
      ///
536
      /// Constructor that sets the iterator to the first arc 
536
      /// Constructor that sets the iterator to the first arc
537 537
      /// incoming to or outgoing from the given node.
538 538
      explicit GraphIncIt(const GR&, const Base&) {}
539 539

	
540 540
      /// \brief Constructor for conversion from \c INVALID.
541 541
      ///
542 542
      /// Constructor for conversion from \c INVALID.
543 543
      /// It initializes the iterator to be invalid.
544 544
      /// \sa Invalid for more details.
545 545
      GraphIncIt(Invalid) {}
546 546

	
547 547
      /// \brief Assignment operator.
548 548
      ///
549 549
      /// Assignment operator for the iterator.
550 550
      GraphIncIt& operator=(const GraphIncIt&) { return *this; }
551 551

	
552 552
      /// \brief Increment the iterator.
... ...
@@ -791,42 +791,42 @@
791 791

	
792 792
      using IterableDigraphComponent<Base>::first;
793 793
      using IterableDigraphComponent<Base>::next;
794 794

	
795 795
      /// \brief Return the first edge.
796 796
      ///
797 797
      /// This function gives back the first edge in the iteration order.
798 798
      void first(Edge&) const {}
799 799

	
800 800
      /// \brief Return the next edge.
801 801
      ///
802 802
      /// This function gives back the next edge in the iteration order.
803 803
      void next(Edge&) const {}
804 804

	
805 805
      /// \brief Return the first edge incident to the given node.
806 806
      ///
807
      /// This function gives back the first edge incident to the given 
807
      /// This function gives back the first edge incident to the given
808 808
      /// node. The bool parameter gives back the direction for which the
809
      /// source node of the directed arc representing the edge is the 
809
      /// source node of the directed arc representing the edge is the
810 810
      /// given node.
811 811
      void firstInc(Edge&, bool&, const Node&) const {}
812 812

	
813 813
      /// \brief Gives back the next of the edges from the
814 814
      /// given node.
815 815
      ///
816
      /// This function gives back the next edge incident to the given 
816
      /// This function gives back the next edge incident to the given
817 817
      /// node. The bool parameter should be used as \c firstInc() use it.
818 818
      void nextInc(Edge&, bool&) const {}
819 819

	
820 820
      using IterableDigraphComponent<Base>::baseNode;
821 821
      using IterableDigraphComponent<Base>::runningNode;
822 822

	
823 823
      /// @}
824 824

	
825 825
      /// \name Class Based Iteration
826 826
      ///
827 827
      /// This interface provides iterator classes for edges.
828 828
      ///
829 829
      /// @{
830 830

	
831 831
      /// \brief This iterator goes through each edge.
832 832
      ///
... ...
@@ -977,33 +977,33 @@
977 977
      template <typename _Graph>
978 978
      struct Constraints {
979 979
        void constraints() {
980 980
          checkConcept<AlterableDigraphComponent<Base>, _Graph>();
981 981
          typename _Graph::EdgeNotifier& uen
982 982
            = graph.notifier(typename _Graph::Edge());
983 983
          ignore_unused_variable_warning(uen);
984 984
        }
985 985

	
986 986
        const _Graph& graph;
987 987
      };
988 988
    };
989 989

	
990 990
    /// \brief Concept class for standard graph maps.
991 991
    ///
992 992
    /// This class describes the concept of standard graph maps, i.e.
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
994 994
    /// graph types, which can be used for associating data to graph items.
995 995
    /// The standard graph maps must conform to the ReferenceMap concept.
996 996
    template <typename GR, typename K, typename V>
997 997
    class GraphMap : public ReferenceMap<K, V, V&, const V&> {
998 998
      typedef ReferenceMap<K, V, V&, const V&> Parent;
999 999

	
1000 1000
    public:
1001 1001

	
1002 1002
      /// The key type of the map.
1003 1003
      typedef K Key;
1004 1004
      /// The value type of the map.
1005 1005
      typedef V Value;
1006 1006
      /// The reference type of the map.
1007 1007
      typedef Value& Reference;
1008 1008
      /// The const reference type of the map.
1009 1009
      typedef const Value& ConstReference;
... ...
@@ -1032,56 +1032,56 @@
1032 1032
      /// it just iterates on the current item set and set the  map
1033 1033
      /// with the value returned by the assigned map.
1034 1034
      template <typename CMap>
1035 1035
      GraphMap& operator=(const CMap&) {
1036 1036
        checkConcept<ReadMap<Key, Value>, CMap>();
1037 1037
        return *this;
1038 1038
      }
1039 1039

	
1040 1040
    public:
1041 1041
      template<typename _Map>
1042 1042
      struct Constraints {
1043 1043
        void constraints() {
1044 1044
          checkConcept
1045 1045
            <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1046 1046
          _Map m1(g);
1047 1047
          _Map m2(g,t);
1048
          
1048

	
1049 1049
          // Copy constructor
1050 1050
          // _Map m3(m);
1051 1051

	
1052 1052
          // Assignment operator
1053 1053
          // ReadMap<Key, Value> cmap;
1054 1054
          // m3 = cmap;
1055 1055

	
1056 1056
          ignore_unused_variable_warning(m1);
1057 1057
          ignore_unused_variable_warning(m2);
1058 1058
          // ignore_unused_variable_warning(m3);
1059 1059
        }
1060 1060

	
1061 1061
        const _Map &m;
1062 1062
        const GR &g;
1063 1063
        const typename GraphMap::Value &t;
1064 1064
      };
1065 1065

	
1066 1066
    };
1067 1067

	
1068 1068
    /// \brief Skeleton class for mappable directed graphs.
1069 1069
    ///
1070 1070
    /// This class describes the interface of mappable directed graphs.
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph
1072 1072
    /// map classes, namely \c NodeMap and \c ArcMap.
1073 1073
    /// This concept is part of the Digraph concept.
1074 1074
    template <typename BAS = BaseDigraphComponent>
1075 1075
    class MappableDigraphComponent : public BAS  {
1076 1076
    public:
1077 1077

	
1078 1078
      typedef BAS Base;
1079 1079
      typedef typename Base::Node Node;
1080 1080
      typedef typename Base::Arc Arc;
1081 1081

	
1082 1082
      typedef MappableDigraphComponent Digraph;
1083 1083

	
1084 1084
      /// \brief Standard graph map for the nodes.
1085 1085
      ///
1086 1086
      /// Standard graph map for the nodes.
1087 1087
      /// It conforms to the ReferenceMap concept.
... ...
@@ -1192,33 +1192,33 @@
1192 1192
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1193 1193
              BoolArcMap >();
1194 1194
          } { // Dummy map test
1195 1195
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1196 1196
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1197 1197
              DummyArcMap >();
1198 1198
          }
1199 1199
        }
1200 1200

	
1201 1201
        const _Digraph& digraph;
1202 1202
      };
1203 1203
    };
1204 1204

	
1205 1205
    /// \brief Skeleton class for mappable undirected graphs.
1206 1206
    ///
1207 1207
    /// This class describes the interface of mappable undirected graphs.
1208
    /// It extends \ref MappableDigraphComponent with the standard graph 
1208
    /// It extends \ref MappableDigraphComponent with the standard graph
1209 1209
    /// map class for edges (\c EdgeMap).
1210 1210
    /// This concept is part of the Graph concept.
1211 1211
    template <typename BAS = BaseGraphComponent>
1212 1212
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1213 1213
    public:
1214 1214

	
1215 1215
      typedef BAS Base;
1216 1216
      typedef typename Base::Edge Edge;
1217 1217

	
1218 1218
      typedef MappableGraphComponent Graph;
1219 1219

	
1220 1220
      /// \brief Standard graph map for the edges.
1221 1221
      ///
1222 1222
      /// Standard graph map for the edges.
1223 1223
      /// It conforms to the ReferenceMap concept.
1224 1224
      template <typename V>
... ...
@@ -1277,33 +1277,33 @@
1277 1277
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1278 1278
              BoolEdgeMap >();
1279 1279
          } { // Dummy map test
1280 1280
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1281 1281
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1282 1282
              DummyEdgeMap >();
1283 1283
          }
1284 1284
        }
1285 1285

	
1286 1286
        const _Graph& graph;
1287 1287
      };
1288 1288
    };
1289 1289

	
1290 1290
    /// \brief Skeleton class for extendable directed graphs.
1291 1291
    ///
1292 1292
    /// This class describes the interface of extendable directed graphs.
1293
    /// It extends \ref BaseDigraphComponent with functions for adding 
1293
    /// It extends \ref BaseDigraphComponent with functions for adding
1294 1294
    /// nodes and arcs to the digraph.
1295 1295
    /// This concept requires \ref AlterableDigraphComponent.
1296 1296
    template <typename BAS = BaseDigraphComponent>
1297 1297
    class ExtendableDigraphComponent : public BAS {
1298 1298
    public:
1299 1299
      typedef BAS Base;
1300 1300

	
1301 1301
      typedef typename Base::Node Node;
1302 1302
      typedef typename Base::Arc Arc;
1303 1303

	
1304 1304
      /// \brief Add a new node to the digraph.
1305 1305
      ///
1306 1306
      /// This function adds a new node to the digraph.
1307 1307
      Node addNode() {
1308 1308
        return INVALID;
1309 1309
      }
... ...
@@ -1321,33 +1321,33 @@
1321 1321
        void constraints() {
1322 1322
          checkConcept<Base, _Digraph>();
1323 1323
          typename _Digraph::Node node_a, node_b;
1324 1324
          node_a = digraph.addNode();
1325 1325
          node_b = digraph.addNode();
1326 1326
          typename _Digraph::Arc arc;
1327 1327
          arc = digraph.addArc(node_a, node_b);
1328 1328
        }
1329 1329

	
1330 1330
        _Digraph& digraph;
1331 1331
      };
1332 1332
    };
1333 1333

	
1334 1334
    /// \brief Skeleton class for extendable undirected graphs.
1335 1335
    ///
1336 1336
    /// This class describes the interface of extendable undirected graphs.
1337
    /// It extends \ref BaseGraphComponent with functions for adding 
1337
    /// It extends \ref BaseGraphComponent with functions for adding
1338 1338
    /// nodes and edges to the graph.
1339 1339
    /// This concept requires \ref AlterableGraphComponent.
1340 1340
    template <typename BAS = BaseGraphComponent>
1341 1341
    class ExtendableGraphComponent : public BAS {
1342 1342
    public:
1343 1343

	
1344 1344
      typedef BAS Base;
1345 1345
      typedef typename Base::Node Node;
1346 1346
      typedef typename Base::Edge Edge;
1347 1347

	
1348 1348
      /// \brief Add a new node to the digraph.
1349 1349
      ///
1350 1350
      /// This function adds a new node to the digraph.
1351 1351
      Node addNode() {
1352 1352
        return INVALID;
1353 1353
      }
... ...
@@ -1365,72 +1365,72 @@
1365 1365
        void constraints() {
1366 1366
          checkConcept<Base, _Graph>();
1367 1367
          typename _Graph::Node node_a, node_b;
1368 1368
          node_a = graph.addNode();
1369 1369
          node_b = graph.addNode();
1370 1370
          typename _Graph::Edge edge;
1371 1371
          edge = graph.addEdge(node_a, node_b);
1372 1372
        }
1373 1373

	
1374 1374
        _Graph& graph;
1375 1375
      };
1376 1376
    };
1377 1377

	
1378 1378
    /// \brief Skeleton class for erasable directed graphs.
1379 1379
    ///
1380 1380
    /// This class describes the interface of erasable directed graphs.
1381
    /// It extends \ref BaseDigraphComponent with functions for removing 
1381
    /// It extends \ref BaseDigraphComponent with functions for removing
1382 1382
    /// nodes and arcs from the digraph.
1383 1383
    /// This concept requires \ref AlterableDigraphComponent.
1384 1384
    template <typename BAS = BaseDigraphComponent>
1385 1385
    class ErasableDigraphComponent : public BAS {
1386 1386
    public:
1387 1387

	
1388 1388
      typedef BAS Base;
1389 1389
      typedef typename Base::Node Node;
1390 1390
      typedef typename Base::Arc Arc;
1391 1391

	
1392 1392
      /// \brief Erase a node from the digraph.
1393 1393
      ///
1394
      /// This function erases the given node from the digraph and all arcs 
1394
      /// This function erases the given node from the digraph and all arcs
1395 1395
      /// connected to the node.
1396 1396
      void erase(const Node&) {}
1397 1397

	
1398 1398
      /// \brief Erase an arc from the digraph.
1399 1399
      ///
1400 1400
      /// This function erases the given arc from the digraph.
1401 1401
      void erase(const Arc&) {}
1402 1402

	
1403 1403
      template <typename _Digraph>
1404 1404
      struct Constraints {
1405 1405
        void constraints() {
1406 1406
          checkConcept<Base, _Digraph>();
1407 1407
          const typename _Digraph::Node node(INVALID);
1408 1408
          digraph.erase(node);
1409 1409
          const typename _Digraph::Arc arc(INVALID);
1410 1410
          digraph.erase(arc);
1411 1411
        }
1412 1412

	
1413 1413
        _Digraph& digraph;
1414 1414
      };
1415 1415
    };
1416 1416

	
1417 1417
    /// \brief Skeleton class for erasable undirected graphs.
1418 1418
    ///
1419 1419
    /// This class describes the interface of erasable undirected graphs.
1420
    /// It extends \ref BaseGraphComponent with functions for removing 
1420
    /// It extends \ref BaseGraphComponent with functions for removing
1421 1421
    /// nodes and edges from the graph.
1422 1422
    /// This concept requires \ref AlterableGraphComponent.
1423 1423
    template <typename BAS = BaseGraphComponent>
1424 1424
    class ErasableGraphComponent : public BAS {
1425 1425
    public:
1426 1426

	
1427 1427
      typedef BAS Base;
1428 1428
      typedef typename Base::Node Node;
1429 1429
      typedef typename Base::Edge Edge;
1430 1430

	
1431 1431
      /// \brief Erase a node from the graph.
1432 1432
      ///
1433 1433
      /// This function erases the given node from the graph and all edges
1434 1434
      /// connected to the node.
1435 1435
      void erase(const Node&) {}
1436 1436

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_CONCEPTS_HEAP_H
20 20
#define LEMON_CONCEPTS_HEAP_H
21 21

	
... ...
@@ -79,186 +79,186 @@
79 79
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
80 80
        PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
81 81
        POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
82 82
      };
83 83

	
84 84
      /// \brief Constructor.
85 85
      ///
86 86
      /// Constructor.
87 87
      /// \param map A map that assigns \c int values to keys of type
88 88
      /// \c Item. It is used internally by the heap implementations to
89 89
      /// handle the cross references. The assigned value must be
90 90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
91 91
#ifdef DOXYGEN
92 92
      explicit Heap(ItemIntMap &map) {}
93 93
#else
94 94
      explicit Heap(ItemIntMap&) {}
95
#endif      
95
#endif
96 96

	
97 97
      /// \brief Constructor.
98 98
      ///
99 99
      /// Constructor.
100 100
      /// \param map A map that assigns \c int values to keys of type
101 101
      /// \c Item. It is used internally by the heap implementations to
102 102
      /// handle the cross references. The assigned value must be
103 103
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
104 104
      /// \param comp The function object used for comparing the priorities.
105 105
#ifdef DOXYGEN
106 106
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
107 107
#else
108 108
      explicit Heap(ItemIntMap&, const CMP&) {}
109
#endif      
109
#endif
110 110

	
111 111
      /// \brief The number of items stored in the heap.
112 112
      ///
113 113
      /// This function returns the number of items stored in the heap.
114 114
      int size() const { return 0; }
115 115

	
116 116
      /// \brief Check if the heap is empty.
117 117
      ///
118 118
      /// This function returns \c true if the heap is empty.
119 119
      bool empty() const { return false; }
120 120

	
121 121
      /// \brief Make the heap empty.
122 122
      ///
123 123
      /// This functon makes the heap empty.
124 124
      /// It does not change the cross reference map. If you want to reuse
125 125
      /// a heap that is not surely empty, you should first clear it and
126 126
      /// then you should set the cross reference map to \c PRE_HEAP
127 127
      /// for each item.
128 128
      void clear() {}
129 129

	
130 130
      /// \brief Insert an item into the heap with the given priority.
131 131
      ///
132 132
      /// This function inserts the given item into the heap with the
133 133
      /// given priority.
134 134
      /// \param i The item to insert.
135 135
      /// \param p The priority of the item.
136 136
      /// \pre \e i must not be stored in the heap.
137 137
#ifdef DOXYGEN
138 138
      void push(const Item &i, const Prio &p) {}
139 139
#else
140 140
      void push(const Item&, const Prio&) {}
141
#endif      
141
#endif
142 142

	
143 143
      /// \brief Return the item having minimum priority.
144 144
      ///
145 145
      /// This function returns the item having minimum priority.
146 146
      /// \pre The heap must be non-empty.
147 147
      Item top() const { return Item(); }
148 148

	
149 149
      /// \brief The minimum priority.
150 150
      ///
151 151
      /// This function returns the minimum priority.
152 152
      /// \pre The heap must be non-empty.
153 153
      Prio prio() const { return Prio(); }
154 154

	
155 155
      /// \brief Remove the item having minimum priority.
156 156
      ///
157 157
      /// This function removes the item having minimum priority.
158 158
      /// \pre The heap must be non-empty.
159 159
      void pop() {}
160 160

	
161 161
      /// \brief Remove the given item from the heap.
162 162
      ///
163 163
      /// This function removes the given item from the heap if it is
164 164
      /// already stored.
165 165
      /// \param i The item to delete.
166 166
      /// \pre \e i must be in the heap.
167 167
#ifdef DOXYGEN
168 168
      void erase(const Item &i) {}
169 169
#else
170 170
      void erase(const Item&) {}
171
#endif      
171
#endif
172 172

	
173 173
      /// \brief The priority of the given item.
174 174
      ///
175 175
      /// This function returns the priority of the given item.
176 176
      /// \param i The item.
177 177
      /// \pre \e i must be in the heap.
178 178
#ifdef DOXYGEN
179 179
      Prio operator[](const Item &i) const {}
180 180
#else
181 181
      Prio operator[](const Item&) const { return Prio(); }
182
#endif      
182
#endif
183 183

	
184 184
      /// \brief Set the priority of an item or insert it, if it is
185 185
      /// not stored in the heap.
186 186
      ///
187 187
      /// This method sets the priority of the given item if it is
188 188
      /// already stored in the heap. Otherwise it inserts the given
189 189
      /// item into the heap with the given priority.
190 190
      ///
191 191
      /// \param i The item.
192 192
      /// \param p The priority.
193 193
#ifdef DOXYGEN
194 194
      void set(const Item &i, const Prio &p) {}
195 195
#else
196 196
      void set(const Item&, const Prio&) {}
197
#endif      
197
#endif
198 198

	
199 199
      /// \brief Decrease the priority of an item to the given value.
200 200
      ///
201 201
      /// This function decreases the priority of an item to the given value.
202 202
      /// \param i The item.
203 203
      /// \param p The priority.
204 204
      /// \pre \e i must be stored in the heap with priority at least \e p.
205 205
#ifdef DOXYGEN
206 206
      void decrease(const Item &i, const Prio &p) {}
207 207
#else
208 208
      void decrease(const Item&, const Prio&) {}
209
#endif      
209
#endif
210 210

	
211 211
      /// \brief Increase the priority of an item to the given value.
212 212
      ///
213 213
      /// This function increases the priority of an item to the given value.
214 214
      /// \param i The item.
215 215
      /// \param p The priority.
216 216
      /// \pre \e i must be stored in the heap with priority at most \e p.
217 217
#ifdef DOXYGEN
218 218
      void increase(const Item &i, const Prio &p) {}
219 219
#else
220 220
      void increase(const Item&, const Prio&) {}
221
#endif      
221
#endif
222 222

	
223 223
      /// \brief Return the state of an item.
224 224
      ///
225 225
      /// This method returns \c PRE_HEAP if the given item has never
226 226
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
227 227
      /// and \c POST_HEAP otherwise.
228 228
      /// In the latter case it is possible that the item will get back
229 229
      /// to the heap again.
230 230
      /// \param i The item.
231 231
#ifdef DOXYGEN
232 232
      State state(const Item &i) const {}
233 233
#else
234 234
      State state(const Item&) const { return PRE_HEAP; }
235
#endif      
235
#endif
236 236

	
237 237
      /// \brief Set the state of an item in the heap.
238 238
      ///
239 239
      /// This function sets the state of the given item in the heap.
240 240
      /// It can be used to manually clear the heap when it is important
241 241
      /// to achive better time complexity.
242 242
      /// \param i The item.
243 243
      /// \param st The state. It should not be \c IN_HEAP.
244 244
#ifdef DOXYGEN
245 245
      void state(const Item& i, State st) {}
246 246
#else
247 247
      void state(const Item&, State) {}
248
#endif      
248
#endif
249 249

	
250 250

	
251 251
      template <typename _Heap>
252 252
      struct Constraints {
253 253
      public:
254 254
        void constraints() {
255 255
          typedef typename _Heap::Item OwnItem;
256 256
          typedef typename _Heap::Prio OwnPrio;
257 257
          typedef typename _Heap::State OwnState;
258 258

	
259 259
          Item item;
260 260
          Prio prio;
261 261
          item=Item();
262 262
          prio=Prio();
263 263
          ignore_unused_variable_warning(item);
264 264
          ignore_unused_variable_warning(prio);
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_CONNECTIVITY_H
20 20
#define LEMON_CONNECTIVITY_H
21 21

	
... ...
@@ -245,33 +245,33 @@
245 245
      int _num;
246 246
    };
247 247

	
248 248
  }
249 249

	
250 250

	
251 251
  /// \ingroup graph_properties
252 252
  ///
253 253
  /// \brief Check whether a directed graph is strongly connected.
254 254
  ///
255 255
  /// This function checks whether the given directed graph is strongly
256 256
  /// connected, i.e. any two nodes of the digraph are
257 257
  /// connected with directed paths in both direction.
258 258
  ///
259 259
  /// \return \c true if the digraph is strongly connected.
260 260
  /// \note By definition, the empty digraph is strongly connected.
261
  /// 
261
  ///
262 262
  /// \see countStronglyConnectedComponents(), stronglyConnectedComponents()
263 263
  /// \see connected()
264 264
  template <typename Digraph>
265 265
  bool stronglyConnected(const Digraph& digraph) {
266 266
    checkConcept<concepts::Digraph, Digraph>();
267 267

	
268 268
    typedef typename Digraph::Node Node;
269 269
    typedef typename Digraph::NodeIt NodeIt;
270 270

	
271 271
    typename Digraph::Node source = NodeIt(digraph);
272 272
    if (source == INVALID) return true;
273 273

	
274 274
    using namespace _connectivity_bits;
275 275

	
276 276
    typedef DfsVisitor<Digraph> Visitor;
277 277
    Visitor visitor;
... ...
@@ -297,33 +297,33 @@
297 297
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
298 298
    rdfs.init();
299 299
    rdfs.addSource(source);
300 300
    rdfs.start();
301 301

	
302 302
    for (RNodeIt it(rdigraph); it != INVALID; ++it) {
303 303
      if (!rdfs.reached(it)) {
304 304
        return false;
305 305
      }
306 306
    }
307 307

	
308 308
    return true;
309 309
  }
310 310

	
311 311
  /// \ingroup graph_properties
312 312
  ///
313
  /// \brief Count the number of strongly connected components of a 
313
  /// \brief Count the number of strongly connected components of a
314 314
  /// directed graph
315 315
  ///
316 316
  /// This function counts the number of strongly connected components of
317 317
  /// the given directed graph.
318 318
  ///
319 319
  /// The strongly connected components are the classes of an
320 320
  /// equivalence relation on the nodes of a digraph. Two nodes are in
321 321
  /// the same class if they are connected with directed paths in both
322 322
  /// direction.
323 323
  ///
324 324
  /// \return The number of strongly connected components.
325 325
  /// \note By definition, the empty digraph has zero
326 326
  /// strongly connected components.
327 327
  ///
328 328
  /// \see stronglyConnected(), stronglyConnectedComponents()
329 329
  template <typename Digraph>
... ...
@@ -731,47 +731,47 @@
731 731
      typename Digraph::template NodeMap<int> _retMap;
732 732
      typename Digraph::template NodeMap<Node> _predMap;
733 733
      std::stack<Edge> _edgeStack;
734 734
      int _num;
735 735
      bool rootCut;
736 736
    };
737 737

	
738 738
  }
739 739

	
740 740
  template <typename Graph>
741 741
  int countBiNodeConnectedComponents(const Graph& graph);
742 742

	
743 743
  /// \ingroup graph_properties
744 744
  ///
745 745
  /// \brief Check whether an undirected graph is bi-node-connected.
746 746
  ///
747
  /// This function checks whether the given undirected graph is 
747
  /// This function checks whether the given undirected graph is
748 748
  /// bi-node-connected, i.e. any two edges are on same circle.
749 749
  ///
750 750
  /// \return \c true if the graph bi-node-connected.
751 751
  /// \note By definition, the empty graph is bi-node-connected.
752 752
  ///
753 753
  /// \see countBiNodeConnectedComponents(), biNodeConnectedComponents()
754 754
  template <typename Graph>
755 755
  bool biNodeConnected(const Graph& graph) {
756 756
    return countBiNodeConnectedComponents(graph) <= 1;
757 757
  }
758 758

	
759 759
  /// \ingroup graph_properties
760 760
  ///
761
  /// \brief Count the number of bi-node-connected components of an 
761
  /// \brief Count the number of bi-node-connected components of an
762 762
  /// undirected graph.
763 763
  ///
764 764
  /// This function counts the number of bi-node-connected components of
765 765
  /// the given undirected graph.
766 766
  ///
767 767
  /// The bi-node-connected components are the classes of an equivalence
768 768
  /// relation on the edges of a undirected graph. Two edges are in the
769 769
  /// same class if they are on same circle.
770 770
  ///
771 771
  /// \return The number of bi-node-connected components.
772 772
  ///
773 773
  /// \see biNodeConnected(), biNodeConnectedComponents()
774 774
  template <typename Graph>
775 775
  int countBiNodeConnectedComponents(const Graph& graph) {
776 776
    checkConcept<concepts::Graph, Graph>();
777 777
    typedef typename Graph::NodeIt NodeIt;
... ...
@@ -799,33 +799,33 @@
799 799
  ///
800 800
  /// \brief Find the bi-node-connected components of an undirected graph.
801 801
  ///
802 802
  /// This function finds the bi-node-connected components of the given
803 803
  /// undirected graph.
804 804
  ///
805 805
  /// The bi-node-connected components are the classes of an equivalence
806 806
  /// relation on the edges of a undirected graph. Two edges are in the
807 807
  /// same class if they are on same circle.
808 808
  ///
809 809
  /// \image html node_biconnected_components.png
810 810
  /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
811 811
  ///
812 812
  /// \param graph The undirected graph.
813 813
  /// \retval compMap A writable edge map. The values will be set from 0
814 814
  /// to the number of the bi-node-connected components minus one. Each
815
  /// value of the map will be set exactly once, and the values of a 
815
  /// value of the map will be set exactly once, and the values of a
816 816
  /// certain component will be set continuously.
817 817
  /// \return The number of bi-node-connected components.
818 818
  ///
819 819
  /// \see biNodeConnected(), countBiNodeConnectedComponents()
820 820
  template <typename Graph, typename EdgeMap>
821 821
  int biNodeConnectedComponents(const Graph& graph,
822 822
                                EdgeMap& compMap) {
823 823
    checkConcept<concepts::Graph, Graph>();
824 824
    typedef typename Graph::NodeIt NodeIt;
825 825
    typedef typename Graph::Edge Edge;
826 826
    checkConcept<concepts::WriteMap<Edge, int>, EdgeMap>();
827 827

	
828 828
    using namespace _connectivity_bits;
829 829

	
830 830
    typedef BiNodeConnectedComponentsVisitor<Graph, EdgeMap> Visitor;
831 831

	
... ...
@@ -845,33 +845,33 @@
845 845
  }
846 846

	
847 847
  /// \ingroup graph_properties
848 848
  ///
849 849
  /// \brief Find the bi-node-connected cut nodes in an undirected graph.
850 850
  ///
851 851
  /// This function finds the bi-node-connected cut nodes in the given
852 852
  /// undirected graph.
853 853
  ///
854 854
  /// The bi-node-connected components are the classes of an equivalence
855 855
  /// relation on the edges of a undirected graph. Two edges are in the
856 856
  /// same class if they are on same circle.
857 857
  /// The bi-node-connected components are separted by the cut nodes of
858 858
  /// the components.
859 859
  ///
860 860
  /// \param graph The undirected graph.
861
  /// \retval cutMap A writable node map. The values will be set to 
861
  /// \retval cutMap A writable node map. The values will be set to
862 862
  /// \c true for the nodes that separate two or more components
863 863
  /// (exactly once for each cut node), and will not be changed for
864 864
  /// other nodes.
865 865
  /// \return The number of the cut nodes.
866 866
  ///
867 867
  /// \see biNodeConnected(), biNodeConnectedComponents()
868 868
  template <typename Graph, typename NodeMap>
869 869
  int biNodeConnectedCutNodes(const Graph& graph, NodeMap& cutMap) {
870 870
    checkConcept<concepts::Graph, Graph>();
871 871
    typedef typename Graph::Node Node;
872 872
    typedef typename Graph::NodeIt NodeIt;
873 873
    checkConcept<concepts::WriteMap<Node, bool>, NodeMap>();
874 874

	
875 875
    using namespace _connectivity_bits;
876 876

	
877 877
    typedef BiNodeConnectedCutNodesVisitor<Graph, NodeMap> Visitor;
... ...
@@ -1072,33 +1072,33 @@
1072 1072
      int& _cutNum;
1073 1073

	
1074 1074
      typename Digraph::template NodeMap<int> _numMap;
1075 1075
      typename Digraph::template NodeMap<int> _retMap;
1076 1076
      typename Digraph::template NodeMap<Arc> _predMap;
1077 1077
      int _num;
1078 1078
    };
1079 1079
  }
1080 1080

	
1081 1081
  template <typename Graph>
1082 1082
  int countBiEdgeConnectedComponents(const Graph& graph);
1083 1083

	
1084 1084
  /// \ingroup graph_properties
1085 1085
  ///
1086 1086
  /// \brief Check whether an undirected graph is bi-edge-connected.
1087 1087
  ///
1088
  /// This function checks whether the given undirected graph is 
1088
  /// This function checks whether the given undirected graph is
1089 1089
  /// bi-edge-connected, i.e. any two nodes are connected with at least
1090 1090
  /// two edge-disjoint paths.
1091 1091
  ///
1092 1092
  /// \return \c true if the graph is bi-edge-connected.
1093 1093
  /// \note By definition, the empty graph is bi-edge-connected.
1094 1094
  ///
1095 1095
  /// \see countBiEdgeConnectedComponents(), biEdgeConnectedComponents()
1096 1096
  template <typename Graph>
1097 1097
  bool biEdgeConnected(const Graph& graph) {
1098 1098
    return countBiEdgeConnectedComponents(graph) <= 1;
1099 1099
  }
1100 1100

	
1101 1101
  /// \ingroup graph_properties
1102 1102
  ///
1103 1103
  /// \brief Count the number of bi-edge-connected components of an
1104 1104
  /// undirected graph.
... ...
@@ -1179,33 +1179,33 @@
1179 1179
    dfs.init();
1180 1180

	
1181 1181
    for (NodeIt it(graph); it != INVALID; ++it) {
1182 1182
      if (!dfs.reached(it)) {
1183 1183
        dfs.addSource(it);
1184 1184
        dfs.start();
1185 1185
      }
1186 1186
    }
1187 1187
    return compNum;
1188 1188
  }
1189 1189

	
1190 1190
  /// \ingroup graph_properties
1191 1191
  ///
1192 1192
  /// \brief Find the bi-edge-connected cut edges in an undirected graph.
1193 1193
  ///
1194 1194
  /// This function finds the bi-edge-connected cut edges in the given
1195
  /// undirected graph. 
1195
  /// undirected graph.
1196 1196
  ///
1197 1197
  /// The bi-edge-connected components are the classes of an equivalence
1198 1198
  /// relation on the nodes of an undirected graph. Two nodes are in the
1199 1199
  /// same class if they are connected with at least two edge-disjoint
1200 1200
  /// paths.
1201 1201
  /// The bi-edge-connected components are separted by the cut edges of
1202 1202
  /// the components.
1203 1203
  ///
1204 1204
  /// \param graph The undirected graph.
1205 1205
  /// \retval cutMap A writable edge map. The values will be set to \c true
1206 1206
  /// for the cut edges (exactly once for each cut edge), and will not be
1207 1207
  /// changed for other edges.
1208 1208
  /// \return The number of cut edges.
1209 1209
  ///
1210 1210
  /// \see biEdgeConnected(), biEdgeConnectedComponents()
1211 1211
  template <typename Graph, typename EdgeMap>
... ...
@@ -1336,33 +1336,33 @@
1336 1336
        dfs.addSource(it);
1337 1337
        dfs.start();
1338 1338
      }
1339 1339
    }
1340 1340
  }
1341 1341

	
1342 1342
  /// \ingroup graph_properties
1343 1343
  ///
1344 1344
  /// \brief Sort the nodes of a DAG into topolgical order.
1345 1345
  ///
1346 1346
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1347 1347
  /// into topolgical order and also checks whether the given digraph
1348 1348
  /// is DAG.
1349 1349
  ///
1350 1350
  /// \param digraph The digraph.
1351 1351
  /// \retval order A readable and writable node map. The values will be
1352
  /// set from 0 to the number of the nodes in the digraph minus one. 
1352
  /// set from 0 to the number of the nodes in the digraph minus one.
1353 1353
  /// Each value of the map will be set exactly once, and the values will
1354 1354
  /// be set descending order.
1355 1355
  /// \return \c false if the digraph is not DAG.
1356 1356
  ///
1357 1357
  /// \see dag(), topologicalSort()
1358 1358
  template <typename Digraph, typename NodeMap>
1359 1359
  bool checkedTopologicalSort(const Digraph& digraph, NodeMap& order) {
1360 1360
    using namespace _connectivity_bits;
1361 1361

	
1362 1362
    checkConcept<concepts::Digraph, Digraph>();
1363 1363
    checkConcept<concepts::ReadWriteMap<typename Digraph::Node, int>,
1364 1364
      NodeMap>();
1365 1365

	
1366 1366
    typedef typename Digraph::Node Node;
1367 1367
    typedef typename Digraph::NodeIt NodeIt;
1368 1368
    typedef typename Digraph::Arc Arc;
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_CORE_H
20 20
#define LEMON_CORE_H
21 21

	
... ...
@@ -1226,33 +1226,34 @@
1226 1226
  template <typename GR>
1227 1227
  class DynArcLookUp
1228 1228
    : protected ItemSetTraits<GR, typename GR::Arc>::ItemNotifier::ObserverBase
1229 1229
  {
1230 1230
    typedef typename ItemSetTraits<GR, typename GR::Arc>
1231 1231
    ::ItemNotifier::ObserverBase Parent;
1232 1232

	
1233 1233
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1234 1234

	
1235 1235
  public:
1236 1236

	
1237 1237
    /// The Digraph type
1238 1238
    typedef GR Digraph;
1239 1239

	
1240 1240
  protected:
1241 1241

	
1242
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
1242
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type
1243
    {
1243 1244
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
1244 1245

	
1245 1246
    public:
1246 1247

	
1247 1248
      AutoNodeMap(const GR& digraph) : Parent(digraph, INVALID) {}
1248 1249

	
1249 1250
      virtual void add(const Node& node) {
1250 1251
        Parent::add(node);
1251 1252
        Parent::set(node, INVALID);
1252 1253
      }
1253 1254

	
1254 1255
      virtual void add(const std::vector<Node>& nodes) {
1255 1256
        Parent::add(nodes);
1256 1257
        for (int i = 0; i < int(nodes.size()); ++i) {
1257 1258
          Parent::set(nodes[i], INVALID);
1258 1259
        }
... ...
@@ -1265,33 +1266,33 @@
1265 1266
        for (nf->first(it); it != INVALID; nf->next(it)) {
1266 1267
          Parent::set(it, INVALID);
1267 1268
        }
1268 1269
      }
1269 1270
    };
1270 1271

	
1271 1272
    class ArcLess {
1272 1273
      const Digraph &g;
1273 1274
    public:
1274 1275
      ArcLess(const Digraph &_g) : g(_g) {}
1275 1276
      bool operator()(Arc a,Arc b) const
1276 1277
      {
1277 1278
        return g.target(a)<g.target(b);
1278 1279
      }
1279 1280
    };
1280 1281

	
1281
  protected: 
1282
  protected:
1282 1283

	
1283 1284
    const Digraph &_g;
1284 1285
    AutoNodeMap _head;
1285 1286
    typename Digraph::template ArcMap<Arc> _parent;
1286 1287
    typename Digraph::template ArcMap<Arc> _left;
1287 1288
    typename Digraph::template ArcMap<Arc> _right;
1288 1289

	
1289 1290
  public:
1290 1291

	
1291 1292
    ///Constructor
1292 1293

	
1293 1294
    ///Constructor.
1294 1295
    ///
1295 1296
    ///It builds up the search database.
1296 1297
    DynArcLookUp(const Digraph &g)
1297 1298
      : _g(g),_head(g),_parent(g),_left(g),_right(g)
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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_COST_SCALING_H
20 20
#define LEMON_COST_SCALING_H
21 21

	
... ...
@@ -79,33 +79,33 @@
79 79
    typedef long long LargeCost;
80 80
#else
81 81
    typedef long LargeCost;
82 82
#endif
83 83
  };
84 84

	
85 85

	
86 86
  /// \addtogroup min_cost_flow_algs
87 87
  /// @{
88 88

	
89 89
  /// \brief Implementation of the Cost Scaling algorithm for
90 90
  /// finding a \ref min_cost_flow "minimum cost flow".
91 91
  ///
92 92
  /// \ref CostScaling implements a cost scaling algorithm that performs
93 93
  /// push/augment and relabel operations for finding a \ref min_cost_flow
94 94
  /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation,
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient. 
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient.
96 96
  /// It is a highly efficient primal-dual solution method, which
97 97
  /// can be viewed as the generalization of the \ref Preflow
98 98
  /// "preflow push-relabel" algorithm for the maximum flow problem.
99 99
  ///
100 100
  /// Most of the parameters of the problem (except for the digraph)
101 101
  /// can be given using separate functions, and the algorithm can be
102 102
  /// executed using the \ref run() function. If some parameters are not
103 103
  /// specified, then default values will be used.
104 104
  ///
105 105
  /// \tparam GR The digraph type the algorithm runs on.
106 106
  /// \tparam V The number type used for flow amounts, capacity bounds
107 107
  /// and supply values in the algorithm. By default, it is \c int.
108 108
  /// \tparam C The number type used for costs and potentials in the
109 109
  /// algorithm. By default, it is the same as \c V.
110 110
  /// \tparam TR The traits class that defines various types used by the
111 111
  /// algorithm. By default, it is \ref CostScalingDefaultTraits
... ...
@@ -176,68 +176,68 @@
176 176
    ///
177 177
    /// \ref CostScaling provides three internal methods that differ mainly
178 178
    /// in their base operations, which are used in conjunction with the
179 179
    /// relabel operation.
180 180
    /// By default, the so called \ref PARTIAL_AUGMENT
181 181
    /// "Partial Augment-Relabel" method is used, which proved to be
182 182
    /// the most efficient and the most robust on various test inputs.
183 183
    /// However, the other methods can be selected using the \ref run()
184 184
    /// function with the proper parameter.
185 185
    enum Method {
186 186
      /// Local push operations are used, i.e. flow is moved only on one
187 187
      /// admissible arc at once.
188 188
      PUSH,
189 189
      /// Augment operations are used, i.e. flow is moved on admissible
190 190
      /// paths from a node with excess to a node with deficit.
191 191
      AUGMENT,
192
      /// Partial augment operations are used, i.e. flow is moved on 
192
      /// Partial augment operations are used, i.e. flow is moved on
193 193
      /// admissible paths started from a node with excess, but the
194 194
      /// lengths of these paths are limited. This method can be viewed
195 195
      /// as a combined version of the previous two operations.
196 196
      PARTIAL_AUGMENT
197 197
    };
198 198

	
199 199
  private:
200 200

	
201 201
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
202 202

	
203 203
    typedef std::vector<int> IntVector;
204 204
    typedef std::vector<Value> ValueVector;
205 205
    typedef std::vector<Cost> CostVector;
206 206
    typedef std::vector<LargeCost> LargeCostVector;
207 207
    typedef std::vector<char> BoolVector;
208 208
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
209 209

	
210 210
  private:
211
  
211

	
212 212
    template <typename KT, typename VT>
213 213
    class StaticVectorMap {
214 214
    public:
215 215
      typedef KT Key;
216 216
      typedef VT Value;
217
      
217

	
218 218
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
219
      
219

	
220 220
      const Value& operator[](const Key& key) const {
221 221
        return _v[StaticDigraph::id(key)];
222 222
      }
223 223

	
224 224
      Value& operator[](const Key& key) {
225 225
        return _v[StaticDigraph::id(key)];
226 226
      }
227
      
227

	
228 228
      void set(const Key& key, const Value& val) {
229 229
        _v[StaticDigraph::id(key)] = val;
230 230
      }
231 231

	
232 232
    private:
233 233
      std::vector<Value>& _v;
234 234
    };
235 235

	
236 236
    typedef StaticVectorMap<StaticDigraph::Node, LargeCost> LargeCostNodeMap;
237 237
    typedef StaticVectorMap<StaticDigraph::Arc, LargeCost> LargeCostArcMap;
238 238

	
239 239
  private:
240 240

	
241 241
    // Data related to the underlying digraph
242 242
    const GR &_graph;
243 243
    int _node_num;
... ...
@@ -270,43 +270,43 @@
270 270
    ValueVector _res_cap;
271 271
    LargeCostVector _cost;
272 272
    LargeCostVector _pi;
273 273
    ValueVector _excess;
274 274
    IntVector _next_out;
275 275
    std::deque<int> _active_nodes;
276 276

	
277 277
    // Data for scaling
278 278
    LargeCost _epsilon;
279 279
    int _alpha;
280 280

	
281 281
    IntVector _buckets;
282 282
    IntVector _bucket_next;
283 283
    IntVector _bucket_prev;
284 284
    IntVector _rank;
285 285
    int _max_rank;
286
  
286

	
287 287
    // Data for a StaticDigraph structure
288 288
    typedef std::pair<int, int> IntPair;
289 289
    StaticDigraph _sgr;
290 290
    std::vector<IntPair> _arc_vec;
291 291
    std::vector<LargeCost> _cost_vec;
292 292
    LargeCostArcMap _cost_map;
293 293
    LargeCostNodeMap _pi_map;
294
  
294

	
295 295
  public:
296
  
296

	
297 297
    /// \brief Constant for infinite upper bounds (capacities).
298 298
    ///
299 299
    /// Constant for infinite upper bounds (capacities).
300 300
    /// It is \c std::numeric_limits<Value>::infinity() if available,
301 301
    /// \c std::numeric_limits<Value>::max() otherwise.
302 302
    const Value INF;
303 303

	
304 304
  public:
305 305

	
306 306
    /// \name Named Template Parameters
307 307
    /// @{
308 308

	
309 309
    template <typename T>
310 310
    struct SetLargeCostTraits : public Traits {
311 311
      typedef T LargeCost;
312 312
    };
... ...
@@ -335,33 +335,33 @@
335 335
    ///
336 336
    /// The constructor of the class.
337 337
    ///
338 338
    /// \param graph The digraph the algorithm runs on.
339 339
    CostScaling(const GR& graph) :
340 340
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
341 341
      _cost_map(_cost_vec), _pi_map(_pi),
342 342
      INF(std::numeric_limits<Value>::has_infinity ?
343 343
          std::numeric_limits<Value>::infinity() :
344 344
          std::numeric_limits<Value>::max())
345 345
    {
346 346
      // Check the number types
347 347
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
348 348
        "The flow type of CostScaling must be signed");
349 349
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
350 350
        "The cost type of CostScaling must be signed");
351
      
351

	
352 352
      // Reset data structures
353 353
      reset();
354 354
    }
355 355

	
356 356
    /// \name Parameters
357 357
    /// The parameters of the algorithm can be specified using these
358 358
    /// functions.
359 359

	
360 360
    /// @{
361 361

	
362 362
    /// \brief Set the lower bounds on the arcs.
363 363
    ///
364 364
    /// This function sets the lower bounds on the arcs.
365 365
    /// If it is not used before calling \ref run(), the lower bounds
366 366
    /// will be set to zero on all arcs.
367 367
    ///
... ...
@@ -451,33 +451,33 @@
451 451
    /// assigned to \c t and all other nodes have zero supply value.
452 452
    ///
453 453
    /// \param s The source node.
454 454
    /// \param t The target node.
455 455
    /// \param k The required amount of flow from node \c s to node \c t
456 456
    /// (i.e. the supply of \c s and the demand of \c t).
457 457
    ///
458 458
    /// \return <tt>(*this)</tt>
459 459
    CostScaling& stSupply(const Node& s, const Node& t, Value k) {
460 460
      for (int i = 0; i != _res_node_num; ++i) {
461 461
        _supply[i] = 0;
462 462
      }
463 463
      _supply[_node_id[s]] =  k;
464 464
      _supply[_node_id[t]] = -k;
465 465
      return *this;
466 466
    }
467
    
467

	
468 468
    /// @}
469 469

	
470 470
    /// \name Execution control
471 471
    /// The algorithm can be executed using \ref run().
472 472

	
473 473
    /// @{
474 474

	
475 475
    /// \brief Run the algorithm.
476 476
    ///
477 477
    /// This function runs the algorithm.
478 478
    /// The paramters can be specified using functions \ref lowerMap(),
479 479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480 480
    /// For example,
481 481
    /// \code
482 482
    ///   CostScaling<ListDigraph> cs(graph);
483 483
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
... ...
@@ -553,33 +553,33 @@
553 553
    /// \see reset(), run()
554 554
    CostScaling& resetParams() {
555 555
      for (int i = 0; i != _res_node_num; ++i) {
556 556
        _supply[i] = 0;
557 557
      }
558 558
      int limit = _first_out[_root];
559 559
      for (int j = 0; j != limit; ++j) {
560 560
        _lower[j] = 0;
561 561
        _upper[j] = INF;
562 562
        _scost[j] = _forward[j] ? 1 : -1;
563 563
      }
564 564
      for (int j = limit; j != _res_arc_num; ++j) {
565 565
        _lower[j] = 0;
566 566
        _upper[j] = INF;
567 567
        _scost[j] = 0;
568 568
        _scost[_reverse[j]] = 0;
569
      }      
569
      }
570 570
      _have_lower = false;
571 571
      return *this;
572 572
    }
573 573

	
574 574
    /// \brief Reset all the parameters that have been given before.
575 575
    ///
576 576
    /// This function resets all the paramaters that have been given
577 577
    /// before using functions \ref lowerMap(), \ref upperMap(),
578 578
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
579 579
    ///
580 580
    /// It is useful for multiple run() calls. If this function is not
581 581
    /// used, all the parameters given before are kept for the next
582 582
    /// \ref run() call.
583 583
    /// However, the underlying digraph must not be modified after this
584 584
    /// class have been constructed, since it copies and extends the graph.
585 585
    /// \return <tt>(*this)</tt>
... ...
@@ -588,33 +588,33 @@
588 588
      _node_num = countNodes(_graph);
589 589
      _arc_num = countArcs(_graph);
590 590
      _res_node_num = _node_num + 1;
591 591
      _res_arc_num = 2 * (_arc_num + _node_num);
592 592
      _root = _node_num;
593 593

	
594 594
      _first_out.resize(_res_node_num + 1);
595 595
      _forward.resize(_res_arc_num);
596 596
      _source.resize(_res_arc_num);
597 597
      _target.resize(_res_arc_num);
598 598
      _reverse.resize(_res_arc_num);
599 599

	
600 600
      _lower.resize(_res_arc_num);
601 601
      _upper.resize(_res_arc_num);
602 602
      _scost.resize(_res_arc_num);
603 603
      _supply.resize(_res_node_num);
604
      
604

	
605 605
      _res_cap.resize(_res_arc_num);
606 606
      _cost.resize(_res_arc_num);
607 607
      _pi.resize(_res_node_num);
608 608
      _excess.resize(_res_node_num);
609 609
      _next_out.resize(_res_node_num);
610 610

	
611 611
      _arc_vec.reserve(_res_arc_num);
612 612
      _cost_vec.reserve(_res_arc_num);
613 613

	
614 614
      // Copy the graph
615 615
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
616 616
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
617 617
        _node_id[n] = i;
618 618
      }
619 619
      i = 0;
620 620
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
... ...
@@ -636,33 +636,33 @@
636 636
        _target[j] = _root;
637 637
        _reverse[j] = k;
638 638
        _forward[k] = true;
639 639
        _source[k] = _root;
640 640
        _target[k] = i;
641 641
        _reverse[k] = j;
642 642
        ++j; ++k;
643 643
      }
644 644
      _first_out[i] = j;
645 645
      _first_out[_res_node_num] = k;
646 646
      for (ArcIt a(_graph); a != INVALID; ++a) {
647 647
        int fi = _arc_idf[a];
648 648
        int bi = _arc_idb[a];
649 649
        _reverse[fi] = bi;
650 650
        _reverse[bi] = fi;
651 651
      }
652
      
652

	
653 653
      // Reset parameters
654 654
      resetParams();
655 655
      return *this;
656 656
    }
657 657

	
658 658
    /// @}
659 659

	
660 660
    /// \name Query Functions
661 661
    /// The results of the algorithm can be obtained using these
662 662
    /// functions.\n
663 663
    /// The \ref run() function must be called before using them.
664 664

	
665 665
    /// @{
666 666

	
667 667
    /// \brief Return the total cost of the found flow.
668 668
    ///
... ...
@@ -745,40 +745,40 @@
745 745
    }
746 746

	
747 747
    /// @}
748 748

	
749 749
  private:
750 750

	
751 751
    // Initialize the algorithm
752 752
    ProblemType init() {
753 753
      if (_res_node_num <= 1) return INFEASIBLE;
754 754

	
755 755
      // Check the sum of supply values
756 756
      _sum_supply = 0;
757 757
      for (int i = 0; i != _root; ++i) {
758 758
        _sum_supply += _supply[i];
759 759
      }
760 760
      if (_sum_supply > 0) return INFEASIBLE;
761
      
761

	
762 762

	
763 763
      // Initialize vectors
764 764
      for (int i = 0; i != _res_node_num; ++i) {
765 765
        _pi[i] = 0;
766 766
        _excess[i] = _supply[i];
767 767
      }
768
      
768

	
769 769
      // Remove infinite upper bounds and check negative arcs
770 770
      const Value MAX = std::numeric_limits<Value>::max();
771 771
      int last_out;
772 772
      if (_have_lower) {
773 773
        for (int i = 0; i != _root; ++i) {
774 774
          last_out = _first_out[i+1];
775 775
          for (int j = _first_out[i]; j != last_out; ++j) {
776 776
            if (_forward[j]) {
777 777
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
778 778
              if (c >= MAX) return UNBOUNDED;
779 779
              _excess[i] -= c;
780 780
              _excess[_target[j]] += c;
781 781
            }
782 782
          }
783 783
        }
784 784
      } else {
... ...
@@ -872,48 +872,48 @@
872 872
          _excess[u] = 0;
873 873
        }
874 874
      } else {
875 875
        for (ArcIt a(_graph); a != INVALID; ++a) {
876 876
          Value fa = flow[a];
877 877
          _res_cap[_arc_idf[a]] = cap[a] - fa;
878 878
          _res_cap[_arc_idb[a]] = fa;
879 879
        }
880 880
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
881 881
          int ra = _reverse[a];
882 882
          _res_cap[a] = 0;
883 883
          _res_cap[ra] = 0;
884 884
          _cost[a] = 0;
885 885
          _cost[ra] = 0;
886 886
        }
887 887
      }
888
      
888

	
889 889
      return OPTIMAL;
890 890
    }
891 891

	
892 892
    // Execute the algorithm and transform the results
893 893
    void start(Method method) {
894 894
      // Maximum path length for partial augment
895 895
      const int MAX_PATH_LENGTH = 4;
896 896

	
897
      // Initialize data structures for buckets      
897
      // Initialize data structures for buckets
898 898
      _max_rank = _alpha * _res_node_num;
899 899
      _buckets.resize(_max_rank);
900 900
      _bucket_next.resize(_res_node_num + 1);
901 901
      _bucket_prev.resize(_res_node_num + 1);
902 902
      _rank.resize(_res_node_num + 1);
903
  
903

	
904 904
      // Execute the algorithm
905 905
      switch (method) {
906 906
        case PUSH:
907 907
          startPush();
908 908
          break;
909 909
        case AUGMENT:
910 910
          startAugment();
911 911
          break;
912 912
        case PARTIAL_AUGMENT:
913 913
          startAugment(MAX_PATH_LENGTH);
914 914
          break;
915 915
      }
916 916

	
917 917
      // Compute node potentials for the original costs
918 918
      _arc_vec.clear();
919 919
      _cost_vec.clear();
... ...
@@ -926,201 +926,201 @@
926 926
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
927 927

	
928 928
      typename BellmanFord<StaticDigraph, LargeCostArcMap>
929 929
        ::template SetDistMap<LargeCostNodeMap>::Create bf(_sgr, _cost_map);
930 930
      bf.distMap(_pi_map);
931 931
      bf.init(0);
932 932
      bf.start();
933 933

	
934 934
      // Handle non-zero lower bounds
935 935
      if (_have_lower) {
936 936
        int limit = _first_out[_root];
937 937
        for (int j = 0; j != limit; ++j) {
938 938
          if (!_forward[j]) _res_cap[j] += _lower[j];
939 939
        }
940 940
      }
941 941
    }
942
    
942

	
943 943
    // Initialize a cost scaling phase
944 944
    void initPhase() {
945 945
      // Saturate arcs not satisfying the optimality condition
946 946
      for (int u = 0; u != _res_node_num; ++u) {
947 947
        int last_out = _first_out[u+1];
948 948
        LargeCost pi_u = _pi[u];
949 949
        for (int a = _first_out[u]; a != last_out; ++a) {
950 950
          int v = _target[a];
951 951
          if (_res_cap[a] > 0 && _cost[a] + pi_u - _pi[v] < 0) {
952 952
            Value delta = _res_cap[a];
953 953
            _excess[u] -= delta;
954 954
            _excess[v] += delta;
955 955
            _res_cap[a] = 0;
956 956
            _res_cap[_reverse[a]] += delta;
957 957
          }
958 958
        }
959 959
      }
960
      
960

	
961 961
      // Find active nodes (i.e. nodes with positive excess)
962 962
      for (int u = 0; u != _res_node_num; ++u) {
963 963
        if (_excess[u] > 0) _active_nodes.push_back(u);
964 964
      }
965 965

	
966 966
      // Initialize the next arcs
967 967
      for (int u = 0; u != _res_node_num; ++u) {
968 968
        _next_out[u] = _first_out[u];
969 969
      }
970 970
    }
971
    
971

	
972 972
    // Early termination heuristic
973 973
    bool earlyTermination() {
974 974
      const double EARLY_TERM_FACTOR = 3.0;
975 975

	
976 976
      // Build a static residual graph
977 977
      _arc_vec.clear();
978 978
      _cost_vec.clear();
979 979
      for (int j = 0; j != _res_arc_num; ++j) {
980 980
        if (_res_cap[j] > 0) {
981 981
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
982 982
          _cost_vec.push_back(_cost[j] + 1);
983 983
        }
984 984
      }
985 985
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
986 986

	
987 987
      // Run Bellman-Ford algorithm to check if the current flow is optimal
988 988
      BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map);
989 989
      bf.init(0);
990 990
      bool done = false;
991 991
      int K = int(EARLY_TERM_FACTOR * std::sqrt(double(_res_node_num)));
992 992
      for (int i = 0; i < K && !done; ++i) {
993 993
        done = bf.processNextWeakRound();
994 994
      }
995 995
      return done;
996 996
    }
997 997

	
998 998
    // Global potential update heuristic
999 999
    void globalUpdate() {
1000 1000
      int bucket_end = _root + 1;
1001
    
1001

	
1002 1002
      // Initialize buckets
1003 1003
      for (int r = 0; r != _max_rank; ++r) {
1004 1004
        _buckets[r] = bucket_end;
1005 1005
      }
1006 1006
      Value total_excess = 0;
1007 1007
      for (int i = 0; i != _res_node_num; ++i) {
1008 1008
        if (_excess[i] < 0) {
1009 1009
          _rank[i] = 0;
1010 1010
          _bucket_next[i] = _buckets[0];
1011 1011
          _bucket_prev[_buckets[0]] = i;
1012 1012
          _buckets[0] = i;
1013 1013
        } else {
1014 1014
          total_excess += _excess[i];
1015 1015
          _rank[i] = _max_rank;
1016 1016
        }
1017 1017
      }
1018 1018
      if (total_excess == 0) return;
1019 1019

	
1020 1020
      // Search the buckets
1021 1021
      int r = 0;
1022 1022
      for ( ; r != _max_rank; ++r) {
1023 1023
        while (_buckets[r] != bucket_end) {
1024 1024
          // Remove the first node from the current bucket
1025 1025
          int u = _buckets[r];
1026 1026
          _buckets[r] = _bucket_next[u];
1027
          
1027

	
1028 1028
          // Search the incomming arcs of u
1029 1029
          LargeCost pi_u = _pi[u];
1030 1030
          int last_out = _first_out[u+1];
1031 1031
          for (int a = _first_out[u]; a != last_out; ++a) {
1032 1032
            int ra = _reverse[a];
1033 1033
            if (_res_cap[ra] > 0) {
1034 1034
              int v = _source[ra];
1035 1035
              int old_rank_v = _rank[v];
1036 1036
              if (r < old_rank_v) {
1037 1037
                // Compute the new rank of v
1038 1038
                LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon;
1039 1039
                int new_rank_v = old_rank_v;
1040 1040
                if (nrc < LargeCost(_max_rank))
1041 1041
                  new_rank_v = r + 1 + int(nrc);
1042
                  
1042

	
1043 1043
                // Change the rank of v
1044 1044
                if (new_rank_v < old_rank_v) {
1045 1045
                  _rank[v] = new_rank_v;
1046 1046
                  _next_out[v] = _first_out[v];
1047
                  
1047

	
1048 1048
                  // Remove v from its old bucket
1049 1049
                  if (old_rank_v < _max_rank) {
1050 1050
                    if (_buckets[old_rank_v] == v) {
1051 1051
                      _buckets[old_rank_v] = _bucket_next[v];
1052 1052
                    } else {
1053 1053
                      _bucket_next[_bucket_prev[v]] = _bucket_next[v];
1054 1054
                      _bucket_prev[_bucket_next[v]] = _bucket_prev[v];
1055 1055
                    }
1056 1056
                  }
1057
                  
1057

	
1058 1058
                  // Insert v to its new bucket
1059 1059
                  _bucket_next[v] = _buckets[new_rank_v];
1060 1060
                  _bucket_prev[_buckets[new_rank_v]] = v;
1061 1061
                  _buckets[new_rank_v] = v;
1062 1062
                }
1063 1063
              }
1064 1064
            }
1065 1065
          }
1066 1066

	
1067 1067
          // Finish search if there are no more active nodes
1068 1068
          if (_excess[u] > 0) {
1069 1069
            total_excess -= _excess[u];
1070 1070
            if (total_excess <= 0) break;
1071 1071
          }
1072 1072
        }
1073 1073
        if (total_excess <= 0) break;
1074 1074
      }
1075
      
1075

	
1076 1076
      // Relabel nodes
1077 1077
      for (int u = 0; u != _res_node_num; ++u) {
1078 1078
        int k = std::min(_rank[u], r);
1079 1079
        if (k > 0) {
1080 1080
          _pi[u] -= _epsilon * k;
1081 1081
          _next_out[u] = _first_out[u];
1082 1082
        }
1083 1083
      }
1084 1084
    }
1085 1085

	
1086 1086
    /// Execute the algorithm performing augment and relabel operations
1087 1087
    void startAugment(int max_length = std::numeric_limits<int>::max()) {
1088 1088
      // Paramters for heuristics
1089 1089
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1090 1090
      const double GLOBAL_UPDATE_FACTOR = 3.0;
1091 1091

	
1092 1092
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1093 1093
        (_res_node_num + _sup_node_num * _sup_node_num));
1094 1094
      int next_update_limit = global_update_freq;
1095
      
1095

	
1096 1096
      int relabel_cnt = 0;
1097
      
1097

	
1098 1098
      // Perform cost scaling phases
1099 1099
      std::vector<int> path;
1100 1100
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1101 1101
                                        1 : _epsilon / _alpha )
1102 1102
      {
1103 1103
        // Early termination heuristic
1104 1104
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1105 1105
          if (earlyTermination()) break;
1106 1106
        }
1107
        
1107

	
1108 1108
        // Initialize current phase
1109 1109
        initPhase();
1110
        
1110

	
1111 1111
        // Perform partial augment and relabel operations
1112 1112
        while (true) {
1113 1113
          // Select an active node (FIFO selection)
1114 1114
          while (_active_nodes.size() > 0 &&
1115 1115
                 _excess[_active_nodes.front()] <= 0) {
1116 1116
            _active_nodes.pop_front();
1117 1117
          }
1118 1118
          if (_active_nodes.size() == 0) break;
1119 1119
          int start = _active_nodes.front();
1120 1120

	
1121 1121
          // Find an augmenting path from the start node
1122 1122
          path.clear();
1123 1123
          int tip = start;
1124 1124
          while (_excess[tip] >= 0 && int(path.size()) < max_length) {
1125 1125
            int u;
1126 1126
            LargeCost min_red_cost, rc, pi_tip = _pi[tip];
... ...
@@ -1183,73 +1183,73 @@
1183 1183
          }
1184 1184
        }
1185 1185
      }
1186 1186
    }
1187 1187

	
1188 1188
    /// Execute the algorithm performing push and relabel operations
1189 1189
    void startPush() {
1190 1190
      // Paramters for heuristics
1191 1191
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1192 1192
      const double GLOBAL_UPDATE_FACTOR = 2.0;
1193 1193

	
1194 1194
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1195 1195
        (_res_node_num + _sup_node_num * _sup_node_num));
1196 1196
      int next_update_limit = global_update_freq;
1197 1197

	
1198 1198
      int relabel_cnt = 0;
1199
      
1199

	
1200 1200
      // Perform cost scaling phases
1201 1201
      BoolVector hyper(_res_node_num, false);
1202 1202
      LargeCostVector hyper_cost(_res_node_num);
1203 1203
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1204 1204
                                        1 : _epsilon / _alpha )
1205 1205
      {
1206 1206
        // Early termination heuristic
1207 1207
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1208 1208
          if (earlyTermination()) break;
1209 1209
        }
1210
        
1210

	
1211 1211
        // Initialize current phase
1212 1212
        initPhase();
1213 1213

	
1214 1214
        // Perform push and relabel operations
1215 1215
        while (_active_nodes.size() > 0) {
1216 1216
          LargeCost min_red_cost, rc, pi_n;
1217 1217
          Value delta;
1218 1218
          int n, t, a, last_out = _res_arc_num;
1219 1219

	
1220 1220
        next_node:
1221 1221
          // Select an active node (FIFO selection)
1222 1222
          n = _active_nodes.front();
1223 1223
          last_out = _first_out[n+1];
1224 1224
          pi_n = _pi[n];
1225
          
1225

	
1226 1226
          // Perform push operations if there are admissible arcs
1227 1227
          if (_excess[n] > 0) {
1228 1228
            for (a = _next_out[n]; a != last_out; ++a) {
1229 1229
              if (_res_cap[a] > 0 &&
1230 1230
                  _cost[a] + pi_n - _pi[_target[a]] < 0) {
1231 1231
                delta = std::min(_res_cap[a], _excess[n]);
1232 1232
                t = _target[a];
1233 1233

	
1234 1234
                // Push-look-ahead heuristic
1235 1235
                Value ahead = -_excess[t];
1236 1236
                int last_out_t = _first_out[t+1];
1237 1237
                LargeCost pi_t = _pi[t];
1238 1238
                for (int ta = _next_out[t]; ta != last_out_t; ++ta) {
1239
                  if (_res_cap[ta] > 0 && 
1239
                  if (_res_cap[ta] > 0 &&
1240 1240
                      _cost[ta] + pi_t - _pi[_target[ta]] < 0)
1241 1241
                    ahead += _res_cap[ta];
1242 1242
                  if (ahead >= delta) break;
1243 1243
                }
1244 1244
                if (ahead < 0) ahead = 0;
1245 1245

	
1246 1246
                // Push flow along the arc
1247 1247
                if (ahead < delta && !hyper[t]) {
1248 1248
                  _res_cap[a] -= ahead;
1249 1249
                  _res_cap[_reverse[a]] += ahead;
1250 1250
                  _excess[n] -= ahead;
1251 1251
                  _excess[t] += ahead;
1252 1252
                  _active_nodes.push_front(t);
1253 1253
                  hyper[t] = true;
1254 1254
                  hyper_cost[t] = _cost[a] + pi_n - pi_t;
1255 1255
                  _next_out[n] = a;
... ...
@@ -1274,41 +1274,41 @@
1274 1274

	
1275 1275
          // Relabel the node if it is still active (or hyper)
1276 1276
          if (_excess[n] > 0 || hyper[n]) {
1277 1277
             min_red_cost = hyper[n] ? -hyper_cost[n] :
1278 1278
               std::numeric_limits<LargeCost>::max();
1279 1279
            for (int a = _first_out[n]; a != last_out; ++a) {
1280 1280
              rc = _cost[a] + pi_n - _pi[_target[a]];
1281 1281
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1282 1282
                min_red_cost = rc;
1283 1283
              }
1284 1284
            }
1285 1285
            _pi[n] -= min_red_cost + _epsilon;
1286 1286
            _next_out[n] = _first_out[n];
1287 1287
            hyper[n] = false;
1288 1288
            ++relabel_cnt;
1289 1289
          }
1290
        
1290

	
1291 1291
          // Remove nodes that are not active nor hyper
1292 1292
        remove_nodes:
1293 1293
          while ( _active_nodes.size() > 0 &&
1294 1294
                  _excess[_active_nodes.front()] <= 0 &&
1295 1295
                  !hyper[_active_nodes.front()] ) {
1296 1296
            _active_nodes.pop_front();
1297 1297
          }
1298
          
1298

	
1299 1299
          // Global update heuristic
1300 1300
          if (relabel_cnt >= next_update_limit) {
1301 1301
            globalUpdate();
1302 1302
            for (int u = 0; u != _res_node_num; ++u)
1303 1303
              hyper[u] = false;
1304 1304
            next_update_limit += global_update_freq;
1305 1305
          }
1306 1306
        }
1307 1307
      }
1308 1308
    }
1309 1309

	
1310 1310
  }; //class CostScaling
1311 1311

	
1312 1312
  ///@}
1313 1313

	
1314 1314
} //namespace lemon
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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 <iostream>
20 20
#include <vector>
21 21
#include <cstring>
... ...
@@ -98,33 +98,33 @@
98 98
  int CplexBase::_addCol() {
99 99
    int i = CPXgetnumcols(cplexEnv(), _prob);
100 100
    double lb = -INF, ub = INF;
101 101
    CPXnewcols(cplexEnv(), _prob, 1, 0, &lb, &ub, 0, 0);
102 102
    return i;
103 103
  }
104 104

	
105 105

	
106 106
  int CplexBase::_addRow() {
107 107
    int i = CPXgetnumrows(cplexEnv(), _prob);
108 108
    const double ub = INF;
109 109
    const char s = 'L';
110 110
    CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
111 111
    return i;
112 112
  }
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b, 
114
  int CplexBase::_addRow(Value lb, ExprIterator b,
115 115
                         ExprIterator e, Value ub) {
116 116
    int i = CPXgetnumrows(cplexEnv(), _prob);
117 117
    if (lb == -INF) {
118 118
      const char s = 'L';
119 119
      CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
120 120
    } else if (ub == INF) {
121 121
      const char s = 'G';
122 122
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
123 123
    } else if (lb == ub){
124 124
      const char s = 'E';
125 125
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
126 126
    } else {
127 127
      const char s = 'R';
128 128
      double len = ub - lb;
129 129
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
130 130
    }
... ...
@@ -476,33 +476,33 @@
476 476

	
477 477
  void CplexBase::_messageLevel(MessageLevel level) {
478 478
    switch (level) {
479 479
    case MESSAGE_NOTHING:
480 480
      _message_enabled = false;
481 481
      break;
482 482
    case MESSAGE_ERROR:
483 483
    case MESSAGE_WARNING:
484 484
    case MESSAGE_NORMAL:
485 485
    case MESSAGE_VERBOSE:
486 486
      _message_enabled = true;
487 487
      break;
488 488
    }
489 489
  }
490 490

	
491 491
  void CplexBase::_applyMessageLevel() {
492
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 
492
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND,
493 493
                   _message_enabled ? CPX_ON : CPX_OFF);
494 494
  }
495 495

	
496 496
  // CplexLp members
497 497

	
498 498
  CplexLp::CplexLp()
499 499
    : LpBase(), LpSolver(), CplexBase() {}
500 500

	
501 501
  CplexLp::CplexLp(const CplexEnv& env)
502 502
    : LpBase(), LpSolver(), CplexBase(env) {}
503 503

	
504 504
  CplexLp::CplexLp(const CplexLp& other)
505 505
    : LpBase(), LpSolver(), CplexBase(other) {}
506 506

	
507 507
  CplexLp::~CplexLp() {}
508 508

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

	
... ...
@@ -129,58 +129,58 @@
129 129
      /// well-known strongly polynomial method
130 130
      /// \ref goldberg89cyclecanceling. It improves along a
131 131
      /// \ref min_mean_cycle "minimum mean cycle" in each iteration.
132 132
      /// Its running time complexity is O(n<sup>2</sup>m<sup>3</sup>log(n)).
133 133
      MINIMUM_MEAN_CYCLE_CANCELING,
134 134
      /// The "Cancel And Tighten" algorithm, which can be viewed as an
135 135
      /// improved version of the previous method
136 136
      /// \ref goldberg89cyclecanceling.
137 137
      /// It is faster both in theory and in practice, its running time
138 138
      /// complexity is O(n<sup>2</sup>m<sup>2</sup>log(n)).
139 139
      CANCEL_AND_TIGHTEN
140 140
    };
141 141

	
142 142
  private:
143 143

	
144 144
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
145
    
145

	
146 146
    typedef std::vector<int> IntVector;
147 147
    typedef std::vector<double> DoubleVector;
148 148
    typedef std::vector<Value> ValueVector;
149 149
    typedef std::vector<Cost> CostVector;
150 150
    typedef std::vector<char> BoolVector;
151 151
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
152 152

	
153 153
  private:
154
  
154

	
155 155
    template <typename KT, typename VT>
156 156
    class StaticVectorMap {
157 157
    public:
158 158
      typedef KT Key;
159 159
      typedef VT Value;
160
      
160

	
161 161
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
162
      
162

	
163 163
      const Value& operator[](const Key& key) const {
164 164
        return _v[StaticDigraph::id(key)];
165 165
      }
166 166

	
167 167
      Value& operator[](const Key& key) {
168 168
        return _v[StaticDigraph::id(key)];
169 169
      }
170
      
170

	
171 171
      void set(const Key& key, const Value& val) {
172 172
        _v[StaticDigraph::id(key)] = val;
173 173
      }
174 174

	
175 175
    private:
176 176
      std::vector<Value>& _v;
177 177
    };
178 178

	
179 179
    typedef StaticVectorMap<StaticDigraph::Node, Cost> CostNodeMap;
180 180
    typedef StaticVectorMap<StaticDigraph::Arc, Cost> CostArcMap;
181 181

	
182 182
  private:
183 183

	
184 184

	
185 185
    // Data related to the underlying digraph
186 186
    const GR &_graph;
... ...
@@ -208,35 +208,35 @@
208 208
    ValueVector _lower;
209 209
    ValueVector _upper;
210 210
    CostVector _cost;
211 211
    ValueVector _supply;
212 212

	
213 213
    ValueVector _res_cap;
214 214
    CostVector _pi;
215 215

	
216 216
    // Data for a StaticDigraph structure
217 217
    typedef std::pair<int, int> IntPair;
218 218
    StaticDigraph _sgr;
219 219
    std::vector<IntPair> _arc_vec;
220 220
    std::vector<Cost> _cost_vec;
221 221
    IntVector _id_vec;
222 222
    CostArcMap _cost_map;
223 223
    CostNodeMap _pi_map;
224
  
224

	
225 225
  public:
226
  
226

	
227 227
    /// \brief Constant for infinite upper bounds (capacities).
228 228
    ///
229 229
    /// Constant for infinite upper bounds (capacities).
230 230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231 231
    /// \c std::numeric_limits<Value>::max() otherwise.
232 232
    const Value INF;
233 233

	
234 234
  public:
235 235

	
236 236
    /// \brief Constructor.
237 237
    ///
238 238
    /// The constructor of the class.
239 239
    ///
240 240
    /// \param graph The digraph the algorithm runs on.
241 241
    CycleCanceling(const GR& graph) :
242 242
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
... ...
@@ -353,33 +353,33 @@
353 353
    /// assigned to \c t and all other nodes have zero supply value.
354 354
    ///
355 355
    /// \param s The source node.
356 356
    /// \param t The target node.
357 357
    /// \param k The required amount of flow from node \c s to node \c t
358 358
    /// (i.e. the supply of \c s and the demand of \c t).
359 359
    ///
360 360
    /// \return <tt>(*this)</tt>
361 361
    CycleCanceling& stSupply(const Node& s, const Node& t, Value k) {
362 362
      for (int i = 0; i != _res_node_num; ++i) {
363 363
        _supply[i] = 0;
364 364
      }
365 365
      _supply[_node_id[s]] =  k;
366 366
      _supply[_node_id[t]] = -k;
367 367
      return *this;
368 368
    }
369
    
369

	
370 370
    /// @}
371 371

	
372 372
    /// \name Execution control
373 373
    /// The algorithm can be executed using \ref run().
374 374

	
375 375
    /// @{
376 376

	
377 377
    /// \brief Run the algorithm.
378 378
    ///
379 379
    /// This function runs the algorithm.
380 380
    /// The paramters can be specified using functions \ref lowerMap(),
381 381
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
382 382
    /// For example,
383 383
    /// \code
384 384
    ///   CycleCanceling<ListDigraph> cc(graph);
385 385
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
... ...
@@ -453,33 +453,33 @@
453 453
    /// \see reset(), run()
454 454
    CycleCanceling& resetParams() {
455 455
      for (int i = 0; i != _res_node_num; ++i) {
456 456
        _supply[i] = 0;
457 457
      }
458 458
      int limit = _first_out[_root];
459 459
      for (int j = 0; j != limit; ++j) {
460 460
        _lower[j] = 0;
461 461
        _upper[j] = INF;
462 462
        _cost[j] = _forward[j] ? 1 : -1;
463 463
      }
464 464
      for (int j = limit; j != _res_arc_num; ++j) {
465 465
        _lower[j] = 0;
466 466
        _upper[j] = INF;
467 467
        _cost[j] = 0;
468 468
        _cost[_reverse[j]] = 0;
469
      }      
469
      }
470 470
      _have_lower = false;
471 471
      return *this;
472 472
    }
473 473

	
474 474
    /// \brief Reset the internal data structures and all the parameters
475 475
    /// that have been given before.
476 476
    ///
477 477
    /// This function resets the internal data structures and all the
478 478
    /// paramaters that have been given before using functions \ref lowerMap(),
479 479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480 480
    ///
481 481
    /// It is useful for multiple \ref run() calls. Basically, all the given
482 482
    /// parameters are kept for the next \ref run() call, unless
483 483
    /// \ref resetParams() or \ref reset() is used.
484 484
    /// If the underlying digraph was also modified after the construction
485 485
    /// of the class or the last \ref reset() call, then the \ref reset()
... ...
@@ -495,33 +495,33 @@
495 495
      _node_num = countNodes(_graph);
496 496
      _arc_num = countArcs(_graph);
497 497
      _res_node_num = _node_num + 1;
498 498
      _res_arc_num = 2 * (_arc_num + _node_num);
499 499
      _root = _node_num;
500 500

	
501 501
      _first_out.resize(_res_node_num + 1);
502 502
      _forward.resize(_res_arc_num);
503 503
      _source.resize(_res_arc_num);
504 504
      _target.resize(_res_arc_num);
505 505
      _reverse.resize(_res_arc_num);
506 506

	
507 507
      _lower.resize(_res_arc_num);
508 508
      _upper.resize(_res_arc_num);
509 509
      _cost.resize(_res_arc_num);
510 510
      _supply.resize(_res_node_num);
511
      
511

	
512 512
      _res_cap.resize(_res_arc_num);
513 513
      _pi.resize(_res_node_num);
514 514

	
515 515
      _arc_vec.reserve(_res_arc_num);
516 516
      _cost_vec.reserve(_res_arc_num);
517 517
      _id_vec.reserve(_res_arc_num);
518 518

	
519 519
      // Copy the graph
520 520
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
521 521
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
522 522
        _node_id[n] = i;
523 523
      }
524 524
      i = 0;
525 525
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
526 526
        _first_out[i] = j;
527 527
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
... ...
@@ -541,33 +541,33 @@
541 541
        _target[j] = _root;
542 542
        _reverse[j] = k;
543 543
        _forward[k] = true;
544 544
        _source[k] = _root;
545 545
        _target[k] = i;
546 546
        _reverse[k] = j;
547 547
        ++j; ++k;
548 548
      }
549 549
      _first_out[i] = j;
550 550
      _first_out[_res_node_num] = k;
551 551
      for (ArcIt a(_graph); a != INVALID; ++a) {
552 552
        int fi = _arc_idf[a];
553 553
        int bi = _arc_idb[a];
554 554
        _reverse[fi] = bi;
555 555
        _reverse[bi] = fi;
556 556
      }
557
      
557

	
558 558
      // Reset parameters
559 559
      resetParams();
560 560
      return *this;
561 561
    }
562 562

	
563 563
    /// @}
564 564

	
565 565
    /// \name Query Functions
566 566
    /// The results of the algorithm can be obtained using these
567 567
    /// functions.\n
568 568
    /// The \ref run() function must be called before using them.
569 569

	
570 570
    /// @{
571 571

	
572 572
    /// \brief Return the total cost of the found flow.
573 573
    ///
... ...
@@ -650,40 +650,40 @@
650 650
    }
651 651

	
652 652
    /// @}
653 653

	
654 654
  private:
655 655

	
656 656
    // Initialize the algorithm
657 657
    ProblemType init() {
658 658
      if (_res_node_num <= 1) return INFEASIBLE;
659 659

	
660 660
      // Check the sum of supply values
661 661
      _sum_supply = 0;
662 662
      for (int i = 0; i != _root; ++i) {
663 663
        _sum_supply += _supply[i];
664 664
      }
665 665
      if (_sum_supply > 0) return INFEASIBLE;
666
      
666

	
667 667

	
668 668
      // Initialize vectors
669 669
      for (int i = 0; i != _res_node_num; ++i) {
670 670
        _pi[i] = 0;
671 671
      }
672 672
      ValueVector excess(_supply);
673
      
673

	
674 674
      // Remove infinite upper bounds and check negative arcs
675 675
      const Value MAX = std::numeric_limits<Value>::max();
676 676
      int last_out;
677 677
      if (_have_lower) {
678 678
        for (int i = 0; i != _root; ++i) {
679 679
          last_out = _first_out[i+1];
680 680
          for (int j = _first_out[i]; j != last_out; ++j) {
681 681
            if (_forward[j]) {
682 682
              Value c = _cost[j] < 0 ? _upper[j] : _lower[j];
683 683
              if (c >= MAX) return UNBOUNDED;
684 684
              excess[i] -= c;
685 685
              excess[_target[j]] += c;
686 686
            }
687 687
          }
688 688
        }
689 689
      } else {
... ...
@@ -757,36 +757,36 @@
757 757
          _cost[ra] = 0;
758 758
        }
759 759
      } else {
760 760
        for (ArcIt a(_graph); a != INVALID; ++a) {
761 761
          Value fa = flow[a];
762 762
          _res_cap[_arc_idf[a]] = cap[a] - fa;
763 763
          _res_cap[_arc_idb[a]] = fa;
764 764
        }
765 765
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
766 766
          int ra = _reverse[a];
767 767
          _res_cap[a] = 1;
768 768
          _res_cap[ra] = 0;
769 769
          _cost[a] = 0;
770 770
          _cost[ra] = 0;
771 771
        }
772 772
      }
773
      
773

	
774 774
      return OPTIMAL;
775 775
    }
776
    
776

	
777 777
    // Build a StaticDigraph structure containing the current
778 778
    // residual network
779 779
    void buildResidualNetwork() {
780 780
      _arc_vec.clear();
781 781
      _cost_vec.clear();
782 782
      _id_vec.clear();
783 783
      for (int j = 0; j != _res_arc_num; ++j) {
784 784
        if (_res_cap[j] > 0) {
785 785
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
786 786
          _cost_vec.push_back(_cost[j]);
787 787
          _id_vec.push_back(j);
788 788
        }
789 789
      }
790 790
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
791 791
    }
792 792

	
... ...
@@ -816,40 +816,40 @@
816 816
      }
817 817

	
818 818
      // Handle non-zero lower bounds
819 819
      if (_have_lower) {
820 820
        int limit = _first_out[_root];
821 821
        for (int j = 0; j != limit; ++j) {
822 822
          if (!_forward[j]) _res_cap[j] += _lower[j];
823 823
        }
824 824
      }
825 825
    }
826 826

	
827 827
    // Execute the "Simple Cycle Canceling" method
828 828
    void startSimpleCycleCanceling() {
829 829
      // Constants for computing the iteration limits
830 830
      const int BF_FIRST_LIMIT  = 2;
831 831
      const double BF_LIMIT_FACTOR = 1.5;
832
      
832

	
833 833
      typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap;
834 834
      typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph;
835 835
      typedef StaticVectorMap<StaticDigraph::Node, StaticDigraph::Arc> PredMap;
836 836
      typedef typename BellmanFord<ResDigraph, CostArcMap>
837 837
        ::template SetDistMap<CostNodeMap>
838 838
        ::template SetPredMap<PredMap>::Create BF;
839
      
839

	
840 840
      // Build the residual network
841 841
      _arc_vec.clear();
842 842
      _cost_vec.clear();
843 843
      for (int j = 0; j != _res_arc_num; ++j) {
844 844
        _arc_vec.push_back(IntPair(_source[j], _target[j]));
845 845
        _cost_vec.push_back(_cost[j]);
846 846
      }
847 847
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
848 848

	
849 849
      FilterMap filter_map(_res_cap);
850 850
      ResDigraph rgr(_sgr, filter_map);
851 851
      std::vector<int> cycle;
852 852
      std::vector<StaticDigraph::Arc> pred(_res_arc_num);
853 853
      PredMap pred_map(pred);
854 854
      BF bf(rgr, _cost_map);
855 855
      bf.distMap(_pi_map).predMap(pred_map);
... ...
@@ -913,56 +913,56 @@
913 913
          }
914 914

	
915 915
          // Increase iteration limit if no cycle is found
916 916
          if (!cycle_found) {
917 917
            length_bound = static_cast<int>(length_bound * BF_LIMIT_FACTOR);
918 918
          }
919 919
        }
920 920
      }
921 921
    }
922 922

	
923 923
    // Execute the "Minimum Mean Cycle Canceling" method
924 924
    void startMinMeanCycleCanceling() {
925 925
      typedef SimplePath<StaticDigraph> SPath;
926 926
      typedef typename SPath::ArcIt SPathArcIt;
927 927
      typedef typename HowardMmc<StaticDigraph, CostArcMap>
928 928
        ::template SetPath<SPath>::Create MMC;
929
      
929

	
930 930
      SPath cycle;
931 931
      MMC mmc(_sgr, _cost_map);
932 932
      mmc.cycle(cycle);
933 933
      buildResidualNetwork();
934 934
      while (mmc.findCycleMean() && mmc.cycleCost() < 0) {
935 935
        // Find the cycle
936 936
        mmc.findCycle();
937 937

	
938 938
        // Compute delta value
939 939
        Value delta = INF;
940 940
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
941 941
          Value d = _res_cap[_id_vec[_sgr.id(a)]];
942 942
          if (d < delta) delta = d;
943 943
        }
944 944

	
945 945
        // Augment along the cycle
946 946
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
947 947
          int j = _id_vec[_sgr.id(a)];
948 948
          _res_cap[j] -= delta;
949 949
          _res_cap[_reverse[j]] += delta;
950 950
        }
951 951

	
952
        // Rebuild the residual network        
952
        // Rebuild the residual network
953 953
        buildResidualNetwork();
954 954
      }
955 955
    }
956 956

	
957 957
    // Execute the "Cancel And Tighten" method
958 958
    void startCancelAndTighten() {
959 959
      // Constants for the min mean cycle computations
960 960
      const double LIMIT_FACTOR = 1.0;
961 961
      const int MIN_LIMIT = 5;
962 962

	
963 963
      // Contruct auxiliary data vectors
964 964
      DoubleVector pi(_res_node_num, 0.0);
965 965
      IntVector level(_res_node_num);
966 966
      BoolVector reached(_res_node_num);
967 967
      BoolVector processed(_res_node_num);
968 968
      IntVector pred_node(_res_node_num);
... ...
@@ -1130,41 +1130,41 @@
1130 1130
              curr = _cost[a] + pu - pi[_target[a]];
1131 1131
              if (-curr > epsilon) epsilon = -curr;
1132 1132
            }
1133 1133
          }
1134 1134
        } else {
1135 1135
          typedef HowardMmc<StaticDigraph, CostArcMap> MMC;
1136 1136
          typedef typename BellmanFord<StaticDigraph, CostArcMap>
1137 1137
            ::template SetDistMap<CostNodeMap>::Create BF;
1138 1138

	
1139 1139
          // Set epsilon to the minimum cycle mean
1140 1140
          buildResidualNetwork();
1141 1141
          MMC mmc(_sgr, _cost_map);
1142 1142
          mmc.findCycleMean();
1143 1143
          epsilon = -mmc.cycleMean();
1144 1144
          Cost cycle_cost = mmc.cycleCost();
1145 1145
          int cycle_size = mmc.cycleSize();
1146
          
1146

	
1147 1147
          // Compute feasible potentials for the current epsilon
1148 1148
          for (int i = 0; i != int(_cost_vec.size()); ++i) {
1149 1149
            _cost_vec[i] = cycle_size * _cost_vec[i] - cycle_cost;
1150 1150
          }
1151 1151
          BF bf(_sgr, _cost_map);
1152 1152
          bf.distMap(_pi_map);
1153 1153
          bf.init(0);
1154 1154
          bf.start();
1155 1155
          for (int u = 0; u != _res_node_num; ++u) {
1156 1156
            pi[u] = static_cast<double>(_pi[u]) / cycle_size;
1157 1157
          }
1158
        
1158

	
1159 1159
          iter = limit;
1160 1160
        }
1161 1161
      }
1162 1162
    }
1163 1163

	
1164 1164
  }; //class CycleCanceling
1165 1165

	
1166 1166
  ///@}
1167 1167

	
1168 1168
} //namespace lemon
1169 1169

	
1170 1170
#endif //LEMON_CYCLE_CANCELING_H
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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

	
... ...
@@ -69,33 +69,34 @@
69 69

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

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

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

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

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

	
99 100
    ///The type of the map that stores the distances of the nodes.
100 101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 102
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -257,33 +258,34 @@
257 258
    };
258 259

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

	
279 281
    template <class T>
280 282
    struct SetProcessedMapTraits : public Traits {
281 283
      typedef T ProcessedMap;
282 284
      static ProcessedMap *createProcessedMap(const Digraph &)
283 285
      {
284 286
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
285 287
        return 0; // ignore warnings
286 288
      }
287 289
    };
288 290
    ///\brief \ref named-templ-param "Named parameter" for setting
289 291
    ///\c ProcessedMap type.
... ...
@@ -789,33 +791,34 @@
789 791

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

	
802 804
    ///The type of the map that indicates which nodes are reached.
803 805

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

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

	
817 820
    ///The type of the map that stores the distances of the nodes.
818 821

	
819 822
    ///The type of the map that stores the distances of the nodes.
820 823
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
821 824
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -1194,33 +1197,34 @@
1194 1197
  };
1195 1198
#endif
1196 1199

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

	
1204 1207
    /// \brief The type of the digraph the algorithm runs on.
1205 1208
    typedef GR Digraph;
1206 1209

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

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

	
1222 1226
  };
1223 1227

	
1224 1228
  /// \ingroup search
1225 1229
  ///
1226 1230
  /// \brief DFS algorithm class with visitor interface.
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_DIMACS_H
20 20
#define LEMON_DIMACS_H
21 21

	
... ...
@@ -48,33 +48,33 @@
48 48
      MAT    ///< DIMACS file type for plain graphs and matching problems.
49 49
    };
50 50
    ///The file type
51 51
    Type type;
52 52
    ///The number of nodes in the graph
53 53
    int nodeNum;
54 54
    ///The number of edges in the graph
55 55
    int edgeNum;
56 56
    int lineShift;
57 57
    ///Constructor. It sets the type to \c NONE.
58 58
    DimacsDescriptor() : type(NONE) {}
59 59
  };
60 60

	
61 61
  ///Discover the type of a DIMACS file
62 62

	
63 63
  ///This function starts seeking the beginning of the given file for the
64
  ///problem type and size info. 
64
  ///problem type and size info.
65 65
  ///The found data is returned in a special struct that can be evaluated
66 66
  ///and passed to the appropriate reader function.
67 67
  DimacsDescriptor dimacsType(std::istream& is)
68 68
  {
69 69
    DimacsDescriptor r;
70 70
    std::string problem,str;
71 71
    char c;
72 72
    r.lineShift=0;
73 73
    while (is >> c)
74 74
      switch(c)
75 75
        {
76 76
        case 'p':
77 77
          if(is >> problem >> r.nodeNum >> r.edgeNum)
78 78
            {
79 79
              getline(is, str);
80 80
              r.lineShift++;
... ...
@@ -199,58 +199,58 @@
199 199
    std::vector<typename Digraph::Node> nodes;
200 200
    typename Digraph::Arc e;
201 201
    char c, d;
202 202
    int i, j;
203 203
    typename CapacityMap::Value _cap;
204 204
    std::string str;
205 205
    nodes.resize(desc.nodeNum + 1);
206 206
    for (int k = 1; k <= desc.nodeNum; ++k) {
207 207
      nodes[k] = g.addNode();
208 208
    }
209 209
    typedef typename CapacityMap::Value Capacity;
210 210

	
211 211
    if(infty==0)
212 212
      infty = std::numeric_limits<Capacity>::has_infinity ?
213 213
        std::numeric_limits<Capacity>::infinity() :
214 214
        std::numeric_limits<Capacity>::max();
215
 
215

	
216 216
    while (is >> c) {
217 217
      switch (c) {
218 218
      case 'c': // comment line
219 219
        getline(is, str);
220 220
        break;
221 221
      case 'n': // node definition line
222 222
        if (desc.type==DimacsDescriptor::SP) { // shortest path problem
223 223
          is >> i;
224 224
          getline(is, str);
225 225
          s = nodes[i];
226 226
        }
227 227
        if (desc.type==DimacsDescriptor::MAX) { // max flow problem
228 228
          is >> i >> d;
229 229
          getline(is, str);
230 230
          if (d == 's') s = nodes[i];
231 231
          if (d == 't') t = nodes[i];
232 232
        }
233 233
        break;
234 234
      case 'a': // arc definition line
235 235
        if (desc.type==DimacsDescriptor::SP) {
236 236
          is >> i >> j >> _cap;
237 237
          getline(is, str);
238 238
          e = g.addArc(nodes[i], nodes[j]);
239 239
          capacity.set(e, _cap);
240
        } 
240
        }
241 241
        else if (desc.type==DimacsDescriptor::MAX) {
242 242
          is >> i >> j >> _cap;
243 243
          getline(is, str);
244 244
          e = g.addArc(nodes[i], nodes[j]);
245 245
          if (_cap >= 0)
246 246
            capacity.set(e, _cap);
247 247
          else
248 248
            capacity.set(e, infty);
249 249
        }
250 250
        else {
251 251
          is >> i >> j;
252 252
          getline(is, str);
253 253
          g.addArc(nodes[i], nodes[j]);
254 254
        }
255 255
        break;
256 256
      }
... ...
@@ -349,63 +349,63 @@
349 349
  }
350 350

	
351 351
  template<typename Graph>
352 352
  typename enable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
353 353
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
354 354
              dummy<0> = 0)
355 355
  {
356 356
    g.addEdge(s,t);
357 357
  }
358 358
  template<typename Graph>
359 359
  typename disable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
360 360
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
361 361
              dummy<1> = 1)
362 362
  {
363 363
    g.addArc(s,t);
364 364
  }
365
  
365

	
366 366
  /// \brief DIMACS plain (di)graph reader function.
367 367
  ///
368 368
  /// This function reads a plain (di)graph without any designated nodes
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from
370 370
  /// DIMACS files having a line starting with
371 371
  /// \code
372 372
  ///   p mat
373 373
  /// \endcode
374 374
  /// At the beginning, \c g is cleared by \c g.clear().
375 375
  ///
376 376
  /// If the file type was previously evaluated by dimacsType(), then
377 377
  /// the descriptor struct should be given by the \c dest parameter.
378 378
  template<typename Graph>
379 379
  void readDimacsMat(std::istream& is, Graph &g,
380 380
                     DimacsDescriptor desc=DimacsDescriptor())
381 381
  {
382 382
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
383 383
    if(desc.type!=DimacsDescriptor::MAT)
384 384
      throw FormatError("Problem type mismatch");
385 385

	
386 386
    g.clear();
387 387
    std::vector<typename Graph::Node> nodes;
388 388
    char c;
389 389
    int i, j;
390 390
    std::string str;
391 391
    nodes.resize(desc.nodeNum + 1);
392 392
    for (int k = 1; k <= desc.nodeNum; ++k) {
393 393
      nodes[k] = g.addNode();
394 394
    }
395
    
395

	
396 396
    while (is >> c) {
397 397
      switch (c) {
398 398
      case 'c': // comment line
399 399
        getline(is, str);
400 400
        break;
401 401
      case 'n': // node definition line
402 402
        break;
403 403
      case 'a': // arc definition line
404 404
        is >> i >> j;
405 405
        getline(is, str);
406 406
        _addArcEdge(g,nodes[i], nodes[j]);
407 407
        break;
408 408
      }
409 409
    }
410 410
  }
411 411

	
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
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_EDGE_SET_H
20 20
#define LEMON_EDGE_SET_H
21 21

	
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_EULER_H
20 20
#define LEMON_EULER_H
21 21

	
22 22
#include<lemon/core.h>
23 23
#include<lemon/adaptors.h>
24 24
#include<lemon/connectivity.h>
25 25
#include <list>
26 26

	
27 27
/// \ingroup graph_properties
28 28
/// \file
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian 
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian
30 30
/// property.
31 31
///
32 32
///This file provides Euler tour iterators and a function to check
33 33
///if a (di)graph is \e Eulerian.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Euler tour iterator for digraphs.
38 38

	
39 39
  /// \ingroup graph_prop
40 40
  ///This iterator provides an Euler tour (Eulerian circuit) of a \e directed
41 41
  ///graph (if there exists) and it converts to the \c Arc type of the digraph.
42 42
  ///
43 43
  ///For example, if the given digraph has an Euler tour (i.e it has only one
44
  ///non-trivial component and the in-degree is equal to the out-degree 
44
  ///non-trivial component and the in-degree is equal to the out-degree
45 45
  ///for all nodes), then the following code will put the arcs of \c g
46 46
  ///to the vector \c et according to an Euler tour of \c g.
47 47
  ///\code
48 48
  ///  std::vector<ListDigraph::Arc> et;
49 49
  ///  for(DiEulerIt<ListDigraph> e(g); e!=INVALID; ++e)
50 50
  ///    et.push_back(e);
51 51
  ///\endcode
52 52
  ///If \c g has no Euler tour, then the resulted walk will not be closed
53 53
  ///or not contain all arcs.
54 54
  ///\sa EulerIt
55 55
  template<typename GR>
56 56
  class DiEulerIt
57 57
  {
58 58
    typedef typename GR::Node Node;
59 59
    typedef typename GR::NodeIt NodeIt;
60 60
    typedef typename GR::Arc Arc;
... ...
@@ -125,42 +125,42 @@
125 125
    ///expect.
126 126
    Arc operator++(int)
127 127
    {
128 128
      Arc e=*this;
129 129
      ++(*this);
130 130
      return e;
131 131
    }
132 132
  };
133 133

	
134 134
  ///Euler tour iterator for graphs.
135 135

	
136 136
  /// \ingroup graph_properties
137 137
  ///This iterator provides an Euler tour (Eulerian circuit) of an
138 138
  ///\e undirected graph (if there exists) and it converts to the \c Arc
139 139
  ///and \c Edge types of the graph.
140 140
  ///
141
  ///For example, if the given graph has an Euler tour (i.e it has only one 
141
  ///For example, if the given graph has an Euler tour (i.e it has only one
142 142
  ///non-trivial component and the degree of each node is even),
143 143
  ///the following code will print the arc IDs according to an
144 144
  ///Euler tour of \c g.
145 145
  ///\code
146 146
  ///  for(EulerIt<ListGraph> e(g); e!=INVALID; ++e) {
147 147
  ///    std::cout << g.id(Edge(e)) << std::eol;
148 148
  ///  }
149 149
  ///\endcode
150
  ///Although this iterator is for undirected graphs, it still returns 
150
  ///Although this iterator is for undirected graphs, it still returns
151 151
  ///arcs in order to indicate the direction of the tour.
152 152
  ///(But arcs convert to edges, of course.)
153 153
  ///
154 154
  ///If \c g has no Euler tour, then the resulted walk will not be closed
155 155
  ///or not contain all edges.
156 156
  template<typename GR>
157 157
  class EulerIt
158 158
  {
159 159
    typedef typename GR::Node Node;
160 160
    typedef typename GR::NodeIt NodeIt;
161 161
    typedef typename GR::Arc Arc;
162 162
    typedef typename GR::Edge Edge;
163 163
    typedef typename GR::ArcIt ArcIt;
164 164
    typedef typename GR::OutArcIt OutArcIt;
165 165
    typedef typename GR::InArcIt InArcIt;
166 166

	
... ...
@@ -220,33 +220,33 @@
220 220
        if(narc[s]==INVALID) break;
221 221
        else {
222 222
          euler.insert(next,narc[s]);
223 223
          visited[narc[s]]=true;
224 224
          Node n=g.target(narc[s]);
225 225
          ++narc[s];
226 226
          s=n;
227 227
        }
228 228
      }
229 229
      return *this;
230 230
    }
231 231

	
232 232
    ///Postfix incrementation
233 233

	
234 234
    /// Postfix incrementation.
235 235
    ///
236
    ///\warning This incrementation returns an \c Arc (which converts to 
236
    ///\warning This incrementation returns an \c Arc (which converts to
237 237
    ///an \c Edge), not an \ref EulerIt, as one may expect.
238 238
    Arc operator++(int)
239 239
    {
240 240
      Arc e=*this;
241 241
      ++(*this);
242 242
      return e;
243 243
    }
244 244
  };
245 245

	
246 246

	
247 247
  ///Check if the given graph is Eulerian
248 248

	
249 249
  /// \ingroup graph_properties
250 250
  ///This function checks if the given graph is Eulerian.
251 251
  ///It works for both directed and undirected graphs.
252 252
  ///
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_FRACTIONAL_MATCHING_H
20 20
#define LEMON_FRACTIONAL_MATCHING_H
21 21

	
... ...
@@ -1996,33 +1996,33 @@
1996 1996

	
1997 1997
            if (left_tree == right_tree) {
1998 1998
              cycleOnEdge(e, left_tree);
1999 1999
              --unmatched;
2000 2000
            } else {
2001 2001
              augmentOnEdge(e);
2002 2002
              unmatched -= 2;
2003 2003
            }
2004 2004
          } break;
2005 2005
        }
2006 2006
      }
2007 2007
      return true;
2008 2008
    }
2009 2009

	
2010 2010
    /// \brief Run the algorithm.
2011 2011
    ///
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching 
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching
2013 2013
    /// algorithm.
2014 2014
    ///
2015 2015
    /// \note mwfm.run() is just a shortcut of the following code.
2016 2016
    /// \code
2017 2017
    ///   mwpfm.init();
2018 2018
    ///   mwpfm.start();
2019 2019
    /// \endcode
2020 2020
    bool run() {
2021 2021
      init();
2022 2022
      return start();
2023 2023
    }
2024 2024

	
2025 2025
    /// @}
2026 2026

	
2027 2027
    /// \name Primal Solution
2028 2028
    /// Functions to get the primal solution, i.e. the maximum weighted
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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
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_FULL_GRAPH_H
20 20
#define LEMON_FULL_GRAPH_H
21 21

	
... ...
@@ -190,42 +190,42 @@
190 190

	
191 191
    /// \brief Resizes the digraph
192 192
    ///
193 193
    /// This function resizes the digraph. It fully destroys and
194 194
    /// rebuilds the structure, therefore the maps of the digraph will be
195 195
    /// reallocated automatically and the previous values will be lost.
196 196
    void resize(int n) {
197 197
      Parent::notifier(Arc()).clear();
198 198
      Parent::notifier(Node()).clear();
199 199
      construct(n);
200 200
      Parent::notifier(Node()).build();
201 201
      Parent::notifier(Arc()).build();
202 202
    }
203 203

	
204 204
    /// \brief Returns the node with the given index.
205 205
    ///
206
    /// Returns the node with the given index. Since this structure is 
206
    /// Returns the node with the given index. Since this structure is
207 207
    /// completely static, the nodes can be indexed with integers from
208 208
    /// the range <tt>[0..nodeNum()-1]</tt>.
209 209
    /// The index of a node is the same as its ID.
210 210
    /// \sa index()
211 211
    Node operator()(int ix) const { return Parent::operator()(ix); }
212 212

	
213 213
    /// \brief Returns the index of the given node.
214 214
    ///
215
    /// Returns the index of the given node. Since this structure is 
215
    /// Returns the index of the given node. Since this structure is
216 216
    /// completely static, the nodes can be indexed with integers from
217 217
    /// the range <tt>[0..nodeNum()-1]</tt>.
218 218
    /// The index of a node is the same as its ID.
219 219
    /// \sa operator()()
220 220
    static int index(const Node& node) { return Parent::index(node); }
221 221

	
222 222
    /// \brief Returns the arc connecting the given nodes.
223 223
    ///
224 224
    /// Returns the arc connecting the given nodes.
225 225
    Arc arc(Node u, Node v) const {
226 226
      return Parent::arc(u, v);
227 227
    }
228 228

	
229 229
    /// \brief Number of nodes.
230 230
    int nodeNum() const { return Parent::nodeNum(); }
231 231
    /// \brief Number of arcs.
... ...
@@ -569,42 +569,42 @@
569 569
    ///
570 570
    /// This function resizes the graph. It fully destroys and
571 571
    /// rebuilds the structure, therefore the maps of the graph will be
572 572
    /// reallocated automatically and the previous values will be lost.
573 573
    void resize(int n) {
574 574
      Parent::notifier(Arc()).clear();
575 575
      Parent::notifier(Edge()).clear();
576 576
      Parent::notifier(Node()).clear();
577 577
      construct(n);
578 578
      Parent::notifier(Node()).build();
579 579
      Parent::notifier(Edge()).build();
580 580
      Parent::notifier(Arc()).build();
581 581
    }
582 582

	
583 583
    /// \brief Returns the node with the given index.
584 584
    ///
585
    /// Returns the node with the given index. Since this structure is 
585
    /// Returns the node with the given index. Since this structure is
586 586
    /// completely static, the nodes can be indexed with integers from
587 587
    /// the range <tt>[0..nodeNum()-1]</tt>.
588 588
    /// The index of a node is the same as its ID.
589 589
    /// \sa index()
590 590
    Node operator()(int ix) const { return Parent::operator()(ix); }
591 591

	
592 592
    /// \brief Returns the index of the given node.
593 593
    ///
594
    /// Returns the index of the given node. Since this structure is 
594
    /// Returns the index of the given node. Since this structure is
595 595
    /// completely static, the nodes can be indexed with integers from
596 596
    /// the range <tt>[0..nodeNum()-1]</tt>.
597 597
    /// The index of a node is the same as its ID.
598 598
    /// \sa operator()()
599 599
    static int index(const Node& node) { return Parent::index(node); }
600 600

	
601 601
    /// \brief Returns the arc connecting the given nodes.
602 602
    ///
603 603
    /// Returns the arc connecting the given nodes.
604 604
    Arc arc(Node s, Node t) const {
605 605
      return Parent::arc(s, t);
606 606
    }
607 607

	
608 608
    /// \brief Returns the edge connecting the given nodes.
609 609
    ///
610 610
    /// Returns the edge connecting the given nodes.

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)