↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -33,121 +33,121 @@
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
36 36
on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
37 37
signed supply values of the nodes.
38 38
If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
39 39
supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
40 40
\f$-sup(u)\f$ demand.
41 41
A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution
42 42
of the following optimization problem.
43 43

	
44 44
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
45 45
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq
46 46
    sup(u) \quad \forall u\in V \f]
47 47
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
48 48

	
49 49
The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
50 50
zero or negative in order to have a feasible solution (since the sum
51 51
of the expressions on the left-hand side of the inequalities is zero).
52 52
It means that the total demand must be greater or equal to the total
53 53
supply and all the supplies have to be carried out from the supply nodes,
54 54
but there could be demands that are not satisfied.
55 55
If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
56 56
constraints have to be satisfied with equality, i.e. all demands
57 57
have to be satisfied and all supplies have to be used.
58 58

	
59 59

	
60 60
\section mcf_algs Algorithms
61 61

	
62 62
LEMON contains several algorithms for solving this problem, for more
63 63
information see \ref min_cost_flow_algs "Minimum Cost Flow Algorithms".
64 64

	
65 65
A feasible solution for this problem can be found using \ref Circulation.
66 66

	
67 67

	
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
   - \f$\pi(u)<=0\f$;
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) =
101 101
    sup(u) \quad \forall u\in V \f]
102 102
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
103 103

	
104 104
However if the sum of the supply values is zero, then these two problems
105 105
are equivalent.
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 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.
139 139
An \f$f: A\rightarrow\mathbf{R}\f$ feasible solution of this problem
140 140
is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$
141 141
node potentials the following conditions hold.
142 142

	
143 143
 - For all \f$uv\in A\f$ arcs:
144 144
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
145 145
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
146 146
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
147 147
 - For all \f$u\in V\f$ nodes:
148
   - \f$\pi(u)>=0\f$;
148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
150 150
     then \f$\pi(u)=0\f$.
151 151

	
152 152
*/
153 153
}
Ignore white space 6 line context
... ...
@@ -255,97 +255,97 @@
255 255
        LEMON_ASSERT(false, "PredMap is not initialized");
256 256
        return 0; // ignore warnings
257 257
      }
258 258
    };
259 259

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

	
281 281
    /// \brief \ref named-templ-param "Named parameter" for setting
282 282
    /// \c DistMap type.
283 283
    ///
284 284
    /// \ref named-templ-param "Named parameter" for setting
285 285
    /// \c DistMap type.
286 286
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
287 287
    template <class T>
288 288
    struct SetDistMap 
289 289
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
290 290
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
291 291
    };
292 292

	
293 293
    template <class T>
294 294
    struct SetOperationTraitsTraits : public Traits {
295 295
      typedef T OperationTraits;
296 296
    };
297 297
    
298 298
    /// \brief \ref named-templ-param "Named parameter" for setting 
299 299
    /// \c OperationTraits type.
300 300
    ///
301 301
    /// \ref named-templ-param "Named parameter" for setting
302 302
    /// \c OperationTraits type.
303
    /// For more information see \ref BellmanFordDefaultOperationTraits.
303
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
304 304
    template <class T>
305 305
    struct SetOperationTraits
306 306
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
307 307
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
308 308
      Create;
309 309
    };
310 310
    
311 311
    ///@}
312 312

	
313 313
  protected:
314 314
    
315 315
    BellmanFord() {}
316 316

	
317 317
  public:      
318 318
    
319 319
    /// \brief Constructor.
320 320
    ///
321 321
    /// Constructor.
322 322
    /// \param g The digraph the algorithm runs on.
323 323
    /// \param length The length map used by the algorithm.
324 324
    BellmanFord(const Digraph& g, const LengthMap& length) :
325 325
      _gr(&g), _length(&length),
326 326
      _pred(0), _local_pred(false),
327 327
      _dist(0), _local_dist(false), _mask(0) {}
328 328
    
329 329
    ///Destructor.
330 330
    ~BellmanFord() {
331 331
      if(_local_pred) delete _pred;
332 332
      if(_local_dist) delete _dist;
333 333
      if(_mask) delete _mask;
334 334
    }
335 335

	
336 336
    /// \brief Sets the length map.
337 337
    ///
338 338
    /// Sets the length map.
339 339
    /// \return <tt>(*this)</tt>
340 340
    BellmanFord &lengthMap(const LengthMap &map) {
341 341
      _length = &map;
342 342
      return *this;
343 343
    }
344 344

	
345 345
    /// \brief Sets the map that stores the predecessor arcs.
346 346
    ///
347 347
    /// Sets the map that stores the predecessor arcs.
348 348
    /// If you don't use this function before calling \ref run()
349 349
    /// or \ref init(), an instance will be allocated automatically.
350 350
    /// The destructor deallocates this automatically allocated map,
351 351
    /// of course.
... ...
@@ -673,112 +673,112 @@
673 673
        return static_cast<Node>(*this) < static_cast<Node>(it); 
674 674
      }
675 675
      
676 676
    private:
677 677
      const BellmanFord* _algorithm;
678 678
      int _index;
679 679
    };
680 680
    
681 681
    /// \name Query Functions
682 682
    /// The result of the Bellman-Ford algorithm can be obtained using these
683 683
    /// functions.\n
684 684
    /// Either \ref run() or \ref init() should be called before using them.
685 685
    
686 686
    ///@{
687 687

	
688 688
    /// \brief The shortest path to the given node.
689 689
    ///    
690 690
    /// Gives back the shortest path to the given node from the root(s).
691 691
    ///
692 692
    /// \warning \c t should be reached from the root(s).
693 693
    ///
694 694
    /// \pre Either \ref run() or \ref init() must be called before
695 695
    /// using this function.
696 696
    Path path(Node t) const
697 697
    {
698 698
      return Path(*_gr, *_pred, t);
699 699
    }
700 700
	  
701 701
    /// \brief The distance of the given node from the root(s).
702 702
    ///
703 703
    /// Returns the distance of the given node from the root(s).
704 704
    ///
705 705
    /// \warning If node \c v is not reached from the root(s), then
706 706
    /// the return value of this function is undefined.
707 707
    ///
708 708
    /// \pre Either \ref run() or \ref init() must be called before
709 709
    /// using this function.
710 710
    Value dist(Node v) const { return (*_dist)[v]; }
711 711

	
712 712
    /// \brief Returns the 'previous arc' of the shortest path tree for
713 713
    /// the given node.
714 714
    ///
715 715
    /// This function returns the 'previous arc' of the shortest path
716 716
    /// tree for node \c v, i.e. it returns the last arc of a
717 717
    /// shortest path from a root to \c v. It is \c INVALID if \c v
718 718
    /// is not reached from the root(s) or if \c v is a root.
719 719
    ///
720 720
    /// The shortest path tree used here is equal to the shortest path
721
    /// tree used in \ref predNode() and \predMap().
721
    /// tree used in \ref predNode() and \ref predMap().
722 722
    ///
723 723
    /// \pre Either \ref run() or \ref init() must be called before
724 724
    /// using this function.
725 725
    Arc predArc(Node v) const { return (*_pred)[v]; }
726 726

	
727 727
    /// \brief Returns the 'previous node' of the shortest path tree for
728 728
    /// the given node.
729 729
    ///
730 730
    /// This function returns the 'previous node' of the shortest path
731 731
    /// tree for node \c v, i.e. it returns the last but one node of
732 732
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
733 733
    /// is not reached from the root(s) or if \c v is a root.
734 734
    ///
735 735
    /// The shortest path tree used here is equal to the shortest path
736
    /// tree used in \ref predArc() and \predMap().
736
    /// tree used in \ref predArc() and \ref predMap().
737 737
    ///
738 738
    /// \pre Either \ref run() or \ref init() must be called before
739 739
    /// using this function.
740 740
    Node predNode(Node v) const { 
741 741
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
742 742
    }
743 743
    
744 744
    /// \brief Returns a const reference to the node map that stores the
745 745
    /// distances of the nodes.
746 746
    ///
747 747
    /// Returns a const reference to the node map that stores the distances
748 748
    /// of the nodes calculated by the algorithm.
749 749
    ///
750 750
    /// \pre Either \ref run() or \ref init() must be called before
751 751
    /// using this function.
752 752
    const DistMap &distMap() const { return *_dist;}
753 753
 
754 754
    /// \brief Returns a const reference to the node map that stores the
755 755
    /// predecessor arcs.
756 756
    ///
757 757
    /// Returns a const reference to the node map that stores the predecessor
758 758
    /// arcs, which form the shortest path tree (forest).
759 759
    ///
760 760
    /// \pre Either \ref run() or \ref init() must be called before
761 761
    /// using this function.
762 762
    const PredMap &predMap() const { return *_pred; }
763 763
 
764 764
    /// \brief Checks if a node is reached from the root(s).
765 765
    ///
766 766
    /// Returns \c true if \c v is reached from the root(s).
767 767
    ///
768 768
    /// \pre Either \ref run() or \ref init() must be called before
769 769
    /// using this function.
770 770
    bool reached(Node v) const {
771 771
      return (*_dist)[v] != OperationTraits::infinity();
772 772
    }
773 773

	
774 774
    /// \brief Gives back a negative cycle.
775 775
    ///    
776 776
    /// This function gives back a directed cycle with negative total
777 777
    /// length if the algorithm has already found one.
778 778
    /// Otherwise it gives back an empty path.
779 779
    lemon::Path<Digraph> negativeCycle() const {
780 780
      typename Digraph::template NodeMap<int> state(*_gr, -1);
781 781
      lemon::Path<Digraph> cycle;
782 782
      for (int i = 0; i < int(_process.size()); ++i) {
783 783
        if (state[_process[i]] != -1) continue;
784 784
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
Ignore white space 6 line context
... ...
@@ -18,97 +18,97 @@
18 18

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66
    ///By default, it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
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 85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 87
    ///Instantiates a \c ReachedMap.
88 88

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

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

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

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

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

	
... ...
@@ -803,97 +803,97 @@
803 803
    ///arcs, which form the shortest path tree (forest).
804 804
    ///
805 805
    ///\pre Either \ref run(Node) "run()" or \ref init()
806 806
    ///must be called before using this function.
807 807
    const PredMap &predMap() const { return *_pred;}
808 808

	
809 809
    ///Checks if the given node is reached from the root(s).
810 810

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

	
817 817
    ///@}
818 818
  };
819 819

	
820 820
  ///Default traits class of bfs() function.
821 821

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

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

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

	
847 847
    ///The type of the map that indicates which nodes are processed.
848 848

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

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

	
867 867
    ///The type of the map that indicates which nodes are reached.
868 868

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

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

	
882 882
    ///The type of the map that stores the distances of the nodes.
883 883

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

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

	
897 897
    ///The type of the shortest paths.
898 898

	
899 899
    ///The type of the shortest paths.
Ignore white space 6 line context
... ...
@@ -261,97 +261,97 @@
261 261
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
262 262
                           SetFlowMapTraits<T> > {
263 263
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
264 264
                          SetFlowMapTraits<T> > Create;
265 265
    };
266 266

	
267 267
    template <typename T>
268 268
    struct SetElevatorTraits : public Traits {
269 269
      typedef T Elevator;
270 270
      static Elevator *createElevator(const Digraph&, int) {
271 271
        LEMON_ASSERT(false, "Elevator is not initialized");
272 272
        return 0; // ignore warnings
273 273
      }
274 274
    };
275 275

	
276 276
    /// \brief \ref named-templ-param "Named parameter" for setting
277 277
    /// Elevator type
278 278
    ///
279 279
    /// \ref named-templ-param "Named parameter" for setting Elevator
280 280
    /// type. If this named parameter is used, then an external
281 281
    /// elevator object must be passed to the algorithm using the
282 282
    /// \ref elevator(Elevator&) "elevator()" function before calling
283 283
    /// \ref run() or \ref init().
284 284
    /// \sa SetStandardElevator
285 285
    template <typename T>
286 286
    struct SetElevator
287 287
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
288 288
                           SetElevatorTraits<T> > {
289 289
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
290 290
                          SetElevatorTraits<T> > Create;
291 291
    };
292 292

	
293 293
    template <typename T>
294 294
    struct SetStandardElevatorTraits : public Traits {
295 295
      typedef T Elevator;
296 296
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
297 297
        return new Elevator(digraph, max_level);
298 298
      }
299 299
    };
300 300

	
301 301
    /// \brief \ref named-templ-param "Named parameter" for setting
302 302
    /// Elevator type with automatic allocation
303 303
    ///
304 304
    /// \ref named-templ-param "Named parameter" for setting Elevator
305 305
    /// type with automatic allocation.
306 306
    /// The Elevator should have standard constructor interface to be
307 307
    /// able to automatically created by the algorithm (i.e. the
308 308
    /// digraph and the maximum level should be passed to it).
309
    /// However an external elevator object could also be passed to the
309
    /// However, an external elevator object could also be passed to the
310 310
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
311 311
    /// before calling \ref run() or \ref init().
312 312
    /// \sa SetElevator
313 313
    template <typename T>
314 314
    struct SetStandardElevator
315 315
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
316 316
                       SetStandardElevatorTraits<T> > {
317 317
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
318 318
                      SetStandardElevatorTraits<T> > Create;
319 319
    };
320 320

	
321 321
    /// @}
322 322

	
323 323
  protected:
324 324

	
325 325
    Circulation() {}
326 326

	
327 327
  public:
328 328

	
329 329
    /// Constructor.
330 330

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

	
344 344
    /// Destructor.
345 345
    ~Circulation() {
346 346
      destroyStructures();
347 347
    }
348 348

	
349 349

	
350 350
  private:
351 351

	
352 352
    bool checkBoundMaps() {
353 353
      for (ArcIt e(_g);e!=INVALID;++e) {
354 354
        if (_tol.less((*_up)[e], (*_lo)[e])) return false;
355 355
      }
356 356
      return true;
357 357
    }
Ignore white space 96 line context
... ...
@@ -62,275 +62,275 @@
62 62

	
63 63
      /// This class identifies a node of the digraph. It also serves
64 64
      /// as a base class of the node iterators,
65 65
      /// thus they convert to this type.
66 66
      class Node {
67 67
      public:
68 68
        /// Default constructor
69 69

	
70 70
        /// Default constructor.
71 71
        /// \warning It sets the object to an undefined value.
72 72
        Node() { }
73 73
        /// Copy constructor.
74 74

	
75 75
        /// Copy constructor.
76 76
        ///
77 77
        Node(const Node&) { }
78 78

	
79 79
        /// %Invalid constructor \& conversion.
80 80

	
81 81
        /// Initializes the object to be invalid.
82 82
        /// \sa Invalid for more details.
83 83
        Node(Invalid) { }
84 84
        /// Equality operator
85 85

	
86 86
        /// Equality operator.
87 87
        ///
88 88
        /// Two iterators are equal if and only if they point to the
89 89
        /// same object or both are \c INVALID.
90 90
        bool operator==(Node) const { return true; }
91 91

	
92 92
        /// Inequality operator
93 93

	
94 94
        /// Inequality operator.
95 95
        bool operator!=(Node) const { return true; }
96 96

	
97 97
        /// Artificial ordering operator.
98 98

	
99 99
        /// Artificial ordering operator.
100 100
        ///
101 101
        /// \note This operator only has to define some strict ordering of
102 102
        /// the nodes; this order has nothing to do with the iteration
103 103
        /// ordering of the nodes.
104 104
        bool operator<(Node) const { return false; }
105 105
      };
106 106

	
107 107
      /// Iterator class for the nodes.
108 108

	
109 109
      /// This iterator goes through each node of the digraph.
110
      /// Its usage is quite simple, for example you can count the number
110
      /// Its usage is quite simple, for example, you can count the number
111 111
      /// of nodes in a digraph \c g of type \c %Digraph like this:
112 112
      ///\code
113 113
      /// int count=0;
114 114
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
115 115
      ///\endcode
116 116
      class NodeIt : public Node {
117 117
      public:
118 118
        /// Default constructor
119 119

	
120 120
        /// Default constructor.
121 121
        /// \warning It sets the iterator to an undefined value.
122 122
        NodeIt() { }
123 123
        /// Copy constructor.
124 124

	
125 125
        /// Copy constructor.
126 126
        ///
127 127
        NodeIt(const NodeIt& n) : Node(n) { }
128 128
        /// %Invalid constructor \& conversion.
129 129

	
130 130
        /// Initializes the iterator to be invalid.
131 131
        /// \sa Invalid for more details.
132 132
        NodeIt(Invalid) { }
133 133
        /// Sets the iterator to the first node.
134 134

	
135 135
        /// Sets the iterator to the first node of the given digraph.
136 136
        ///
137 137
        explicit NodeIt(const Digraph&) { }
138 138
        /// Sets the iterator to the given node.
139 139

	
140 140
        /// Sets the iterator to the given node of the given digraph.
141 141
        ///
142 142
        NodeIt(const Digraph&, const Node&) { }
143 143
        /// Next node.
144 144

	
145 145
        /// Assign the iterator to the next node.
146 146
        ///
147 147
        NodeIt& operator++() { return *this; }
148 148
      };
149 149

	
150 150

	
151 151
      /// The arc type of the digraph
152 152

	
153 153
      /// This class identifies an arc of the digraph. It also serves
154 154
      /// as a base class of the arc iterators,
155 155
      /// thus they will convert to this type.
156 156
      class Arc {
157 157
      public:
158 158
        /// Default constructor
159 159

	
160 160
        /// Default constructor.
161 161
        /// \warning It sets the object to an undefined value.
162 162
        Arc() { }
163 163
        /// Copy constructor.
164 164

	
165 165
        /// Copy constructor.
166 166
        ///
167 167
        Arc(const Arc&) { }
168 168
        /// %Invalid constructor \& conversion.
169 169

	
170 170
        /// Initializes the object to be invalid.
171 171
        /// \sa Invalid for more details.
172 172
        Arc(Invalid) { }
173 173
        /// Equality operator
174 174

	
175 175
        /// Equality operator.
176 176
        ///
177 177
        /// Two iterators are equal if and only if they point to the
178 178
        /// same object or both are \c INVALID.
179 179
        bool operator==(Arc) const { return true; }
180 180
        /// Inequality operator
181 181

	
182 182
        /// Inequality operator.
183 183
        bool operator!=(Arc) const { return true; }
184 184

	
185 185
        /// Artificial ordering operator.
186 186

	
187 187
        /// Artificial ordering operator.
188 188
        ///
189 189
        /// \note This operator only has to define some strict ordering of
190 190
        /// the arcs; this order has nothing to do with the iteration
191 191
        /// ordering of the arcs.
192 192
        bool operator<(Arc) const { return false; }
193 193
      };
194 194

	
195 195
      /// Iterator class for the outgoing arcs of a node.
196 196

	
197 197
      /// This iterator goes trough the \e outgoing arcs of a certain node
198 198
      /// of a digraph.
199
      /// Its usage is quite simple, for example you can count the number
199
      /// Its usage is quite simple, for example, you can count the number
200 200
      /// of outgoing arcs of a node \c n
201 201
      /// in a digraph \c g of type \c %Digraph as follows.
202 202
      ///\code
203 203
      /// int count=0;
204 204
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
205 205
      ///\endcode
206 206
      class OutArcIt : public Arc {
207 207
      public:
208 208
        /// Default constructor
209 209

	
210 210
        /// Default constructor.
211 211
        /// \warning It sets the iterator to an undefined value.
212 212
        OutArcIt() { }
213 213
        /// Copy constructor.
214 214

	
215 215
        /// Copy constructor.
216 216
        ///
217 217
        OutArcIt(const OutArcIt& e) : Arc(e) { }
218 218
        /// %Invalid constructor \& conversion.
219 219

	
220 220
        /// Initializes the iterator to be invalid.
221 221
        /// \sa Invalid for more details.
222 222
        OutArcIt(Invalid) { }
223 223
        /// Sets the iterator to the first outgoing arc.
224 224

	
225 225
        /// Sets the iterator to the first outgoing arc of the given node.
226 226
        ///
227 227
        OutArcIt(const Digraph&, const Node&) { }
228 228
        /// Sets the iterator to the given arc.
229 229

	
230 230
        /// Sets the iterator to the given arc of the given digraph.
231 231
        ///
232 232
        OutArcIt(const Digraph&, const Arc&) { }
233 233
        /// Next outgoing arc
234 234

	
235 235
        /// Assign the iterator to the next
236 236
        /// outgoing arc of the corresponding node.
237 237
        OutArcIt& operator++() { return *this; }
238 238
      };
239 239

	
240 240
      /// Iterator class for the incoming arcs of a node.
241 241

	
242 242
      /// This iterator goes trough the \e incoming arcs of a certain node
243 243
      /// of a digraph.
244
      /// Its usage is quite simple, for example you can count the number
244
      /// Its usage is quite simple, for example, you can count the number
245 245
      /// of incoming arcs of a node \c n
246 246
      /// in a digraph \c g of type \c %Digraph as follows.
247 247
      ///\code
248 248
      /// int count=0;
249 249
      /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
250 250
      ///\endcode
251 251
      class InArcIt : public Arc {
252 252
      public:
253 253
        /// Default constructor
254 254

	
255 255
        /// Default constructor.
256 256
        /// \warning It sets the iterator to an undefined value.
257 257
        InArcIt() { }
258 258
        /// Copy constructor.
259 259

	
260 260
        /// Copy constructor.
261 261
        ///
262 262
        InArcIt(const InArcIt& e) : Arc(e) { }
263 263
        /// %Invalid constructor \& conversion.
264 264

	
265 265
        /// Initializes the iterator to be invalid.
266 266
        /// \sa Invalid for more details.
267 267
        InArcIt(Invalid) { }
268 268
        /// Sets the iterator to the first incoming arc.
269 269

	
270 270
        /// Sets the iterator to the first incoming arc of the given node.
271 271
        ///
272 272
        InArcIt(const Digraph&, const Node&) { }
273 273
        /// Sets the iterator to the given arc.
274 274

	
275 275
        /// Sets the iterator to the given arc of the given digraph.
276 276
        ///
277 277
        InArcIt(const Digraph&, const Arc&) { }
278 278
        /// Next incoming arc
279 279

	
280 280
        /// Assign the iterator to the next
281 281
        /// incoming arc of the corresponding node.
282 282
        InArcIt& operator++() { return *this; }
283 283
      };
284 284

	
285 285
      /// Iterator class for the arcs.
286 286

	
287 287
      /// This iterator goes through each arc of the digraph.
288
      /// Its usage is quite simple, for example you can count the number
288
      /// Its usage is quite simple, for example, you can count the number
289 289
      /// of arcs in a digraph \c g of type \c %Digraph as follows:
290 290
      ///\code
291 291
      /// int count=0;
292 292
      /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
293 293
      ///\endcode
294 294
      class ArcIt : public Arc {
295 295
      public:
296 296
        /// Default constructor
297 297

	
298 298
        /// Default constructor.
299 299
        /// \warning It sets the iterator to an undefined value.
300 300
        ArcIt() { }
301 301
        /// Copy constructor.
302 302

	
303 303
        /// Copy constructor.
304 304
        ///
305 305
        ArcIt(const ArcIt& e) : Arc(e) { }
306 306
        /// %Invalid constructor \& conversion.
307 307

	
308 308
        /// Initializes the iterator to be invalid.
309 309
        /// \sa Invalid for more details.
310 310
        ArcIt(Invalid) { }
311 311
        /// Sets the iterator to the first arc.
312 312

	
313 313
        /// Sets the iterator to the first arc of the given digraph.
314 314
        ///
315 315
        explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
316 316
        /// Sets the iterator to the given arc.
317 317

	
318 318
        /// Sets the iterator to the given arc of the given digraph.
319 319
        ///
320 320
        ArcIt(const Digraph&, const Arc&) { }
321 321
        /// Next arc
322 322

	
323 323
        /// Assign the iterator to the next arc.
324 324
        ///
325 325
        ArcIt& operator++() { return *this; }
326 326
      };
327 327

	
328 328
      /// \brief The source node of the arc.
329 329
      ///
330 330
      /// Returns the source node of the given arc.
331 331
      Node source(Arc) const { return INVALID; }
332 332

	
333 333
      /// \brief The target node of the arc.
334 334
      ///
335 335
      /// Returns the target node of the given arc.
336 336
      Node target(Arc) const { return INVALID; }
Ignore white space 6 line context
... ...
@@ -95,418 +95,418 @@
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() { }
105 105
        /// Copy constructor.
106 106

	
107 107
        /// Copy constructor.
108 108
        ///
109 109
        Node(const Node&) { }
110 110

	
111 111
        /// %Invalid constructor \& conversion.
112 112

	
113 113
        /// Initializes the object to be invalid.
114 114
        /// \sa Invalid for more details.
115 115
        Node(Invalid) { }
116 116
        /// Equality operator
117 117

	
118 118
        /// Equality operator.
119 119
        ///
120 120
        /// Two iterators are equal if and only if they point to the
121 121
        /// same object or both are \c INVALID.
122 122
        bool operator==(Node) const { return true; }
123 123

	
124 124
        /// Inequality operator
125 125

	
126 126
        /// Inequality operator.
127 127
        bool operator!=(Node) const { return true; }
128 128

	
129 129
        /// Artificial ordering operator.
130 130

	
131 131
        /// Artificial ordering operator.
132 132
        ///
133 133
        /// \note This operator only has to define some strict ordering of
134 134
        /// the items; this order has nothing to do with the iteration
135 135
        /// ordering of the items.
136 136
        bool operator<(Node) const { return false; }
137 137

	
138 138
      };
139 139

	
140 140
      /// Iterator class for the nodes.
141 141

	
142 142
      /// This iterator goes through each node of the graph.
143
      /// Its usage is quite simple, for example you can count the number
143
      /// Its usage is quite simple, for example, you can count the number
144 144
      /// of nodes in a graph \c g of type \c %Graph like this:
145 145
      ///\code
146 146
      /// int count=0;
147 147
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
148 148
      ///\endcode
149 149
      class NodeIt : public Node {
150 150
      public:
151 151
        /// Default constructor
152 152

	
153 153
        /// Default constructor.
154 154
        /// \warning It sets the iterator to an undefined value.
155 155
        NodeIt() { }
156 156
        /// Copy constructor.
157 157

	
158 158
        /// Copy constructor.
159 159
        ///
160 160
        NodeIt(const NodeIt& n) : Node(n) { }
161 161
        /// %Invalid constructor \& conversion.
162 162

	
163 163
        /// Initializes the iterator to be invalid.
164 164
        /// \sa Invalid for more details.
165 165
        NodeIt(Invalid) { }
166 166
        /// Sets the iterator to the first node.
167 167

	
168 168
        /// Sets the iterator to the first node of the given digraph.
169 169
        ///
170 170
        explicit NodeIt(const Graph&) { }
171 171
        /// Sets the iterator to the given node.
172 172

	
173 173
        /// Sets the iterator to the given node of the given digraph.
174 174
        ///
175 175
        NodeIt(const Graph&, const Node&) { }
176 176
        /// Next node.
177 177

	
178 178
        /// Assign the iterator to the next node.
179 179
        ///
180 180
        NodeIt& operator++() { return *this; }
181 181
      };
182 182

	
183 183

	
184 184
      /// The edge type of the graph
185 185

	
186 186
      /// This class identifies an edge of the graph. It also serves
187 187
      /// as a base class of the edge iterators,
188 188
      /// thus they will convert to this type.
189 189
      class Edge {
190 190
      public:
191 191
        /// Default constructor
192 192

	
193 193
        /// Default constructor.
194 194
        /// \warning It sets the object to an undefined value.
195 195
        Edge() { }
196 196
        /// Copy constructor.
197 197

	
198 198
        /// Copy constructor.
199 199
        ///
200 200
        Edge(const Edge&) { }
201 201
        /// %Invalid constructor \& conversion.
202 202

	
203 203
        /// Initializes the object to be invalid.
204 204
        /// \sa Invalid for more details.
205 205
        Edge(Invalid) { }
206 206
        /// Equality operator
207 207

	
208 208
        /// Equality operator.
209 209
        ///
210 210
        /// Two iterators are equal if and only if they point to the
211 211
        /// same object or both are \c INVALID.
212 212
        bool operator==(Edge) const { return true; }
213 213
        /// Inequality operator
214 214

	
215 215
        /// Inequality operator.
216 216
        bool operator!=(Edge) const { return true; }
217 217

	
218 218
        /// Artificial ordering operator.
219 219

	
220 220
        /// Artificial ordering operator.
221 221
        ///
222 222
        /// \note This operator only has to define some strict ordering of
223 223
        /// the edges; this order has nothing to do with the iteration
224 224
        /// ordering of the edges.
225 225
        bool operator<(Edge) const { return false; }
226 226
      };
227 227

	
228 228
      /// Iterator class for the edges.
229 229

	
230 230
      /// This iterator goes through each edge of the graph.
231
      /// Its usage is quite simple, for example you can count the number
231
      /// Its usage is quite simple, for example, you can count the number
232 232
      /// of edges in a graph \c g of type \c %Graph as follows:
233 233
      ///\code
234 234
      /// int count=0;
235 235
      /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
236 236
      ///\endcode
237 237
      class EdgeIt : public Edge {
238 238
      public:
239 239
        /// Default constructor
240 240

	
241 241
        /// Default constructor.
242 242
        /// \warning It sets the iterator to an undefined value.
243 243
        EdgeIt() { }
244 244
        /// Copy constructor.
245 245

	
246 246
        /// Copy constructor.
247 247
        ///
248 248
        EdgeIt(const EdgeIt& e) : Edge(e) { }
249 249
        /// %Invalid constructor \& conversion.
250 250

	
251 251
        /// Initializes the iterator to be invalid.
252 252
        /// \sa Invalid for more details.
253 253
        EdgeIt(Invalid) { }
254 254
        /// Sets the iterator to the first edge.
255 255

	
256 256
        /// Sets the iterator to the first edge of the given graph.
257 257
        ///
258 258
        explicit EdgeIt(const Graph&) { }
259 259
        /// Sets the iterator to the given edge.
260 260

	
261 261
        /// Sets the iterator to the given edge of the given graph.
262 262
        ///
263 263
        EdgeIt(const Graph&, const Edge&) { }
264 264
        /// Next edge
265 265

	
266 266
        /// Assign the iterator to the next edge.
267 267
        ///
268 268
        EdgeIt& operator++() { return *this; }
269 269
      };
270 270

	
271 271
      /// Iterator class for the incident edges of a node.
272 272

	
273 273
      /// This iterator goes trough the incident undirected edges
274 274
      /// of a certain node of a graph.
275
      /// Its usage is quite simple, for example you can compute the
275
      /// Its usage is quite simple, for example, you can compute the
276 276
      /// degree (i.e. the number of incident edges) of a node \c n
277 277
      /// in a graph \c g of type \c %Graph as follows.
278 278
      ///
279 279
      ///\code
280 280
      /// int count=0;
281 281
      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
282 282
      ///\endcode
283 283
      ///
284 284
      /// \warning Loop edges will be iterated twice.
285 285
      class IncEdgeIt : public Edge {
286 286
      public:
287 287
        /// Default constructor
288 288

	
289 289
        /// Default constructor.
290 290
        /// \warning It sets the iterator to an undefined value.
291 291
        IncEdgeIt() { }
292 292
        /// Copy constructor.
293 293

	
294 294
        /// Copy constructor.
295 295
        ///
296 296
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
297 297
        /// %Invalid constructor \& conversion.
298 298

	
299 299
        /// Initializes the iterator to be invalid.
300 300
        /// \sa Invalid for more details.
301 301
        IncEdgeIt(Invalid) { }
302 302
        /// Sets the iterator to the first incident edge.
303 303

	
304 304
        /// Sets the iterator to the first incident edge of the given node.
305 305
        ///
306 306
        IncEdgeIt(const Graph&, const Node&) { }
307 307
        /// Sets the iterator to the given edge.
308 308

	
309 309
        /// Sets the iterator to the given edge of the given graph.
310 310
        ///
311 311
        IncEdgeIt(const Graph&, const Edge&) { }
312 312
        /// Next incident edge
313 313

	
314 314
        /// Assign the iterator to the next incident edge
315 315
        /// of the corresponding node.
316 316
        IncEdgeIt& operator++() { return *this; }
317 317
      };
318 318

	
319 319
      /// The arc type of the graph
320 320

	
321 321
      /// This class identifies a directed arc of the graph. It also serves
322 322
      /// as a base class of the arc iterators,
323 323
      /// thus they will convert to this type.
324 324
      class Arc {
325 325
      public:
326 326
        /// Default constructor
327 327

	
328 328
        /// Default constructor.
329 329
        /// \warning It sets the object to an undefined value.
330 330
        Arc() { }
331 331
        /// Copy constructor.
332 332

	
333 333
        /// Copy constructor.
334 334
        ///
335 335
        Arc(const Arc&) { }
336 336
        /// %Invalid constructor \& conversion.
337 337

	
338 338
        /// Initializes the object to be invalid.
339 339
        /// \sa Invalid for more details.
340 340
        Arc(Invalid) { }
341 341
        /// Equality operator
342 342

	
343 343
        /// Equality operator.
344 344
        ///
345 345
        /// Two iterators are equal if and only if they point to the
346 346
        /// same object or both are \c INVALID.
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
      /// Its usage is quite simple, for example you can count the number
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:
380 380
        /// Default constructor
381 381

	
382 382
        /// Default constructor.
383 383
        /// \warning It sets the iterator to an undefined value.
384 384
        ArcIt() { }
385 385
        /// Copy constructor.
386 386

	
387 387
        /// Copy constructor.
388 388
        ///
389 389
        ArcIt(const ArcIt& e) : Arc(e) { }
390 390
        /// %Invalid constructor \& conversion.
391 391

	
392 392
        /// Initializes the iterator to be invalid.
393 393
        /// \sa Invalid for more details.
394 394
        ArcIt(Invalid) { }
395 395
        /// Sets the iterator to the first arc.
396 396

	
397 397
        /// Sets the iterator to the first arc of the given graph.
398 398
        ///
399 399
        explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
400 400
        /// Sets the iterator to the given arc.
401 401

	
402 402
        /// Sets the iterator to the given arc of the given graph.
403 403
        ///
404 404
        ArcIt(const Graph&, const Arc&) { }
405 405
        /// Next arc
406 406

	
407 407
        /// Assign the iterator to the next arc.
408 408
        ///
409 409
        ArcIt& operator++() { return *this; }
410 410
      };
411 411

	
412 412
      /// Iterator class for the outgoing arcs of a node.
413 413

	
414 414
      /// This iterator goes trough the \e outgoing directed arcs of a
415 415
      /// certain node of a graph.
416
      /// Its usage is quite simple, for example you can count the number
416
      /// Its usage is quite simple, for example, you can count the number
417 417
      /// of outgoing arcs of a node \c n
418 418
      /// in a graph \c g of type \c %Graph as follows.
419 419
      ///\code
420 420
      /// int count=0;
421 421
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
422 422
      ///\endcode
423 423
      class OutArcIt : public Arc {
424 424
      public:
425 425
        /// Default constructor
426 426

	
427 427
        /// Default constructor.
428 428
        /// \warning It sets the iterator to an undefined value.
429 429
        OutArcIt() { }
430 430
        /// Copy constructor.
431 431

	
432 432
        /// Copy constructor.
433 433
        ///
434 434
        OutArcIt(const OutArcIt& e) : Arc(e) { }
435 435
        /// %Invalid constructor \& conversion.
436 436

	
437 437
        /// Initializes the iterator to be invalid.
438 438
        /// \sa Invalid for more details.
439 439
        OutArcIt(Invalid) { }
440 440
        /// Sets the iterator to the first outgoing arc.
441 441

	
442 442
        /// Sets the iterator to the first outgoing arc of the given node.
443 443
        ///
444 444
        OutArcIt(const Graph& n, const Node& g) {
445 445
          ignore_unused_variable_warning(n);
446 446
          ignore_unused_variable_warning(g);
447 447
        }
448 448
        /// Sets the iterator to the given arc.
449 449

	
450 450
        /// Sets the iterator to the given arc of the given graph.
451 451
        ///
452 452
        OutArcIt(const Graph&, const Arc&) { }
453 453
        /// Next outgoing arc
454 454

	
455 455
        /// Assign the iterator to the next
456 456
        /// outgoing arc of the corresponding node.
457 457
        OutArcIt& operator++() { return *this; }
458 458
      };
459 459

	
460 460
      /// Iterator class for the incoming arcs of a node.
461 461

	
462 462
      /// This iterator goes trough the \e incoming directed arcs of a
463 463
      /// certain node of a graph.
464
      /// Its usage is quite simple, for example you can count the number
464
      /// Its usage is quite simple, for example, you can count the number
465 465
      /// of incoming arcs of a node \c n
466 466
      /// in a graph \c g of type \c %Graph as follows.
467 467
      ///\code
468 468
      /// int count=0;
469 469
      /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
470 470
      ///\endcode
471 471
      class InArcIt : public Arc {
472 472
      public:
473 473
        /// Default constructor
474 474

	
475 475
        /// Default constructor.
476 476
        /// \warning It sets the iterator to an undefined value.
477 477
        InArcIt() { }
478 478
        /// Copy constructor.
479 479

	
480 480
        /// Copy constructor.
481 481
        ///
482 482
        InArcIt(const InArcIt& e) : Arc(e) { }
483 483
        /// %Invalid constructor \& conversion.
484 484

	
485 485
        /// Initializes the iterator to be invalid.
486 486
        /// \sa Invalid for more details.
487 487
        InArcIt(Invalid) { }
488 488
        /// Sets the iterator to the first incoming arc.
489 489

	
490 490
        /// Sets the iterator to the first incoming arc of the given node.
491 491
        ///
492 492
        InArcIt(const Graph& g, const Node& n) {
493 493
          ignore_unused_variable_warning(n);
494 494
          ignore_unused_variable_warning(g);
495 495
        }
496 496
        /// Sets the iterator to the given arc.
497 497

	
498 498
        /// Sets the iterator to the given arc of the given graph.
499 499
        ///
500 500
        InArcIt(const Graph&, const Arc&) { }
501 501
        /// Next incoming arc
502 502

	
503 503
        /// Assign the iterator to the next
504 504
        /// incoming arc of the corresponding node.
505 505
        InArcIt& operator++() { return *this; }
506 506
      };
507 507

	
508 508
      /// \brief Standard graph map type for the nodes.
509 509
      ///
510 510
      /// Standard graph map type for the nodes.
511 511
      /// It conforms to the ReferenceMap concept.
512 512
      template<class T>
... ...
@@ -542,110 +542,110 @@
542 542

	
543 543
        /// Constructor
544 544
        explicit ArcMap(const Graph&) { }
545 545
        /// Constructor with given initial value
546 546
        ArcMap(const Graph&, T) { }
547 547

	
548 548
      private:
549 549
        ///Copy constructor
550 550
        ArcMap(const ArcMap& em) :
551 551
          ReferenceMap<Arc, T, T&, const T&>(em) { }
552 552
        ///Assignment operator
553 553
        template <typename CMap>
554 554
        ArcMap& operator=(const CMap&) {
555 555
          checkConcept<ReadMap<Arc, T>, CMap>();
556 556
          return *this;
557 557
        }
558 558
      };
559 559

	
560 560
      /// \brief Standard graph map type for the edges.
561 561
      ///
562 562
      /// Standard graph map type for the edges.
563 563
      /// It conforms to the ReferenceMap concept.
564 564
      template<class T>
565 565
      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
566 566
      {
567 567
      public:
568 568

	
569 569
        /// Constructor
570 570
        explicit EdgeMap(const Graph&) { }
571 571
        /// Constructor with given initial value
572 572
        EdgeMap(const Graph&, T) { }
573 573

	
574 574
      private:
575 575
        ///Copy constructor
576 576
        EdgeMap(const EdgeMap& em) :
577 577
          ReferenceMap<Edge, T, T&, const T&>(em) {}
578 578
        ///Assignment operator
579 579
        template <typename CMap>
580 580
        EdgeMap& operator=(const CMap&) {
581 581
          checkConcept<ReadMap<Edge, T>, CMap>();
582 582
          return *this;
583 583
        }
584 584
      };
585 585

	
586 586
      /// \brief The first node of the edge.
587 587
      ///
588 588
      /// Returns the first node of the given edge.
589 589
      ///
590
      /// Edges don't have source and target nodes, however methods
590
      /// Edges don't have source and target nodes, however, methods
591 591
      /// u() and v() are used to query the two end-nodes of an edge.
592 592
      /// The orientation of an edge that arises this way is called
593 593
      /// the inherent direction, it is used to define the default
594 594
      /// direction for the corresponding arcs.
595 595
      /// \sa v()
596 596
      /// \sa direction()
597 597
      Node u(Edge) const { return INVALID; }
598 598

	
599 599
      /// \brief The second node of the edge.
600 600
      ///
601 601
      /// Returns the second node of the given edge.
602 602
      ///
603
      /// Edges don't have source and target nodes, however methods
603
      /// Edges don't have source and target nodes, however, methods
604 604
      /// u() and v() are used to query the two end-nodes of an edge.
605 605
      /// The orientation of an edge that arises this way is called
606 606
      /// the inherent direction, it is used to define the default
607 607
      /// direction for the corresponding arcs.
608 608
      /// \sa u()
609 609
      /// \sa direction()
610 610
      Node v(Edge) const { return INVALID; }
611 611

	
612 612
      /// \brief The source node of the arc.
613 613
      ///
614 614
      /// Returns the source node of the given arc.
615 615
      Node source(Arc) const { return INVALID; }
616 616

	
617 617
      /// \brief The target node of the arc.
618 618
      ///
619 619
      /// Returns the target node of the given arc.
620 620
      Node target(Arc) const { return INVALID; }
621 621

	
622 622
      /// \brief The ID of the node.
623 623
      ///
624 624
      /// Returns the ID of the given node.
625 625
      int id(Node) const { return -1; }
626 626

	
627 627
      /// \brief The ID of the edge.
628 628
      ///
629 629
      /// Returns the ID of the given edge.
630 630
      int id(Edge) const { return -1; }
631 631

	
632 632
      /// \brief The ID of the arc.
633 633
      ///
634 634
      /// Returns the ID of the given arc.
635 635
      int id(Arc) const { return -1; }
636 636

	
637 637
      /// \brief The node with the given ID.
638 638
      ///
639 639
      /// Returns the node with the given ID.
640 640
      /// \pre The argument should be a valid node ID in the graph.
641 641
      Node nodeFromId(int) const { return INVALID; }
642 642

	
643 643
      /// \brief The edge with the given ID.
644 644
      ///
645 645
      /// Returns the edge with the given ID.
646 646
      /// \pre The argument should be a valid edge ID in the graph.
647 647
      Edge edgeFromId(int) const { return INVALID; }
648 648

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

	
19 19
///\ingroup graph_concepts
20 20
///\file
21
///\brief The concept of graph components.
21
///\brief The concepts of graph components.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
24 24
#define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
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 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.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      GraphItem(const GraphItem &) {}
61 61

	
62 62
      /// \brief Constructor for conversion from \c INVALID.
63 63
      ///
64 64
      /// Constructor for conversion from \c INVALID.
65 65
      /// It initializes the item to be invalid.
66 66
      /// \sa Invalid for more details.
67 67
      GraphItem(Invalid) {}
68 68

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

	
19 19
///\ingroup concept
20 20
///\file
21
///\brief Classes for representing paths in digraphs.
21
///\brief The concept of paths
22 22
///
23 23

	
24 24
#ifndef LEMON_CONCEPTS_PATH_H
25 25
#define LEMON_CONCEPTS_PATH_H
26 26

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

	
30 30
namespace lemon {
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// \brief A skeleton structure for representing directed paths in
37 37
    /// a digraph.
38 38
    ///
39 39
    /// A skeleton structure for representing directed paths in a
40 40
    /// digraph.
41
    /// In a sense, a path can be treated as a list of arcs.
42
    /// LEMON path types just store this list. As a consequence, they cannot
43
    /// enumerate the nodes on the path directly and a zero length path
44
    /// cannot store its source node.
45
    ///
46
    /// The arcs of a path should be stored in the order of their directions,
47
    /// i.e. the target node of each arc should be the same as the source
48
    /// node of the next arc. This consistency could be checked using
49
    /// \ref checkPath().
50
    /// The source and target nodes of a (consistent) path can be obtained
51
    /// using \ref pathSource() and \ref pathTarget().
52
    ///
53
    /// A path can be constructed from another path of any type using the
54
    /// copy constructor or the assignment operator.
55
    ///
41 56
    /// \tparam GR The digraph type in which the path is.
42
    ///
43
    /// In a sense, the path can be treated as a list of arcs. The
44
    /// lemon path type stores just this list. As a consequence it
45
    /// cannot enumerate the nodes in the path and the zero length
46
    /// paths cannot store the source.
47
    ///
48 57
    template <typename GR>
49 58
    class Path {
50 59
    public:
51 60

	
52 61
      /// Type of the underlying digraph.
53 62
      typedef GR Digraph;
54 63
      /// Arc type of the underlying digraph.
55 64
      typedef typename Digraph::Arc Arc;
56 65

	
57 66
      class ArcIt;
58 67

	
59 68
      /// \brief Default constructor
60 69
      Path() {}
61 70

	
62
      /// \brief Template constructor
71
      /// \brief Template copy constructor
63 72
      template <typename CPath>
64 73
      Path(const CPath& cpath) {}
65 74

	
66
      /// \brief Template assigment
75
      /// \brief Template assigment operator
67 76
      template <typename CPath>
68 77
      Path& operator=(const CPath& cpath) {
69 78
        ignore_unused_variable_warning(cpath);
70 79
        return *this;
71 80
      }
72 81

	
73
      /// Length of the path ie. the number of arcs in the path.
82
      /// Length of the path, i.e. the number of arcs on the path.
74 83
      int length() const { return 0;}
75 84

	
76 85
      /// Returns whether the path is empty.
77 86
      bool empty() const { return true;}
78 87

	
79 88
      /// Resets the path to an empty path.
80 89
      void clear() {}
81 90

	
82
      /// \brief LEMON style iterator for path arcs
91
      /// \brief LEMON style iterator for enumerating the arcs of a path.
83 92
      ///
84
      /// This class is used to iterate on the arcs of the paths.
93
      /// LEMON style iterator class for enumerating the arcs of a path.
85 94
      class ArcIt {
86 95
      public:
87 96
        /// Default constructor
88 97
        ArcIt() {}
89 98
        /// Invalid constructor
90 99
        ArcIt(Invalid) {}
91
        /// Constructor for first arc
100
        /// Sets the iterator to the first arc of the given path
92 101
        ArcIt(const Path &) {}
93 102

	
94
        /// Conversion to Arc
103
        /// Conversion to \c Arc
95 104
        operator Arc() const { return INVALID; }
96 105

	
97 106
        /// Next arc
98 107
        ArcIt& operator++() {return *this;}
99 108

	
100 109
        /// Comparison operator
101 110
        bool operator==(const ArcIt&) const {return true;}
102 111
        /// Comparison operator
103 112
        bool operator!=(const ArcIt&) const {return true;}
104 113
        /// Comparison operator
105 114
        bool operator<(const ArcIt&) const {return false;}
106 115

	
107 116
      };
108 117

	
109 118
      template <typename _Path>
110 119
      struct Constraints {
111 120
        void constraints() {
112 121
          Path<Digraph> pc;
113 122
          _Path p, pp(pc);
114 123
          int l = p.length();
115 124
          int e = p.empty();
116 125
          p.clear();
117 126

	
118 127
          p = pc;
119 128

	
120 129
          typename _Path::ArcIt id, ii(INVALID), i(p);
121 130

	
122 131
          ++i;
123 132
          typename Digraph::Arc ed = i;
124 133

	
125 134
          e = (i == ii);
126 135
          e = (i != ii);
127 136
          e = (i < ii);
128 137

	
129 138
          ignore_unused_variable_warning(l);
130 139
          ignore_unused_variable_warning(pp);
131 140
          ignore_unused_variable_warning(e);
132 141
          ignore_unused_variable_warning(id);
133 142
          ignore_unused_variable_warning(ii);
134 143
          ignore_unused_variable_warning(ed);
135 144
        }
136 145
      };
137 146

	
138 147
    };
139 148

	
140 149
    namespace _path_bits {
141 150

	
142 151
      template <typename _Digraph, typename _Path, typename RevPathTag = void>
... ...
@@ -147,161 +156,155 @@
147 156

	
148 157
          typename _Path::ArcIt id, i(p);
149 158

	
150 159
          ++i;
151 160
          typename _Digraph::Arc ed = i;
152 161

	
153 162
          e = (i == INVALID);
154 163
          e = (i != INVALID);
155 164

	
156 165
          ignore_unused_variable_warning(l);
157 166
          ignore_unused_variable_warning(e);
158 167
          ignore_unused_variable_warning(id);
159 168
          ignore_unused_variable_warning(ed);
160 169
        }
161 170
        _Path& p;
162 171
      };
163 172

	
164 173
      template <typename _Digraph, typename _Path>
165 174
      struct PathDumperConstraints<
166 175
        _Digraph, _Path,
167 176
        typename enable_if<typename _Path::RevPathTag, void>::type
168 177
      > {
169 178
        void constraints() {
170 179
          int l = p.length();
171 180
          int e = p.empty();
172 181

	
173 182
          typename _Path::RevArcIt id, i(p);
174 183

	
175 184
          ++i;
176 185
          typename _Digraph::Arc ed = i;
177 186

	
178 187
          e = (i == INVALID);
179 188
          e = (i != INVALID);
180 189

	
181 190
          ignore_unused_variable_warning(l);
182 191
          ignore_unused_variable_warning(e);
183 192
          ignore_unused_variable_warning(id);
184 193
          ignore_unused_variable_warning(ed);
185 194
        }
186 195
        _Path& p;
187 196
      };
188 197

	
189 198
    }
190 199

	
191 200

	
192 201
    /// \brief A skeleton structure for path dumpers.
193 202
    ///
194 203
    /// A skeleton structure for path dumpers. The path dumpers are
195
    /// the generalization of the paths. The path dumpers can
196
    /// enumerate the arcs of the path wheter in forward or in
197
    /// backward order.  In most time these classes are not used
198
    /// directly rather it used to assign a dumped class to a real
199
    /// path type.
204
    /// the generalization of the paths, they can enumerate the arcs
205
    /// of the path either in forward or in backward order.
206
    /// These classes are typically not used directly, they are rather
207
    /// used to be assigned to a real path type.
200 208
    ///
201 209
    /// The main purpose of this concept is that the shortest path
202
    /// algorithms can enumerate easily the arcs in reverse order.
203
    /// If we would like to give back a real path from these
204
    /// algorithms then we should create a temporarly path object. In
205
    /// LEMON such algorithms gives back a path dumper what can
206
    /// assigned to a real path and the dumpers can be implemented as
210
    /// algorithms can enumerate the arcs easily in reverse order.
211
    /// In LEMON, such algorithms give back a (reverse) path dumper that
212
    /// can be assigned to a real path. The dumpers can be implemented as
207 213
    /// an adaptor class to the predecessor map.
208 214
    ///
209 215
    /// \tparam GR The digraph type in which the path is.
210
    ///
211
    /// The paths can be constructed from any path type by a
212
    /// template constructor or a template assignment operator.
213 216
    template <typename GR>
214 217
    class PathDumper {
215 218
    public:
216 219

	
217 220
      /// Type of the underlying digraph.
218 221
      typedef GR Digraph;
219 222
      /// Arc type of the underlying digraph.
220 223
      typedef typename Digraph::Arc Arc;
221 224

	
222
      /// Length of the path ie. the number of arcs in the path.
225
      /// Length of the path, i.e. the number of arcs on the path.
223 226
      int length() const { return 0;}
224 227

	
225 228
      /// Returns whether the path is empty.
226 229
      bool empty() const { return true;}
227 230

	
228 231
      /// \brief Forward or reverse dumping
229 232
      ///
230
      /// If the RevPathTag is defined and true then reverse dumping
231
      /// is provided in the path dumper. In this case instead of the
232
      /// ArcIt the RevArcIt iterator should be implemented in the
233
      /// dumper.
233
      /// If this tag is defined to be \c True, then reverse dumping
234
      /// is provided in the path dumper. In this case, \c RevArcIt
235
      /// iterator should be implemented instead of \c ArcIt iterator.
234 236
      typedef False RevPathTag;
235 237

	
236
      /// \brief LEMON style iterator for path arcs
238
      /// \brief LEMON style iterator for enumerating the arcs of a path.
237 239
      ///
238
      /// This class is used to iterate on the arcs of the paths.
240
      /// LEMON style iterator class for enumerating the arcs of a path.
239 241
      class ArcIt {
240 242
      public:
241 243
        /// Default constructor
242 244
        ArcIt() {}
243 245
        /// Invalid constructor
244 246
        ArcIt(Invalid) {}
245
        /// Constructor for first arc
247
        /// Sets the iterator to the first arc of the given path
246 248
        ArcIt(const PathDumper&) {}
247 249

	
248
        /// Conversion to Arc
250
        /// Conversion to \c Arc
249 251
        operator Arc() const { return INVALID; }
250 252

	
251 253
        /// Next arc
252 254
        ArcIt& operator++() {return *this;}
253 255

	
254 256
        /// Comparison operator
255 257
        bool operator==(const ArcIt&) const {return true;}
256 258
        /// Comparison operator
257 259
        bool operator!=(const ArcIt&) const {return true;}
258 260
        /// Comparison operator
259 261
        bool operator<(const ArcIt&) const {return false;}
260 262

	
261 263
      };
262 264

	
263
      /// \brief LEMON style iterator for path arcs
265
      /// \brief LEMON style iterator for enumerating the arcs of a path
266
      /// in reverse direction.
264 267
      ///
265
      /// This class is used to iterate on the arcs of the paths in
266
      /// reverse direction.
268
      /// LEMON style iterator class for enumerating the arcs of a path
269
      /// in reverse direction.
267 270
      class RevArcIt {
268 271
      public:
269 272
        /// Default constructor
270 273
        RevArcIt() {}
271 274
        /// Invalid constructor
272 275
        RevArcIt(Invalid) {}
273
        /// Constructor for first arc
276
        /// Sets the iterator to the last arc of the given path
274 277
        RevArcIt(const PathDumper &) {}
275 278

	
276
        /// Conversion to Arc
279
        /// Conversion to \c Arc
277 280
        operator Arc() const { return INVALID; }
278 281

	
279 282
        /// Next arc
280 283
        RevArcIt& operator++() {return *this;}
281 284

	
282 285
        /// Comparison operator
283 286
        bool operator==(const RevArcIt&) const {return true;}
284 287
        /// Comparison operator
285 288
        bool operator!=(const RevArcIt&) const {return true;}
286 289
        /// Comparison operator
287 290
        bool operator<(const RevArcIt&) const {return false;}
288 291

	
289 292
      };
290 293

	
291 294
      template <typename _Path>
292 295
      struct Constraints {
293 296
        void constraints() {
294 297
          function_requires<_path_bits::
295 298
            PathDumperConstraints<Digraph, _Path> >();
296 299
        }
297 300
      };
298 301

	
299 302
    };
300 303

	
301 304

	
302 305
    ///@}
303 306
  }
304 307

	
305 308
} // namespace lemon
306 309

	
307 310
#endif
Ignore white space 6 line context
... ...
@@ -167,83 +167,83 @@
167 167
    /// on destruction. (It modifies the value of its parent, so 'No'
168 168
    /// only means 'do not print'.)
169 169
    ///
170 170
    /// Replacing \ref SubCounter "SubCounter"s with \ref NoSubCounter
171 171
    /// "NoSubCounter"s makes it possible to turn off reporting
172 172
    /// subcounter values without actually removing the definitions
173 173
    /// and the increment or decrement operators.
174 174
    ///
175 175
    /// \sa SubCounter
176 176
    typedef _NoSubCounter<Counter> NoSubCounter;
177 177

	
178 178
    /// Constructor.
179 179
    Counter() : _title(), _os(std::cerr), count(0) {}
180 180
    /// Constructor.
181 181
    Counter(std::string title,std::ostream &os=std::cerr)
182 182
      : _title(title), _os(os), count(0) {}
183 183
    /// Constructor.
184 184
    Counter(const char *title,std::ostream &os=std::cerr)
185 185
      : _title(title), _os(os), count(0) {}
186 186
    /// Destructor. Prints the given title and the value of the counter.
187 187
    ~Counter() {
188 188
      _os << _title << count <<std::endl;
189 189
    }
190 190
    ///\e
191 191
    Counter &operator++() { count++; return *this;}
192 192
    ///\e
193 193
    int operator++(int) { return count++;}
194 194
    ///\e
195 195
    Counter &operator--() { count--; return *this;}
196 196
    ///\e
197 197
    int operator--(int) { return count--;}
198 198
    ///\e
199 199
    Counter &operator+=(int c) { count+=c; return *this;}
200 200
    ///\e
201 201
    Counter &operator-=(int c) { count-=c; return *this;}
202 202
    /// Resets the counter to the given value.
203 203

	
204 204
    /// Resets the counter to the given value.
205 205
    /// \note This function does not reset the values of
206 206
    /// \ref SubCounter "SubCounter"s but it resets \ref NoSubCounter
207 207
    /// "NoSubCounter"s along with the main counter.
208 208
    void reset(int c=0) {count=c;}
209 209
    /// Returns the value of the counter.
210 210
    operator int() {return count;}
211 211
  };
212 212

	
213 213
  /// 'Do nothing' version of Counter.
214 214

	
215
  /// This class can be used in the same way as \ref Counter however it
215
  /// This class can be used in the same way as \ref Counter, but it
216 216
  /// does not count at all and does not print report on destruction.
217 217
  ///
218 218
  /// Replacing a \ref Counter with a \ref NoCounter makes it possible
219 219
  /// to turn off all counting and reporting (SubCounters should also
220 220
  /// be replaced with NoSubCounters), so it does not affect the
221 221
  /// efficiency of the program at all.
222 222
  ///
223 223
  /// \sa Counter
224 224
  class NoCounter
225 225
  {
226 226
  public:
227 227
    typedef _NoSubCounter<NoCounter> SubCounter;
228 228
    typedef _NoSubCounter<NoCounter> NoSubCounter;
229 229

	
230 230
    NoCounter() {}
231 231
    NoCounter(std::string,std::ostream &) {}
232 232
    NoCounter(const char *,std::ostream &) {}
233 233
    NoCounter(std::string) {}
234 234
    NoCounter(const char *) {}
235 235
    NoCounter &operator++() { return *this; }
236 236
    int operator++(int) { return 0; }
237 237
    NoCounter &operator--() { return *this; }
238 238
    int operator--(int) { return 0; }
239 239
    NoCounter &operator+=(int) { return *this;}
240 240
    NoCounter &operator-=(int) { return *this;}
241 241
    void reset(int) {}
242 242
    void reset() {}
243 243
    operator int() {return 0;}
244 244
  };
245 245

	
246 246
  ///@}
247 247
}
248 248

	
249 249
#endif
Ignore white space 6 line context
... ...
@@ -18,97 +18,97 @@
18 18

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66
    ///By default, it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
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 85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 87
    ///Instantiates a \c ReachedMap.
88 88

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

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

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

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

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

	
... ...
@@ -733,97 +733,97 @@
733 733
    ///arcs, which form the DFS tree (forest).
734 734
    ///
735 735
    ///\pre Either \ref run(Node) "run()" or \ref init()
736 736
    ///must be called before using this function.
737 737
    const PredMap &predMap() const { return *_pred;}
738 738

	
739 739
    ///Checks if the given node. node is reached from the root(s).
740 740

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

	
747 747
    ///@}
748 748
  };
749 749

	
750 750
  ///Default traits class of dfs() function.
751 751

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

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

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

	
777 777
    ///The type of the map that indicates which nodes are processed.
778 778

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

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

	
797 797
    ///The type of the map that indicates which nodes are reached.
798 798

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

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

	
812 812
    ///The type of the map that stores the distances of the nodes.
813 813

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

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

	
827 827
    ///The type of the DFS paths.
828 828

	
829 829
    ///The type of the DFS paths.
Ignore white space 6 line context
... ...
@@ -87,97 +87,97 @@
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

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

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

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

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

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

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

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

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

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

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

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

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

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

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172 172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173 173
  ///when all arc lengths are non-negative. If there are negative lengths,
174 174
  ///the BellmanFord algorithm should be used instead.
175 175
  ///
176 176
  ///The arc lengths are passed to the algorithm using a
177 177
  ///\ref concepts::ReadMap "ReadMap",
178 178
  ///so it is easy to change it to any kind of length.
179 179
  ///The type of the length is determined by the
180 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
181 181
  ///It is also possible to change the underlying priority heap.
182 182
  ///
183 183
  ///There is also a \ref dijkstra() "function-type interface" for the
... ...
@@ -381,118 +381,118 @@
381 381
      typedef CR HeapCrossRef;
382 382
      typedef H Heap;
383 383
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
384 384
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
385 385
        return 0; // ignore warnings
386 386
      }
387 387
      static Heap *createHeap(HeapCrossRef &)
388 388
      {
389 389
        LEMON_ASSERT(false, "Heap is not initialized");
390 390
        return 0; // ignore warnings
391 391
      }
392 392
    };
393 393
    ///\brief \ref named-templ-param "Named parameter" for setting
394 394
    ///heap and cross reference types
395 395
    ///
396 396
    ///\ref named-templ-param "Named parameter" for setting heap and cross
397 397
    ///reference types. If this named parameter is used, then external
398 398
    ///heap and cross reference objects must be passed to the algorithm
399 399
    ///using the \ref heap() function before calling \ref run(Node) "run()"
400 400
    ///or \ref init().
401 401
    ///\sa SetStandardHeap
402 402
    template <class H, class CR = typename Digraph::template NodeMap<int> >
403 403
    struct SetHeap
404 404
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
405 405
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
406 406
    };
407 407

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

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

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

	
458 458
    ///@}
459 459

	
460 460
  protected:
461 461

	
462 462
    Dijkstra() {}
463 463

	
464 464
  public:
465 465

	
466 466
    ///Constructor.
467 467

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

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

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

	
492 492
    ///Sets the length map.
493 493
    ///\return <tt> (*this) </tt>
494 494
    Dijkstra &lengthMap(const LengthMap &m)
495 495
    {
496 496
      _length = &m;
497 497
      return *this;
498 498
    }
... ...
@@ -951,97 +951,97 @@
951 951

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1039 1039
  /// Default traits class used by DijkstraWizard.
1040 1040
  /// \tparam GR The type of the digraph.
1041 1041
  /// \tparam LEN The type of the length map.
1042 1042
  template<typename GR, typename LEN>
1043 1043
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1044 1044
  {
1045 1045
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1046 1046
  protected:
1047 1047
    //The type of the nodes in the digraph.
Ignore white space 6 line context
... ...
@@ -249,197 +249,195 @@
249 249
    /// \pre \ref run() must be called before using this function.
250 250
    int rootDist(const Node& node) const {
251 251
      return (*_order)[node];
252 252
    }
253 253

	
254 254
    /// \brief Return the minimum cut value between two nodes
255 255
    ///
256 256
    /// This function returns the minimum cut value between the nodes
257 257
    /// \c s and \c t. 
258 258
    /// It finds the nearest common ancestor of the given nodes in the
259 259
    /// Gomory-Hu tree and calculates the minimum weight edge on the
260 260
    /// paths to the ancestor.
261 261
    ///
262 262
    /// \pre \ref run() must be called before using this function.
263 263
    Value minCutValue(const Node& s, const Node& t) const {
264 264
      Node sn = s, tn = t;
265 265
      Value value = std::numeric_limits<Value>::max();
266 266
      
267 267
      while (sn != tn) {
268 268
	if ((*_order)[sn] < (*_order)[tn]) {
269 269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270 270
	  tn = (*_pred)[tn];
271 271
	} else {
272 272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273 273
	  sn = (*_pred)[sn];
274 274
	}
275 275
      }
276 276
      return value;
277 277
    }
278 278

	
279 279
    /// \brief Return the minimum cut between two nodes
280 280
    ///
281 281
    /// This function returns the minimum cut between the nodes \c s and \c t
282 282
    /// in the \c cutMap parameter by setting the nodes in the component of
283 283
    /// \c s to \c true and the other nodes to \c false.
284 284
    ///
285 285
    /// For higher level interfaces see MinCutNodeIt and MinCutEdgeIt.
286 286
    ///
287 287
    /// \param s The base node.
288 288
    /// \param t The node you want to separate from node \c s.
289 289
    /// \param cutMap The cut will be returned in this map.
290 290
    /// It must be a \c bool (or convertible) \ref concepts::ReadWriteMap
291 291
    /// "ReadWriteMap" on the graph nodes.
292 292
    ///
293 293
    /// \return The value of the minimum cut between \c s and \c t.
294 294
    ///
295 295
    /// \pre \ref run() must be called before using this function.
296 296
    template <typename CutMap>
297
    Value minCutMap(const Node& s, ///< 
297
    Value minCutMap(const Node& s,
298 298
                    const Node& t,
299
                    ///< 
300 299
                    CutMap& cutMap
301
                    ///< 
302 300
                    ) const {
303 301
      Node sn = s, tn = t;
304 302
      bool s_root=false;
305 303
      Node rn = INVALID;
306 304
      Value value = std::numeric_limits<Value>::max();
307 305
      
308 306
      while (sn != tn) {
309 307
	if ((*_order)[sn] < (*_order)[tn]) {
310 308
	  if ((*_weight)[tn] <= value) {
311 309
	    rn = tn;
312 310
            s_root = false;
313 311
	    value = (*_weight)[tn];
314 312
	  }
315 313
	  tn = (*_pred)[tn];
316 314
	} else {
317 315
	  if ((*_weight)[sn] <= value) {
318 316
	    rn = sn;
319 317
            s_root = true;
320 318
	    value = (*_weight)[sn];
321 319
	  }
322 320
	  sn = (*_pred)[sn];
323 321
	}
324 322
      }
325 323

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

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

	
349 347
    ///@}
350 348

	
351 349
    friend class MinCutNodeIt;
352 350

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

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

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

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

	
435 433
      /// Postfix incrementation.
436 434
      ///
437 435
      /// \warning This incrementation
438 436
      /// returns a \c Node, not a \c MinCutNodeIt, as one may
439 437
      /// expect.
440 438
      typename Graph::Node operator++(int)
441 439
      {
442 440
        typename Graph::Node n=*this;
443 441
        ++(*this);
444 442
        return n;
445 443
      }
Ignore white space 6 line context
... ...
@@ -97,97 +97,97 @@
97 97
  double _nodeScale;
98 98
  double _xBorder, _yBorder;
99 99
  double _scale;
100 100
  double _nodeBorderQuotient;
101 101

	
102 102
  bool _drawArrows;
103 103
  double _arrowLength, _arrowWidth;
104 104

	
105 105
  bool _showNodes, _showArcs;
106 106

	
107 107
  bool _enableParallel;
108 108
  double _parArcDist;
109 109

	
110 110
  bool _showNodeText;
111 111
  ConstMap<typename Graph::Node,bool > _nodeTexts;
112 112
  double _nodeTextSize;
113 113

	
114 114
  bool _showNodePsText;
115 115
  ConstMap<typename Graph::Node,bool > _nodePsTexts;
116 116
  char *_nodePsTextsPreamble;
117 117

	
118 118
  bool _undirected;
119 119

	
120 120
  bool _pleaseRemoveOsStream;
121 121

	
122 122
  bool _scaleToA4;
123 123

	
124 124
  std::string _title;
125 125
  std::string _copyright;
126 126

	
127 127
  enum NodeTextColorType
128 128
    { DIST_COL=0, DIST_BW=1, CUST_COL=2, SAME_COL=3 } _nodeTextColorType;
129 129
  ConstMap<typename Graph::Node,Color > _nodeTextColors;
130 130

	
131 131
  bool _autoNodeScale;
132 132
  bool _autoArcWidthScale;
133 133

	
134 134
  bool _absoluteNodeSizes;
135 135
  bool _absoluteArcWidths;
136 136

	
137 137
  bool _negY;
138 138

	
139 139
  bool _preScale;
140 140
  ///Constructor
141 141

	
142 142
  ///Constructor
143 143
  ///\param gr  Reference to the graph to be printed.
144 144
  ///\param ost Reference to the output stream.
145
  ///By default it is <tt>std::cout</tt>.
145
  ///By default, it is <tt>std::cout</tt>.
146 146
  ///\param pros If it is \c true, then the \c ostream referenced by \c os
147 147
  ///will be explicitly deallocated by the destructor.
148 148
  DefaultGraphToEpsTraits(const GR &gr, std::ostream& ost = std::cout,
149 149
                          bool pros = false) :
150 150
    g(gr), os(ost),
151 151
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
152 152
    _nodeColors(WHITE), _arcColors(BLACK),
153 153
    _arcWidths(1.0), _arcWidthScale(0.003),
154 154
    _nodeScale(.01), _xBorder(10), _yBorder(10), _scale(1.0),
155 155
    _nodeBorderQuotient(.1),
156 156
    _drawArrows(false), _arrowLength(1), _arrowWidth(0.3),
157 157
    _showNodes(true), _showArcs(true),
158 158
    _enableParallel(false), _parArcDist(1),
159 159
    _showNodeText(false), _nodeTexts(false), _nodeTextSize(1),
160 160
    _showNodePsText(false), _nodePsTexts(false), _nodePsTextsPreamble(0),
161 161
    _undirected(lemon::UndirectedTagIndicator<GR>::value),
162 162
    _pleaseRemoveOsStream(pros), _scaleToA4(false),
163 163
    _nodeTextColorType(SAME_COL), _nodeTextColors(BLACK),
164 164
    _autoNodeScale(false),
165 165
    _autoArcWidthScale(false),
166 166
    _absoluteNodeSizes(false),
167 167
    _absoluteArcWidths(false),
168 168
    _negY(false),
169 169
    _preScale(true)
170 170
  {}
171 171
};
172 172

	
173 173
///Auxiliary class to implement the named parameters of \ref graphToEps()
174 174

	
175 175
///Auxiliary class to implement the named parameters of \ref graphToEps().
176 176
///
177 177
///For detailed examples see the \ref graph_to_eps_demo.cc demo file.
178 178
template<class T> class GraphToEps : public T
179 179
{
180 180
  // Can't believe it is required by the C++ standard
181 181
  using T::g;
182 182
  using T::os;
183 183

	
184 184
  using T::_coords;
185 185
  using T::_nodeSizes;
186 186
  using T::_nodeShapes;
187 187
  using T::_nodeColors;
188 188
  using T::_arcColors;
189 189
  using T::_arcWidths;
190 190

	
191 191
  using T::_arcWidthScale;
192 192
  using T::_nodeScale;
193 193
  using T::_xBorder;
... ...
@@ -467,97 +467,97 @@
467 467
  ///\sa Palette
468 468
  template<class X> GraphToEps<ArcColorsTraits<X> >
469 469
  arcColors(const X &x)
470 470
  {
471 471
    dontPrint=true;
472 472
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
473 473
  }
474 474
  ///Sets a global scale factor for node sizes
475 475

	
476 476
  ///Sets a global scale factor for node sizes.
477 477
  ///
478 478
  /// If nodeSizes() is not given, this function simply sets the node
479 479
  /// sizes to \c d.  If nodeSizes() is given, but
480 480
  /// autoNodeScale() is not, then the node size given by
481 481
  /// nodeSizes() will be multiplied by the value \c d.
482 482
  /// If both nodeSizes() and autoNodeScale() are used, then the
483 483
  /// node sizes will be scaled in such a way that the greatest size will be
484 484
  /// equal to \c d.
485 485
  /// \sa nodeSizes()
486 486
  /// \sa autoNodeScale()
487 487
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
488 488
  ///Turns on/off the automatic node size scaling.
489 489

	
490 490
  ///Turns on/off the automatic node size scaling.
491 491
  ///
492 492
  ///\sa nodeScale()
493 493
  ///
494 494
  GraphToEps<T> &autoNodeScale(bool b=true) {
495 495
    _autoNodeScale=b;return *this;
496 496
  }
497 497

	
498 498
  ///Turns on/off the absolutematic node size scaling.
499 499

	
500 500
  ///Turns on/off the absolutematic node size scaling.
501 501
  ///
502 502
  ///\sa nodeScale()
503 503
  ///
504 504
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
505 505
    _absoluteNodeSizes=b;return *this;
506 506
  }
507 507

	
508 508
  ///Negates the Y coordinates.
509 509
  GraphToEps<T> &negateY(bool b=true) {
510 510
    _negY=b;return *this;
511 511
  }
512 512

	
513 513
  ///Turn on/off pre-scaling
514 514

	
515
  ///By default graphToEps() rescales the whole image in order to avoid
515
  ///By default, graphToEps() rescales the whole image in order to avoid
516 516
  ///very big or very small bounding boxes.
517 517
  ///
518 518
  ///This (p)rescaling can be turned off with this function.
519 519
  ///
520 520
  GraphToEps<T> &preScale(bool b=true) {
521 521
    _preScale=b;return *this;
522 522
  }
523 523

	
524 524
  ///Sets a global scale factor for arc widths
525 525

	
526 526
  /// Sets a global scale factor for arc widths.
527 527
  ///
528 528
  /// If arcWidths() is not given, this function simply sets the arc
529 529
  /// widths to \c d.  If arcWidths() is given, but
530 530
  /// autoArcWidthScale() is not, then the arc withs given by
531 531
  /// arcWidths() will be multiplied by the value \c d.
532 532
  /// If both arcWidths() and autoArcWidthScale() are used, then the
533 533
  /// arc withs will be scaled in such a way that the greatest width will be
534 534
  /// equal to \c d.
535 535
  GraphToEps<T> &arcWidthScale(double d=.003) {_arcWidthScale=d;return *this;}
536 536
  ///Turns on/off the automatic arc width scaling.
537 537

	
538 538
  ///Turns on/off the automatic arc width scaling.
539 539
  ///
540 540
  ///\sa arcWidthScale()
541 541
  ///
542 542
  GraphToEps<T> &autoArcWidthScale(bool b=true) {
543 543
    _autoArcWidthScale=b;return *this;
544 544
  }
545 545
  ///Turns on/off the absolutematic arc width scaling.
546 546

	
547 547
  ///Turns on/off the absolutematic arc width scaling.
548 548
  ///
549 549
  ///\sa arcWidthScale()
550 550
  ///
551 551
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
552 552
    _absoluteArcWidths=b;return *this;
553 553
  }
554 554
  ///Sets a global scale factor for the whole picture
555 555
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
556 556
  ///Sets the width of the border around the picture
557 557
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
558 558
  ///Sets the width of the border around the picture
559 559
  GraphToEps<T> &border(double x, double y) {
560 560
    _xBorder=x;_yBorder=y;return *this;
561 561
  }
562 562
  ///Sets whether to draw arrows
563 563
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
... ...
@@ -1069,109 +1069,109 @@
1069 1069

	
1070 1070
  ///An alias for arcColors()
1071 1071
  template<class X> GraphToEps<ArcColorsTraits<X> >
1072 1072
  edgeColors(const X &x)
1073 1073
  {
1074 1074
    return arcColors(x);
1075 1075
  }
1076 1076

	
1077 1077
  ///An alias for arcWidthScale()
1078 1078
  GraphToEps<T> &edgeWidthScale(double d) {return arcWidthScale(d);}
1079 1079

	
1080 1080
  ///An alias for autoArcWidthScale()
1081 1081
  GraphToEps<T> &autoEdgeWidthScale(bool b=true)
1082 1082
  {
1083 1083
    return autoArcWidthScale(b);
1084 1084
  }
1085 1085

	
1086 1086
  ///An alias for absoluteArcWidths()
1087 1087
  GraphToEps<T> &absoluteEdgeWidths(bool b=true)
1088 1088
  {
1089 1089
    return absoluteArcWidths(b);
1090 1090
  }
1091 1091

	
1092 1092
  ///An alias for parArcDist()
1093 1093
  GraphToEps<T> &parEdgeDist(double d) {return parArcDist(d);}
1094 1094

	
1095 1095
  ///An alias for hideArcs()
1096 1096
  GraphToEps<T> &hideEdges(bool b=true) {return hideArcs(b);}
1097 1097

	
1098 1098
  ///@}
1099 1099
};
1100 1100

	
1101 1101
template<class T>
1102 1102
const int GraphToEps<T>::INTERPOL_PREC = 20;
1103 1103
template<class T>
1104 1104
const double GraphToEps<T>::A4HEIGHT = 841.8897637795276;
1105 1105
template<class T>
1106 1106
const double GraphToEps<T>::A4WIDTH  = 595.275590551181;
1107 1107
template<class T>
1108 1108
const double GraphToEps<T>::A4BORDER = 15;
1109 1109

	
1110 1110

	
1111 1111
///Generates an EPS file from a graph
1112 1112

	
1113 1113
///\ingroup eps_io
1114 1114
///Generates an EPS file from a graph.
1115 1115
///\param g Reference to the graph to be printed.
1116 1116
///\param os Reference to the output stream.
1117
///By default it is <tt>std::cout</tt>.
1117
///By default, it is <tt>std::cout</tt>.
1118 1118
///
1119 1119
///This function also has a lot of
1120 1120
///\ref named-templ-func-param "named parameters",
1121 1121
///they are declared as the members of class \ref GraphToEps. The following
1122 1122
///example shows how to use these parameters.
1123 1123
///\code
1124 1124
/// graphToEps(g,os).scale(10).coords(coords)
1125 1125
///              .nodeScale(2).nodeSizes(sizes)
1126 1126
///              .arcWidthScale(.4).run();
1127 1127
///\endcode
1128 1128
///
1129
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1129
///For more detailed examples, see the \ref graph_to_eps_demo.cc demo file.
1130 1130
///
1131 1131
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1132 1132
///to the end of the parameter list.
1133 1133
///\sa GraphToEps
1134 1134
///\sa graphToEps(GR &g, const char *file_name)
1135 1135
template<class GR>
1136 1136
GraphToEps<DefaultGraphToEpsTraits<GR> >
1137 1137
graphToEps(GR &g, std::ostream& os=std::cout)
1138 1138
{
1139 1139
  return
1140 1140
    GraphToEps<DefaultGraphToEpsTraits<GR> >(DefaultGraphToEpsTraits<GR>(g,os));
1141 1141
}
1142 1142

	
1143 1143
///Generates an EPS file from a graph
1144 1144

	
1145 1145
///\ingroup eps_io
1146 1146
///This function does the same as
1147 1147
///\ref graphToEps(GR &g,std::ostream& os)
1148 1148
///but it writes its output into the file \c file_name
1149 1149
///instead of a stream.
1150 1150
///\sa graphToEps(GR &g, std::ostream& os)
1151 1151
template<class GR>
1152 1152
GraphToEps<DefaultGraphToEpsTraits<GR> >
1153 1153
graphToEps(GR &g,const char *file_name)
1154 1154
{
1155 1155
  std::ostream* os = new std::ofstream(file_name);
1156 1156
  if (!(*os)) {
1157 1157
    delete os;
1158 1158
    throw IoError("Cannot write file", file_name);
1159 1159
  }
1160 1160
  return GraphToEps<DefaultGraphToEpsTraits<GR> >
1161 1161
    (DefaultGraphToEpsTraits<GR>(g,*os,true));
1162 1162
}
1163 1163

	
1164 1164
///Generates an EPS file from a graph
1165 1165

	
1166 1166
///\ingroup eps_io
1167 1167
///This function does the same as
1168 1168
///\ref graphToEps(GR &g,std::ostream& os)
1169 1169
///but it writes its output into the file \c file_name
1170 1170
///instead of a stream.
1171 1171
///\sa graphToEps(GR &g, std::ostream& os)
1172 1172
template<class GR>
1173 1173
GraphToEps<DefaultGraphToEpsTraits<GR> >
1174 1174
graphToEps(GR &g,const std::string& file_name)
1175 1175
{
1176 1176
  std::ostream* os = new std::ofstream(file_name.c_str());
1177 1177
  if (!(*os)) {
Ignore white space 6 line context
... ...
@@ -242,97 +242,97 @@
242 242
      return (arc._id & 1) == 1;
243 243
    }
244 244

	
245 245
    static Arc direct(Edge edge, bool dir) {
246 246
      return Arc((edge._id << 1) | (dir ? 1 : 0));
247 247
    }
248 248

	
249 249
    int dimension() const {
250 250
      return _dim;
251 251
    }
252 252

	
253 253
    bool projection(Node node, int n) const {
254 254
      return static_cast<bool>(node._id & (1 << n));
255 255
    }
256 256

	
257 257
    int dimension(Edge edge) const {
258 258
      return edge._id >> (_dim-1);
259 259
    }
260 260

	
261 261
    int dimension(Arc arc) const {
262 262
      return arc._id >> _dim;
263 263
    }
264 264

	
265 265
    static int index(Node node) {
266 266
      return node._id;
267 267
    }
268 268

	
269 269
    Node operator()(int ix) const {
270 270
      return Node(ix);
271 271
    }
272 272

	
273 273
  private:
274 274
    int _dim;
275 275
    int _node_num, _edge_num;
276 276
  };
277 277

	
278 278

	
279 279
  typedef GraphExtender<HypercubeGraphBase> ExtendedHypercubeGraphBase;
280 280

	
281 281
  /// \ingroup graphs
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285 285
  /// HypercubeGraph implements a special graph type. The nodes of the
286 286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289 289
  /// This class is completely static and it needs constant memory space.
290
  /// Thus you can neither add nor delete nodes or edges, however 
290
  /// Thus you can neither add nor delete nodes or edges, however,
291 291
  /// the structure can be resized using resize().
292 292
  ///
293 293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
294 294
  /// Most of its member functions and nested classes are documented
295 295
  /// only in the concept class.
296 296
  ///
297 297
  /// This class provides constant time counting for nodes, edges and arcs.
298 298
  ///
299 299
  /// \note The type of the indices is chosen to \c int for efficiency
300 300
  /// reasons. Thus the maximum dimension of this implementation is 26
301 301
  /// (assuming that the size of \c int is 32 bit).
302 302
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
303 303
    typedef ExtendedHypercubeGraphBase Parent;
304 304

	
305 305
  public:
306 306

	
307 307
    /// \brief Constructs a hypercube graph with \c dim dimensions.
308 308
    ///
309 309
    /// Constructs a hypercube graph with \c dim dimensions.
310 310
    HypercubeGraph(int dim) { construct(dim); }
311 311

	
312 312
    /// \brief Resizes the graph
313 313
    ///
314 314
    /// This function resizes the graph. It fully destroys and
315 315
    /// rebuilds the structure, therefore the maps of the graph will be
316 316
    /// reallocated automatically and the previous values will be lost.
317 317
    void resize(int dim) {
318 318
      Parent::notifier(Arc()).clear();
319 319
      Parent::notifier(Edge()).clear();
320 320
      Parent::notifier(Node()).clear();
321 321
      construct(dim);
322 322
      Parent::notifier(Node()).build();
323 323
      Parent::notifier(Edge()).build();
324 324
      Parent::notifier(Arc()).build();
325 325
    }
326 326

	
327 327
    /// \brief The number of dimensions.
328 328
    ///
329 329
    /// Gives back the number of dimensions.
330 330
    int dimension() const {
331 331
      return Parent::dimension();
332 332
    }
333 333

	
334 334
    /// \brief Returns \c true if the n'th bit of the node is one.
335 335
    ///
336 336
    /// Returns \c true if the n'th bit of the node is one.
337 337
    bool projection(Node node, int n) const {
338 338
      return Parent::projection(node, n);
Ignore white space 6 line context
... ...
@@ -382,97 +382,97 @@
382 382
        }
383 383
        if (is) is.putback(c);
384 384
        else if (is.eof()) is.clear();
385 385
      }
386 386
    };
387 387

	
388 388
  }
389 389

	
390 390
  template <typename DGR>
391 391
  class DigraphReader;
392 392

	
393 393
  template <typename TDGR>
394 394
  DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is = std::cin);
395 395
  template <typename TDGR>
396 396
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const std::string& fn);
397 397
  template <typename TDGR>
398 398
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
399 399

	
400 400
  /// \ingroup lemon_io
401 401
  ///
402 402
  /// \brief \ref lgf-format "LGF" reader for directed graphs
403 403
  ///
404 404
  /// This utility reads an \ref lgf-format "LGF" file.
405 405
  ///
406 406
  /// The reading method does a batch processing. The user creates a
407 407
  /// reader object, then various reading rules can be added to the
408 408
  /// reader, and eventually the reading is executed with the \c run()
409 409
  /// member function. A map reading rule can be added to the reader
410 410
  /// with the \c nodeMap() or \c arcMap() members. An optional
411 411
  /// converter parameter can also be added as a standard functor
412 412
  /// converting from \c std::string to the value type of the map. If it
413 413
  /// is set, it will determine how the tokens in the file should be
414 414
  /// converted to the value type of the map. If the functor is not set,
415 415
  /// then a default conversion will be used. One map can be read into
416 416
  /// multiple map objects at the same time. The \c attribute(), \c
417 417
  /// node() and \c arc() functions are used to add attribute reading
418 418
  /// rules.
419 419
  ///
420 420
  ///\code
421 421
  /// DigraphReader<DGR>(digraph, std::cin).
422 422
  ///   nodeMap("coordinates", coord_map).
423 423
  ///   arcMap("capacity", cap_map).
424 424
  ///   node("source", src).
425 425
  ///   node("target", trg).
426 426
  ///   attribute("caption", caption).
427 427
  ///   run();
428 428
  ///\endcode
429 429
  ///
430
  /// By default the reader uses the first section in the file of the
430
  /// By default, the reader uses the first section in the file of the
431 431
  /// proper type. If a section has an optional name, then it can be
432 432
  /// selected for reading by giving an optional name parameter to the
433 433
  /// \c nodes(), \c arcs() or \c attributes() functions.
434 434
  ///
435 435
  /// The \c useNodes() and \c useArcs() functions are used to tell the reader
436 436
  /// that the nodes or arcs should not be constructed (added to the
437 437
  /// graph) during the reading, but instead the label map of the items
438 438
  /// are given as a parameter of these functions. An
439 439
  /// application of these functions is multipass reading, which is
440 440
  /// important if two \c \@arcs sections must be read from the
441 441
  /// file. In this case the first phase would read the node set and one
442 442
  /// of the arc sets, while the second phase would read the second arc
443 443
  /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet).
444 444
  /// The previously read label node map should be passed to the \c
445 445
  /// useNodes() functions. Another application of multipass reading when
446 446
  /// paths are given as a node map or an arc map.
447 447
  /// It is impossible to read this in
448 448
  /// a single pass, because the arcs are not constructed when the node
449 449
  /// maps are read.
450 450
  template <typename DGR>
451 451
  class DigraphReader {
452 452
  public:
453 453

	
454 454
    typedef DGR Digraph;
455 455

	
456 456
  private:
457 457

	
458 458
    TEMPLATE_DIGRAPH_TYPEDEFS(DGR);
459 459

	
460 460
    std::istream* _is;
461 461
    bool local_is;
462 462
    std::string _filename;
463 463

	
464 464
    DGR& _digraph;
465 465

	
466 466
    std::string _nodes_caption;
467 467
    std::string _arcs_caption;
468 468
    std::string _attributes_caption;
469 469

	
470 470
    typedef std::map<std::string, Node> NodeIndex;
471 471
    NodeIndex _node_index;
472 472
    typedef std::map<std::string, Arc> ArcIndex;
473 473
    ArcIndex _arc_index;
474 474

	
475 475
    typedef std::vector<std::pair<std::string,
476 476
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;
477 477
    NodeMaps _node_maps;
478 478

	
... ...
@@ -2176,97 +2176,97 @@
2176 2176
        throw IoError("Cannot open file", fn);
2177 2177
      }
2178 2178
    }
2179 2179

	
2180 2180
    /// \brief Destructor
2181 2181
    ~SectionReader() {
2182 2182
      for (Sections::iterator it = _sections.begin();
2183 2183
           it != _sections.end(); ++it) {
2184 2184
        delete it->second;
2185 2185
      }
2186 2186

	
2187 2187
      if (local_is) {
2188 2188
        delete _is;
2189 2189
      }
2190 2190

	
2191 2191
    }
2192 2192

	
2193 2193
  private:
2194 2194

	
2195 2195
    friend SectionReader sectionReader(std::istream& is);
2196 2196
    friend SectionReader sectionReader(const std::string& fn);
2197 2197
    friend SectionReader sectionReader(const char* fn);
2198 2198

	
2199 2199
    SectionReader(SectionReader& other)
2200 2200
      : _is(other._is), local_is(other.local_is) {
2201 2201

	
2202 2202
      other._is = 0;
2203 2203
      other.local_is = false;
2204 2204

	
2205 2205
      _sections.swap(other._sections);
2206 2206
    }
2207 2207

	
2208 2208
    SectionReader& operator=(const SectionReader&);
2209 2209

	
2210 2210
  public:
2211 2211

	
2212 2212
    /// \name Section Readers
2213 2213
    /// @{
2214 2214

	
2215 2215
    /// \brief Add a section processor with line oriented reading
2216 2216
    ///
2217 2217
    /// The first parameter is the type descriptor of the section, the
2218 2218
    /// second is a functor, which takes just one \c std::string
2219 2219
    /// parameter. At the reading process, each line of the section
2220 2220
    /// will be given to the functor object. However, the empty lines
2221 2221
    /// and the comment lines are filtered out, and the leading
2222 2222
    /// whitespaces are trimmed from each processed string.
2223 2223
    ///
2224
    /// For example let's see a section, which contain several
2224
    /// For example, let's see a section, which contain several
2225 2225
    /// integers, which should be inserted into a vector.
2226 2226
    ///\code
2227 2227
    ///  @numbers
2228 2228
    ///  12 45 23
2229 2229
    ///  4
2230 2230
    ///  23 6
2231 2231
    ///\endcode
2232 2232
    ///
2233 2233
    /// The functor is implemented as a struct:
2234 2234
    ///\code
2235 2235
    ///  struct NumberSection {
2236 2236
    ///    std::vector<int>& _data;
2237 2237
    ///    NumberSection(std::vector<int>& data) : _data(data) {}
2238 2238
    ///    void operator()(const std::string& line) {
2239 2239
    ///      std::istringstream ls(line);
2240 2240
    ///      int value;
2241 2241
    ///      while (ls >> value) _data.push_back(value);
2242 2242
    ///    }
2243 2243
    ///  };
2244 2244
    ///
2245 2245
    ///  // ...
2246 2246
    ///
2247 2247
    ///  reader.sectionLines("numbers", NumberSection(vec));
2248 2248
    ///\endcode
2249 2249
    template <typename Functor>
2250 2250
    SectionReader& sectionLines(const std::string& type, Functor functor) {
2251 2251
      LEMON_ASSERT(!type.empty(), "Type is empty.");
2252 2252
      LEMON_ASSERT(_sections.find(type) == _sections.end(),
2253 2253
                   "Multiple reading of section.");
2254 2254
      _sections.insert(std::make_pair(type,
2255 2255
        new _reader_bits::LineSection<Functor>(functor)));
2256 2256
      return *this;
2257 2257
    }
2258 2258

	
2259 2259

	
2260 2260
    /// \brief Add a section processor with stream oriented reading
2261 2261
    ///
2262 2262
    /// The first parameter is the type of the section, the second is
2263 2263
    /// a functor, which takes an \c std::istream& and an \c int&
2264 2264
    /// parameter, the latter regard to the line number of stream. The
2265 2265
    /// functor can read the input while the section go on, and the
2266 2266
    /// line number should be modified accordingly.
2267 2267
    template <typename Functor>
2268 2268
    SectionReader& sectionStream(const std::string& type, Functor functor) {
2269 2269
      LEMON_ASSERT(!type.empty(), "Type is empty.");
2270 2270
      LEMON_ASSERT(_sections.find(type) == _sections.end(),
2271 2271
                   "Multiple reading of section.");
2272 2272
      _sections.insert(std::make_pair(type,
Ignore white space 6 line context
... ...
@@ -355,109 +355,109 @@
355 355

	
356 356
    ///This function adds a new arc to the digraph with source node \c s
357 357
    ///and target node \c t.
358 358
    ///\return The new arc.
359 359
    Arc addArc(Node s, Node t) {
360 360
      return Parent::addArc(s, t);
361 361
    }
362 362

	
363 363
    ///\brief Erase a node from the digraph.
364 364
    ///
365 365
    ///This function erases the given node along with its outgoing and
366 366
    ///incoming arcs from the digraph.
367 367
    ///
368 368
    ///\note All iterators referencing the removed node or the connected
369 369
    ///arcs are invalidated, of course.
370 370
    void erase(Node n) { Parent::erase(n); }
371 371

	
372 372
    ///\brief Erase an arc from the digraph.
373 373
    ///
374 374
    ///This function erases the given arc from the digraph.
375 375
    ///
376 376
    ///\note All iterators referencing the removed arc are invalidated,
377 377
    ///of course.
378 378
    void erase(Arc a) { Parent::erase(a); }
379 379

	
380 380
    /// Node validity check
381 381

	
382 382
    /// This function gives back \c true if the given node is valid,
383 383
    /// i.e. it is a real node of the digraph.
384 384
    ///
385 385
    /// \warning A removed node could become valid again if new nodes are
386 386
    /// added to the digraph.
387 387
    bool valid(Node n) const { return Parent::valid(n); }
388 388

	
389 389
    /// Arc validity check
390 390

	
391 391
    /// This function gives back \c true if the given arc is valid,
392 392
    /// i.e. it is a real arc of the digraph.
393 393
    ///
394 394
    /// \warning A removed arc could become valid again if new arcs are
395 395
    /// added to the digraph.
396 396
    bool valid(Arc a) const { return Parent::valid(a); }
397 397

	
398 398
    /// Change the target node of an arc
399 399

	
400 400
    /// This function changes the target node of the given arc \c a to \c n.
401 401
    ///
402 402
    ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
403
    ///arc remain valid, however \c InArcIt iterators are invalidated.
403
    ///arc remain valid, but \c InArcIt iterators are invalidated.
404 404
    ///
405 405
    ///\warning This functionality cannot be used together with the Snapshot
406 406
    ///feature.
407 407
    void changeTarget(Arc a, Node n) {
408 408
      Parent::changeTarget(a,n);
409 409
    }
410 410
    /// Change the source node of an arc
411 411

	
412 412
    /// This function changes the source node of the given arc \c a to \c n.
413 413
    ///
414 414
    ///\note \c InArcIt iterators referencing the changed arc remain
415
    ///valid, however \c ArcIt and \c OutArcIt iterators are invalidated.
415
    ///valid, but \c ArcIt and \c OutArcIt iterators are invalidated.
416 416
    ///
417 417
    ///\warning This functionality cannot be used together with the Snapshot
418 418
    ///feature.
419 419
    void changeSource(Arc a, Node n) {
420 420
      Parent::changeSource(a,n);
421 421
    }
422 422

	
423 423
    /// Reverse the direction of an arc.
424 424

	
425 425
    /// This function reverses the direction of the given arc.
426 426
    ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
427 427
    ///the changed arc are invalidated.
428 428
    ///
429 429
    ///\warning This functionality cannot be used together with the Snapshot
430 430
    ///feature.
431 431
    void reverseArc(Arc a) {
432 432
      Node t=target(a);
433 433
      changeTarget(a,source(a));
434 434
      changeSource(a,t);
435 435
    }
436 436

	
437 437
    ///Contract two nodes.
438 438

	
439 439
    ///This function contracts the given two nodes.
440 440
    ///Node \c v is removed, but instead of deleting its
441 441
    ///incident arcs, they are joined to node \c u.
442 442
    ///If the last parameter \c r is \c true (this is the default value),
443 443
    ///then the newly created loops are removed.
444 444
    ///
445 445
    ///\note The moved arcs are joined to node \c u using changeSource()
446 446
    ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
447 447
    ///invalidated for the outgoing arcs of node \c v and \c InArcIt
448 448
    ///iterators are invalidated for the incomming arcs of \c v.
449 449
    ///Moreover all iterators referencing node \c v or the removed 
450 450
    ///loops are also invalidated. Other iterators remain valid.
451 451
    ///
452 452
    ///\warning This functionality cannot be used together with the Snapshot
453 453
    ///feature.
454 454
    void contract(Node u, Node v, bool r = true)
455 455
    {
456 456
      for(OutArcIt e(*this,v);e!=INVALID;) {
457 457
        OutArcIt f=e;
458 458
        ++f;
459 459
        if(r && target(e)==u) erase(e);
460 460
        else changeSource(e,u);
461 461
        e=f;
462 462
      }
463 463
      for(InArcIt e(*this,v);e!=INVALID;) {
... ...
@@ -514,97 +514,97 @@
514 514
      changeTarget(a,v);
515 515
      return v;
516 516
    }
517 517

	
518 518
    ///Clear the digraph.
519 519

	
520 520
    ///This function erases all nodes and arcs from the digraph.
521 521
    ///
522 522
    ///\note All iterators of the digraph are invalidated, of course.
523 523
    void clear() {
524 524
      Parent::clear();
525 525
    }
526 526

	
527 527
    /// Reserve memory for nodes.
528 528

	
529 529
    /// Using this function, it is possible to avoid superfluous memory
530 530
    /// allocation: if you know that the digraph you want to build will
531 531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532 532
    /// then it is worth reserving space for this amount before starting
533 533
    /// to build the digraph.
534 534
    /// \sa reserveArc()
535 535
    void reserveNode(int n) { nodes.reserve(n); };
536 536

	
537 537
    /// Reserve memory for arcs.
538 538

	
539 539
    /// Using this function, it is possible to avoid superfluous memory
540 540
    /// allocation: if you know that the digraph you want to build will
541 541
    /// be large (e.g. it will contain millions of nodes and/or arcs),
542 542
    /// then it is worth reserving space for this amount before starting
543 543
    /// to build the digraph.
544 544
    /// \sa reserveNode()
545 545
    void reserveArc(int m) { arcs.reserve(m); };
546 546

	
547 547
    /// \brief Class to make a snapshot of the digraph and restore
548 548
    /// it later.
549 549
    ///
550 550
    /// Class to make a snapshot of the digraph and restore it later.
551 551
    ///
552 552
    /// The newly added nodes and arcs can be removed using the
553 553
    /// restore() function.
554 554
    ///
555 555
    /// \note After a state is restored, you cannot restore a later state, 
556 556
    /// i.e. you cannot add the removed nodes and arcs again using
557 557
    /// another Snapshot instance.
558 558
    ///
559 559
    /// \warning Node and arc deletions and other modifications (e.g.
560 560
    /// reversing, contracting, splitting arcs or nodes) cannot be
561 561
    /// restored. These events invalidate the snapshot.
562
    /// However the arcs and nodes that were added to the digraph after
562
    /// However, the arcs and nodes that were added to the digraph after
563 563
    /// making the current snapshot can be removed without invalidating it.
564 564
    class Snapshot {
565 565
    protected:
566 566

	
567 567
      typedef Parent::NodeNotifier NodeNotifier;
568 568

	
569 569
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
570 570
      public:
571 571

	
572 572
        NodeObserverProxy(Snapshot& _snapshot)
573 573
          : snapshot(_snapshot) {}
574 574

	
575 575
        using NodeNotifier::ObserverBase::attach;
576 576
        using NodeNotifier::ObserverBase::detach;
577 577
        using NodeNotifier::ObserverBase::attached;
578 578

	
579 579
      protected:
580 580

	
581 581
        virtual void add(const Node& node) {
582 582
          snapshot.addNode(node);
583 583
        }
584 584
        virtual void add(const std::vector<Node>& nodes) {
585 585
          for (int i = nodes.size() - 1; i >= 0; ++i) {
586 586
            snapshot.addNode(nodes[i]);
587 587
          }
588 588
        }
589 589
        virtual void erase(const Node& node) {
590 590
          snapshot.eraseNode(node);
591 591
        }
592 592
        virtual void erase(const std::vector<Node>& nodes) {
593 593
          for (int i = 0; i < int(nodes.size()); ++i) {
594 594
            snapshot.eraseNode(nodes[i]);
595 595
          }
596 596
        }
597 597
        virtual void build() {
598 598
          Node node;
599 599
          std::vector<Node> nodes;
600 600
          for (notifier()->first(node); node != INVALID;
601 601
               notifier()->next(node)) {
602 602
            nodes.push_back(node);
603 603
          }
604 604
          for (int i = nodes.size() - 1; i >= 0; --i) {
605 605
            snapshot.addNode(nodes[i]);
606 606
          }
607 607
        }
608 608
        virtual void clear() {
609 609
          Node node;
610 610
          for (notifier()->first(node); node != INVALID;
... ...
@@ -1241,182 +1241,182 @@
1241 1241
    /// This function erases the given edge from the graph.
1242 1242
    ///
1243 1243
    /// \note All iterators referencing the removed edge are invalidated,
1244 1244
    /// of course.
1245 1245
    void erase(Edge e) { Parent::erase(e); }
1246 1246
    /// Node validity check
1247 1247

	
1248 1248
    /// This function gives back \c true if the given node is valid,
1249 1249
    /// i.e. it is a real node of the graph.
1250 1250
    ///
1251 1251
    /// \warning A removed node could become valid again if new nodes are
1252 1252
    /// added to the graph.
1253 1253
    bool valid(Node n) const { return Parent::valid(n); }
1254 1254
    /// Edge validity check
1255 1255

	
1256 1256
    /// This function gives back \c true if the given edge is valid,
1257 1257
    /// i.e. it is a real edge of the graph.
1258 1258
    ///
1259 1259
    /// \warning A removed edge could become valid again if new edges are
1260 1260
    /// added to the graph.
1261 1261
    bool valid(Edge e) const { return Parent::valid(e); }
1262 1262
    /// Arc validity check
1263 1263

	
1264 1264
    /// This function gives back \c true if the given arc is valid,
1265 1265
    /// i.e. it is a real arc of the graph.
1266 1266
    ///
1267 1267
    /// \warning A removed arc could become valid again if new edges are
1268 1268
    /// added to the graph.
1269 1269
    bool valid(Arc a) const { return Parent::valid(a); }
1270 1270

	
1271 1271
    /// \brief Change the first node of an edge.
1272 1272
    ///
1273 1273
    /// This function changes the first node of the given edge \c e to \c n.
1274 1274
    ///
1275 1275
    ///\note \c EdgeIt and \c ArcIt iterators referencing the
1276 1276
    ///changed edge are invalidated and all other iterators whose
1277 1277
    ///base node is the changed node are also invalidated.
1278 1278
    ///
1279 1279
    ///\warning This functionality cannot be used together with the
1280 1280
    ///Snapshot feature.
1281 1281
    void changeU(Edge e, Node n) {
1282 1282
      Parent::changeU(e,n);
1283 1283
    }
1284 1284
    /// \brief Change the second node of an edge.
1285 1285
    ///
1286 1286
    /// This function changes the second node of the given edge \c e to \c n.
1287 1287
    ///
1288 1288
    ///\note \c EdgeIt iterators referencing the changed edge remain
1289
    ///valid, however \c ArcIt iterators referencing the changed edge and
1289
    ///valid, but \c ArcIt iterators referencing the changed edge and
1290 1290
    ///all other iterators whose base node is the changed node are also
1291 1291
    ///invalidated.
1292 1292
    ///
1293 1293
    ///\warning This functionality cannot be used together with the
1294 1294
    ///Snapshot feature.
1295 1295
    void changeV(Edge e, Node n) {
1296 1296
      Parent::changeV(e,n);
1297 1297
    }
1298 1298

	
1299 1299
    /// \brief Contract two nodes.
1300 1300
    ///
1301 1301
    /// This function contracts the given two nodes.
1302 1302
    /// Node \c b is removed, but instead of deleting
1303 1303
    /// its incident edges, they are joined to node \c a.
1304 1304
    /// If the last parameter \c r is \c true (this is the default value),
1305 1305
    /// then the newly created loops are removed.
1306 1306
    ///
1307 1307
    /// \note The moved edges are joined to node \c a using changeU()
1308 1308
    /// or changeV(), thus all edge and arc iterators whose base node is
1309 1309
    /// \c b are invalidated.
1310 1310
    /// Moreover all iterators referencing node \c b or the removed 
1311 1311
    /// loops are also invalidated. Other iterators remain valid.
1312 1312
    ///
1313 1313
    ///\warning This functionality cannot be used together with the
1314 1314
    ///Snapshot feature.
1315 1315
    void contract(Node a, Node b, bool r = true) {
1316 1316
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1317 1317
        IncEdgeIt f = e; ++f;
1318 1318
        if (r && runningNode(e) == a) {
1319 1319
          erase(e);
1320 1320
        } else if (u(e) == b) {
1321 1321
          changeU(e, a);
1322 1322
        } else {
1323 1323
          changeV(e, a);
1324 1324
        }
1325 1325
        e = f;
1326 1326
      }
1327 1327
      erase(b);
1328 1328
    }
1329 1329

	
1330 1330
    ///Clear the graph.
1331 1331

	
1332 1332
    ///This function erases all nodes and arcs from the graph.
1333 1333
    ///
1334 1334
    ///\note All iterators of the graph are invalidated, of course.
1335 1335
    void clear() {
1336 1336
      Parent::clear();
1337 1337
    }
1338 1338

	
1339 1339
    /// Reserve memory for nodes.
1340 1340

	
1341 1341
    /// Using this function, it is possible to avoid superfluous memory
1342 1342
    /// allocation: if you know that the graph you want to build will
1343 1343
    /// be large (e.g. it will contain millions of nodes and/or edges),
1344 1344
    /// then it is worth reserving space for this amount before starting
1345 1345
    /// to build the graph.
1346 1346
    /// \sa reserveEdge()
1347 1347
    void reserveNode(int n) { nodes.reserve(n); };
1348 1348

	
1349 1349
    /// Reserve memory for edges.
1350 1350

	
1351 1351
    /// Using this function, it is possible to avoid superfluous memory
1352 1352
    /// allocation: if you know that the graph you want to build will
1353 1353
    /// be large (e.g. it will contain millions of nodes and/or edges),
1354 1354
    /// then it is worth reserving space for this amount before starting
1355 1355
    /// to build the graph.
1356 1356
    /// \sa reserveNode()
1357 1357
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1358 1358

	
1359 1359
    /// \brief Class to make a snapshot of the graph and restore
1360 1360
    /// it later.
1361 1361
    ///
1362 1362
    /// Class to make a snapshot of the graph and restore it later.
1363 1363
    ///
1364 1364
    /// The newly added nodes and edges can be removed
1365 1365
    /// using the restore() function.
1366 1366
    ///
1367 1367
    /// \note After a state is restored, you cannot restore a later state, 
1368 1368
    /// i.e. you cannot add the removed nodes and edges again using
1369 1369
    /// another Snapshot instance.
1370 1370
    ///
1371 1371
    /// \warning Node and edge deletions and other modifications
1372 1372
    /// (e.g. changing the end-nodes of edges or contracting nodes)
1373 1373
    /// cannot be restored. These events invalidate the snapshot.
1374
    /// However the edges and nodes that were added to the graph after
1374
    /// However, the edges and nodes that were added to the graph after
1375 1375
    /// making the current snapshot can be removed without invalidating it.
1376 1376
    class Snapshot {
1377 1377
    protected:
1378 1378

	
1379 1379
      typedef Parent::NodeNotifier NodeNotifier;
1380 1380

	
1381 1381
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
1382 1382
      public:
1383 1383

	
1384 1384
        NodeObserverProxy(Snapshot& _snapshot)
1385 1385
          : snapshot(_snapshot) {}
1386 1386

	
1387 1387
        using NodeNotifier::ObserverBase::attach;
1388 1388
        using NodeNotifier::ObserverBase::detach;
1389 1389
        using NodeNotifier::ObserverBase::attached;
1390 1390

	
1391 1391
      protected:
1392 1392

	
1393 1393
        virtual void add(const Node& node) {
1394 1394
          snapshot.addNode(node);
1395 1395
        }
1396 1396
        virtual void add(const std::vector<Node>& nodes) {
1397 1397
          for (int i = nodes.size() - 1; i >= 0; ++i) {
1398 1398
            snapshot.addNode(nodes[i]);
1399 1399
          }
1400 1400
        }
1401 1401
        virtual void erase(const Node& node) {
1402 1402
          snapshot.eraseNode(node);
1403 1403
        }
1404 1404
        virtual void erase(const std::vector<Node>& nodes) {
1405 1405
          for (int i = 0; i < int(nodes.size()); ++i) {
1406 1406
            snapshot.eraseNode(nodes[i]);
1407 1407
          }
1408 1408
        }
1409 1409
        virtual void build() {
1410 1410
          Node node;
1411 1411
          std::vector<Node> nodes;
1412 1412
          for (notifier()->first(node); node != INVALID;
1413 1413
               notifier()->next(node)) {
1414 1414
            nodes.push_back(node);
1415 1415
          }
1416 1416
          for (int i = nodes.size() - 1; i >= 0; --i) {
1417 1417
            snapshot.addNode(nodes[i]);
1418 1418
          }
1419 1419
        }
1420 1420
        virtual void clear() {
1421 1421
          Node node;
1422 1422
          for (notifier()->first(node); node != INVALID;
Ignore white space 6 line context
... ...
@@ -101,192 +101,192 @@
101 101
    ///This type is used to refer to a column of the LP.
102 102
    ///
103 103
    ///Its value remains valid and correct even after the addition or erase of
104 104
    ///other columns.
105 105
    ///
106 106
    ///\note This class is similar to other Item types in LEMON, like
107 107
    ///Node and Arc types in digraph.
108 108
    class Col {
109 109
      friend class LpBase;
110 110
    protected:
111 111
      int _id;
112 112
      explicit Col(int id) : _id(id) {}
113 113
    public:
114 114
      typedef Value ExprValue;
115 115
      typedef True LpCol;
116 116
      /// Default constructor
117 117
      
118 118
      /// \warning The default constructor sets the Col to an
119 119
      /// undefined value.
120 120
      Col() {}
121 121
      /// Invalid constructor \& conversion.
122 122
      
123 123
      /// This constructor initializes the Col to be invalid.
124 124
      /// \sa Invalid for more details.      
125 125
      Col(const Invalid&) : _id(-1) {}
126 126
      /// Equality operator
127 127

	
128 128
      /// Two \ref Col "Col"s are equal if and only if they point to
129 129
      /// the same LP column or both are invalid.
130 130
      bool operator==(Col c) const  {return _id == c._id;}
131 131
      /// Inequality operator
132 132

	
133 133
      /// \sa operator==(Col c)
134 134
      ///
135 135
      bool operator!=(Col c) const  {return _id != c._id;}
136 136
      /// Artificial ordering operator.
137 137

	
138 138
      /// To allow the use of this object in std::map or similar
139 139
      /// associative container we require this.
140 140
      ///
141 141
      /// \note This operator only have to define some strict ordering of
142 142
      /// the items; this order has nothing to do with the iteration
143 143
      /// ordering of the items.
144 144
      bool operator<(Col c) const  {return _id < c._id;}
145 145
    };
146 146

	
147 147
    ///Iterator for iterate over the columns of an LP problem
148 148

	
149
    /// Its usage is quite simple, for example you can count the number
149
    /// Its usage is quite simple, for example, you can count the number
150 150
    /// of columns in an LP \c lp:
151 151
    ///\code
152 152
    /// int count=0;
153 153
    /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
154 154
    ///\endcode
155 155
    class ColIt : public Col {
156 156
      const LpBase *_solver;
157 157
    public:
158 158
      /// Default constructor
159 159
      
160 160
      /// \warning The default constructor sets the iterator
161 161
      /// to an undefined value.
162 162
      ColIt() {}
163 163
      /// Sets the iterator to the first Col
164 164
      
165 165
      /// Sets the iterator to the first Col.
166 166
      ///
167 167
      ColIt(const LpBase &solver) : _solver(&solver)
168 168
      {
169 169
        _solver->cols.firstItem(_id);
170 170
      }
171 171
      /// Invalid constructor \& conversion
172 172
      
173 173
      /// Initialize the iterator to be invalid.
174 174
      /// \sa Invalid for more details.
175 175
      ColIt(const Invalid&) : Col(INVALID) {}
176 176
      /// Next column
177 177
      
178 178
      /// Assign the iterator to the next column.
179 179
      ///
180 180
      ColIt &operator++()
181 181
      {
182 182
        _solver->cols.nextItem(_id);
183 183
        return *this;
184 184
      }
185 185
    };
186 186

	
187 187
    /// \brief Returns the ID of the column.
188 188
    static int id(const Col& col) { return col._id; }
189 189
    /// \brief Returns the column with the given ID.
190 190
    ///
191 191
    /// \pre The argument should be a valid column ID in the LP problem.
192 192
    static Col colFromId(int id) { return Col(id); }
193 193

	
194 194
    ///Refer to a row of the LP.
195 195

	
196 196
    ///This type is used to refer to a row of the LP.
197 197
    ///
198 198
    ///Its value remains valid and correct even after the addition or erase of
199 199
    ///other rows.
200 200
    ///
201 201
    ///\note This class is similar to other Item types in LEMON, like
202 202
    ///Node and Arc types in digraph.
203 203
    class Row {
204 204
      friend class LpBase;
205 205
    protected:
206 206
      int _id;
207 207
      explicit Row(int id) : _id(id) {}
208 208
    public:
209 209
      typedef Value ExprValue;
210 210
      typedef True LpRow;
211 211
      /// Default constructor
212 212
      
213 213
      /// \warning The default constructor sets the Row to an
214 214
      /// undefined value.
215 215
      Row() {}
216 216
      /// Invalid constructor \& conversion.
217 217
      
218 218
      /// This constructor initializes the Row to be invalid.
219 219
      /// \sa Invalid for more details.      
220 220
      Row(const Invalid&) : _id(-1) {}
221 221
      /// Equality operator
222 222

	
223 223
      /// Two \ref Row "Row"s are equal if and only if they point to
224 224
      /// the same LP row or both are invalid.
225 225
      bool operator==(Row r) const  {return _id == r._id;}
226 226
      /// Inequality operator
227 227
      
228 228
      /// \sa operator==(Row r)
229 229
      ///
230 230
      bool operator!=(Row r) const  {return _id != r._id;}
231 231
      /// Artificial ordering operator.
232 232

	
233 233
      /// To allow the use of this object in std::map or similar
234 234
      /// associative container we require this.
235 235
      ///
236 236
      /// \note This operator only have to define some strict ordering of
237 237
      /// the items; this order has nothing to do with the iteration
238 238
      /// ordering of the items.
239 239
      bool operator<(Row r) const  {return _id < r._id;}
240 240
    };
241 241

	
242 242
    ///Iterator for iterate over the rows of an LP problem
243 243

	
244
    /// Its usage is quite simple, for example you can count the number
244
    /// Its usage is quite simple, for example, you can count the number
245 245
    /// of rows in an LP \c lp:
246 246
    ///\code
247 247
    /// int count=0;
248 248
    /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
249 249
    ///\endcode
250 250
    class RowIt : public Row {
251 251
      const LpBase *_solver;
252 252
    public:
253 253
      /// Default constructor
254 254
      
255 255
      /// \warning The default constructor sets the iterator
256 256
      /// to an undefined value.
257 257
      RowIt() {}
258 258
      /// Sets the iterator to the first Row
259 259
      
260 260
      /// Sets the iterator to the first Row.
261 261
      ///
262 262
      RowIt(const LpBase &solver) : _solver(&solver)
263 263
      {
264 264
        _solver->rows.firstItem(_id);
265 265
      }
266 266
      /// Invalid constructor \& conversion
267 267
      
268 268
      /// Initialize the iterator to be invalid.
269 269
      /// \sa Invalid for more details.
270 270
      RowIt(const Invalid&) : Row(INVALID) {}
271 271
      /// Next row
272 272
      
273 273
      /// Assign the iterator to the next row.
274 274
      ///
275 275
      RowIt &operator++()
276 276
      {
277 277
        _solver->rows.nextItem(_id);
278 278
        return *this;
279 279
      }
280 280
    };
281 281

	
282 282
    /// \brief Returns the ID of the row.
283 283
    static int id(const Row& row) { return row._id; }
284 284
    /// \brief Returns the row with the given ID.
285 285
    ///
286 286
    /// \pre The argument should be a valid row ID in the LP problem.
287 287
    static Row rowFromId(int id) { return Row(id); }
288 288

	
289 289
  public:
290 290

	
291 291
    ///Linear expression of variables and a constant component
292 292

	
Ignore white space 6 line context
... ...
@@ -185,100 +185,100 @@
185 185
  };
186 186

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

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

	
197 197

	
198 198
  /// Identity map.
199 199

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

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

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

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

	
227 227

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

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

	
249 249
  public:
250 250

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

	
260 260
    typedef True ReferenceMapTag;
261 261

	
262 262
  public:
263 263

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

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

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

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

	
283 283
    /// Resizes the map.
284 284

	
... ...
@@ -303,99 +303,99 @@
303 303
    }
304 304

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

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

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

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

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

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

	
336 336

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

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

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

	
373 373
    typedef True ReferenceMapTag;
374 374

	
375 375
  private:
376 376

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

	
381 381
  public:
382 382

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

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

	
397 397
  private:
398 398

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

	
401 401
  public:
... ...
@@ -1740,112 +1740,112 @@
1740 1740
#ifdef DOXYGEN
1741 1741
  template <typename IT, typename KEY>
1742 1742
#else
1743 1743
  template <typename IT,
1744 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1745 1745
#endif
1746 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1747 1747
  public:
1748 1748

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

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

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

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

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

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

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

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

	
1812 1812
  /// @}
1813 1813

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

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

	
1848 1848
    /// \brief Constructor.
1849 1849
    ///
1850 1850
    /// Constructor of the map.
1851 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
... ...
@@ -1877,97 +1877,97 @@
1877 1877
      /// \brief Constructor.
1878 1878
      ///
1879 1879
      /// Constructor for creating an id-to-item map.
1880 1880
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1881 1881

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

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

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

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

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

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

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

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

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

	
1948 1948
  public:
1949 1949

	
1950 1950
    /// The graph type of CrossRefMap.
1951 1951
    typedef GR Graph;
1952 1952
    typedef GR Digraph;
1953 1953
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1954 1954
    typedef K Item;
1955 1955
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1956 1956
    typedef K Key;
1957 1957
    /// The value type of CrossRefMap.
1958 1958
    typedef V Value;
1959 1959

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

	
1965 1965
    /// \brief Forward iterator for values.
1966 1966
    ///
1967 1967
    /// This iterator is an STL compatible forward
1968 1968
    /// iterator on the values of the map. The values can
1969 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1970 1970
    /// They are considered with multiplicity, so each value is
1971 1971
    /// traversed for each item it is assigned to.
1972 1972
    class ValueIt
1973 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
... ...
@@ -3421,97 +3421,97 @@
3421 3421
  /// of the graph with \c false parameter.
3422 3422
  /// \tparam GR The graph type.
3423 3423
  /// \see ForwardMap
3424 3424
  template <typename GR>
3425 3425
  class BackwardMap {
3426 3426
  public:
3427 3427

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

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

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

	
3446 3446
  private:
3447 3447
    const GR& _graph;
3448 3448
  };
3449 3449

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

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

	
3459 3459
  /// \brief Map of the in-degrees of nodes in a digraph.
3460 3460
  ///
3461 3461
  /// This map returns the in-degree of a node. Once it is constructed,
3462 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3463 3463
  /// in constant time. On the other hand, the values are updated automatically
3464 3464
  /// whenever the digraph changes.
3465 3465
  ///
3466 3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3467 3467
  /// may provide alternative ways to modify the digraph.
3468 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
3469
  /// features are used. For example the functions
3469
  /// features are used. For example, the functions
3470 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
3471 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3472 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3473 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
3474 3474
  ///
3475 3475
  /// \sa OutDegMap
3476 3476
  template <typename GR>
3477 3477
  class InDegMap
3478 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
3479 3479
      ::ItemNotifier::ObserverBase {
3480 3480

	
3481 3481
  public:
3482 3482

	
3483 3483
    /// The graph type of InDegMap
3484 3484
    typedef GR Graph;
3485 3485
    typedef GR Digraph;
3486 3486
    /// The key type
3487 3487
    typedef typename Digraph::Node Key;
3488 3488
    /// The value type
3489 3489
    typedef int Value;
3490 3490

	
3491 3491
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3492 3492
    ::ItemNotifier::ObserverBase Parent;
3493 3493

	
3494 3494
  private:
3495 3495

	
3496 3496
    class AutoNodeMap
3497 3497
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3498 3498
    public:
3499 3499

	
3500 3500
      typedef typename ItemSetTraits<Digraph, Key>::
3501 3501
      template Map<int>::Type Parent;
3502 3502

	
3503 3503
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3504 3504

	
3505 3505
      virtual void add(const Key& key) {
3506 3506
        Parent::add(key);
3507 3507
        Parent::set(key, 0);
3508 3508
      }
3509 3509

	
3510 3510
      virtual void add(const std::vector<Key>& keys) {
3511 3511
        Parent::add(keys);
3512 3512
        for (int i = 0; i < int(keys.size()); ++i) {
3513 3513
          Parent::set(keys[i], 0);
3514 3514
        }
3515 3515
      }
3516 3516

	
3517 3517
      virtual void build() {
... ...
@@ -3551,97 +3551,97 @@
3551 3551

	
3552 3552
    virtual void add(const Arc& arc) {
3553 3553
      ++_deg[_digraph.target(arc)];
3554 3554
    }
3555 3555

	
3556 3556
    virtual void add(const std::vector<Arc>& arcs) {
3557 3557
      for (int i = 0; i < int(arcs.size()); ++i) {
3558 3558
        ++_deg[_digraph.target(arcs[i])];
3559 3559
      }
3560 3560
    }
3561 3561

	
3562 3562
    virtual void erase(const Arc& arc) {
3563 3563
      --_deg[_digraph.target(arc)];
3564 3564
    }
3565 3565

	
3566 3566
    virtual void erase(const std::vector<Arc>& arcs) {
3567 3567
      for (int i = 0; i < int(arcs.size()); ++i) {
3568 3568
        --_deg[_digraph.target(arcs[i])];
3569 3569
      }
3570 3570
    }
3571 3571

	
3572 3572
    virtual void build() {
3573 3573
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3574 3574
        _deg[it] = countInArcs(_digraph, it);
3575 3575
      }
3576 3576
    }
3577 3577

	
3578 3578
    virtual void clear() {
3579 3579
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3580 3580
        _deg[it] = 0;
3581 3581
      }
3582 3582
    }
3583 3583
  private:
3584 3584

	
3585 3585
    const Digraph& _digraph;
3586 3586
    AutoNodeMap _deg;
3587 3587
  };
3588 3588

	
3589 3589
  /// \brief Map of the out-degrees of nodes in a digraph.
3590 3590
  ///
3591 3591
  /// This map returns the out-degree of a node. Once it is constructed,
3592 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3593 3593
  /// in constant time. On the other hand, the values are updated automatically
3594 3594
  /// whenever the digraph changes.
3595 3595
  ///
3596 3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3597 3597
  /// may provide alternative ways to modify the digraph.
3598 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
3599
  /// features are used. For example the functions
3599
  /// features are used. For example, the functions
3600 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
3601 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3602 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3603 3603
  /// of \ref ListDigraph will \e not update the degree values correctly.
3604 3604
  ///
3605 3605
  /// \sa InDegMap
3606 3606
  template <typename GR>
3607 3607
  class OutDegMap
3608 3608
    : protected ItemSetTraits<GR, typename GR::Arc>
3609 3609
      ::ItemNotifier::ObserverBase {
3610 3610

	
3611 3611
  public:
3612 3612

	
3613 3613
    /// The graph type of OutDegMap
3614 3614
    typedef GR Graph;
3615 3615
    typedef GR Digraph;
3616 3616
    /// The key type
3617 3617
    typedef typename Digraph::Node Key;
3618 3618
    /// The value type
3619 3619
    typedef int Value;
3620 3620

	
3621 3621
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3622 3622
    ::ItemNotifier::ObserverBase Parent;
3623 3623

	
3624 3624
  private:
3625 3625

	
3626 3626
    class AutoNodeMap
3627 3627
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3628 3628
    public:
3629 3629

	
3630 3630
      typedef typename ItemSetTraits<Digraph, Key>::
3631 3631
      template Map<int>::Type Parent;
3632 3632

	
3633 3633
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3634 3634

	
3635 3635
      virtual void add(const Key& key) {
3636 3636
        Parent::add(key);
3637 3637
        Parent::set(key, 0);
3638 3638
      }
3639 3639
      virtual void add(const std::vector<Key>& keys) {
3640 3640
        Parent::add(keys);
3641 3641
        for (int i = 0; i < int(keys.size()); ++i) {
3642 3642
          Parent::set(keys[i], 0);
3643 3643
        }
3644 3644
      }
3645 3645
      virtual void build() {
3646 3646
        Parent::build();
3647 3647
        Key it;
Ignore white space 6 line context
... ...
@@ -5,199 +5,199 @@
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_NETWORK_SIMPLEX_H
20 20
#define LEMON_NETWORK_SIMPLEX_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
///
24 24
/// \file
25 25
/// \brief Network Simplex algorithm for finding a minimum cost flow.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <algorithm>
30 30

	
31 31
#include <lemon/core.h>
32 32
#include <lemon/math.h>
33 33

	
34 34
namespace lemon {
35 35

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

	
39 39
  /// \brief Implementation of the primal Network Simplex algorithm
40 40
  /// for finding a \ref min_cost_flow "minimum cost flow".
41 41
  ///
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43 43
  /// for finding a \ref min_cost_flow "minimum cost flow"
44 44
  /// \ref amo93networkflows, \ref dantzig63linearprog,
45 45
  /// \ref kellyoneill91netsimplex.
46 46
  /// This algorithm is a specialized version of the linear programming
47 47
  /// simplex method directly for the minimum cost flow problem.
48 48
  /// It is one of the most efficient solution methods.
49 49
  ///
50 50
  /// In general this class is the fastest implementation available
51 51
  /// in LEMON for the minimum cost flow problem.
52 52
  /// Moreover it supports both directions of the supply/demand inequality
53
  /// constraints. For more information see \ref SupplyType.
53
  /// constraints. For more information, see \ref SupplyType.
54 54
  ///
55 55
  /// Most of the parameters of the problem (except for the digraph)
56 56
  /// can be given using separate functions, and the algorithm can be
57 57
  /// executed using the \ref run() function. If some parameters are not
58 58
  /// specified, then default values will be used.
59 59
  ///
60 60
  /// \tparam GR The digraph type the algorithm runs on.
61 61
  /// \tparam V The value type used for flow amounts, capacity bounds
62
  /// and supply values in the algorithm. By default it is \c int.
62
  /// and supply values in the algorithm. By default, it is \c int.
63 63
  /// \tparam C The value type used for costs and potentials in the
64
  /// algorithm. By default it is the same as \c V.
64
  /// algorithm. By default, it is the same as \c V.
65 65
  ///
66 66
  /// \warning Both value types must be signed and all input data must
67 67
  /// be integer.
68 68
  ///
69 69
  /// \note %NetworkSimplex provides five different pivot rule
70 70
  /// implementations, from which the most efficient one is used
71
  /// by default. For more information see \ref PivotRule.
71
  /// by default. For more information, see \ref PivotRule.
72 72
  template <typename GR, typename V = int, typename C = V>
73 73
  class NetworkSimplex
74 74
  {
75 75
  public:
76 76

	
77 77
    /// The type of the flow amounts, capacity bounds and supply values
78 78
    typedef V Value;
79 79
    /// The type of the arc costs
80 80
    typedef C Cost;
81 81

	
82 82
  public:
83 83

	
84 84
    /// \brief Problem type constants for the \c run() function.
85 85
    ///
86 86
    /// Enum type containing the problem type constants that can be
87 87
    /// returned by the \ref run() function of the algorithm.
88 88
    enum ProblemType {
89 89
      /// The problem has no feasible solution (flow).
90 90
      INFEASIBLE,
91 91
      /// The problem has optimal solution (i.e. it is feasible and
92 92
      /// bounded), and the algorithm has found optimal flow and node
93 93
      /// potentials (primal and dual solutions).
94 94
      OPTIMAL,
95 95
      /// The objective function of the problem is unbounded, i.e.
96 96
      /// there is a directed cycle having negative total cost and
97 97
      /// infinite upper bound.
98 98
      UNBOUNDED
99 99
    };
100 100
    
101 101
    /// \brief Constants for selecting the type of the supply constraints.
102 102
    ///
103 103
    /// Enum type containing constants for selecting the supply type,
104 104
    /// i.e. the direction of the inequalities in the supply/demand
105 105
    /// constraints of the \ref min_cost_flow "minimum cost flow problem".
106 106
    ///
107 107
    /// The default supply type is \c GEQ, the \c LEQ type can be
108 108
    /// selected using \ref supplyType().
109 109
    /// The equality form is a special case of both supply types.
110 110
    enum SupplyType {
111 111
      /// This option means that there are <em>"greater or equal"</em>
112 112
      /// supply/demand constraints in the definition of the problem.
113 113
      GEQ,
114 114
      /// This option means that there are <em>"less or equal"</em>
115 115
      /// supply/demand constraints in the definition of the problem.
116 116
      LEQ
117 117
    };
118 118
    
119 119
    /// \brief Constants for selecting the pivot rule.
120 120
    ///
121 121
    /// Enum type containing constants for selecting the pivot rule for
122 122
    /// the \ref run() function.
123 123
    ///
124 124
    /// \ref NetworkSimplex provides five different pivot rule
125 125
    /// implementations that significantly affect the running time
126 126
    /// of the algorithm.
127
    /// By default \ref BLOCK_SEARCH "Block Search" is used, which
127
    /// By default, \ref BLOCK_SEARCH "Block Search" is used, which
128 128
    /// proved to be the most efficient and the most robust on various
129 129
    /// test inputs according to our benchmark tests.
130
    /// However another pivot rule can be selected using the \ref run()
130
    /// However, another pivot rule can be selected using the \ref run()
131 131
    /// function with the proper parameter.
132 132
    enum PivotRule {
133 133

	
134
      /// The First Eligible pivot rule.
134
      /// The \e First \e Eligible pivot rule.
135 135
      /// The next eligible arc is selected in a wraparound fashion
136 136
      /// in every iteration.
137 137
      FIRST_ELIGIBLE,
138 138

	
139
      /// The Best Eligible pivot rule.
139
      /// The \e Best \e Eligible pivot rule.
140 140
      /// The best eligible arc is selected in every iteration.
141 141
      BEST_ELIGIBLE,
142 142

	
143
      /// The Block Search pivot rule.
143
      /// The \e Block \e Search pivot rule.
144 144
      /// A specified number of arcs are examined in every iteration
145 145
      /// in a wraparound fashion and the best eligible arc is selected
146 146
      /// from this block.
147 147
      BLOCK_SEARCH,
148 148

	
149
      /// The Candidate List pivot rule.
149
      /// The \e Candidate \e List pivot rule.
150 150
      /// In a major iteration a candidate list is built from eligible arcs
151 151
      /// in a wraparound fashion and in the following minor iterations
152 152
      /// the best eligible arc is selected from this list.
153 153
      CANDIDATE_LIST,
154 154

	
155
      /// The Altering Candidate List pivot rule.
155
      /// The \e Altering \e Candidate \e List pivot rule.
156 156
      /// It is a modified version of the Candidate List method.
157 157
      /// It keeps only the several best eligible arcs from the former
158 158
      /// candidate list and extends this list in every iteration.
159 159
      ALTERING_LIST
160 160
    };
161 161
    
162 162
  private:
163 163

	
164 164
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
165 165

	
166 166
    typedef std::vector<int> IntVector;
167 167
    typedef std::vector<bool> BoolVector;
168 168
    typedef std::vector<Value> ValueVector;
169 169
    typedef std::vector<Cost> CostVector;
170 170

	
171 171
    // State constants for arcs
172 172
    enum ArcStateEnum {
173 173
      STATE_UPPER = -1,
174 174
      STATE_TREE  =  0,
175 175
      STATE_LOWER =  1
176 176
    };
177 177

	
178 178
  private:
179 179

	
180 180
    // Data related to the underlying digraph
181 181
    const GR &_graph;
182 182
    int _node_num;
183 183
    int _arc_num;
184 184
    int _all_arc_num;
185 185
    int _search_arc_num;
186 186

	
187 187
    // Parameters of the problem
188 188
    bool _have_lower;
189 189
    SupplyType _stype;
190 190
    Value _sum_supply;
191 191

	
192 192
    // Data structures for storing the digraph
193 193
    IntNodeMap _node_id;
194 194
    IntArcMap _arc_id;
195 195
    IntVector _source;
196 196
    IntVector _target;
197 197

	
198 198
    // Node and arc data
199 199
    ValueVector _lower;
200 200
    ValueVector _upper;
201 201
    ValueVector _cap;
202 202
    CostVector _cost;
203 203
    ValueVector _supply;
... ...
@@ -767,158 +767,158 @@
767 767
    /// If neither this function nor \ref stSupply() is used before
768 768
    /// calling \ref run(), the supply of each node will be set to zero.
769 769
    ///
770 770
    /// \param map A node map storing the supply values.
771 771
    /// Its \c Value type must be convertible to the \c Value type
772 772
    /// of the algorithm.
773 773
    ///
774 774
    /// \return <tt>(*this)</tt>
775 775
    template<typename SupplyMap>
776 776
    NetworkSimplex& supplyMap(const SupplyMap& map) {
777 777
      for (NodeIt n(_graph); n != INVALID; ++n) {
778 778
        _supply[_node_id[n]] = map[n];
779 779
      }
780 780
      return *this;
781 781
    }
782 782

	
783 783
    /// \brief Set single source and target nodes and a supply value.
784 784
    ///
785 785
    /// This function sets a single source node and a single target node
786 786
    /// and the required flow value.
787 787
    /// If neither this function nor \ref supplyMap() is used before
788 788
    /// calling \ref run(), the supply of each node will be set to zero.
789 789
    ///
790 790
    /// Using this function has the same effect as using \ref supplyMap()
791 791
    /// with such a map in which \c k is assigned to \c s, \c -k is
792 792
    /// assigned to \c t and all other nodes have zero supply value.
793 793
    ///
794 794
    /// \param s The source node.
795 795
    /// \param t The target node.
796 796
    /// \param k The required amount of flow from node \c s to node \c t
797 797
    /// (i.e. the supply of \c s and the demand of \c t).
798 798
    ///
799 799
    /// \return <tt>(*this)</tt>
800 800
    NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
801 801
      for (int i = 0; i != _node_num; ++i) {
802 802
        _supply[i] = 0;
803 803
      }
804 804
      _supply[_node_id[s]] =  k;
805 805
      _supply[_node_id[t]] = -k;
806 806
      return *this;
807 807
    }
808 808
    
809 809
    /// \brief Set the type of the supply constraints.
810 810
    ///
811 811
    /// This function sets the type of the supply/demand constraints.
812 812
    /// If it is not used before calling \ref run(), the \ref GEQ supply
813 813
    /// type will be used.
814 814
    ///
815
    /// For more information see \ref SupplyType.
815
    /// For more information, see \ref SupplyType.
816 816
    ///
817 817
    /// \return <tt>(*this)</tt>
818 818
    NetworkSimplex& supplyType(SupplyType supply_type) {
819 819
      _stype = supply_type;
820 820
      return *this;
821 821
    }
822 822

	
823 823
    /// @}
824 824

	
825 825
    /// \name Execution Control
826 826
    /// The algorithm can be executed using \ref run().
827 827

	
828 828
    /// @{
829 829

	
830 830
    /// \brief Run the algorithm.
831 831
    ///
832 832
    /// This function runs the algorithm.
833 833
    /// The paramters can be specified using functions \ref lowerMap(),
834 834
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), 
835 835
    /// \ref supplyType().
836 836
    /// For example,
837 837
    /// \code
838 838
    ///   NetworkSimplex<ListDigraph> ns(graph);
839 839
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
840 840
    ///     .supplyMap(sup).run();
841 841
    /// \endcode
842 842
    ///
843 843
    /// This function can be called more than once. All the parameters
844 844
    /// that have been given are kept for the next call, unless
845 845
    /// \ref reset() is called, thus only the modified parameters
846 846
    /// have to be set again. See \ref reset() for examples.
847
    /// However the underlying digraph must not be modified after this
847
    /// However, the underlying digraph must not be modified after this
848 848
    /// class have been constructed, since it copies and extends the graph.
849 849
    ///
850 850
    /// \param pivot_rule The pivot rule that will be used during the
851
    /// algorithm. For more information see \ref PivotRule.
851
    /// algorithm. For more information, see \ref PivotRule.
852 852
    ///
853 853
    /// \return \c INFEASIBLE if no feasible flow exists,
854 854
    /// \n \c OPTIMAL if the problem has optimal solution
855 855
    /// (i.e. it is feasible and bounded), and the algorithm has found
856 856
    /// optimal flow and node potentials (primal and dual solutions),
857 857
    /// \n \c UNBOUNDED if the objective function of the problem is
858 858
    /// unbounded, i.e. there is a directed cycle having negative total
859 859
    /// cost and infinite upper bound.
860 860
    ///
861 861
    /// \see ProblemType, PivotRule
862 862
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
863 863
      if (!init()) return INFEASIBLE;
864 864
      return start(pivot_rule);
865 865
    }
866 866

	
867 867
    /// \brief Reset all the parameters that have been given before.
868 868
    ///
869 869
    /// This function resets all the paramaters that have been given
870 870
    /// before using functions \ref lowerMap(), \ref upperMap(),
871 871
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType().
872 872
    ///
873 873
    /// It is useful for multiple run() calls. If this function is not
874 874
    /// used, all the parameters given before are kept for the next
875 875
    /// \ref run() call.
876
    /// However the underlying digraph must not be modified after this
876
    /// However, the underlying digraph must not be modified after this
877 877
    /// class have been constructed, since it copies and extends the graph.
878 878
    ///
879 879
    /// For example,
880 880
    /// \code
881 881
    ///   NetworkSimplex<ListDigraph> ns(graph);
882 882
    ///
883 883
    ///   // First run
884 884
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
885 885
    ///     .supplyMap(sup).run();
886 886
    ///
887 887
    ///   // Run again with modified cost map (reset() is not called,
888 888
    ///   // so only the cost map have to be set again)
889 889
    ///   cost[e] += 100;
890 890
    ///   ns.costMap(cost).run();
891 891
    ///
892 892
    ///   // Run again from scratch using reset()
893 893
    ///   // (the lower bounds will be set to zero on all arcs)
894 894
    ///   ns.reset();
895 895
    ///   ns.upperMap(capacity).costMap(cost)
896 896
    ///     .supplyMap(sup).run();
897 897
    /// \endcode
898 898
    ///
899 899
    /// \return <tt>(*this)</tt>
900 900
    NetworkSimplex& reset() {
901 901
      for (int i = 0; i != _node_num; ++i) {
902 902
        _supply[i] = 0;
903 903
      }
904 904
      for (int i = 0; i != _arc_num; ++i) {
905 905
        _lower[i] = 0;
906 906
        _upper[i] = INF;
907 907
        _cost[i] = 1;
908 908
      }
909 909
      _have_lower = false;
910 910
      _stype = GEQ;
911 911
      return *this;
912 912
    }
913 913

	
914 914
    /// @}
915 915

	
916 916
    /// \name Query Functions
917 917
    /// The results of the algorithm can be obtained using these
918 918
    /// functions.\n
919 919
    /// The \ref run() function must be called before using them.
920 920

	
921 921
    /// @{
922 922

	
923 923
    /// \brief Return the total cost of the found flow.
924 924
    ///
Ignore white space 6 line context
... ...
@@ -220,97 +220,97 @@
220 220
    template <typename T>
221 221
    struct SetFlowMap
222 222
      : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
223 223
      typedef Preflow<Digraph, CapacityMap,
224 224
                      SetFlowMapTraits<T> > Create;
225 225
    };
226 226

	
227 227
    template <typename T>
228 228
    struct SetElevatorTraits : public Traits {
229 229
      typedef T Elevator;
230 230
      static Elevator *createElevator(const Digraph&, int) {
231 231
        LEMON_ASSERT(false, "Elevator is not initialized");
232 232
        return 0; // ignore warnings
233 233
      }
234 234
    };
235 235

	
236 236
    /// \brief \ref named-templ-param "Named parameter" for setting
237 237
    /// Elevator type
238 238
    ///
239 239
    /// \ref named-templ-param "Named parameter" for setting Elevator
240 240
    /// type. If this named parameter is used, then an external
241 241
    /// elevator object must be passed to the algorithm using the
242 242
    /// \ref elevator(Elevator&) "elevator()" function before calling
243 243
    /// \ref run() or \ref init().
244 244
    /// \sa SetStandardElevator
245 245
    template <typename T>
246 246
    struct SetElevator
247 247
      : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
248 248
      typedef Preflow<Digraph, CapacityMap,
249 249
                      SetElevatorTraits<T> > Create;
250 250
    };
251 251

	
252 252
    template <typename T>
253 253
    struct SetStandardElevatorTraits : public Traits {
254 254
      typedef T Elevator;
255 255
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
256 256
        return new Elevator(digraph, max_level);
257 257
      }
258 258
    };
259 259

	
260 260
    /// \brief \ref named-templ-param "Named parameter" for setting
261 261
    /// Elevator type with automatic allocation
262 262
    ///
263 263
    /// \ref named-templ-param "Named parameter" for setting Elevator
264 264
    /// type with automatic allocation.
265 265
    /// The Elevator should have standard constructor interface to be
266 266
    /// able to automatically created by the algorithm (i.e. the
267 267
    /// digraph and the maximum level should be passed to it).
268
    /// However an external elevator object could also be passed to the
268
    /// However, an external elevator object could also be passed to the
269 269
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
270 270
    /// before calling \ref run() or \ref init().
271 271
    /// \sa SetElevator
272 272
    template <typename T>
273 273
    struct SetStandardElevator
274 274
      : public Preflow<Digraph, CapacityMap,
275 275
                       SetStandardElevatorTraits<T> > {
276 276
      typedef Preflow<Digraph, CapacityMap,
277 277
                      SetStandardElevatorTraits<T> > Create;
278 278
    };
279 279

	
280 280
    /// @}
281 281

	
282 282
  protected:
283 283

	
284 284
    Preflow() {}
285 285

	
286 286
  public:
287 287

	
288 288

	
289 289
    /// \brief The constructor of the class.
290 290
    ///
291 291
    /// The constructor of the class.
292 292
    /// \param digraph The digraph the algorithm runs on.
293 293
    /// \param capacity The capacity of the arcs.
294 294
    /// \param source The source node.
295 295
    /// \param target The target node.
296 296
    Preflow(const Digraph& digraph, const CapacityMap& capacity,
297 297
            Node source, Node target)
298 298
      : _graph(digraph), _capacity(&capacity),
299 299
        _node_num(0), _source(source), _target(target),
300 300
        _flow(0), _local_flow(false),
301 301
        _level(0), _local_level(false),
302 302
        _excess(0), _tolerance(), _phase() {}
303 303

	
304 304
    /// \brief Destructor.
305 305
    ///
306 306
    /// Destructor.
307 307
    ~Preflow() {
308 308
      destroyStructures();
309 309
    }
310 310

	
311 311
    /// \brief Sets the capacity map.
312 312
    ///
313 313
    /// Sets the capacity map.
314 314
    /// \return <tt>(*this)</tt>
315 315
    Preflow& capacityMap(const CapacityMap& map) {
316 316
      _capacity = &map;
Ignore white space 6 line context
... ...
@@ -330,97 +330,97 @@
330 330
    ///Stop the time counters
331 331

	
332 332
    ///This function stops the time counters. If start() was executed more than
333 333
    ///once, then the same number of stop() execution is necessary the really
334 334
    ///stop the timer.
335 335
    ///
336 336
    ///\sa halt()
337 337
    ///\sa start()
338 338
    ///\sa restart()
339 339
    ///\sa reset()
340 340

	
341 341
    void stop()
342 342
    {
343 343
      if(_running && !--_running) {
344 344
        TimeStamp t;
345 345
        t.stamp();
346 346
        start_time=t-start_time;
347 347
      }
348 348
    }
349 349

	
350 350
    ///Halt (i.e stop immediately) the time counters
351 351

	
352 352
    ///This function stops immediately the time counters, i.e. <tt>t.halt()</tt>
353 353
    ///is a faster
354 354
    ///equivalent of the following.
355 355
    ///\code
356 356
    ///  while(t.running()) t.stop()
357 357
    ///\endcode
358 358
    ///
359 359
    ///
360 360
    ///\sa stop()
361 361
    ///\sa restart()
362 362
    ///\sa reset()
363 363

	
364 364
    void halt()
365 365
    {
366 366
      if(_running) {
367 367
        _running=0;
368 368
        TimeStamp t;
369 369
        t.stamp();
370 370
        start_time=t-start_time;
371 371
      }
372 372
    }
373 373

	
374 374
    ///Returns the running state of the timer
375 375

	
376 376
    ///This function returns the number of stop() exections that is
377 377
    ///necessary to really stop the timer.
378
    ///For example the timer
378
    ///For example, the timer
379 379
    ///is running if and only if the return value is \c true
380 380
    ///(i.e. greater than
381 381
    ///zero).
382 382
    int running()  { return _running; }
383 383

	
384 384

	
385 385
    ///Restart the time counters
386 386

	
387 387
    ///This function is a shorthand for
388 388
    ///a reset() and a start() calls.
389 389
    ///
390 390
    void restart()
391 391
    {
392 392
      reset();
393 393
      start();
394 394
    }
395 395

	
396 396
    ///@}
397 397

	
398 398
    ///\name Query Functions for the Ellapsed Time
399 399

	
400 400
    ///@{
401 401

	
402 402
    ///Gives back the ellapsed user time of the process
403 403
    double userTime() const
404 404
    {
405 405
      return operator TimeStamp().userTime();
406 406
    }
407 407
    ///Gives back the ellapsed system time of the process
408 408
    double systemTime() const
409 409
    {
410 410
      return operator TimeStamp().systemTime();
411 411
    }
412 412
    ///Gives back the ellapsed user time of the process' children
413 413

	
414 414
    ///\note On <tt>WIN32</tt> platform this value is not calculated.
415 415
    ///
416 416
    double cUserTime() const
417 417
    {
418 418
      return operator TimeStamp().cUserTime();
419 419
    }
420 420
    ///Gives back the ellapsed user time of the process' children
421 421

	
422 422
    ///\note On <tt>WIN32</tt> platform this value is not calculated.
423 423
    ///
424 424
    double cSystemTime() const
425 425
    {
426 426
      return operator TimeStamp().cSystemTime();
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_UNION_FIND_H
20 20
#define LEMON_UNION_FIND_H
21 21

	
22 22
//!\ingroup auxdat
23 23
//!\file
24 24
//!\brief Union-Find data structures.
25 25
//!
26 26

	
27 27
#include <vector>
28 28
#include <list>
29 29
#include <utility>
30 30
#include <algorithm>
31 31
#include <functional>
32 32

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

	
35 35
namespace lemon {
36 36

	
37 37
  /// \ingroup auxdat
38 38
  ///
39 39
  /// \brief A \e Union-Find data structure implementation
40 40
  ///
41 41
  /// The class implements the \e Union-Find data structure.
42 42
  /// The union operation uses rank heuristic, while
43 43
  /// the find operation uses path compression.
44 44
  /// This is a very simple but efficient implementation, providing
45 45
  /// only four methods: join (union), find, insert and size.
46
  /// For more features see the \ref UnionFindEnum class.
46
  /// For more features, see the \ref UnionFindEnum class.
47 47
  ///
48 48
  /// It is primarily used in Kruskal algorithm for finding minimal
49 49
  /// cost spanning tree in a graph.
50 50
  /// \sa kruskal()
51 51
  ///
52 52
  /// \pre You need to add all the elements by the \ref insert()
53 53
  /// method.
54 54
  template <typename IM>
55 55
  class UnionFind {
56 56
  public:
57 57

	
58 58
    ///\e
59 59
    typedef IM ItemIntMap;
60 60
    ///\e
61 61
    typedef typename ItemIntMap::Key Item;
62 62

	
63 63
  private:
64 64
    // If the items vector stores negative value for an item then
65 65
    // that item is root item and it has -items[it] component size.
66 66
    // Else the items[it] contains the index of the parent.
67 67
    std::vector<int> items;
68 68
    ItemIntMap& index;
69 69

	
70 70
    bool rep(int idx) const {
71 71
      return items[idx] < 0;
72 72
    }
73 73

	
74 74
    int repIndex(int idx) const {
75 75
      int k = idx;
76 76
      while (!rep(k)) {
77 77
        k = items[k] ;
78 78
      }
79 79
      while (idx != k) {
80 80
        int next = items[idx];
81 81
        const_cast<int&>(items[idx]) = k;
82 82
        idx = next;
83 83
      }
84 84
      return k;
85 85
    }
86 86

	
87 87
  public:
88 88

	
89 89
    /// \brief Constructor
90 90
    ///
91 91
    /// Constructor of the UnionFind class. You should give an item to
92 92
    /// integer map which will be used from the data structure. If you
93 93
    /// modify directly this map that may cause segmentation fault,
94 94
    /// invalid data structure, or infinite loop when you use again
0 comments (0 inline)