gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Unify the sources (#339)
! ! !
default
89 files changed:
↑ Collapse diff ↑
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup demos
20 20
///\file
21 21
///\brief Argument parser demo
22 22
///
23 23
/// This example shows how the argument parser can be used.
24 24
///
25 25
/// \include arg_parser_demo.cc
26 26

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

	
29 29
using namespace lemon;
30 30
int main(int argc, char **argv)
31 31
{
32 32
  // Initialize the argument parser
33 33
  ArgParser ap(argc, argv);
34 34
  int i;
35 35
  std::string s;
36 36
  double d = 1.0;
37 37
  bool b, nh;
38 38
  bool g1, g2, g3;
39 39

	
40 40
  // Add a mandatory integer option with storage reference
41 41
  ap.refOption("n", "An integer input.", i, true);
42 42
  // Add a double option with storage reference (the default value is 1.0)
43 43
  ap.refOption("val", "A double input.", d);
44 44
  // Add a double option without storage reference (the default value is 3.14)
45 45
  ap.doubleOption("val2", "A double input.", 3.14);
46 46
  // Set synonym for -val option
47 47
  ap.synonym("vals", "val");
48 48
  // Add a string option
49 49
  ap.refOption("name", "A string input.", s);
50 50
  // Add bool options
51 51
  ap.refOption("f", "A switch.", b)
52 52
    .refOption("nohelp", "", nh)
53 53
    .refOption("gra", "Choice A", g1)
54 54
    .refOption("grb", "Choice B", g2)
55 55
    .refOption("grc", "Choice C", g3);
56 56
  // Bundle -gr* options into a group
57 57
  ap.optionGroup("gr", "gra")
58 58
    .optionGroup("gr", "grb")
59 59
    .optionGroup("gr", "grc");
60 60
  // Set the group mandatory
61 61
  ap.mandatoryGroup("gr");
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

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

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

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

	
84 84
  std::cout << "  Value of -n: " << i << std::endl;
85 85
  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
86 86
  if(ap.given("val2")) {
87 87
    d = ap["val2"];
88 88
    std::cout << "  Value of -val2: " << d << std::endl;
89 89
  }
90 90
  if(ap.given("name")) std::cout << "  Value of -name: " << s << std::endl;
91 91
  if(ap.given("f")) std::cout << "  -f is given\n";
92 92
  if(ap.given("nohelp")) std::cout << "  Value of -nohelp: " << nh << std::endl;
93 93
  if(ap.given("gra")) std::cout << "  -gra is given\n";
94 94
  if(ap.given("grb")) std::cout << "  -grb is given\n";
95 95
  if(ap.given("grc")) std::cout << "  -grc is given\n";
96 96

	
97 97
  switch(ap.files().size()) {
98 98
  case 0:
99 99
    std::cout << "  No file argument was given.\n";
100 100
    break;
101 101
  case 1:
102 102
    std::cout << "  1 file argument was given. It is:\n";
103 103
    break;
104 104
  default:
105 105
    std::cout << "  "
106 106
              << ap.files().size() << " file arguments were given. They are:\n";
107 107
  }
108 108
  for(unsigned int i=0;i<ap.files().size();++i)
109 109
    std::cout << "    '" << ap.files()[i] << "'\n";
110 110

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

	
19 19
namespace lemon {
20 20

	
21 21
/**
22 22
@defgroup datas Data Structures
23 23
This group contains the several data structures implemented in LEMON.
24 24
*/
25 25

	
26 26
/**
27 27
@defgroup graphs Graph Structures
28 28
@ingroup datas
29 29
\brief Graph structures implemented in LEMON.
30 30

	
31 31
The implementation of combinatorial algorithms heavily relies on
32 32
efficient graph implementations. LEMON offers data structures which are
33 33
planned to be easily used in an experimental phase of implementation studies,
34 34
and thereafter the program code can be made efficient by small modifications.
35 35

	
36 36
The most efficient implementation of diverse applications require the
37 37
usage of different physical graph implementations. These differences
38 38
appear in the size of graph we require to handle, memory or time usage
39 39
limitations or in the set of operations through which the graph can be
40 40
accessed.  LEMON provides several physical graph structures to meet
41 41
the diverging requirements of the possible users.  In order to save on
42 42
running time or on memory usage, some structures may fail to provide
43 43
some graph features like arc/edge or node deletion.
44 44

	
45 45
Alteration of standard containers need a very limited number of
46 46
operations, these together satisfy the everyday requirements.
47 47
In the case of graph structures, different operations are needed which do
48 48
not alter the physical graph, but gives another view. If some nodes or
49 49
arcs have to be hidden or the reverse oriented graph have to be used, then
50 50
this is the case. It also may happen that in a flow implementation
51 51
the residual graph can be accessed by another algorithm, or a node-set
52 52
is to be shrunk for another algorithm.
53 53
LEMON also provides a variety of graphs for these requirements called
54 54
\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
55 55
in conjunction with other graph representations.
56 56

	
57 57
You are free to use the graph structure that fit your requirements
58 58
the best, most graph algorithms and auxiliary data structures can be used
59 59
with any graph structure.
60 60

	
61 61
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
62 62
*/
63 63

	
64 64
/**
65 65
@defgroup graph_adaptors Adaptor Classes for Graphs
66 66
@ingroup graphs
67 67
\brief Adaptor classes for digraphs and graphs
68 68

	
69 69
This group contains several useful adaptor classes for digraphs and graphs.
70 70

	
71 71
The main parts of LEMON are the different graph structures, generic
72 72
graph algorithms, graph concepts, which couple them, and graph
73 73
adaptors. While the previous notions are more or less clear, the
74 74
latter one needs further explanation. Graph adaptors are graph classes
75 75
which serve for considering graph structures in different ways.
76 76

	
77 77
A short example makes this much clearer.  Suppose that we have an
78 78
instance \c g of a directed graph type, say ListDigraph and an algorithm
79 79
\code
80 80
template <typename Digraph>
81 81
int algorithm(const Digraph&);
82 82
\endcode
83 83
is needed to run on the reverse oriented graph.  It may be expensive
84 84
(in time or in memory usage) to copy \c g with the reversed
85 85
arcs.  In this case, an adaptor class is used, which (according
86 86
to LEMON \ref concepts::Digraph "digraph concepts") works as a digraph.
87 87
The adaptor uses the original digraph structure and digraph operations when
88 88
methods of the reversed oriented graph are called.  This means that the adaptor
89 89
have minor memory usage, and do not perform sophisticated algorithmic
90 90
actions.  The purpose of it is to give a tool for the cases when a
91 91
graph have to be used in a specific alteration.  If this alteration is
92 92
obtained by a usual construction like filtering the node or the arc set or
93 93
considering a new orientation, then an adaptor is worthwhile to use.
94 94
To come back to the reverse oriented graph, in this situation
95 95
\code
96 96
template<typename Digraph> class ReverseDigraph;
97 97
\endcode
98 98
template class can be used. The code looks as follows
99 99
\code
100 100
ListDigraph g;
101 101
ReverseDigraph<ListDigraph> rg(g);
102 102
int result = algorithm(rg);
103 103
\endcode
104 104
During running the algorithm, the original digraph \c g is untouched.
105 105
This techniques give rise to an elegant code, and based on stable
106 106
graph adaptors, complex algorithms can be implemented easily.
107 107

	
108 108
In flow, circulation and matching problems, the residual
109 109
graph is of particular importance. Combining an adaptor implementing
110 110
this with shortest path algorithms or minimum mean cycle algorithms,
111 111
a range of weighted and cardinality optimization algorithms can be
112 112
obtained. For other examples, the interested user is referred to the
113 113
detailed documentation of particular adaptors.
114 114

	
115 115
The behavior of graph adaptors can be very different. Some of them keep
116 116
capabilities of the original graph while in other cases this would be
117 117
meaningless. This means that the concepts that they meet depend
118 118
on the graph adaptor, and the wrapped graph.
119 119
For example, if an arc of a reversed digraph is deleted, this is carried
120 120
out by deleting the corresponding arc of the original digraph, thus the
121 121
adaptor modifies the original digraph.
122 122
However in case of a residual digraph, this operation has no sense.
123 123

	
124 124
Let us stand one more example here to simplify your work.
125 125
ReverseDigraph has constructor
126 126
\code
127 127
ReverseDigraph(Digraph& digraph);
128 128
\endcode
129 129
This means that in a situation, when a <tt>const %ListDigraph&</tt>
130 130
reference to a graph is given, then it have to be instantiated with
131 131
<tt>Digraph=const %ListDigraph</tt>.
132 132
\code
133 133
int algorithm1(const ListDigraph& g) {
134 134
  ReverseDigraph<const ListDigraph> rg(g);
135 135
  return algorithm2(rg);
136 136
}
137 137
\endcode
138 138
*/
139 139

	
140 140
/**
141 141
@defgroup maps Maps
142 142
@ingroup datas
143 143
\brief Map structures implemented in LEMON.
144 144

	
145 145
This group contains the map structures implemented in LEMON.
146 146

	
147 147
LEMON provides several special purpose maps and map adaptors that e.g. combine
148 148
new maps from existing ones.
149 149

	
150 150
<b>See also:</b> \ref map_concepts "Map Concepts".
151 151
*/
152 152

	
153 153
/**
154 154
@defgroup graph_maps Graph Maps
155 155
@ingroup maps
156 156
\brief Special graph-related maps.
157 157

	
158 158
This group contains maps that are specifically designed to assign
159 159
values to the nodes and arcs/edges of graphs.
160 160

	
161 161
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
162 162
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
163 163
*/
164 164

	
165 165
/**
166 166
\defgroup map_adaptors Map Adaptors
167 167
\ingroup maps
168 168
\brief Tools to create new maps from existing ones
169 169

	
170 170
This group contains map adaptors that are used to create "implicit"
171 171
maps from other maps.
172 172

	
173 173
Most of them are \ref concepts::ReadMap "read-only maps".
174 174
They can make arithmetic and logical operations between one or two maps
175 175
(negation, shifting, addition, multiplication, logical 'and', 'or',
176 176
'not' etc.) or e.g. convert a map to another one of different Value type.
177 177

	
178 178
The typical usage of this classes is passing implicit maps to
179 179
algorithms.  If a function type algorithm is called then the function
180 180
type map adaptors can be used comfortable. For example let's see the
181 181
usage of map adaptors with the \c graphToEps() function.
182 182
\code
183 183
  Color nodeColor(int deg) {
184 184
    if (deg >= 2) {
185 185
      return Color(0.5, 0.0, 0.5);
186 186
    } else if (deg == 1) {
187 187
      return Color(1.0, 0.5, 1.0);
188 188
    } else {
189 189
      return Color(0.0, 0.0, 0.0);
190 190
    }
191 191
  }
192 192

	
193 193
  Digraph::NodeMap<int> degree_map(graph);
194 194

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

	
19 19
/**
20 20
\mainpage LEMON Documentation
21 21

	
22 22
\section intro Introduction
23 23

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

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

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

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

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

	
52 52
If you are interested in starting to use the library, see the <a class="el"
53 53
href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation
54 54
Guide</a>.
55 55

	
56 56
If you know what you are looking for, then try to find it under the
57 57
<a class="el" href="modules.html">Modules</a> section.
58 58

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

	
19 19
namespace lemon {
20 20

	
21 21
/**
22 22
\page min_cost_flow Minimum Cost Flow Problem
23 23

	
24 24
\section mcf_def Definition (GEQ form)
25 25

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29 29
and arc costs \ref amo93networkflows.
30 30

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
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 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
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

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

	
136 136
Note that the optimality conditions for this supply constraint type are
137 137
slightly differ from the conditions that are discussed for the GEQ form,
138 138
namely the potentials have to be non-negative instead of non-positive.
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 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 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ADAPTORS_H
20 20
#define LEMON_ADAPTORS_H
21 21

	
22 22
/// \ingroup graph_adaptors
23 23
/// \file
24 24
/// \brief Adaptor classes for digraphs and graphs
25 25
///
26 26
/// This file contains several useful adaptors for digraphs and graphs.
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/variant.h>
31 31

	
32 32
#include <lemon/bits/graph_adaptor_extender.h>
33 33
#include <lemon/bits/map_extender.h>
34 34
#include <lemon/tolerance.h>
35 35

	
36 36
#include <algorithm>
37 37

	
38 38
namespace lemon {
39 39

	
40 40
#ifdef _MSC_VER
41 41
#define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
42 42
#else
43 43
#define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
44 44
#endif
45 45

	
46 46
  template<typename DGR>
47 47
  class DigraphAdaptorBase {
48 48
  public:
49 49
    typedef DGR Digraph;
50 50
    typedef DigraphAdaptorBase Adaptor;
51 51

	
52 52
  protected:
53 53
    DGR* _digraph;
54 54
    DigraphAdaptorBase() : _digraph(0) { }
55 55
    void initialize(DGR& digraph) { _digraph = &digraph; }
56 56

	
57 57
  public:
58 58
    DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
59 59

	
60 60
    typedef typename DGR::Node Node;
61 61
    typedef typename DGR::Arc Arc;
62 62

	
63 63
    void first(Node& i) const { _digraph->first(i); }
64 64
    void first(Arc& i) const { _digraph->first(i); }
65 65
    void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
66 66
    void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
67 67

	
68 68
    void next(Node& i) const { _digraph->next(i); }
69 69
    void next(Arc& i) const { _digraph->next(i); }
70 70
    void nextIn(Arc& i) const { _digraph->nextIn(i); }
71 71
    void nextOut(Arc& i) const { _digraph->nextOut(i); }
72 72

	
73 73
    Node source(const Arc& a) const { return _digraph->source(a); }
74 74
    Node target(const Arc& a) const { return _digraph->target(a); }
75 75

	
76 76
    typedef NodeNumTagIndicator<DGR> NodeNumTag;
77 77
    int nodeNum() const { return _digraph->nodeNum(); }
78 78

	
79 79
    typedef ArcNumTagIndicator<DGR> ArcNumTag;
80 80
    int arcNum() const { return _digraph->arcNum(); }
81 81

	
82 82
    typedef FindArcTagIndicator<DGR> FindArcTag;
83 83
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
84 84
      return _digraph->findArc(u, v, prev);
85 85
    }
86 86

	
87 87
    Node addNode() { return _digraph->addNode(); }
88 88
    Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
89 89

	
90 90
    void erase(const Node& n) { _digraph->erase(n); }
91 91
    void erase(const Arc& a) { _digraph->erase(a); }
92 92

	
93 93
    void clear() { _digraph->clear(); }
94 94

	
95 95
    int id(const Node& n) const { return _digraph->id(n); }
96 96
    int id(const Arc& a) const { return _digraph->id(a); }
97 97

	
98 98
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
99 99
    Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
100 100

	
101 101
    int maxNodeId() const { return _digraph->maxNodeId(); }
102 102
    int maxArcId() const { return _digraph->maxArcId(); }
103 103

	
104 104
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
105 105
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
106 106

	
107 107
    typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
108 108
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
109 109

	
110 110
    template <typename V>
111 111
    class NodeMap : public DGR::template NodeMap<V> {
112 112
      typedef typename DGR::template NodeMap<V> Parent;
113 113

	
114 114
    public:
115 115
      explicit NodeMap(const Adaptor& adaptor)
116 116
        : Parent(*adaptor._digraph) {}
117 117
      NodeMap(const Adaptor& adaptor, const V& value)
118 118
        : Parent(*adaptor._digraph, value) { }
119 119

	
120 120
    private:
121 121
      NodeMap& operator=(const NodeMap& cmap) {
122 122
        return operator=<NodeMap>(cmap);
123 123
      }
124 124

	
125 125
      template <typename CMap>
126 126
      NodeMap& operator=(const CMap& cmap) {
127 127
        Parent::operator=(cmap);
128 128
        return *this;
129 129
      }
130 130

	
131 131
    };
132 132

	
133 133
    template <typename V>
134 134
    class ArcMap : public DGR::template ArcMap<V> {
135 135
      typedef typename DGR::template ArcMap<V> Parent;
136 136

	
137 137
    public:
138 138
      explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
139 139
        : Parent(*adaptor._digraph) {}
140 140
      ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
141 141
        : Parent(*adaptor._digraph, value) {}
142 142

	
143 143
    private:
144 144
      ArcMap& operator=(const ArcMap& cmap) {
145 145
        return operator=<ArcMap>(cmap);
146 146
      }
147 147

	
148 148
      template <typename CMap>
149 149
      ArcMap& operator=(const CMap& cmap) {
150 150
        Parent::operator=(cmap);
151 151
        return *this;
152 152
      }
153 153

	
154 154
    };
155 155

	
156 156
  };
157 157

	
158 158
  template<typename GR>
159 159
  class GraphAdaptorBase {
160 160
  public:
161 161
    typedef GR Graph;
162 162

	
163 163
  protected:
164 164
    GR* _graph;
165 165

	
166 166
    GraphAdaptorBase() : _graph(0) {}
167 167

	
168 168
    void initialize(GR& graph) { _graph = &graph; }
169 169

	
170 170
  public:
171 171
    GraphAdaptorBase(GR& graph) : _graph(&graph) {}
172 172

	
173 173
    typedef typename GR::Node Node;
174 174
    typedef typename GR::Arc Arc;
175 175
    typedef typename GR::Edge Edge;
176 176

	
177 177
    void first(Node& i) const { _graph->first(i); }
178 178
    void first(Arc& i) const { _graph->first(i); }
179 179
    void first(Edge& i) const { _graph->first(i); }
180 180
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
181 181
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
182 182
    void firstInc(Edge &i, bool &d, const Node &n) const {
183 183
      _graph->firstInc(i, d, n);
184 184
    }
185 185

	
186 186
    void next(Node& i) const { _graph->next(i); }
187 187
    void next(Arc& i) const { _graph->next(i); }
188 188
    void next(Edge& i) const { _graph->next(i); }
189 189
    void nextIn(Arc& i) const { _graph->nextIn(i); }
190 190
    void nextOut(Arc& i) const { _graph->nextOut(i); }
191 191
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
192 192

	
193 193
    Node u(const Edge& e) const { return _graph->u(e); }
194 194
    Node v(const Edge& e) const { return _graph->v(e); }
195 195

	
196 196
    Node source(const Arc& a) const { return _graph->source(a); }
197 197
    Node target(const Arc& a) const { return _graph->target(a); }
... ...
@@ -232,2180 +232,2180 @@
232 232
    int id(const Arc& a) const { return _graph->id(a); }
233 233
    int id(const Edge& e) const { return _graph->id(e); }
234 234

	
235 235
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
236 236
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
237 237
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
238 238

	
239 239
    int maxNodeId() const { return _graph->maxNodeId(); }
240 240
    int maxArcId() const { return _graph->maxArcId(); }
241 241
    int maxEdgeId() const { return _graph->maxEdgeId(); }
242 242

	
243 243
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
244 244
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
245 245

	
246 246
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
247 247
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
248 248

	
249 249
    typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
250 250
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
251 251

	
252 252
    template <typename V>
253 253
    class NodeMap : public GR::template NodeMap<V> {
254 254
      typedef typename GR::template NodeMap<V> Parent;
255 255

	
256 256
    public:
257 257
      explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
258 258
        : Parent(*adapter._graph) {}
259 259
      NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
260 260
        : Parent(*adapter._graph, value) {}
261 261

	
262 262
    private:
263 263
      NodeMap& operator=(const NodeMap& cmap) {
264 264
        return operator=<NodeMap>(cmap);
265 265
      }
266 266

	
267 267
      template <typename CMap>
268 268
      NodeMap& operator=(const CMap& cmap) {
269 269
        Parent::operator=(cmap);
270 270
        return *this;
271 271
      }
272 272

	
273 273
    };
274 274

	
275 275
    template <typename V>
276 276
    class ArcMap : public GR::template ArcMap<V> {
277 277
      typedef typename GR::template ArcMap<V> Parent;
278 278

	
279 279
    public:
280 280
      explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
281 281
        : Parent(*adapter._graph) {}
282 282
      ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
283 283
        : Parent(*adapter._graph, value) {}
284 284

	
285 285
    private:
286 286
      ArcMap& operator=(const ArcMap& cmap) {
287 287
        return operator=<ArcMap>(cmap);
288 288
      }
289 289

	
290 290
      template <typename CMap>
291 291
      ArcMap& operator=(const CMap& cmap) {
292 292
        Parent::operator=(cmap);
293 293
        return *this;
294 294
      }
295 295
    };
296 296

	
297 297
    template <typename V>
298 298
    class EdgeMap : public GR::template EdgeMap<V> {
299 299
      typedef typename GR::template EdgeMap<V> Parent;
300 300

	
301 301
    public:
302 302
      explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
303 303
        : Parent(*adapter._graph) {}
304 304
      EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
305 305
        : Parent(*adapter._graph, value) {}
306 306

	
307 307
    private:
308 308
      EdgeMap& operator=(const EdgeMap& cmap) {
309 309
        return operator=<EdgeMap>(cmap);
310 310
      }
311 311

	
312 312
      template <typename CMap>
313 313
      EdgeMap& operator=(const CMap& cmap) {
314 314
        Parent::operator=(cmap);
315 315
        return *this;
316 316
      }
317 317
    };
318 318

	
319 319
  };
320 320

	
321 321
  template <typename DGR>
322 322
  class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
323 323
    typedef DigraphAdaptorBase<DGR> Parent;
324 324
  public:
325 325
    typedef DGR Digraph;
326 326
  protected:
327 327
    ReverseDigraphBase() : Parent() { }
328 328
  public:
329 329
    typedef typename Parent::Node Node;
330 330
    typedef typename Parent::Arc Arc;
331 331

	
332 332
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
333 333
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
334 334

	
335 335
    void nextIn(Arc& a) const { Parent::nextOut(a); }
336 336
    void nextOut(Arc& a) const { Parent::nextIn(a); }
337 337

	
338 338
    Node source(const Arc& a) const { return Parent::target(a); }
339 339
    Node target(const Arc& a) const { return Parent::source(a); }
340 340

	
341 341
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
342 342

	
343 343
    typedef FindArcTagIndicator<DGR> FindArcTag;
344 344
    Arc findArc(const Node& u, const Node& v,
345 345
                const Arc& prev = INVALID) const {
346 346
      return Parent::findArc(v, u, prev);
347 347
    }
348 348

	
349 349
  };
350 350

	
351 351
  /// \ingroup graph_adaptors
352 352
  ///
353 353
  /// \brief Adaptor class for reversing the orientation of the arcs in
354 354
  /// a digraph.
355 355
  ///
356 356
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363 363
  /// This class provides item counting in the same time as the adapted
364 364
  /// digraph structure.
365 365
  ///
366 366
  /// \tparam DGR The type of the adapted digraph.
367 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
368 368
  /// It can also be specified to be \c const.
369 369
  ///
370 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
371 371
  /// digraph are convertible to each other.
372 372
  template<typename DGR>
373 373
#ifdef DOXYGEN
374 374
  class ReverseDigraph {
375 375
#else
376 376
  class ReverseDigraph :
377 377
    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
378 378
#endif
379 379
    typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
380 380
  public:
381 381
    /// The type of the adapted digraph.
382 382
    typedef DGR Digraph;
383 383
  protected:
384 384
    ReverseDigraph() { }
385 385
  public:
386 386

	
387 387
    /// \brief Constructor
388 388
    ///
389 389
    /// Creates a reverse digraph adaptor for the given digraph.
390 390
    explicit ReverseDigraph(DGR& digraph) {
391 391
      Parent::initialize(digraph);
392 392
    }
393 393
  };
394 394

	
395 395
  /// \brief Returns a read-only ReverseDigraph adaptor
396 396
  ///
397 397
  /// This function just returns a read-only \ref ReverseDigraph adaptor.
398 398
  /// \ingroup graph_adaptors
399 399
  /// \relates ReverseDigraph
400 400
  template<typename DGR>
401 401
  ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
402 402
    return ReverseDigraph<const DGR>(digraph);
403 403
  }
404 404

	
405 405

	
406 406
  template <typename DGR, typename NF, typename AF, bool ch = true>
407 407
  class SubDigraphBase : public DigraphAdaptorBase<DGR> {
408 408
    typedef DigraphAdaptorBase<DGR> Parent;
409 409
  public:
410 410
    typedef DGR Digraph;
411 411
    typedef NF NodeFilterMap;
412 412
    typedef AF ArcFilterMap;
413 413

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

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

	
427 427
  public:
428 428

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

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

	
437 437
    void first(Arc& i) const {
438 438
      Parent::first(i);
439 439
      while (i != INVALID && (!(*_arc_filter)[i]
440 440
                              || !(*_node_filter)[Parent::source(i)]
441 441
                              || !(*_node_filter)[Parent::target(i)]))
442 442
        Parent::next(i);
443 443
    }
444 444

	
445 445
    void firstIn(Arc& i, const Node& n) const {
446 446
      Parent::firstIn(i, n);
447 447
      while (i != INVALID && (!(*_arc_filter)[i]
448 448
                              || !(*_node_filter)[Parent::source(i)]))
449 449
        Parent::nextIn(i);
450 450
    }
451 451

	
452 452
    void firstOut(Arc& i, const Node& n) const {
453 453
      Parent::firstOut(i, n);
454 454
      while (i != INVALID && (!(*_arc_filter)[i]
455 455
                              || !(*_node_filter)[Parent::target(i)]))
456 456
        Parent::nextOut(i);
457 457
    }
458 458

	
459 459
    void next(Node& i) const {
460 460
      Parent::next(i);
461 461
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
462 462
    }
463 463

	
464 464
    void next(Arc& i) const {
465 465
      Parent::next(i);
466 466
      while (i != INVALID && (!(*_arc_filter)[i]
467 467
                              || !(*_node_filter)[Parent::source(i)]
468 468
                              || !(*_node_filter)[Parent::target(i)]))
469 469
        Parent::next(i);
470 470
    }
471 471

	
472 472
    void nextIn(Arc& i) const {
473 473
      Parent::nextIn(i);
474 474
      while (i != INVALID && (!(*_arc_filter)[i]
475 475
                              || !(*_node_filter)[Parent::source(i)]))
476 476
        Parent::nextIn(i);
477 477
    }
478 478

	
479 479
    void nextOut(Arc& i) const {
480 480
      Parent::nextOut(i);
481 481
      while (i != INVALID && (!(*_arc_filter)[i]
482 482
                              || !(*_node_filter)[Parent::target(i)]))
483 483
        Parent::nextOut(i);
484 484
    }
485 485

	
486 486
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
487 487
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
488 488

	
489 489
    bool status(const Node& n) const { return (*_node_filter)[n]; }
490 490
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
491 491

	
492 492
    typedef False NodeNumTag;
493 493
    typedef False ArcNumTag;
494 494

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

	
508 508
  public:
509 509

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

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

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

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

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

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

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

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

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

	
557 557
      template <typename CMap>
558 558
      ArcMap& operator=(const CMap& cmap) {
559 559
        Parent::operator=(cmap);
560 560
        return *this;
561 561
      }
562 562
    };
563 563

	
564 564
  };
565 565

	
566 566
  template <typename DGR, typename NF, typename AF>
567 567
  class SubDigraphBase<DGR, NF, AF, false>
568 568
    : public DigraphAdaptorBase<DGR> {
569 569
    typedef DigraphAdaptorBase<DGR> Parent;
570 570
  public:
571 571
    typedef DGR Digraph;
572 572
    typedef NF NodeFilterMap;
573 573
    typedef AF ArcFilterMap;
574 574

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

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

	
588 588
  public:
589 589

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

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

	
598 598
    void first(Arc& i) const {
599 599
      Parent::first(i);
600 600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
601 601
    }
602 602

	
603 603
    void firstIn(Arc& i, const Node& n) const {
604 604
      Parent::firstIn(i, n);
605 605
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
606 606
    }
607 607

	
608 608
    void firstOut(Arc& i, const Node& n) const {
609 609
      Parent::firstOut(i, n);
610 610
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
611 611
    }
612 612

	
613 613
    void next(Node& i) const {
614 614
      Parent::next(i);
615 615
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
616 616
    }
617 617
    void next(Arc& i) const {
618 618
      Parent::next(i);
619 619
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
620 620
    }
621 621
    void nextIn(Arc& i) const {
622 622
      Parent::nextIn(i);
623 623
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
624 624
    }
625 625

	
626 626
    void nextOut(Arc& i) const {
627 627
      Parent::nextOut(i);
628 628
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
629 629
    }
630 630

	
631 631
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
632 632
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
633 633

	
634 634
    bool status(const Node& n) const { return (*_node_filter)[n]; }
635 635
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
636 636

	
637 637
    typedef False NodeNumTag;
638 638
    typedef False ArcNumTag;
639 639

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

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

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

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

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

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

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

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

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

	
695 695
    private:
696 696
      ArcMap& operator=(const ArcMap& cmap) {
697 697
        return operator=<ArcMap>(cmap);
698 698
      }
699 699

	
700 700
      template <typename CMap>
701 701
      ArcMap& operator=(const CMap& cmap) {
702 702
        Parent::operator=(cmap);
703 703
        return *this;
704 704
      }
705 705
    };
706 706

	
707 707
  };
708 708

	
709 709
  /// \ingroup graph_adaptors
710 710
  ///
711 711
  /// \brief Adaptor class for hiding nodes and arcs in a digraph
712 712
  ///
713 713
  /// SubDigraph can be used for hiding nodes and arcs in a digraph.
714 714
  /// A \c bool node map and a \c bool arc map must be specified, which
715 715
  /// define the filters for nodes and arcs.
716 716
  /// Only the nodes and arcs with \c true filter value are
717 717
  /// shown in the subdigraph. The arcs that are incident to hidden
718 718
  /// nodes are also filtered out.
719 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
720 720
  ///
721 721
  /// The adapted digraph can also be modified through this adaptor
722 722
  /// by adding or removing nodes or arcs, unless the \c GR template
723 723
  /// parameter is set to be \c const.
724 724
  ///
725 725
  /// This class provides only linear time counting for nodes and arcs.
726 726
  ///
727 727
  /// \tparam DGR The type of the adapted digraph.
728 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
729 729
  /// It can also be specified to be \c const.
730 730
  /// \tparam NF The type of the node filter map.
731 731
  /// It must be a \c bool (or convertible) node map of the
732 732
  /// adapted digraph. The default type is
733 733
  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
734 734
  /// \tparam AF The type of the arc filter map.
735 735
  /// It must be \c bool (or convertible) arc map of the
736 736
  /// adapted digraph. The default type is
737 737
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
738 738
  ///
739 739
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
740 740
  /// digraph are convertible to each other.
741 741
  ///
742 742
  /// \see FilterNodes
743 743
  /// \see FilterArcs
744 744
#ifdef DOXYGEN
745 745
  template<typename DGR, typename NF, typename AF>
746 746
  class SubDigraph {
747 747
#else
748 748
  template<typename DGR,
749 749
           typename NF = typename DGR::template NodeMap<bool>,
750 750
           typename AF = typename DGR::template ArcMap<bool> >
751 751
  class SubDigraph :
752 752
    public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
753 753
#endif
754 754
  public:
755 755
    /// The type of the adapted digraph.
756 756
    typedef DGR Digraph;
757 757
    /// The type of the node filter map.
758 758
    typedef NF NodeFilterMap;
759 759
    /// The type of the arc filter map.
760 760
    typedef AF ArcFilterMap;
761 761

	
762 762
    typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
763 763
      Parent;
764 764

	
765 765
    typedef typename Parent::Node Node;
766 766
    typedef typename Parent::Arc Arc;
767 767

	
768 768
  protected:
769 769
    SubDigraph() { }
770 770
  public:
771 771

	
772 772
    /// \brief Constructor
773 773
    ///
774 774
    /// Creates a subdigraph for the given digraph with the
775 775
    /// given node and arc filter maps.
776 776
    SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
777 777
      Parent::initialize(digraph, node_filter, arc_filter);
778 778
    }
779 779

	
780 780
    /// \brief Sets the status of the given node
781 781
    ///
782 782
    /// This function sets the status of the given node.
783 783
    /// It is done by simply setting the assigned value of \c n
784 784
    /// to \c v in the node filter map.
785 785
    void status(const Node& n, bool v) const { Parent::status(n, v); }
786 786

	
787 787
    /// \brief Sets the status of the given arc
788 788
    ///
789 789
    /// This function sets the status of the given arc.
790 790
    /// It is done by simply setting the assigned value of \c a
791 791
    /// to \c v in the arc filter map.
792 792
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
793 793

	
794 794
    /// \brief Returns the status of the given node
795 795
    ///
796 796
    /// This function returns the status of the given node.
797 797
    /// It is \c true if the given node is enabled (i.e. not hidden).
798 798
    bool status(const Node& n) const { return Parent::status(n); }
799 799

	
800 800
    /// \brief Returns the status of the given arc
801 801
    ///
802 802
    /// This function returns the status of the given arc.
803 803
    /// It is \c true if the given arc is enabled (i.e. not hidden).
804 804
    bool status(const Arc& a) const { return Parent::status(a); }
805 805

	
806 806
    /// \brief Disables the given node
807 807
    ///
808 808
    /// This function disables the given node in the subdigraph,
809 809
    /// so the iteration jumps over it.
810 810
    /// It is the same as \ref status() "status(n, false)".
811 811
    void disable(const Node& n) const { Parent::status(n, false); }
812 812

	
813 813
    /// \brief Disables the given arc
814 814
    ///
815 815
    /// This function disables the given arc in the subdigraph,
816 816
    /// so the iteration jumps over it.
817 817
    /// It is the same as \ref status() "status(a, false)".
818 818
    void disable(const Arc& a) const { Parent::status(a, false); }
819 819

	
820 820
    /// \brief Enables the given node
821 821
    ///
822 822
    /// This function enables the given node in the subdigraph.
823 823
    /// It is the same as \ref status() "status(n, true)".
824 824
    void enable(const Node& n) const { Parent::status(n, true); }
825 825

	
826 826
    /// \brief Enables the given arc
827 827
    ///
828 828
    /// This function enables the given arc in the subdigraph.
829 829
    /// It is the same as \ref status() "status(a, true)".
830 830
    void enable(const Arc& a) const { Parent::status(a, true); }
831 831

	
832 832
  };
833 833

	
834 834
  /// \brief Returns a read-only SubDigraph adaptor
835 835
  ///
836 836
  /// This function just returns a read-only \ref SubDigraph adaptor.
837 837
  /// \ingroup graph_adaptors
838 838
  /// \relates SubDigraph
839 839
  template<typename DGR, typename NF, typename AF>
840 840
  SubDigraph<const DGR, NF, AF>
841 841
  subDigraph(const DGR& digraph,
842 842
             NF& node_filter, AF& arc_filter) {
843 843
    return SubDigraph<const DGR, NF, AF>
844 844
      (digraph, node_filter, arc_filter);
845 845
  }
846 846

	
847 847
  template<typename DGR, typename NF, typename AF>
848 848
  SubDigraph<const DGR, const NF, AF>
849 849
  subDigraph(const DGR& digraph,
850 850
             const NF& node_filter, AF& arc_filter) {
851 851
    return SubDigraph<const DGR, const NF, AF>
852 852
      (digraph, node_filter, arc_filter);
853 853
  }
854 854

	
855 855
  template<typename DGR, typename NF, typename AF>
856 856
  SubDigraph<const DGR, NF, const AF>
857 857
  subDigraph(const DGR& digraph,
858 858
             NF& node_filter, const AF& arc_filter) {
859 859
    return SubDigraph<const DGR, NF, const AF>
860 860
      (digraph, node_filter, arc_filter);
861 861
  }
862 862

	
863 863
  template<typename DGR, typename NF, typename AF>
864 864
  SubDigraph<const DGR, const NF, const AF>
865 865
  subDigraph(const DGR& digraph,
866 866
             const NF& node_filter, const AF& arc_filter) {
867 867
    return SubDigraph<const DGR, const NF, const AF>
868 868
      (digraph, node_filter, arc_filter);
869 869
  }
870 870

	
871 871

	
872 872
  template <typename GR, typename NF, typename EF, bool ch = true>
873 873
  class SubGraphBase : public GraphAdaptorBase<GR> {
874 874
    typedef GraphAdaptorBase<GR> Parent;
875 875
  public:
876 876
    typedef GR Graph;
877 877
    typedef NF NodeFilterMap;
878 878
    typedef EF EdgeFilterMap;
879 879

	
880 880
    typedef SubGraphBase Adaptor;
881 881
  protected:
882 882

	
883 883
    NF* _node_filter;
884 884
    EF* _edge_filter;
885 885

	
886 886
    SubGraphBase()
887 887
      : Parent(), _node_filter(0), _edge_filter(0) { }
888 888

	
889 889
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
890 890
      Parent::initialize(graph);
891 891
      _node_filter = &node_filter;
892 892
      _edge_filter = &edge_filter;
893 893
    }
894 894

	
895 895
  public:
896 896

	
897 897
    typedef typename Parent::Node Node;
898 898
    typedef typename Parent::Arc Arc;
899 899
    typedef typename Parent::Edge Edge;
900 900

	
901 901
    void first(Node& i) const {
902 902
      Parent::first(i);
903 903
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
904 904
    }
905 905

	
906 906
    void first(Arc& i) const {
907 907
      Parent::first(i);
908 908
      while (i!=INVALID && (!(*_edge_filter)[i]
909 909
                            || !(*_node_filter)[Parent::source(i)]
910 910
                            || !(*_node_filter)[Parent::target(i)]))
911 911
        Parent::next(i);
912 912
    }
913 913

	
914 914
    void first(Edge& i) const {
915 915
      Parent::first(i);
916 916
      while (i!=INVALID && (!(*_edge_filter)[i]
917 917
                            || !(*_node_filter)[Parent::u(i)]
918 918
                            || !(*_node_filter)[Parent::v(i)]))
919 919
        Parent::next(i);
920 920
    }
921 921

	
922 922
    void firstIn(Arc& i, const Node& n) const {
923 923
      Parent::firstIn(i, n);
924 924
      while (i!=INVALID && (!(*_edge_filter)[i]
925 925
                            || !(*_node_filter)[Parent::source(i)]))
926 926
        Parent::nextIn(i);
927 927
    }
928 928

	
929 929
    void firstOut(Arc& i, const Node& n) const {
930 930
      Parent::firstOut(i, n);
931 931
      while (i!=INVALID && (!(*_edge_filter)[i]
932 932
                            || !(*_node_filter)[Parent::target(i)]))
933 933
        Parent::nextOut(i);
934 934
    }
935 935

	
936 936
    void firstInc(Edge& i, bool& d, const Node& n) const {
937 937
      Parent::firstInc(i, d, n);
938 938
      while (i!=INVALID && (!(*_edge_filter)[i]
939 939
                            || !(*_node_filter)[Parent::u(i)]
940 940
                            || !(*_node_filter)[Parent::v(i)]))
941 941
        Parent::nextInc(i, d);
942 942
    }
943 943

	
944 944
    void next(Node& i) const {
945 945
      Parent::next(i);
946 946
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
947 947
    }
948 948

	
949 949
    void next(Arc& i) const {
950 950
      Parent::next(i);
951 951
      while (i!=INVALID && (!(*_edge_filter)[i]
952 952
                            || !(*_node_filter)[Parent::source(i)]
953 953
                            || !(*_node_filter)[Parent::target(i)]))
954 954
        Parent::next(i);
955 955
    }
956 956

	
957 957
    void next(Edge& i) const {
958 958
      Parent::next(i);
959 959
      while (i!=INVALID && (!(*_edge_filter)[i]
960 960
                            || !(*_node_filter)[Parent::u(i)]
961 961
                            || !(*_node_filter)[Parent::v(i)]))
962 962
        Parent::next(i);
963 963
    }
964 964

	
965 965
    void nextIn(Arc& i) const {
966 966
      Parent::nextIn(i);
967 967
      while (i!=INVALID && (!(*_edge_filter)[i]
968 968
                            || !(*_node_filter)[Parent::source(i)]))
969 969
        Parent::nextIn(i);
970 970
    }
971 971

	
972 972
    void nextOut(Arc& i) const {
973 973
      Parent::nextOut(i);
974 974
      while (i!=INVALID && (!(*_edge_filter)[i]
975 975
                            || !(*_node_filter)[Parent::target(i)]))
976 976
        Parent::nextOut(i);
977 977
    }
978 978

	
979 979
    void nextInc(Edge& i, bool& d) const {
980 980
      Parent::nextInc(i, d);
981 981
      while (i!=INVALID && (!(*_edge_filter)[i]
982 982
                            || !(*_node_filter)[Parent::u(i)]
983 983
                            || !(*_node_filter)[Parent::v(i)]))
984 984
        Parent::nextInc(i, d);
985 985
    }
986 986

	
987 987
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
988 988
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
989 989

	
990 990
    bool status(const Node& n) const { return (*_node_filter)[n]; }
991 991
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
992 992

	
993 993
    typedef False NodeNumTag;
994 994
    typedef False ArcNumTag;
995 995
    typedef False EdgeNumTag;
996 996

	
997 997
    typedef FindArcTagIndicator<Graph> FindArcTag;
998 998
    Arc findArc(const Node& u, const Node& v,
999 999
                const Arc& prev = INVALID) const {
1000 1000
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1001 1001
        return INVALID;
1002 1002
      }
1003 1003
      Arc arc = Parent::findArc(u, v, prev);
1004 1004
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1005 1005
        arc = Parent::findArc(u, v, arc);
1006 1006
      }
1007 1007
      return arc;
1008 1008
    }
1009 1009

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1098 1098
      template <typename CMap>
1099 1099
      EdgeMap& operator=(const CMap& cmap) {
1100 1100
        Parent::operator=(cmap);
1101 1101
        return *this;
1102 1102
      }
1103 1103
    };
1104 1104

	
1105 1105
  };
1106 1106

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

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

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

	
1129 1129
  public:
1130 1130

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

	
1135 1135
    void first(Node& i) const {
1136 1136
      Parent::first(i);
1137 1137
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1138 1138
    }
1139 1139

	
1140 1140
    void first(Arc& i) const {
1141 1141
      Parent::first(i);
1142 1142
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1143 1143
    }
1144 1144

	
1145 1145
    void first(Edge& i) const {
1146 1146
      Parent::first(i);
1147 1147
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1148 1148
    }
1149 1149

	
1150 1150
    void firstIn(Arc& i, const Node& n) const {
1151 1151
      Parent::firstIn(i, n);
1152 1152
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1153 1153
    }
1154 1154

	
1155 1155
    void firstOut(Arc& i, const Node& n) const {
1156 1156
      Parent::firstOut(i, n);
1157 1157
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1158 1158
    }
1159 1159

	
1160 1160
    void firstInc(Edge& i, bool& d, const Node& n) const {
1161 1161
      Parent::firstInc(i, d, n);
1162 1162
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1163 1163
    }
1164 1164

	
1165 1165
    void next(Node& i) const {
1166 1166
      Parent::next(i);
1167 1167
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1168 1168
    }
1169 1169
    void next(Arc& i) const {
1170 1170
      Parent::next(i);
1171 1171
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1172 1172
    }
1173 1173
    void next(Edge& i) const {
1174 1174
      Parent::next(i);
1175 1175
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1176 1176
    }
1177 1177
    void nextIn(Arc& i) const {
1178 1178
      Parent::nextIn(i);
1179 1179
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1180 1180
    }
1181 1181

	
1182 1182
    void nextOut(Arc& i) const {
1183 1183
      Parent::nextOut(i);
1184 1184
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1185 1185
    }
1186 1186
    void nextInc(Edge& i, bool& d) const {
1187 1187
      Parent::nextInc(i, d);
1188 1188
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1189 1189
    }
1190 1190

	
1191 1191
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1192 1192
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1193 1193

	
1194 1194
    bool status(const Node& n) const { return (*_node_filter)[n]; }
1195 1195
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1196 1196

	
1197 1197
    typedef False NodeNumTag;
1198 1198
    typedef False ArcNumTag;
1199 1199
    typedef False EdgeNumTag;
1200 1200

	
1201 1201
    typedef FindArcTagIndicator<Graph> FindArcTag;
1202 1202
    Arc findArc(const Node& u, const Node& v,
1203 1203
                const Arc& prev = INVALID) const {
1204 1204
      Arc arc = Parent::findArc(u, v, prev);
1205 1205
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1206 1206
        arc = Parent::findArc(u, v, arc);
1207 1207
      }
1208 1208
      return arc;
1209 1209
    }
1210 1210

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1296 1296
      template <typename CMap>
1297 1297
      EdgeMap& operator=(const CMap& cmap) {
1298 1298
        Parent::operator=(cmap);
1299 1299
        return *this;
1300 1300
      }
1301 1301
    };
1302 1302

	
1303 1303
  };
1304 1304

	
1305 1305
  /// \ingroup graph_adaptors
1306 1306
  ///
1307 1307
  /// \brief Adaptor class for hiding nodes and edges in an undirected
1308 1308
  /// graph.
1309 1309
  ///
1310 1310
  /// SubGraph can be used for hiding nodes and edges in a graph.
1311 1311
  /// A \c bool node map and a \c bool edge map must be specified, which
1312 1312
  /// define the filters for nodes and edges.
1313 1313
  /// Only the nodes and edges with \c true filter value are
1314 1314
  /// shown in the subgraph. The edges that are incident to hidden
1315 1315
  /// nodes are also filtered out.
1316 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1317 1317
  ///
1318 1318
  /// The adapted graph can also be modified through this adaptor
1319 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1320 1320
  /// parameter is set to be \c const.
1321 1321
  ///
1322 1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323 1323
  ///
1324 1324
  /// \tparam GR The type of the adapted graph.
1325 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1326 1326
  /// It can also be specified to be \c const.
1327 1327
  /// \tparam NF The type of the node filter map.
1328 1328
  /// It must be a \c bool (or convertible) node map of the
1329 1329
  /// adapted graph. The default type is
1330 1330
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1331 1331
  /// \tparam EF The type of the edge filter map.
1332 1332
  /// It must be a \c bool (or convertible) edge map of the
1333 1333
  /// adapted graph. The default type is
1334 1334
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1335 1335
  ///
1336 1336
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1337 1337
  /// adapted graph are convertible to each other.
1338 1338
  ///
1339 1339
  /// \see FilterNodes
1340 1340
  /// \see FilterEdges
1341 1341
#ifdef DOXYGEN
1342 1342
  template<typename GR, typename NF, typename EF>
1343 1343
  class SubGraph {
1344 1344
#else
1345 1345
  template<typename GR,
1346 1346
           typename NF = typename GR::template NodeMap<bool>,
1347 1347
           typename EF = typename GR::template EdgeMap<bool> >
1348 1348
  class SubGraph :
1349 1349
    public GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> > {
1350 1350
#endif
1351 1351
  public:
1352 1352
    /// The type of the adapted graph.
1353 1353
    typedef GR Graph;
1354 1354
    /// The type of the node filter map.
1355 1355
    typedef NF NodeFilterMap;
1356 1356
    /// The type of the edge filter map.
1357 1357
    typedef EF EdgeFilterMap;
1358 1358

	
1359 1359
    typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1360 1360
      Parent;
1361 1361

	
1362 1362
    typedef typename Parent::Node Node;
1363 1363
    typedef typename Parent::Edge Edge;
1364 1364

	
1365 1365
  protected:
1366 1366
    SubGraph() { }
1367 1367
  public:
1368 1368

	
1369 1369
    /// \brief Constructor
1370 1370
    ///
1371 1371
    /// Creates a subgraph for the given graph with the given node
1372 1372
    /// and edge filter maps.
1373 1373
    SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1374 1374
      initialize(graph, node_filter, edge_filter);
1375 1375
    }
1376 1376

	
1377 1377
    /// \brief Sets the status of the given node
1378 1378
    ///
1379 1379
    /// This function sets the status of the given node.
1380 1380
    /// It is done by simply setting the assigned value of \c n
1381 1381
    /// to \c v in the node filter map.
1382 1382
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1383 1383

	
1384 1384
    /// \brief Sets the status of the given edge
1385 1385
    ///
1386 1386
    /// This function sets the status of the given edge.
1387 1387
    /// It is done by simply setting the assigned value of \c e
1388 1388
    /// to \c v in the edge filter map.
1389 1389
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1390 1390

	
1391 1391
    /// \brief Returns the status of the given node
1392 1392
    ///
1393 1393
    /// This function returns the status of the given node.
1394 1394
    /// It is \c true if the given node is enabled (i.e. not hidden).
1395 1395
    bool status(const Node& n) const { return Parent::status(n); }
1396 1396

	
1397 1397
    /// \brief Returns the status of the given edge
1398 1398
    ///
1399 1399
    /// This function returns the status of the given edge.
1400 1400
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1401 1401
    bool status(const Edge& e) const { return Parent::status(e); }
1402 1402

	
1403 1403
    /// \brief Disables the given node
1404 1404
    ///
1405 1405
    /// This function disables the given node in the subdigraph,
1406 1406
    /// so the iteration jumps over it.
1407 1407
    /// It is the same as \ref status() "status(n, false)".
1408 1408
    void disable(const Node& n) const { Parent::status(n, false); }
1409 1409

	
1410 1410
    /// \brief Disables the given edge
1411 1411
    ///
1412 1412
    /// This function disables the given edge in the subgraph,
1413 1413
    /// so the iteration jumps over it.
1414 1414
    /// It is the same as \ref status() "status(e, false)".
1415 1415
    void disable(const Edge& e) const { Parent::status(e, false); }
1416 1416

	
1417 1417
    /// \brief Enables the given node
1418 1418
    ///
1419 1419
    /// This function enables the given node in the subdigraph.
1420 1420
    /// It is the same as \ref status() "status(n, true)".
1421 1421
    void enable(const Node& n) const { Parent::status(n, true); }
1422 1422

	
1423 1423
    /// \brief Enables the given edge
1424 1424
    ///
1425 1425
    /// This function enables the given edge in the subgraph.
1426 1426
    /// It is the same as \ref status() "status(e, true)".
1427 1427
    void enable(const Edge& e) const { Parent::status(e, true); }
1428 1428

	
1429 1429
  };
1430 1430

	
1431 1431
  /// \brief Returns a read-only SubGraph adaptor
1432 1432
  ///
1433 1433
  /// This function just returns a read-only \ref SubGraph adaptor.
1434 1434
  /// \ingroup graph_adaptors
1435 1435
  /// \relates SubGraph
1436 1436
  template<typename GR, typename NF, typename EF>
1437 1437
  SubGraph<const GR, NF, EF>
1438 1438
  subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1439 1439
    return SubGraph<const GR, NF, EF>
1440 1440
      (graph, node_filter, edge_filter);
1441 1441
  }
1442 1442

	
1443 1443
  template<typename GR, typename NF, typename EF>
1444 1444
  SubGraph<const GR, const NF, EF>
1445 1445
  subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1446 1446
    return SubGraph<const GR, const NF, EF>
1447 1447
      (graph, node_filter, edge_filter);
1448 1448
  }
1449 1449

	
1450 1450
  template<typename GR, typename NF, typename EF>
1451 1451
  SubGraph<const GR, NF, const EF>
1452 1452
  subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1453 1453
    return SubGraph<const GR, NF, const EF>
1454 1454
      (graph, node_filter, edge_filter);
1455 1455
  }
1456 1456

	
1457 1457
  template<typename GR, typename NF, typename EF>
1458 1458
  SubGraph<const GR, const NF, const EF>
1459 1459
  subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1460 1460
    return SubGraph<const GR, const NF, const EF>
1461 1461
      (graph, node_filter, edge_filter);
1462 1462
  }
1463 1463

	
1464 1464

	
1465 1465
  /// \ingroup graph_adaptors
1466 1466
  ///
1467 1467
  /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1468 1468
  ///
1469 1469
  /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1470 1470
  /// graph. A \c bool node map must be specified, which defines the filter
1471 1471
  /// for the nodes. Only the nodes with \c true filter value and the
1472 1472
  /// arcs/edges incident to nodes both with \c true filter value are shown
1473 1473
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1474 1474
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1475 1475
  /// depending on the \c GR template parameter.
1476 1476
  ///
1477 1477
  /// The adapted (di)graph can also be modified through this adaptor
1478 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1479 1479
  /// parameter is set to be \c const.
1480 1480
  ///
1481 1481
  /// This class provides only linear time item counting.
1482 1482
  ///
1483 1483
  /// \tparam GR The type of the adapted digraph or graph.
1484 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1485 1485
  /// or the \ref concepts::Graph "Graph" concept.
1486 1486
  /// It can also be specified to be \c const.
1487 1487
  /// \tparam NF The type of the node filter map.
1488 1488
  /// It must be a \c bool (or convertible) node map of the
1489 1489
  /// adapted (di)graph. The default type is
1490 1490
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1491 1491
  ///
1492 1492
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1493 1493
  /// adapted (di)graph are convertible to each other.
1494 1494
#ifdef DOXYGEN
1495 1495
  template<typename GR, typename NF>
1496 1496
  class FilterNodes {
1497 1497
#else
1498 1498
  template<typename GR,
1499 1499
           typename NF = typename GR::template NodeMap<bool>,
1500 1500
           typename Enable = void>
1501 1501
  class FilterNodes :
1502 1502
    public DigraphAdaptorExtender<
1503 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1504 1504
                     true> > {
1505 1505
#endif
1506 1506
    typedef DigraphAdaptorExtender<
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1508 1508
                     true> > Parent;
1509 1509

	
1510 1510
  public:
1511 1511

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

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

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

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

	
1522 1522
  public:
1523 1523

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

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

	
1541 1541
    /// \brief Returns the status of the given node
1542 1542
    ///
1543 1543
    /// This function returns the status of the given node.
1544 1544
    /// It is \c true if the given node is enabled (i.e. not hidden).
1545 1545
    bool status(const Node& n) const { return Parent::status(n); }
1546 1546

	
1547 1547
    /// \brief Disables the given node
1548 1548
    ///
1549 1549
    /// This function disables the given node, so the iteration
1550 1550
    /// jumps over it.
1551 1551
    /// It is the same as \ref status() "status(n, false)".
1552 1552
    void disable(const Node& n) const { Parent::status(n, false); }
1553 1553

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

	
1560 1560
  };
1561 1561

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

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

	
1573 1573
  public:
1574 1574

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

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

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

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

	
1585 1585
  public:
1586 1586

	
1587 1587
    FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1588 1588
      Parent(), const_true_map() {
1589 1589
      Parent::initialize(graph, node_filter, const_true_map);
1590 1590
    }
1591 1591

	
1592 1592
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1593 1593
    bool status(const Node& n) const { return Parent::status(n); }
1594 1594
    void disable(const Node& n) const { Parent::status(n, false); }
1595 1595
    void enable(const Node& n) const { Parent::status(n, true); }
1596 1596

	
1597 1597
  };
1598 1598

	
1599 1599

	
1600 1600
  /// \brief Returns a read-only FilterNodes adaptor
1601 1601
  ///
1602 1602
  /// This function just returns a read-only \ref FilterNodes adaptor.
1603 1603
  /// \ingroup graph_adaptors
1604 1604
  /// \relates FilterNodes
1605 1605
  template<typename GR, typename NF>
1606 1606
  FilterNodes<const GR, NF>
1607 1607
  filterNodes(const GR& graph, NF& node_filter) {
1608 1608
    return FilterNodes<const GR, NF>(graph, node_filter);
1609 1609
  }
1610 1610

	
1611 1611
  template<typename GR, typename NF>
1612 1612
  FilterNodes<const GR, const NF>
1613 1613
  filterNodes(const GR& graph, const NF& node_filter) {
1614 1614
    return FilterNodes<const GR, const NF>(graph, node_filter);
1615 1615
  }
1616 1616

	
1617 1617
  /// \ingroup graph_adaptors
1618 1618
  ///
1619 1619
  /// \brief Adaptor class for hiding arcs in a digraph.
1620 1620
  ///
1621 1621
  /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1622 1622
  /// A \c bool arc map must be specified, which defines the filter for
1623 1623
  /// the arcs. Only the arcs with \c true filter value are shown in the
1624 1624
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1625 1625
  /// "Digraph" concept.
1626 1626
  ///
1627 1627
  /// The adapted digraph can also be modified through this adaptor
1628 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1629 1629
  /// parameter is set to be \c const.
1630 1630
  ///
1631 1631
  /// This class provides only linear time counting for nodes and arcs.
1632 1632
  ///
1633 1633
  /// \tparam DGR The type of the adapted digraph.
1634 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1635 1635
  /// It can also be specified to be \c const.
1636 1636
  /// \tparam AF The type of the arc filter map.
1637 1637
  /// It must be a \c bool (or convertible) arc map of the
1638 1638
  /// adapted digraph. The default type is
1639 1639
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1640 1640
  ///
1641 1641
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1642 1642
  /// digraph are convertible to each other.
1643 1643
#ifdef DOXYGEN
1644 1644
  template<typename DGR,
1645 1645
           typename AF>
1646 1646
  class FilterArcs {
1647 1647
#else
1648 1648
  template<typename DGR,
1649 1649
           typename AF = typename DGR::template ArcMap<bool> >
1650 1650
  class FilterArcs :
1651 1651
    public DigraphAdaptorExtender<
1652 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1653 1653
                     AF, false> > {
1654 1654
#endif
1655 1655
    typedef DigraphAdaptorExtender<
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1657 1657
                     AF, false> > Parent;
1658 1658

	
1659 1659
  public:
1660 1660

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

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

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

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

	
1673 1673
  public:
1674 1674

	
1675 1675
    /// \brief Constructor
1676 1676
    ///
1677 1677
    /// Creates a subdigraph for the given digraph with the given arc
1678 1678
    /// filter map.
1679 1679
    FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1680 1680
      : Parent(), const_true_map() {
1681 1681
      Parent::initialize(digraph, const_true_map, arc_filter);
1682 1682
    }
1683 1683

	
1684 1684
    /// \brief Sets the status of the given arc
1685 1685
    ///
1686 1686
    /// This function sets the status of the given arc.
1687 1687
    /// It is done by simply setting the assigned value of \c a
1688 1688
    /// to \c v in the arc filter map.
1689 1689
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
1690 1690

	
1691 1691
    /// \brief Returns the status of the given arc
1692 1692
    ///
1693 1693
    /// This function returns the status of the given arc.
1694 1694
    /// It is \c true if the given arc is enabled (i.e. not hidden).
1695 1695
    bool status(const Arc& a) const { return Parent::status(a); }
1696 1696

	
1697 1697
    /// \brief Disables the given arc
1698 1698
    ///
1699 1699
    /// This function disables the given arc in the subdigraph,
1700 1700
    /// so the iteration jumps over it.
1701 1701
    /// It is the same as \ref status() "status(a, false)".
1702 1702
    void disable(const Arc& a) const { Parent::status(a, false); }
1703 1703

	
1704 1704
    /// \brief Enables the given arc
1705 1705
    ///
1706 1706
    /// This function enables the given arc in the subdigraph.
1707 1707
    /// It is the same as \ref status() "status(a, true)".
1708 1708
    void enable(const Arc& a) const { Parent::status(a, true); }
1709 1709

	
1710 1710
  };
1711 1711

	
1712 1712
  /// \brief Returns a read-only FilterArcs adaptor
1713 1713
  ///
1714 1714
  /// This function just returns a read-only \ref FilterArcs adaptor.
1715 1715
  /// \ingroup graph_adaptors
1716 1716
  /// \relates FilterArcs
1717 1717
  template<typename DGR, typename AF>
1718 1718
  FilterArcs<const DGR, AF>
1719 1719
  filterArcs(const DGR& digraph, AF& arc_filter) {
1720 1720
    return FilterArcs<const DGR, AF>(digraph, arc_filter);
1721 1721
  }
1722 1722

	
1723 1723
  template<typename DGR, typename AF>
1724 1724
  FilterArcs<const DGR, const AF>
1725 1725
  filterArcs(const DGR& digraph, const AF& arc_filter) {
1726 1726
    return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1727 1727
  }
1728 1728

	
1729 1729
  /// \ingroup graph_adaptors
1730 1730
  ///
1731 1731
  /// \brief Adaptor class for hiding edges in a graph.
1732 1732
  ///
1733 1733
  /// FilterEdges adaptor can be used for hiding edges in a graph.
1734 1734
  /// A \c bool edge map must be specified, which defines the filter for
1735 1735
  /// the edges. Only the edges with \c true filter value are shown in the
1736 1736
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1737 1737
  /// "Graph" concept.
1738 1738
  ///
1739 1739
  /// The adapted graph can also be modified through this adaptor
1740 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1741 1741
  /// parameter is set to be \c const.
1742 1742
  ///
1743 1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744 1744
  ///
1745 1745
  /// \tparam GR The type of the adapted graph.
1746 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1747 1747
  /// It can also be specified to be \c const.
1748 1748
  /// \tparam EF The type of the edge filter map.
1749 1749
  /// It must be a \c bool (or convertible) edge map of the
1750 1750
  /// adapted graph. The default type is
1751 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1752 1752
  ///
1753 1753
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1754 1754
  /// adapted graph are convertible to each other.
1755 1755
#ifdef DOXYGEN
1756 1756
  template<typename GR,
1757 1757
           typename EF>
1758 1758
  class FilterEdges {
1759 1759
#else
1760 1760
  template<typename GR,
1761 1761
           typename EF = typename GR::template EdgeMap<bool> >
1762 1762
  class FilterEdges :
1763 1763
    public GraphAdaptorExtender<
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1765 1765
                   EF, false> > {
1766 1766
#endif
1767 1767
    typedef GraphAdaptorExtender<
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1769 1769
                   EF, false> > Parent;
1770 1770

	
1771 1771
  public:
1772 1772

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

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

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

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

	
1787 1787
  public:
1788 1788

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

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

	
1805 1805
    /// \brief Returns the status of the given edge
1806 1806
    ///
1807 1807
    /// This function returns the status of the given edge.
1808 1808
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1809 1809
    bool status(const Edge& e) const { return Parent::status(e); }
1810 1810

	
1811 1811
    /// \brief Disables the given edge
1812 1812
    ///
1813 1813
    /// This function disables the given edge in the subgraph,
1814 1814
    /// so the iteration jumps over it.
1815 1815
    /// It is the same as \ref status() "status(e, false)".
1816 1816
    void disable(const Edge& e) const { Parent::status(e, false); }
1817 1817

	
1818 1818
    /// \brief Enables the given edge
1819 1819
    ///
1820 1820
    /// This function enables the given edge in the subgraph.
1821 1821
    /// It is the same as \ref status() "status(e, true)".
1822 1822
    void enable(const Edge& e) const { Parent::status(e, true); }
1823 1823

	
1824 1824
  };
1825 1825

	
1826 1826
  /// \brief Returns a read-only FilterEdges adaptor
1827 1827
  ///
1828 1828
  /// This function just returns a read-only \ref FilterEdges adaptor.
1829 1829
  /// \ingroup graph_adaptors
1830 1830
  /// \relates FilterEdges
1831 1831
  template<typename GR, typename EF>
1832 1832
  FilterEdges<const GR, EF>
1833 1833
  filterEdges(const GR& graph, EF& edge_filter) {
1834 1834
    return FilterEdges<const GR, EF>(graph, edge_filter);
1835 1835
  }
1836 1836

	
1837 1837
  template<typename GR, typename EF>
1838 1838
  FilterEdges<const GR, const EF>
1839 1839
  filterEdges(const GR& graph, const EF& edge_filter) {
1840 1840
    return FilterEdges<const GR, const EF>(graph, edge_filter);
1841 1841
  }
1842 1842

	
1843 1843

	
1844 1844
  template <typename DGR>
1845 1845
  class UndirectorBase {
1846 1846
  public:
1847 1847
    typedef DGR Digraph;
1848 1848
    typedef UndirectorBase Adaptor;
1849 1849

	
1850 1850
    typedef True UndirectedTag;
1851 1851

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

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

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

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

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

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

	
1871 1871
      bool operator==(const Arc &other) const {
1872 1872
        return _forward == other._forward && _edge == other._edge;
1873 1873
      }
1874 1874
      bool operator!=(const Arc &other) const {
1875 1875
        return _forward != other._forward || _edge != other._edge;
1876 1876
      }
1877 1877
      bool operator<(const Arc &other) const {
1878 1878
        return _forward < other._forward ||
1879 1879
          (_forward == other._forward && _edge < other._edge);
1880 1880
      }
1881 1881
    };
1882 1882

	
1883 1883
    void first(Node& n) const {
1884 1884
      _digraph->first(n);
1885 1885
    }
1886 1886

	
1887 1887
    void next(Node& n) const {
1888 1888
      _digraph->next(n);
1889 1889
    }
1890 1890

	
1891 1891
    void first(Arc& a) const {
1892 1892
      _digraph->first(a._edge);
1893 1893
      a._forward = true;
1894 1894
    }
1895 1895

	
1896 1896
    void next(Arc& a) const {
1897 1897
      if (a._forward) {
1898 1898
        a._forward = false;
1899 1899
      } else {
1900 1900
        _digraph->next(a._edge);
1901 1901
        a._forward = true;
1902 1902
      }
1903 1903
    }
1904 1904

	
1905 1905
    void first(Edge& e) const {
1906 1906
      _digraph->first(e);
1907 1907
    }
1908 1908

	
1909 1909
    void next(Edge& e) const {
1910 1910
      _digraph->next(e);
1911 1911
    }
1912 1912

	
1913 1913
    void firstOut(Arc& a, const Node& n) const {
1914 1914
      _digraph->firstIn(a._edge, n);
1915 1915
      if (a._edge != INVALID ) {
1916 1916
        a._forward = false;
1917 1917
      } else {
1918 1918
        _digraph->firstOut(a._edge, n);
1919 1919
        a._forward = true;
1920 1920
      }
1921 1921
    }
1922 1922
    void nextOut(Arc &a) const {
1923 1923
      if (!a._forward) {
1924 1924
        Node n = _digraph->target(a._edge);
1925 1925
        _digraph->nextIn(a._edge);
1926 1926
        if (a._edge == INVALID) {
1927 1927
          _digraph->firstOut(a._edge, n);
1928 1928
          a._forward = true;
1929 1929
        }
1930 1930
      }
1931 1931
      else {
1932 1932
        _digraph->nextOut(a._edge);
1933 1933
      }
1934 1934
    }
1935 1935

	
1936 1936
    void firstIn(Arc &a, const Node &n) const {
1937 1937
      _digraph->firstOut(a._edge, n);
1938 1938
      if (a._edge != INVALID ) {
1939 1939
        a._forward = false;
1940 1940
      } else {
1941 1941
        _digraph->firstIn(a._edge, n);
1942 1942
        a._forward = true;
1943 1943
      }
1944 1944
    }
1945 1945
    void nextIn(Arc &a) const {
1946 1946
      if (!a._forward) {
1947 1947
        Node n = _digraph->source(a._edge);
1948 1948
        _digraph->nextOut(a._edge);
1949 1949
        if (a._edge == INVALID ) {
1950 1950
          _digraph->firstIn(a._edge, n);
1951 1951
          a._forward = true;
1952 1952
        }
1953 1953
      }
1954 1954
      else {
1955 1955
        _digraph->nextIn(a._edge);
1956 1956
      }
1957 1957
    }
1958 1958

	
1959 1959
    void firstInc(Edge &e, bool &d, const Node &n) const {
1960 1960
      d = true;
1961 1961
      _digraph->firstOut(e, n);
1962 1962
      if (e != INVALID) return;
1963 1963
      d = false;
1964 1964
      _digraph->firstIn(e, n);
1965 1965
    }
1966 1966

	
1967 1967
    void nextInc(Edge &e, bool &d) const {
1968 1968
      if (d) {
1969 1969
        Node s = _digraph->source(e);
1970 1970
        _digraph->nextOut(e);
1971 1971
        if (e != INVALID) return;
1972 1972
        d = false;
1973 1973
        _digraph->firstIn(e, s);
1974 1974
      } else {
1975 1975
        _digraph->nextIn(e);
1976 1976
      }
1977 1977
    }
1978 1978

	
1979 1979
    Node u(const Edge& e) const {
1980 1980
      return _digraph->source(e);
1981 1981
    }
1982 1982

	
1983 1983
    Node v(const Edge& e) const {
1984 1984
      return _digraph->target(e);
1985 1985
    }
1986 1986

	
1987 1987
    Node source(const Arc &a) const {
1988 1988
      return a._forward ? _digraph->source(a._edge) : _digraph->target(a._edge);
1989 1989
    }
1990 1990

	
1991 1991
    Node target(const Arc &a) const {
1992 1992
      return a._forward ? _digraph->target(a._edge) : _digraph->source(a._edge);
1993 1993
    }
1994 1994

	
1995 1995
    static Arc direct(const Edge &e, bool d) {
1996 1996
      return Arc(e, d);
1997 1997
    }
1998 1998

	
1999 1999
    static bool direction(const Arc &a) { return a._forward; }
2000 2000

	
2001 2001
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
2002 2002
    Arc arcFromId(int ix) const {
2003 2003
      return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
2004 2004
    }
2005 2005
    Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
2006 2006

	
2007 2007
    int id(const Node &n) const { return _digraph->id(n); }
2008 2008
    int id(const Arc &a) const {
2009 2009
      return  (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
2010 2010
    }
2011 2011
    int id(const Edge &e) const { return _digraph->id(e); }
2012 2012

	
2013 2013
    int maxNodeId() const { return _digraph->maxNodeId(); }
2014 2014
    int maxArcId() const { return (_digraph->maxArcId() << 1) | 1; }
2015 2015
    int maxEdgeId() const { return _digraph->maxArcId(); }
2016 2016

	
2017 2017
    Node addNode() { return _digraph->addNode(); }
2018 2018
    Edge addEdge(const Node& u, const Node& v) {
2019 2019
      return _digraph->addArc(u, v);
2020 2020
    }
2021 2021

	
2022 2022
    void erase(const Node& i) { _digraph->erase(i); }
2023 2023
    void erase(const Edge& i) { _digraph->erase(i); }
2024 2024

	
2025 2025
    void clear() { _digraph->clear(); }
2026 2026

	
2027 2027
    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
2028 2028
    int nodeNum() const { return _digraph->nodeNum(); }
2029 2029

	
2030 2030
    typedef ArcNumTagIndicator<Digraph> ArcNumTag;
2031 2031
    int arcNum() const { return 2 * _digraph->arcNum(); }
2032 2032

	
2033 2033
    typedef ArcNumTag EdgeNumTag;
2034 2034
    int edgeNum() const { return _digraph->arcNum(); }
2035 2035

	
2036 2036
    typedef FindArcTagIndicator<Digraph> FindArcTag;
2037 2037
    Arc findArc(Node s, Node t, Arc p = INVALID) const {
2038 2038
      if (p == INVALID) {
2039 2039
        Edge arc = _digraph->findArc(s, t);
2040 2040
        if (arc != INVALID) return direct(arc, true);
2041 2041
        arc = _digraph->findArc(t, s);
2042 2042
        if (arc != INVALID) return direct(arc, false);
2043 2043
      } else if (direction(p)) {
2044 2044
        Edge arc = _digraph->findArc(s, t, p);
2045 2045
        if (arc != INVALID) return direct(arc, true);
2046 2046
        arc = _digraph->findArc(t, s);
2047 2047
        if (arc != INVALID) return direct(arc, false);
2048 2048
      } else {
2049 2049
        Edge arc = _digraph->findArc(t, s, p);
2050 2050
        if (arc != INVALID) return direct(arc, false);
2051 2051
      }
2052 2052
      return INVALID;
2053 2053
    }
2054 2054

	
2055 2055
    typedef FindArcTag FindEdgeTag;
2056 2056
    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
2057 2057
      if (s != t) {
2058 2058
        if (p == INVALID) {
2059 2059
          Edge arc = _digraph->findArc(s, t);
2060 2060
          if (arc != INVALID) return arc;
2061 2061
          arc = _digraph->findArc(t, s);
2062 2062
          if (arc != INVALID) return arc;
2063 2063
        } else if (_digraph->source(p) == s) {
2064 2064
          Edge arc = _digraph->findArc(s, t, p);
2065 2065
          if (arc != INVALID) return arc;
2066 2066
          arc = _digraph->findArc(t, s);
2067 2067
          if (arc != INVALID) return arc;
2068 2068
        } else {
2069 2069
          Edge arc = _digraph->findArc(t, s, p);
2070 2070
          if (arc != INVALID) return arc;
2071 2071
        }
2072 2072
      } else {
2073 2073
        return _digraph->findArc(s, t, p);
2074 2074
      }
2075 2075
      return INVALID;
2076 2076
    }
2077 2077

	
2078 2078
  private:
2079 2079

	
2080 2080
    template <typename V>
2081 2081
    class ArcMapBase {
2082 2082
    private:
2083 2083

	
2084 2084
      typedef typename DGR::template ArcMap<V> MapImpl;
2085 2085

	
2086 2086
    public:
2087 2087

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

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

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

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

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

	
2112 2112
      ConstReturnValue operator[](const Arc& a) const {
2113 2113
        if (direction(a)) {
2114 2114
          return _forward[a];
2115 2115
        } else {
2116 2116
          return _backward[a];
2117 2117
        }
2118 2118
      }
2119 2119

	
2120 2120
      ReturnValue operator[](const Arc& a) {
2121 2121
        if (direction(a)) {
2122 2122
          return _forward[a];
2123 2123
        } else {
2124 2124
          return _backward[a];
2125 2125
        }
2126 2126
      }
2127 2127

	
2128 2128
    protected:
2129 2129

	
2130 2130
      MapImpl _forward, _backward;
2131 2131

	
2132 2132
    };
2133 2133

	
2134 2134
  public:
2135 2135

	
2136 2136
    template <typename V>
2137 2137
    class NodeMap : public DGR::template NodeMap<V> {
2138 2138
      typedef typename DGR::template NodeMap<V> Parent;
2139 2139

	
2140 2140
    public:
2141 2141
      typedef V Value;
2142 2142

	
2143 2143
      explicit NodeMap(const UndirectorBase<DGR>& adaptor)
2144 2144
        : Parent(*adaptor._digraph) {}
2145 2145

	
2146 2146
      NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2147 2147
        : Parent(*adaptor._digraph, value) { }
2148 2148

	
2149 2149
    private:
2150 2150
      NodeMap& operator=(const NodeMap& cmap) {
2151 2151
        return operator=<NodeMap>(cmap);
2152 2152
      }
2153 2153

	
2154 2154
      template <typename CMap>
2155 2155
      NodeMap& operator=(const CMap& cmap) {
2156 2156
        Parent::operator=(cmap);
2157 2157
        return *this;
2158 2158
      }
2159 2159

	
2160 2160
    };
2161 2161

	
2162 2162
    template <typename V>
2163 2163
    class ArcMap
2164 2164
      : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
2165 2165
      typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
2166 2166

	
2167 2167
    public:
2168 2168
      typedef V Value;
2169 2169

	
2170 2170
      explicit ArcMap(const UndirectorBase<DGR>& adaptor)
2171 2171
        : Parent(adaptor) {}
2172 2172

	
2173 2173
      ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
2174 2174
        : Parent(adaptor, value) {}
2175 2175

	
2176 2176
    private:
2177 2177
      ArcMap& operator=(const ArcMap& cmap) {
2178 2178
        return operator=<ArcMap>(cmap);
2179 2179
      }
2180 2180

	
2181 2181
      template <typename CMap>
2182 2182
      ArcMap& operator=(const CMap& cmap) {
2183 2183
        Parent::operator=(cmap);
2184 2184
        return *this;
2185 2185
      }
2186 2186
    };
2187 2187

	
2188 2188
    template <typename V>
2189 2189
    class EdgeMap : public Digraph::template ArcMap<V> {
2190 2190
      typedef typename Digraph::template ArcMap<V> Parent;
2191 2191

	
2192 2192
    public:
2193 2193
      typedef V Value;
2194 2194

	
2195 2195
      explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
2196 2196
        : Parent(*adaptor._digraph) {}
2197 2197

	
2198 2198
      EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2199 2199
        : Parent(*adaptor._digraph, value) {}
2200 2200

	
2201 2201
    private:
2202 2202
      EdgeMap& operator=(const EdgeMap& cmap) {
2203 2203
        return operator=<EdgeMap>(cmap);
2204 2204
      }
2205 2205

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

	
2212 2212
    };
2213 2213

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

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

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

	
2223 2223
  protected:
2224 2224

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

	
2227 2227
    DGR* _digraph;
2228 2228

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

	
2233 2233
  };
2234 2234

	
2235 2235
  /// \ingroup graph_adaptors
2236 2236
  ///
2237 2237
  /// \brief Adaptor class for viewing a digraph as an undirected graph.
2238 2238
  ///
2239 2239
  /// Undirector adaptor can be used for viewing a digraph as an undirected
2240 2240
  /// graph. All arcs of the underlying digraph are showed in the
2241 2241
  /// adaptor as an edge (and also as a pair of arcs, of course).
2242 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2243 2243
  ///
2244 2244
  /// The adapted digraph can also be modified through this adaptor
2245 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2246 2246
  /// parameter is set to be \c const.
2247 2247
  ///
2248 2248
  /// This class provides item counting in the same time as the adapted
2249 2249
  /// digraph structure.
2250 2250
  ///
2251 2251
  /// \tparam DGR The type of the adapted digraph.
2252 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2253 2253
  /// It can also be specified to be \c const.
2254 2254
  ///
2255 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2256 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
2257 2257
  /// and the \c Arc type of the adapted digraph are also convertible to
2258 2258
  /// each other.
2259 2259
  /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
2260 2260
  /// of the adapted digraph.)
2261 2261
  template<typename DGR>
2262 2262
#ifdef DOXYGEN
2263 2263
  class Undirector {
2264 2264
#else
2265 2265
  class Undirector :
2266 2266
    public GraphAdaptorExtender<UndirectorBase<DGR> > {
2267 2267
#endif
2268 2268
    typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
2269 2269
  public:
2270 2270
    /// The type of the adapted digraph.
2271 2271
    typedef DGR Digraph;
2272 2272
  protected:
2273 2273
    Undirector() { }
2274 2274
  public:
2275 2275

	
2276 2276
    /// \brief Constructor
2277 2277
    ///
2278 2278
    /// Creates an undirected graph from the given digraph.
2279 2279
    Undirector(DGR& digraph) {
2280 2280
      initialize(digraph);
2281 2281
    }
2282 2282

	
2283 2283
    /// \brief Arc map combined from two original arc maps
2284 2284
    ///
2285 2285
    /// This map adaptor class adapts two arc maps of the underlying
2286 2286
    /// digraph to get an arc map of the undirected graph.
2287 2287
    /// Its value type is inherited from the first arc map type (\c FW).
2288 2288
    /// \tparam FW The type of the "foward" arc map.
2289 2289
    /// \tparam BK The type of the "backward" arc map.
2290 2290
    template <typename FW, typename BK>
2291 2291
    class CombinedArcMap {
2292 2292
    public:
2293 2293

	
2294 2294
      /// The key type of the map
2295 2295
      typedef typename Parent::Arc Key;
2296 2296
      /// The value type of the map
2297 2297
      typedef typename FW::Value Value;
2298 2298

	
2299 2299
      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2300 2300

	
2301 2301
      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2302 2302
      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2303 2303
      typedef typename MapTraits<FW>::ReturnValue Reference;
2304 2304
      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2305 2305

	
2306 2306
      /// Constructor
2307 2307
      CombinedArcMap(FW& forward, BK& backward)
2308 2308
        : _forward(&forward), _backward(&backward) {}
2309 2309

	
2310 2310
      /// Sets the value associated with the given key.
2311 2311
      void set(const Key& e, const Value& a) {
2312 2312
        if (Parent::direction(e)) {
2313 2313
          _forward->set(e, a);
2314 2314
        } else {
2315 2315
          _backward->set(e, a);
2316 2316
        }
2317 2317
      }
2318 2318

	
2319 2319
      /// Returns the value associated with the given key.
2320 2320
      ConstReturnValue operator[](const Key& e) const {
2321 2321
        if (Parent::direction(e)) {
2322 2322
          return (*_forward)[e];
2323 2323
        } else {
2324 2324
          return (*_backward)[e];
2325 2325
        }
2326 2326
      }
2327 2327

	
2328 2328
      /// Returns a reference to the value associated with the given key.
2329 2329
      ReturnValue operator[](const Key& e) {
2330 2330
        if (Parent::direction(e)) {
2331 2331
          return (*_forward)[e];
2332 2332
        } else {
2333 2333
          return (*_backward)[e];
2334 2334
        }
2335 2335
      }
2336 2336

	
2337 2337
    protected:
2338 2338

	
2339 2339
      FW* _forward;
2340 2340
      BK* _backward;
2341 2341

	
2342 2342
    };
2343 2343

	
2344 2344
    /// \brief Returns a combined arc map
2345 2345
    ///
2346 2346
    /// This function just returns a combined arc map.
2347 2347
    template <typename FW, typename BK>
2348 2348
    static CombinedArcMap<FW, BK>
2349 2349
    combinedArcMap(FW& forward, BK& backward) {
2350 2350
      return CombinedArcMap<FW, BK>(forward, backward);
2351 2351
    }
2352 2352

	
2353 2353
    template <typename FW, typename BK>
2354 2354
    static CombinedArcMap<const FW, BK>
2355 2355
    combinedArcMap(const FW& forward, BK& backward) {
2356 2356
      return CombinedArcMap<const FW, BK>(forward, backward);
2357 2357
    }
2358 2358

	
2359 2359
    template <typename FW, typename BK>
2360 2360
    static CombinedArcMap<FW, const BK>
2361 2361
    combinedArcMap(FW& forward, const BK& backward) {
2362 2362
      return CombinedArcMap<FW, const BK>(forward, backward);
2363 2363
    }
2364 2364

	
2365 2365
    template <typename FW, typename BK>
2366 2366
    static CombinedArcMap<const FW, const BK>
2367 2367
    combinedArcMap(const FW& forward, const BK& backward) {
2368 2368
      return CombinedArcMap<const FW, const BK>(forward, backward);
2369 2369
    }
2370 2370

	
2371 2371
  };
2372 2372

	
2373 2373
  /// \brief Returns a read-only Undirector adaptor
2374 2374
  ///
2375 2375
  /// This function just returns a read-only \ref Undirector adaptor.
2376 2376
  /// \ingroup graph_adaptors
2377 2377
  /// \relates Undirector
2378 2378
  template<typename DGR>
2379 2379
  Undirector<const DGR> undirector(const DGR& digraph) {
2380 2380
    return Undirector<const DGR>(digraph);
2381 2381
  }
2382 2382

	
2383 2383

	
2384 2384
  template <typename GR, typename DM>
2385 2385
  class OrienterBase {
2386 2386
  public:
2387 2387

	
2388 2388
    typedef GR Graph;
2389 2389
    typedef DM DirectionMap;
2390 2390

	
2391 2391
    typedef typename GR::Node Node;
2392 2392
    typedef typename GR::Edge Arc;
2393 2393

	
2394 2394
    void reverseArc(const Arc& arc) {
2395 2395
      _direction->set(arc, !(*_direction)[arc]);
2396 2396
    }
2397 2397

	
2398 2398
    void first(Node& i) const { _graph->first(i); }
2399 2399
    void first(Arc& i) const { _graph->first(i); }
2400 2400
    void firstIn(Arc& i, const Node& n) const {
2401 2401
      bool d = true;
2402 2402
      _graph->firstInc(i, d, n);
2403 2403
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2404 2404
    }
2405 2405
    void firstOut(Arc& i, const Node& n ) const {
2406 2406
      bool d = true;
2407 2407
      _graph->firstInc(i, d, n);
2408 2408
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2409 2409
    }
2410 2410

	
2411 2411
    void next(Node& i) const { _graph->next(i); }
... ...
@@ -2539,524 +2539,524 @@
2539 2539
  /// \ingroup graph_adaptors
2540 2540
  ///
2541 2541
  /// \brief Adaptor class for orienting the edges of a graph to get a digraph
2542 2542
  ///
2543 2543
  /// Orienter adaptor can be used for orienting the edges of a graph to
2544 2544
  /// get a digraph. A \c bool edge map of the underlying graph must be
2545 2545
  /// specified, which define the direction of the arcs in the adaptor.
2546 2546
  /// The arcs can be easily reversed by the \c reverseArc() member function
2547 2547
  /// of the adaptor.
2548 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2549 2549
  ///
2550 2550
  /// The adapted graph can also be modified through this adaptor
2551 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2552 2552
  /// parameter is set to be \c const.
2553 2553
  ///
2554 2554
  /// This class provides item counting in the same time as the adapted
2555 2555
  /// graph structure.
2556 2556
  ///
2557 2557
  /// \tparam GR The type of the adapted graph.
2558 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2559 2559
  /// It can also be specified to be \c const.
2560 2560
  /// \tparam DM The type of the direction map.
2561 2561
  /// It must be a \c bool (or convertible) edge map of the
2562 2562
  /// adapted graph. The default type is
2563 2563
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2564 2564
  ///
2565 2565
  /// \note The \c Node type of this adaptor and the adapted graph are
2566 2566
  /// convertible to each other, moreover the \c Arc type of the adaptor
2567 2567
  /// and the \c Edge type of the adapted graph are also convertible to
2568 2568
  /// each other.
2569 2569
#ifdef DOXYGEN
2570 2570
  template<typename GR,
2571 2571
           typename DM>
2572 2572
  class Orienter {
2573 2573
#else
2574 2574
  template<typename GR,
2575 2575
           typename DM = typename GR::template EdgeMap<bool> >
2576 2576
  class Orienter :
2577 2577
    public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
2578 2578
#endif
2579 2579
    typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
2580 2580
  public:
2581 2581

	
2582 2582
    /// The type of the adapted graph.
2583 2583
    typedef GR Graph;
2584 2584
    /// The type of the direction edge map.
2585 2585
    typedef DM DirectionMap;
2586 2586

	
2587 2587
    typedef typename Parent::Arc Arc;
2588 2588

	
2589 2589
  protected:
2590 2590
    Orienter() { }
2591 2591

	
2592 2592
  public:
2593 2593

	
2594 2594
    /// \brief Constructor
2595 2595
    ///
2596 2596
    /// Constructor of the adaptor.
2597 2597
    Orienter(GR& graph, DM& direction) {
2598 2598
      Parent::initialize(graph, direction);
2599 2599
    }
2600 2600

	
2601 2601
    /// \brief Reverses the given arc
2602 2602
    ///
2603 2603
    /// This function reverses the given arc.
2604 2604
    /// It is done by simply negate the assigned value of \c a
2605 2605
    /// in the direction map.
2606 2606
    void reverseArc(const Arc& a) {
2607 2607
      Parent::reverseArc(a);
2608 2608
    }
2609 2609
  };
2610 2610

	
2611 2611
  /// \brief Returns a read-only Orienter adaptor
2612 2612
  ///
2613 2613
  /// This function just returns a read-only \ref Orienter adaptor.
2614 2614
  /// \ingroup graph_adaptors
2615 2615
  /// \relates Orienter
2616 2616
  template<typename GR, typename DM>
2617 2617
  Orienter<const GR, DM>
2618 2618
  orienter(const GR& graph, DM& direction) {
2619 2619
    return Orienter<const GR, DM>(graph, direction);
2620 2620
  }
2621 2621

	
2622 2622
  template<typename GR, typename DM>
2623 2623
  Orienter<const GR, const DM>
2624 2624
  orienter(const GR& graph, const DM& direction) {
2625 2625
    return Orienter<const GR, const DM>(graph, direction);
2626 2626
  }
2627 2627

	
2628 2628
  namespace _adaptor_bits {
2629 2629

	
2630 2630
    template <typename DGR, typename CM, typename FM, typename TL>
2631 2631
    class ResForwardFilter {
2632 2632
    public:
2633 2633

	
2634 2634
      typedef typename DGR::Arc Key;
2635 2635
      typedef bool Value;
2636 2636

	
2637 2637
    private:
2638 2638

	
2639 2639
      const CM* _capacity;
2640 2640
      const FM* _flow;
2641 2641
      TL _tolerance;
2642 2642

	
2643 2643
    public:
2644 2644

	
2645 2645
      ResForwardFilter(const CM& capacity, const FM& flow,
2646 2646
                       const TL& tolerance = TL())
2647 2647
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2648 2648

	
2649 2649
      bool operator[](const typename DGR::Arc& a) const {
2650 2650
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2651 2651
      }
2652 2652
    };
2653 2653

	
2654 2654
    template<typename DGR,typename CM, typename FM, typename TL>
2655 2655
    class ResBackwardFilter {
2656 2656
    public:
2657 2657

	
2658 2658
      typedef typename DGR::Arc Key;
2659 2659
      typedef bool Value;
2660 2660

	
2661 2661
    private:
2662 2662

	
2663 2663
      const CM* _capacity;
2664 2664
      const FM* _flow;
2665 2665
      TL _tolerance;
2666 2666

	
2667 2667
    public:
2668 2668

	
2669 2669
      ResBackwardFilter(const CM& capacity, const FM& flow,
2670 2670
                        const TL& tolerance = TL())
2671 2671
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2672 2672

	
2673 2673
      bool operator[](const typename DGR::Arc& a) const {
2674 2674
        return _tolerance.positive((*_flow)[a]);
2675 2675
      }
2676 2676
    };
2677 2677

	
2678 2678
  }
2679 2679

	
2680 2680
  /// \ingroup graph_adaptors
2681 2681
  ///
2682 2682
  /// \brief Adaptor class for composing the residual digraph for directed
2683 2683
  /// flow and circulation problems.
2684 2684
  ///
2685 2685
  /// ResidualDigraph can be used for composing the \e residual digraph
2686 2686
  /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2687 2687
  /// be a directed graph and let \f$ F \f$ be a number type.
2688 2688
  /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2689 2689
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2690 2690
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2691 2691
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2692 2692
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2693 2693
  /// called residual digraph.
2694 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2695 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2696 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2697 2697
  /// arcs).
2698 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2699 2699
  ///
2700 2700
  /// This class provides only linear time counting for nodes and arcs.
2701 2701
  ///
2702 2702
  /// \tparam DGR The type of the adapted digraph.
2703 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2704 2704
  /// It is implicitly \c const.
2705 2705
  /// \tparam CM The type of the capacity map.
2706 2706
  /// It must be an arc map of some numerical type, which defines
2707 2707
  /// the capacities in the flow problem. It is implicitly \c const.
2708 2708
  /// The default type is
2709 2709
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2710 2710
  /// \tparam FM The type of the flow map.
2711 2711
  /// It must be an arc map of some numerical type, which defines
2712 2712
  /// the flow values in the flow problem. The default type is \c CM.
2713 2713
  /// \tparam TL The tolerance type for handling inexact computation.
2714 2714
  /// The default tolerance type depends on the value type of the
2715 2715
  /// capacity map.
2716 2716
  ///
2717 2717
  /// \note This adaptor is implemented using Undirector and FilterArcs
2718 2718
  /// adaptors.
2719 2719
  ///
2720 2720
  /// \note The \c Node type of this adaptor and the adapted digraph are
2721 2721
  /// convertible to each other, moreover the \c Arc type of the adaptor
2722 2722
  /// is convertible to the \c Arc type of the adapted digraph.
2723 2723
#ifdef DOXYGEN
2724 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2725 2725
  class ResidualDigraph
2726 2726
#else
2727 2727
  template<typename DGR,
2728 2728
           typename CM = typename DGR::template ArcMap<int>,
2729 2729
           typename FM = CM,
2730 2730
           typename TL = Tolerance<typename CM::Value> >
2731
  class ResidualDigraph 
2731
  class ResidualDigraph
2732 2732
    : public SubDigraph<
2733 2733
        Undirector<const DGR>,
2734 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2735 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2736 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2737 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2738 2738
#endif
2739 2739
  {
2740 2740
  public:
2741 2741

	
2742 2742
    /// The type of the underlying digraph.
2743 2743
    typedef DGR Digraph;
2744 2744
    /// The type of the capacity map.
2745 2745
    typedef CM CapacityMap;
2746 2746
    /// The type of the flow map.
2747 2747
    typedef FM FlowMap;
2748 2748
    /// The tolerance type.
2749 2749
    typedef TL Tolerance;
2750 2750

	
2751 2751
    typedef typename CapacityMap::Value Value;
2752 2752
    typedef ResidualDigraph Adaptor;
2753 2753

	
2754 2754
  protected:
2755 2755

	
2756 2756
    typedef Undirector<const Digraph> Undirected;
2757 2757

	
2758 2758
    typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
2759 2759

	
2760 2760
    typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
2761 2761
                                            FM, TL> ForwardFilter;
2762 2762

	
2763 2763
    typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
2764 2764
                                             FM, TL> BackwardFilter;
2765 2765

	
2766 2766
    typedef typename Undirected::
2767 2767
      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2768 2768

	
2769 2769
    typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
2770 2770

	
2771 2771
    const CapacityMap* _capacity;
2772 2772
    FlowMap* _flow;
2773 2773

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

	
2780 2780
  public:
2781 2781

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

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

	
2799 2799
    /// \brief Returns the residual capacity of the given arc.
2800 2800
    ///
2801 2801
    /// Returns the residual capacity of the given arc.
2802 2802
    Value residualCapacity(const Arc& a) const {
2803 2803
      if (Undirected::direction(a)) {
2804 2804
        return (*_capacity)[a] - (*_flow)[a];
2805 2805
      } else {
2806 2806
        return (*_flow)[a];
2807 2807
      }
2808 2808
    }
2809 2809

	
2810 2810
    /// \brief Augments on the given arc in the residual digraph.
2811 2811
    ///
2812 2812
    /// Augments on the given arc in the residual digraph. It increases
2813 2813
    /// or decreases the flow value on the original arc according to the
2814 2814
    /// direction of the residual arc.
2815 2815
    void augment(const Arc& a, const Value& v) const {
2816 2816
      if (Undirected::direction(a)) {
2817 2817
        _flow->set(a, (*_flow)[a] + v);
2818 2818
      } else {
2819 2819
        _flow->set(a, (*_flow)[a] - v);
2820 2820
      }
2821 2821
    }
2822 2822

	
2823 2823
    /// \brief Returns \c true if the given residual arc is a forward arc.
2824 2824
    ///
2825 2825
    /// Returns \c true if the given residual arc has the same orientation
2826 2826
    /// as the original arc, i.e. it is a so called forward arc.
2827 2827
    static bool forward(const Arc& a) {
2828 2828
      return Undirected::direction(a);
2829 2829
    }
2830 2830

	
2831 2831
    /// \brief Returns \c true if the given residual arc is a backward arc.
2832 2832
    ///
2833 2833
    /// Returns \c true if the given residual arc has the opposite orientation
2834 2834
    /// than the original arc, i.e. it is a so called backward arc.
2835 2835
    static bool backward(const Arc& a) {
2836 2836
      return !Undirected::direction(a);
2837 2837
    }
2838 2838

	
2839 2839
    /// \brief Returns the forward oriented residual arc.
2840 2840
    ///
2841 2841
    /// Returns the forward oriented residual arc related to the given
2842 2842
    /// arc of the underlying digraph.
2843 2843
    static Arc forward(const typename Digraph::Arc& a) {
2844 2844
      return Undirected::direct(a, true);
2845 2845
    }
2846 2846

	
2847 2847
    /// \brief Returns the backward oriented residual arc.
2848 2848
    ///
2849 2849
    /// Returns the backward oriented residual arc related to the given
2850 2850
    /// arc of the underlying digraph.
2851 2851
    static Arc backward(const typename Digraph::Arc& a) {
2852 2852
      return Undirected::direct(a, false);
2853 2853
    }
2854 2854

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

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

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

	
2878 2878
    };
2879 2879

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

	
2887 2887
  };
2888 2888

	
2889 2889
  /// \brief Returns a (read-only) Residual adaptor
2890 2890
  ///
2891 2891
  /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
2892 2892
  /// \ingroup graph_adaptors
2893 2893
  /// \relates ResidualDigraph
2894 2894
    template<typename DGR, typename CM, typename FM>
2895 2895
  ResidualDigraph<DGR, CM, FM>
2896 2896
  residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
2897 2897
    return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
2898 2898
  }
2899 2899

	
2900 2900

	
2901 2901
  template <typename DGR>
2902 2902
  class SplitNodesBase {
2903 2903
    typedef DigraphAdaptorBase<const DGR> Parent;
2904 2904

	
2905 2905
  public:
2906 2906

	
2907 2907
    typedef DGR Digraph;
2908 2908
    typedef SplitNodesBase Adaptor;
2909 2909

	
2910 2910
    typedef typename DGR::Node DigraphNode;
2911 2911
    typedef typename DGR::Arc DigraphArc;
2912 2912

	
2913 2913
    class Node;
2914 2914
    class Arc;
2915 2915

	
2916 2916
  private:
2917 2917

	
2918 2918
    template <typename T> class NodeMapBase;
2919 2919
    template <typename T> class ArcMapBase;
2920 2920

	
2921 2921
  public:
2922 2922

	
2923 2923
    class Node : public DigraphNode {
2924 2924
      friend class SplitNodesBase;
2925 2925
      template <typename T> friend class NodeMapBase;
2926 2926
    private:
2927 2927

	
2928 2928
      bool _in;
2929 2929
      Node(DigraphNode node, bool in)
2930 2930
        : DigraphNode(node), _in(in) {}
2931 2931

	
2932 2932
    public:
2933 2933

	
2934 2934
      Node() {}
2935 2935
      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2936 2936

	
2937 2937
      bool operator==(const Node& node) const {
2938 2938
        return DigraphNode::operator==(node) && _in == node._in;
2939 2939
      }
2940 2940

	
2941 2941
      bool operator!=(const Node& node) const {
2942 2942
        return !(*this == node);
2943 2943
      }
2944 2944

	
2945 2945
      bool operator<(const Node& node) const {
2946 2946
        return DigraphNode::operator<(node) ||
2947 2947
          (DigraphNode::operator==(node) && _in < node._in);
2948 2948
      }
2949 2949
    };
2950 2950

	
2951 2951
    class Arc {
2952 2952
      friend class SplitNodesBase;
2953 2953
      template <typename T> friend class ArcMapBase;
2954 2954
    private:
2955 2955
      typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
2956 2956

	
2957 2957
      explicit Arc(const DigraphArc& arc) : _item(arc) {}
2958 2958
      explicit Arc(const DigraphNode& node) : _item(node) {}
2959 2959

	
2960 2960
      ArcImpl _item;
2961 2961

	
2962 2962
    public:
2963 2963
      Arc() {}
2964 2964
      Arc(Invalid) : _item(DigraphArc(INVALID)) {}
2965 2965

	
2966 2966
      bool operator==(const Arc& arc) const {
2967 2967
        if (_item.firstState()) {
2968 2968
          if (arc._item.firstState()) {
2969 2969
            return _item.first() == arc._item.first();
2970 2970
          }
2971 2971
        } else {
2972 2972
          if (arc._item.secondState()) {
2973 2973
            return _item.second() == arc._item.second();
2974 2974
          }
2975 2975
        }
2976 2976
        return false;
2977 2977
      }
2978 2978

	
2979 2979
      bool operator!=(const Arc& arc) const {
2980 2980
        return !(*this == arc);
2981 2981
      }
2982 2982

	
2983 2983
      bool operator<(const Arc& arc) const {
2984 2984
        if (_item.firstState()) {
2985 2985
          if (arc._item.firstState()) {
2986 2986
            return _item.first() < arc._item.first();
2987 2987
          }
2988 2988
          return false;
2989 2989
        } else {
2990 2990
          if (arc._item.secondState()) {
2991 2991
            return _item.second() < arc._item.second();
2992 2992
          }
2993 2993
          return true;
2994 2994
        }
2995 2995
      }
2996 2996

	
2997 2997
      operator DigraphArc() const { return _item.first(); }
2998 2998
      operator DigraphNode() const { return _item.second(); }
2999 2999

	
3000 3000
    };
3001 3001

	
3002 3002
    void first(Node& n) const {
3003 3003
      _digraph->first(n);
3004 3004
      n._in = true;
3005 3005
    }
3006 3006

	
3007 3007
    void next(Node& n) const {
3008 3008
      if (n._in) {
3009 3009
        n._in = false;
3010 3010
      } else {
3011 3011
        n._in = true;
3012 3012
        _digraph->next(n);
3013 3013
      }
3014 3014
    }
3015 3015

	
3016 3016
    void first(Arc& e) const {
3017 3017
      e._item.setSecond();
3018 3018
      _digraph->first(e._item.second());
3019 3019
      if (e._item.second() == INVALID) {
3020 3020
        e._item.setFirst();
3021 3021
        _digraph->first(e._item.first());
3022 3022
      }
3023 3023
    }
3024 3024

	
3025 3025
    void next(Arc& e) const {
3026 3026
      if (e._item.secondState()) {
3027 3027
        _digraph->next(e._item.second());
3028 3028
        if (e._item.second() == INVALID) {
3029 3029
          e._item.setFirst();
3030 3030
          _digraph->first(e._item.first());
3031 3031
        }
3032 3032
      } else {
3033 3033
        _digraph->next(e._item.first());
3034 3034
      }
3035 3035
    }
3036 3036

	
3037 3037
    void firstOut(Arc& e, const Node& n) const {
3038 3038
      if (n._in) {
3039 3039
        e._item.setSecond(n);
3040 3040
      } else {
3041 3041
        e._item.setFirst();
3042 3042
        _digraph->firstOut(e._item.first(), n);
3043 3043
      }
3044 3044
    }
3045 3045

	
3046 3046
    void nextOut(Arc& e) const {
3047 3047
      if (!e._item.firstState()) {
3048 3048
        e._item.setFirst(INVALID);
3049 3049
      } else {
3050 3050
        _digraph->nextOut(e._item.first());
3051 3051
      }
3052 3052
    }
3053 3053

	
3054 3054
    void firstIn(Arc& e, const Node& n) const {
3055 3055
      if (!n._in) {
3056 3056
        e._item.setSecond(n);
3057 3057
      } else {
3058 3058
        e._item.setFirst();
3059 3059
        _digraph->firstIn(e._item.first(), n);
3060 3060
      }
3061 3061
    }
3062 3062

	
... ...
@@ -3258,381 +3258,381 @@
3258 3258
      ArcImpl _arc_map;
3259 3259
      NodeImpl _node_map;
3260 3260
    };
3261 3261

	
3262 3262
  public:
3263 3263

	
3264 3264
    template <typename V>
3265 3265
    class NodeMap
3266 3266
      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
3267 3267
      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
3268 3268

	
3269 3269
    public:
3270 3270
      typedef V Value;
3271 3271

	
3272 3272
      NodeMap(const SplitNodesBase<DGR>& adaptor)
3273 3273
        : Parent(adaptor) {}
3274 3274

	
3275 3275
      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3276 3276
        : Parent(adaptor, value) {}
3277 3277

	
3278 3278
    private:
3279 3279
      NodeMap& operator=(const NodeMap& cmap) {
3280 3280
        return operator=<NodeMap>(cmap);
3281 3281
      }
3282 3282

	
3283 3283
      template <typename CMap>
3284 3284
      NodeMap& operator=(const CMap& cmap) {
3285 3285
        Parent::operator=(cmap);
3286 3286
        return *this;
3287 3287
      }
3288 3288
    };
3289 3289

	
3290 3290
    template <typename V>
3291 3291
    class ArcMap
3292 3292
      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
3293 3293
      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
3294 3294

	
3295 3295
    public:
3296 3296
      typedef V Value;
3297 3297

	
3298 3298
      ArcMap(const SplitNodesBase<DGR>& adaptor)
3299 3299
        : Parent(adaptor) {}
3300 3300

	
3301 3301
      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3302 3302
        : Parent(adaptor, value) {}
3303 3303

	
3304 3304
    private:
3305 3305
      ArcMap& operator=(const ArcMap& cmap) {
3306 3306
        return operator=<ArcMap>(cmap);
3307 3307
      }
3308 3308

	
3309 3309
      template <typename CMap>
3310 3310
      ArcMap& operator=(const CMap& cmap) {
3311 3311
        Parent::operator=(cmap);
3312 3312
        return *this;
3313 3313
      }
3314 3314
    };
3315 3315

	
3316 3316
  protected:
3317 3317

	
3318 3318
    SplitNodesBase() : _digraph(0) {}
3319 3319

	
3320 3320
    DGR* _digraph;
3321 3321

	
3322 3322
    void initialize(Digraph& digraph) {
3323 3323
      _digraph = &digraph;
3324 3324
    }
3325 3325

	
3326 3326
  };
3327 3327

	
3328 3328
  /// \ingroup graph_adaptors
3329 3329
  ///
3330 3330
  /// \brief Adaptor class for splitting the nodes of a digraph.
3331 3331
  ///
3332 3332
  /// SplitNodes adaptor can be used for splitting each node into an
3333 3333
  /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3334 3334
  /// replaces each node \f$ u \f$ in the digraph with two nodes,
3335 3335
  /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3336 3336
  /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3337 3337
  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3338 3338
  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3339 3339
  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3340 3340
  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3341 3341
  ///
3342 3342
  /// The aim of this class is running an algorithm with respect to node
3343 3343
  /// costs or capacities if the algorithm considers only arc costs or
3344 3344
  /// capacities directly.
3345 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3346 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3347 3347
  /// in the adaptor.
3348 3348
  ///
3349 3349
  /// This class provides item counting in the same time as the adapted
3350 3350
  /// digraph structure.
3351 3351
  ///
3352 3352
  /// \tparam DGR The type of the adapted digraph.
3353 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3354 3354
  /// It is implicitly \c const.
3355 3355
  ///
3356 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3357 3357
  /// type of the adapted digraph.
3358 3358
  template <typename DGR>
3359 3359
#ifdef DOXYGEN
3360 3360
  class SplitNodes {
3361 3361
#else
3362 3362
  class SplitNodes
3363 3363
    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3364 3364
#endif
3365 3365
    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3366 3366

	
3367 3367
  public:
3368 3368
    typedef DGR Digraph;
3369 3369

	
3370 3370
    typedef typename DGR::Node DigraphNode;
3371 3371
    typedef typename DGR::Arc DigraphArc;
3372 3372

	
3373 3373
    typedef typename Parent::Node Node;
3374 3374
    typedef typename Parent::Arc Arc;
3375 3375

	
3376 3376
    /// \brief Constructor
3377 3377
    ///
3378 3378
    /// Constructor of the adaptor.
3379 3379
    SplitNodes(const DGR& g) {
3380 3380
      Parent::initialize(g);
3381 3381
    }
3382 3382

	
3383 3383
    /// \brief Returns \c true if the given node is an in-node.
3384 3384
    ///
3385 3385
    /// Returns \c true if the given node is an in-node.
3386 3386
    static bool inNode(const Node& n) {
3387 3387
      return Parent::inNode(n);
3388 3388
    }
3389 3389

	
3390 3390
    /// \brief Returns \c true if the given node is an out-node.
3391 3391
    ///
3392 3392
    /// Returns \c true if the given node is an out-node.
3393 3393
    static bool outNode(const Node& n) {
3394 3394
      return Parent::outNode(n);
3395 3395
    }
3396 3396

	
3397 3397
    /// \brief Returns \c true if the given arc is an original arc.
3398 3398
    ///
3399 3399
    /// Returns \c true if the given arc is one of the arcs in the
3400 3400
    /// original digraph.
3401 3401
    static bool origArc(const Arc& a) {
3402 3402
      return Parent::origArc(a);
3403 3403
    }
3404 3404

	
3405 3405
    /// \brief Returns \c true if the given arc is a bind arc.
3406 3406
    ///
3407 3407
    /// Returns \c true if the given arc is a bind arc, i.e. it connects
3408 3408
    /// an in-node and an out-node.
3409 3409
    static bool bindArc(const Arc& a) {
3410 3410
      return Parent::bindArc(a);
3411 3411
    }
3412 3412

	
3413 3413
    /// \brief Returns the in-node created from the given original node.
3414 3414
    ///
3415 3415
    /// Returns the in-node created from the given original node.
3416 3416
    static Node inNode(const DigraphNode& n) {
3417 3417
      return Parent::inNode(n);
3418 3418
    }
3419 3419

	
3420 3420
    /// \brief Returns the out-node created from the given original node.
3421 3421
    ///
3422 3422
    /// Returns the out-node created from the given original node.
3423 3423
    static Node outNode(const DigraphNode& n) {
3424 3424
      return Parent::outNode(n);
3425 3425
    }
3426 3426

	
3427 3427
    /// \brief Returns the bind arc that corresponds to the given
3428 3428
    /// original node.
3429 3429
    ///
3430 3430
    /// Returns the bind arc in the adaptor that corresponds to the given
3431 3431
    /// original node, i.e. the arc connecting the in-node and out-node
3432 3432
    /// of \c n.
3433 3433
    static Arc arc(const DigraphNode& n) {
3434 3434
      return Parent::arc(n);
3435 3435
    }
3436 3436

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

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

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

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

	
3467 3467
      /// Constructor
3468 3468
      CombinedNodeMap(IN& in_map, OUT& out_map)
3469 3469
        : _in_map(in_map), _out_map(out_map) {}
3470 3470

	
3471 3471
      /// Returns the value associated with the given key.
3472 3472
      Value operator[](const Key& key) const {
3473 3473
        if (SplitNodesBase<const DGR>::inNode(key)) {
3474 3474
          return _in_map[key];
3475 3475
        } else {
3476 3476
          return _out_map[key];
3477 3477
        }
3478 3478
      }
3479 3479

	
3480 3480
      /// Returns a reference to the value associated with the given key.
3481 3481
      Value& operator[](const Key& key) {
3482 3482
        if (SplitNodesBase<const DGR>::inNode(key)) {
3483 3483
          return _in_map[key];
3484 3484
        } else {
3485 3485
          return _out_map[key];
3486 3486
        }
3487 3487
      }
3488 3488

	
3489 3489
      /// Sets the value associated with the given key.
3490 3490
      void set(const Key& key, const Value& value) {
3491 3491
        if (SplitNodesBase<const DGR>::inNode(key)) {
3492 3492
          _in_map.set(key, value);
3493 3493
        } else {
3494 3494
          _out_map.set(key, value);
3495 3495
        }
3496 3496
      }
3497 3497

	
3498 3498
    private:
3499 3499

	
3500 3500
      IN& _in_map;
3501 3501
      OUT& _out_map;
3502 3502

	
3503 3503
    };
3504 3504

	
3505 3505

	
3506 3506
    /// \brief Returns a combined node map
3507 3507
    ///
3508 3508
    /// This function just returns a combined node map.
3509 3509
    template <typename IN, typename OUT>
3510 3510
    static CombinedNodeMap<IN, OUT>
3511 3511
    combinedNodeMap(IN& in_map, OUT& out_map) {
3512 3512
      return CombinedNodeMap<IN, OUT>(in_map, out_map);
3513 3513
    }
3514 3514

	
3515 3515
    template <typename IN, typename OUT>
3516 3516
    static CombinedNodeMap<const IN, OUT>
3517 3517
    combinedNodeMap(const IN& in_map, OUT& out_map) {
3518 3518
      return CombinedNodeMap<const IN, OUT>(in_map, out_map);
3519 3519
    }
3520 3520

	
3521 3521
    template <typename IN, typename OUT>
3522 3522
    static CombinedNodeMap<IN, const OUT>
3523 3523
    combinedNodeMap(IN& in_map, const OUT& out_map) {
3524 3524
      return CombinedNodeMap<IN, const OUT>(in_map, out_map);
3525 3525
    }
3526 3526

	
3527 3527
    template <typename IN, typename OUT>
3528 3528
    static CombinedNodeMap<const IN, const OUT>
3529 3529
    combinedNodeMap(const IN& in_map, const OUT& out_map) {
3530 3530
      return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
3531 3531
    }
3532 3532

	
3533 3533
    /// \brief Arc map combined from an arc map and a node map of the
3534 3534
    /// original digraph.
3535 3535
    ///
3536 3536
    /// This map adaptor class adapts an arc map and a node map of the
3537 3537
    /// original digraph to get an arc map of the split digraph.
3538 3538
    /// Its value type is inherited from the original arc map type (\c AM).
3539 3539
    /// \tparam AM The type of the arc map.
3540 3540
    /// \tparam NM the type of the node map.
3541 3541
    template <typename AM, typename NM>
3542 3542
    class CombinedArcMap {
3543 3543
    public:
3544 3544

	
3545 3545
      /// The key type of the map
3546 3546
      typedef Arc Key;
3547 3547
      /// The value type of the map
3548 3548
      typedef typename AM::Value Value;
3549 3549

	
3550 3550
      typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
3551 3551
      typedef typename MapTraits<AM>::ReturnValue ReturnValue;
3552 3552
      typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
3553 3553
      typedef typename MapTraits<AM>::ReturnValue Reference;
3554 3554
      typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
3555 3555

	
3556 3556
      /// Constructor
3557 3557
      CombinedArcMap(AM& arc_map, NM& node_map)
3558 3558
        : _arc_map(arc_map), _node_map(node_map) {}
3559 3559

	
3560 3560
      /// Returns the value associated with the given key.
3561 3561
      Value operator[](const Key& arc) const {
3562 3562
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3563 3563
          return _arc_map[arc];
3564 3564
        } else {
3565 3565
          return _node_map[arc];
3566 3566
        }
3567 3567
      }
3568 3568

	
3569 3569
      /// Returns a reference to the value associated with the given key.
3570 3570
      Value& operator[](const Key& arc) {
3571 3571
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3572 3572
          return _arc_map[arc];
3573 3573
        } else {
3574 3574
          return _node_map[arc];
3575 3575
        }
3576 3576
      }
3577 3577

	
3578 3578
      /// Sets the value associated with the given key.
3579 3579
      void set(const Arc& arc, const Value& val) {
3580 3580
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3581 3581
          _arc_map.set(arc, val);
3582 3582
        } else {
3583 3583
          _node_map.set(arc, val);
3584 3584
        }
3585 3585
      }
3586 3586

	
3587 3587
    private:
3588 3588

	
3589 3589
      AM& _arc_map;
3590 3590
      NM& _node_map;
3591 3591

	
3592 3592
    };
3593 3593

	
3594 3594
    /// \brief Returns a combined arc map
3595 3595
    ///
3596 3596
    /// This function just returns a combined arc map.
3597 3597
    template <typename ArcMap, typename NodeMap>
3598 3598
    static CombinedArcMap<ArcMap, NodeMap>
3599 3599
    combinedArcMap(ArcMap& arc_map, NodeMap& node_map) {
3600 3600
      return CombinedArcMap<ArcMap, NodeMap>(arc_map, node_map);
3601 3601
    }
3602 3602

	
3603 3603
    template <typename ArcMap, typename NodeMap>
3604 3604
    static CombinedArcMap<const ArcMap, NodeMap>
3605 3605
    combinedArcMap(const ArcMap& arc_map, NodeMap& node_map) {
3606 3606
      return CombinedArcMap<const ArcMap, NodeMap>(arc_map, node_map);
3607 3607
    }
3608 3608

	
3609 3609
    template <typename ArcMap, typename NodeMap>
3610 3610
    static CombinedArcMap<ArcMap, const NodeMap>
3611 3611
    combinedArcMap(ArcMap& arc_map, const NodeMap& node_map) {
3612 3612
      return CombinedArcMap<ArcMap, const NodeMap>(arc_map, node_map);
3613 3613
    }
3614 3614

	
3615 3615
    template <typename ArcMap, typename NodeMap>
3616 3616
    static CombinedArcMap<const ArcMap, const NodeMap>
3617 3617
    combinedArcMap(const ArcMap& arc_map, const NodeMap& node_map) {
3618 3618
      return CombinedArcMap<const ArcMap, const NodeMap>(arc_map, node_map);
3619 3619
    }
3620 3620

	
3621 3621
  };
3622 3622

	
3623 3623
  /// \brief Returns a (read-only) SplitNodes adaptor
3624 3624
  ///
3625 3625
  /// This function just returns a (read-only) \ref SplitNodes adaptor.
3626 3626
  /// \ingroup graph_adaptors
3627 3627
  /// \relates SplitNodes
3628 3628
  template<typename DGR>
3629 3629
  SplitNodes<DGR>
3630 3630
  splitNodes(const DGR& digraph) {
3631 3631
    return SplitNodes<DGR>(digraph);
3632 3632
  }
3633 3633

	
3634 3634
#undef LEMON_SCOPE_FIX
3635 3635

	
3636 3636
} //namespace lemon
3637 3637

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

	
19 19
#include <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

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

	
30

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

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

	
45 45
  ArgParser::~ArgParser()
46 46
  {
47 47
    for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
48 48
      if(i->second.self_delete)
49 49
        switch(i->second.type) {
50 50
        case BOOL:
51 51
          delete i->second.bool_p;
52 52
          break;
53 53
        case STRING:
54 54
          delete i->second.string_p;
55 55
          break;
56 56
        case DOUBLE:
57 57
          delete i->second.double_p;
58 58
          break;
59 59
        case INTEGER:
60 60
          delete i->second.int_p;
61 61
          break;
62 62
        case UNKNOWN:
63 63
          break;
64 64
        case FUNC:
65 65
          break;
66 66
        }
67 67
  }
68 68

	
69 69

	
70 70
  ArgParser &ArgParser::intOption(const std::string &name,
71 71
                               const std::string &help,
72 72
                               int value, bool obl)
73 73
  {
74 74
    ParData p;
75 75
    p.int_p=new int(value);
76 76
    p.self_delete=true;
77 77
    p.help=help;
78 78
    p.type=INTEGER;
79 79
    p.mandatory=obl;
80 80
    _opts[name]=p;
81 81
    return *this;
82 82
  }
83 83

	
84 84
  ArgParser &ArgParser::doubleOption(const std::string &name,
85 85
                               const std::string &help,
86 86
                               double value, bool obl)
87 87
  {
88 88
    ParData p;
89 89
    p.double_p=new double(value);
90 90
    p.self_delete=true;
91 91
    p.help=help;
92 92
    p.type=DOUBLE;
93 93
    p.mandatory=obl;
94 94
    _opts[name]=p;
95 95
    return *this;
96 96
  }
97 97

	
98 98
  ArgParser &ArgParser::boolOption(const std::string &name,
99 99
                               const std::string &help,
100 100
                               bool value, bool obl)
101 101
  {
102 102
    ParData p;
103 103
    p.bool_p=new bool(value);
104 104
    p.self_delete=true;
105 105
    p.help=help;
106 106
    p.type=BOOL;
107 107
    p.mandatory=obl;
108 108
    _opts[name]=p;
109 109
    return *this;
110 110
  }
111 111

	
112 112
  ArgParser &ArgParser::stringOption(const std::string &name,
113 113
                               const std::string &help,
114 114
                               std::string value, bool obl)
115 115
  {
116 116
    ParData p;
117 117
    p.string_p=new std::string(value);
118 118
    p.self_delete=true;
119 119
    p.help=help;
120 120
    p.type=STRING;
121 121
    p.mandatory=obl;
122 122
    _opts[name]=p;
123 123
    return *this;
124 124
  }
125 125

	
126 126
  ArgParser &ArgParser::refOption(const std::string &name,
127 127
                               const std::string &help,
128 128
                               int &ref, bool obl)
129 129
  {
130 130
    ParData p;
131 131
    p.int_p=&ref;
132 132
    p.self_delete=false;
133 133
    p.help=help;
134 134
    p.type=INTEGER;
135 135
    p.mandatory=obl;
136 136
    _opts[name]=p;
137 137
    return *this;
138 138
  }
139 139

	
140 140
  ArgParser &ArgParser::refOption(const std::string &name,
141 141
                                  const std::string &help,
142 142
                                  double &ref, bool obl)
143 143
  {
144 144
    ParData p;
145 145
    p.double_p=&ref;
146 146
    p.self_delete=false;
147 147
    p.help=help;
148 148
    p.type=DOUBLE;
149 149
    p.mandatory=obl;
150 150
    _opts[name]=p;
151 151
    return *this;
152 152
  }
153 153

	
154 154
  ArgParser &ArgParser::refOption(const std::string &name,
155 155
                                  const std::string &help,
156 156
                                  bool &ref, bool obl)
157 157
  {
158 158
    ParData p;
159 159
    p.bool_p=&ref;
160 160
    p.self_delete=false;
161 161
    p.help=help;
162 162
    p.type=BOOL;
163 163
    p.mandatory=obl;
164 164
    _opts[name]=p;
165 165

	
166 166
    ref = false;
167 167

	
168 168
    return *this;
169 169
  }
170 170

	
171 171
  ArgParser &ArgParser::refOption(const std::string &name,
172 172
                               const std::string &help,
173 173
                               std::string &ref, bool obl)
174 174
  {
175 175
    ParData p;
176 176
    p.string_p=&ref;
177 177
    p.self_delete=false;
178 178
    p.help=help;
179 179
    p.type=STRING;
180 180
    p.mandatory=obl;
181 181
    _opts[name]=p;
182 182
    return *this;
183 183
  }
184 184

	
185 185
  ArgParser &ArgParser::funcOption(const std::string &name,
186 186
                               const std::string &help,
187 187
                               void (*func)(void *),void *data)
188 188
  {
189 189
    ParData p;
190 190
    p.func_p.p=func;
191 191
    p.func_p.data=data;
192 192
    p.self_delete=false;
193 193
    p.help=help;
194 194
    p.type=FUNC;
195 195
    p.mandatory=false;
196 196
    _opts[name]=p;
197 197
    return *this;
198 198
  }
199 199

	
200 200
  ArgParser &ArgParser::optionGroup(const std::string &group,
201 201
                                    const std::string &opt)
202 202
  {
203 203
    Opts::iterator i = _opts.find(opt);
204 204
    LEMON_ASSERT(i!=_opts.end(), "Unknown option: '"+opt+"'");
205 205
    LEMON_ASSERT(!(i->second.ingroup),
206 206
                 "Option already in option group: '"+opt+"'");
207 207
    GroupData &g=_groups[group];
208 208
    g.opts.push_back(opt);
209 209
    i->second.ingroup=true;
210 210
    return *this;
211 211
  }
212 212

	
213 213
  ArgParser &ArgParser::onlyOneGroup(const std::string &group)
214 214
  {
215 215
    GroupData &g=_groups[group];
216 216
    g.only_one=true;
217 217
    return *this;
218 218
  }
219 219

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

	
19 19
#ifndef LEMON_ARG_PARSER_H
20 20
#define LEMON_ARG_PARSER_H
21 21

	
22 22
#include <vector>
23 23
#include <map>
24 24
#include <list>
25 25
#include <string>
26 26
#include <iostream>
27 27
#include <sstream>
28 28
#include <algorithm>
29 29
#include <lemon/assert.h>
30 30

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

	
35 35
namespace lemon {
36 36

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

	
46 46
  private:
47 47
    Reason _reason;
48
    
48

	
49 49
  public:
50 50
    ///Constructor
51 51
    ArgParserException(Reason r) throw() : _reason(r) {}
52 52
    ///Virtual destructor
53 53
    virtual ~ArgParserException() throw() {}
54 54
    ///A short description of the exception
55 55
    virtual const char* what() const throw() {
56 56
      switch(_reason)
57 57
        {
58 58
        case HELP:
59 59
          return "lemon::ArgParseException: ask for help";
60 60
          break;
61 61
        case UNKNOWN_OPT:
62 62
          return "lemon::ArgParseException: unknown option";
63 63
          break;
64 64
        case INVALID_OPT:
65 65
          return "lemon::ArgParseException: invalid combination of options";
66 66
          break;
67 67
        }
68 68
      return "";
69 69
    }
70 70
    ///Return the reason for the failure
71 71
    Reason reason() const {return _reason; }
72 72
  };
73 73

	
74 74

	
75 75
  ///Command line arguments parser
76 76

	
77 77
  ///\ingroup misc
78 78
  ///Command line arguments parser.
79 79
  ///
80 80
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
81 81
  class ArgParser {
82 82

	
83 83
    static void _showHelp(void *p);
84 84
  protected:
85 85

	
86 86
    int _argc;
87 87
    const char * const *_argv;
88 88

	
89 89
    enum OptType { UNKNOWN=0, BOOL=1, STRING=2, DOUBLE=3, INTEGER=4, FUNC=5 };
90 90

	
91 91
    class ParData {
92 92
    public:
93 93
      union {
94 94
        bool *bool_p;
95 95
        int *int_p;
96 96
        double *double_p;
97 97
        std::string *string_p;
98 98
        struct {
99 99
          void (*p)(void *);
100 100
          void *data;
101 101
        } func_p;
102 102

	
103 103
      };
104 104
      std::string help;
105 105
      bool mandatory;
106 106
      OptType type;
107 107
      bool set;
108 108
      bool ingroup;
109 109
      bool has_syn;
110 110
      bool syn;
111 111
      bool self_delete;
112 112
      ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false),
113 113
                  has_syn(false), syn(false), self_delete(false) {}
114 114
    };
115 115

	
116 116
    typedef std::map<std::string,ParData> Opts;
117 117
    Opts _opts;
118 118

	
119 119
    class GroupData
120 120
    {
121 121
    public:
122 122
      typedef std::list<std::string> Opts;
123 123
      Opts opts;
124 124
      bool only_one;
125 125
      bool mandatory;
126 126
      GroupData() :only_one(false), mandatory(false) {}
127 127
    };
128 128

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

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

	
138 138
    };
139 139

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

	
144
    
144

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

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

	
157 157
    bool _exit_on_problems;
158
    
158

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

	
161 161
  public:
162 162

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

	
166 166
    ~ArgParser();
167 167

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

	
171 171
    ///@{
172 172

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

	
175 175
    ///Add a new integer type option.
176 176
    ///\param name The name of the option. The leading '-' must be omitted.
177 177
    ///\param help A help string.
178 178
    ///\param value A default value for the option.
179 179
    ///\param obl Indicate if the option is mandatory.
180 180
    ArgParser &intOption(const std::string &name,
181 181
                    const std::string &help,
182 182
                    int value=0, bool obl=false);
183 183

	
184 184
    ///Add a new floating point type option
185 185

	
186 186
    ///Add a new floating point type option.
187 187
    ///\param name The name of the option. The leading '-' must be omitted.
188 188
    ///\param help A help string.
189 189
    ///\param value A default value for the option.
190 190
    ///\param obl Indicate if the option is mandatory.
191 191
    ArgParser &doubleOption(const std::string &name,
192 192
                      const std::string &help,
193 193
                      double value=0, bool obl=false);
194 194

	
195 195
    ///Add a new bool type option
196 196

	
197 197
    ///Add a new bool type option.
198 198
    ///\param name The name of the option. The leading '-' must be omitted.
199 199
    ///\param help A help string.
200 200
    ///\param value A default value for the option.
201 201
    ///\param obl Indicate if the option is mandatory.
202 202
    ///\note A mandatory bool obtion is of very little use.
203 203
    ArgParser &boolOption(const std::string &name,
204 204
                      const std::string &help,
205 205
                      bool value=false, bool obl=false);
206 206

	
207 207
    ///Add a new string type option
208 208

	
209 209
    ///Add a new string type option.
210 210
    ///\param name The name of the option. The leading '-' must be omitted.
211 211
    ///\param help A help string.
212 212
    ///\param value A default value for the option.
213 213
    ///\param obl Indicate if the option is mandatory.
214 214
    ArgParser &stringOption(const std::string &name,
215 215
                      const std::string &help,
216 216
                      std::string value="", bool obl=false);
217 217

	
218 218
    ///Give help string for non-parsed arguments.
219 219

	
220 220
    ///With this function you can give help string for non-parsed arguments.
221 221
    ///The parameter \c name will be printed in the short usage line, while
222 222
    ///\c help gives a more detailed description.
223 223
    ArgParser &other(const std::string &name,
224 224
                     const std::string &help="");
225 225

	
226 226
    ///@}
227 227

	
228 228
    ///\name Options with External Storage
229 229
    ///Using this functions, the value of the option will be directly written
230 230
    ///into a variable once the option appears in the command line.
231 231

	
232 232
    ///@{
233 233

	
234 234
    ///Add a new integer type option with a storage reference
235 235

	
236 236
    ///Add a new integer type option with a storage reference.
237 237
    ///\param name The name of the option. The leading '-' must be omitted.
238 238
    ///\param help A help string.
239 239
    ///\param obl Indicate if the option is mandatory.
240 240
    ///\retval ref The value of the argument will be written to this variable.
241 241
    ArgParser &refOption(const std::string &name,
242 242
                    const std::string &help,
243 243
                    int &ref, bool obl=false);
244 244

	
245 245
    ///Add a new floating type option with a storage reference
246 246

	
247 247
    ///Add a new floating type option with a storage reference.
248 248
    ///\param name The name of the option. The leading '-' must be omitted.
249 249
    ///\param help A help string.
250 250
    ///\param obl Indicate if the option is mandatory.
251 251
    ///\retval ref The value of the argument will be written to this variable.
252 252
    ArgParser &refOption(const std::string &name,
253 253
                      const std::string &help,
254 254
                      double &ref, bool obl=false);
255 255

	
256 256
    ///Add a new bool type option with a storage reference
257 257

	
258 258
    ///Add a new bool type option with a storage reference.
259 259
    ///\param name The name of the option. The leading '-' must be omitted.
260 260
    ///\param help A help string.
261 261
    ///\param obl Indicate if the option is mandatory.
262 262
    ///\retval ref The value of the argument will be written to this variable.
263 263
    ///\note A mandatory bool obtion is of very little use.
264 264
    ArgParser &refOption(const std::string &name,
265 265
                      const std::string &help,
266 266
                      bool &ref, bool obl=false);
267 267

	
268 268
    ///Add a new string type option with a storage reference
269 269

	
270 270
    ///Add a new string type option with a storage reference.
271 271
    ///\param name The name of the option. The leading '-' must be omitted.
272 272
    ///\param help A help string.
273 273
    ///\param obl Indicate if the option is mandatory.
274 274
    ///\retval ref The value of the argument will be written to this variable.
275 275
    ArgParser &refOption(const std::string &name,
276 276
                      const std::string &help,
277 277
                      std::string &ref, bool obl=false);
278 278

	
279 279
    ///@}
280 280

	
281 281
    ///\name Option Groups and Synonyms
282 282
    ///
283 283

	
284 284
    ///@{
285 285

	
286 286
    ///Bundle some options into a group
287 287

	
288 288
    /// You can group some option by calling this function repeatedly for each
289 289
    /// option to be grouped with the same groupname.
290 290
    ///\param group The group name.
291 291
    ///\param opt The option name.
292 292
    ArgParser &optionGroup(const std::string &group,
293 293
                           const std::string &opt);
294 294

	
295 295
    ///Make the members of a group exclusive
296 296

	
297 297
    ///If you call this function for a group, than at most one of them can be
298 298
    ///given at the same time.
299 299
    ArgParser &onlyOneGroup(const std::string &group);
300 300

	
301 301
    ///Make a group mandatory
302 302

	
303 303
    ///Using this function, at least one of the members of \c group
304 304
    ///must be given.
305 305
    ArgParser &mandatoryGroup(const std::string &group);
306 306

	
307 307
    ///Create synonym to an option
308 308

	
309 309
    ///With this function you can create a synonym \c syn of the
310 310
    ///option \c opt.
311 311
    ArgParser &synonym(const std::string &syn,
312 312
                           const std::string &opt);
313 313

	
314 314
    ///@}
315 315

	
316 316
  private:
317 317
    void show(std::ostream &os,Opts::const_iterator i) const;
318 318
    void show(std::ostream &os,Groups::const_iterator i) const;
319 319
    void showHelp(Opts::const_iterator i) const;
320 320
    void showHelp(std::vector<OtherArg>::const_iterator i) const;
321 321

	
322 322
    void unknownOpt(std::string arg) const;
323 323

	
324 324
    void requiresValue(std::string arg, OptType t) const;
325 325
    void checkMandatories() const;
326 326

	
327 327
    void shortHelp() const;
328 328
    void showHelp() const;
329 329
  public:
330 330

	
331 331
    ///Start the parsing process
332 332
    ArgParser &parse();
333 333

	
334 334
    /// Synonym for parse()
335 335
    ArgParser &run()
336 336
    {
337 337
      return parse();
338 338
    }
339 339

	
340 340
    ///Give back the command name (the 0th argument)
341 341
    const std::string &commandName() const { return _command_name; }
342 342

	
343 343
    ///Check if an opion has been given to the command.
344 344
    bool given(std::string op) const
345 345
    {
346 346
      Opts::const_iterator i = _opts.find(op);
347 347
      return i!=_opts.end()?i->second.set:false;
348 348
    }
349 349

	
350 350

	
351 351
    ///Magic type for operator[]
352 352

	
353 353
    ///This is the type of the return value of ArgParser::operator[]().
354 354
    ///It automatically converts to \c int, \c double, \c bool or
355 355
    ///\c std::string if the type of the option matches, which is checked
356 356
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
357 357
    ///type checking).
358 358
    class RefType
359 359
    {
360 360
      const ArgParser &_parser;
361 361
      std::string _name;
362 362
    public:
363 363
      ///\e
364 364
      RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
365 365
      ///\e
366 366
      operator bool()
367 367
      {
368 368
        Opts::const_iterator i = _parser._opts.find(_name);
369 369
        LEMON_ASSERT(i!=_parser._opts.end(),
370 370
                     std::string()+"Unkown option: '"+_name+"'");
371 371
        LEMON_ASSERT(i->second.type==ArgParser::BOOL,
372 372
                     std::string()+"'"+_name+"' is a bool option");
373 373
        return *(i->second.bool_p);
374 374
      }
375 375
      ///\e
376 376
      operator std::string()
377 377
      {
378 378
        Opts::const_iterator i = _parser._opts.find(_name);
379 379
        LEMON_ASSERT(i!=_parser._opts.end(),
380 380
                     std::string()+"Unkown option: '"+_name+"'");
381 381
        LEMON_ASSERT(i->second.type==ArgParser::STRING,
382 382
                     std::string()+"'"+_name+"' is a string option");
383 383
        return *(i->second.string_p);
384 384
      }
385 385
      ///\e
386 386
      operator double()
387 387
      {
388 388
        Opts::const_iterator i = _parser._opts.find(_name);
389 389
        LEMON_ASSERT(i!=_parser._opts.end(),
390 390
                     std::string()+"Unkown option: '"+_name+"'");
391 391
        LEMON_ASSERT(i->second.type==ArgParser::DOUBLE ||
392 392
                     i->second.type==ArgParser::INTEGER,
393 393
                     std::string()+"'"+_name+"' is a floating point option");
394 394
        return i->second.type==ArgParser::DOUBLE ?
395 395
          *(i->second.double_p) : *(i->second.int_p);
396 396
      }
397 397
      ///\e
398 398
      operator int()
399 399
      {
400 400
        Opts::const_iterator i = _parser._opts.find(_name);
401 401
        LEMON_ASSERT(i!=_parser._opts.end(),
402 402
                     std::string()+"Unkown option: '"+_name+"'");
403 403
        LEMON_ASSERT(i->second.type==ArgParser::INTEGER,
404 404
                     std::string()+"'"+_name+"' is an integer option");
405 405
        return *(i->second.int_p);
406 406
      }
407 407

	
408 408
    };
409 409

	
410 410
    ///Give back the value of an option
411 411

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

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

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

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

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

	
19 19
#ifndef LEMON_BELLMAN_FORD_H
20 20
#define LEMON_BELLMAN_FORD_H
21 21

	
22 22
/// \ingroup shortest_path
23 23
/// \file
24 24
/// \brief Bellman-Ford algorithm.
25 25

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

	
34 34
#include <limits>
35 35

	
36 36
namespace lemon {
37 37

	
38 38
  /// \brief Default operation traits for the BellmanFord algorithm class.
39
  ///  
39
  ///
40 40
  /// This operation traits class defines all computational operations
41 41
  /// and constants that are used in the Bellman-Ford algorithm.
42 42
  /// The default implementation is based on the \c numeric_limits class.
43 43
  /// If the numeric type does not have infinity value, then the maximum
44 44
  /// value is used as extremal infinity value.
45 45
  ///
46 46
  /// \see BellmanFordToleranceOperationTraits
47 47
  template <
48
    typename V, 
48
    typename V,
49 49
    bool has_inf = std::numeric_limits<V>::has_infinity>
50 50
  struct BellmanFordDefaultOperationTraits {
51 51
    /// \brief Value type for the algorithm.
52 52
    typedef V Value;
53 53
    /// \brief Gives back the zero value of the type.
54 54
    static Value zero() {
55 55
      return static_cast<Value>(0);
56 56
    }
57 57
    /// \brief Gives back the positive infinity value of the type.
58 58
    static Value infinity() {
59 59
      return std::numeric_limits<Value>::infinity();
60 60
    }
61 61
    /// \brief Gives back the sum of the given two elements.
62 62
    static Value plus(const Value& left, const Value& right) {
63 63
      return left + right;
64 64
    }
65 65
    /// \brief Gives back \c true only if the first value is less than
66 66
    /// the second.
67 67
    static bool less(const Value& left, const Value& right) {
68 68
      return left < right;
69 69
    }
70 70
  };
71 71

	
72 72
  template <typename V>
73 73
  struct BellmanFordDefaultOperationTraits<V, false> {
74 74
    typedef V Value;
75 75
    static Value zero() {
76 76
      return static_cast<Value>(0);
77 77
    }
78 78
    static Value infinity() {
79 79
      return std::numeric_limits<Value>::max();
80 80
    }
81 81
    static Value plus(const Value& left, const Value& right) {
82 82
      if (left == infinity() || right == infinity()) return infinity();
83 83
      return left + right;
84 84
    }
85 85
    static bool less(const Value& left, const Value& right) {
86 86
      return left < right;
87 87
    }
88 88
  };
89
  
89

	
90 90
  /// \brief Operation traits for the BellmanFord algorithm class
91 91
  /// using tolerance.
92 92
  ///
93 93
  /// This operation traits class defines all computational operations
94 94
  /// and constants that are used in the Bellman-Ford algorithm.
95 95
  /// The only difference between this implementation and
96 96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97 97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98 98
  /// function.
99 99
  ///
100 100
  /// \tparam V The value type.
101 101
  /// \tparam eps The epsilon value for the \ref less() function.
102 102
  /// By default, it is the epsilon value used by \ref Tolerance
103 103
  /// "Tolerance<V>".
104 104
  ///
105 105
  /// \see BellmanFordDefaultOperationTraits
106 106
#ifdef DOXYGEN
107 107
  template <typename V, V eps>
108 108
#else
109 109
  template <
110 110
    typename V,
111 111
    V eps = Tolerance<V>::def_epsilon>
112 112
#endif
113 113
  struct BellmanFordToleranceOperationTraits {
114 114
    /// \brief Value type for the algorithm.
115 115
    typedef V Value;
116 116
    /// \brief Gives back the zero value of the type.
117 117
    static Value zero() {
118 118
      return static_cast<Value>(0);
119 119
    }
120 120
    /// \brief Gives back the positive infinity value of the type.
121 121
    static Value infinity() {
122 122
      return std::numeric_limits<Value>::infinity();
123 123
    }
124 124
    /// \brief Gives back the sum of the given two elements.
125 125
    static Value plus(const Value& left, const Value& right) {
126 126
      return left + right;
127 127
    }
128 128
    /// \brief Gives back \c true only if the first value is less than
129 129
    /// the second.
130 130
    static bool less(const Value& left, const Value& right) {
131 131
      return left + eps < right;
132 132
    }
133 133
  };
134 134

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

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

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

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

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

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

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

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

	
194 194
  };
195
  
195

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

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

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

	
256 256
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
257 257
    typedef TR Traits;
258 258

	
259 259
  private:
260 260

	
261 261
    typedef typename Digraph::Node Node;
262 262
    typedef typename Digraph::NodeIt NodeIt;
263 263
    typedef typename Digraph::Arc Arc;
264 264
    typedef typename Digraph::OutArcIt OutArcIt;
265 265

	
266 266
    // Pointer to the underlying digraph.
267 267
    const Digraph *_gr;
268 268
    // Pointer to the length map
269 269
    const LengthMap *_length;
270 270
    // Pointer to the map of predecessors arcs.
271 271
    PredMap *_pred;
272 272
    // Indicates if _pred is locally allocated (true) or not.
273 273
    bool _local_pred;
274 274
    // Pointer to the map of distances.
275 275
    DistMap *_dist;
276 276
    // Indicates if _dist is locally allocated (true) or not.
277 277
    bool _local_dist;
278 278

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

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

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

	
299 299
  public :
300
 
300

	
301 301
    typedef BellmanFord Create;
302 302

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

	
305 305
    ///@{
306 306

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

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

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

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

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

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

	
367 367
    ///@}
368 368

	
369 369
  protected:
370
    
370

	
371 371
    BellmanFord() {}
372 372

	
373
  public:      
374
    
373
  public:
374

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

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

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

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

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

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

	
445 445
    ///@{
446 446

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

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

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

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

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

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

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

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

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

	
686 686
    ///@}
687 687

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

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

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

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

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

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

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

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

	
746 746
    ///@{
747 747

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

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

	
772 772
    /// \brief Returns the 'previous arc' of the shortest path tree for
773 773
    /// the given node.
774 774
    ///
775 775
    /// This function returns the 'previous arc' of the shortest path
776 776
    /// tree for node \c v, i.e. it returns the last arc of a
777 777
    /// shortest path from a root to \c v. It is \c INVALID if \c v
778 778
    /// is not reached from the root(s) or if \c v is a root.
779 779
    ///
780 780
    /// The shortest path tree used here is equal to the shortest path
781 781
    /// tree used in \ref predNode() and \ref predMap().
782 782
    ///
783 783
    /// \pre Either \ref run() or \ref init() must be called before
784 784
    /// using this function.
785 785
    Arc predArc(Node v) const { return (*_pred)[v]; }
786 786

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
966 966
    /// Constructor.
967
    
967

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

	
978 978
  };
979
  
979

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

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

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

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

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

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

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

	
1027 1027
    ~BellmanFordWizard() {}
1028 1028

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

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

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

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

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

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

	
1101 1101
    template<class T>
1102 1102
    struct SetPathBase : public Base {
1103 1103
      typedef T Path;
1104 1104
      SetPathBase(const TR &b) : TR(b) {}
1105 1105
    };
1106 1106

	
1107 1107
    /// \brief \ref named-func-param "Named parameter" for getting
1108 1108
    /// the shortest path to the target node.
1109 1109
    ///
1110 1110
    /// \ref named-func-param "Named parameter" for getting
1111 1111
    /// the shortest path to the target node.
1112 1112
    template<class T>
1113 1113
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1114 1114
    {
1115 1115
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1116 1116
      return BellmanFordWizard<SetPathBase<T> >(*this);
1117 1117
    }
1118 1118

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

	
1130 1130
  };
1131
  
1131

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

	
1162 1162
} //END OF NAMESPACE LEMON
1163 1163

	
1164 1164
#endif
1165 1165

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

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

	
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 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
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 88
    ///Instantiates a \c ReachedMap.
88 89

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

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

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

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

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

	
115 116
  ///\ingroup search
116 117
  ///This class provides an efficient implementation of the %BFS algorithm.
117 118
  ///
118 119
  ///There is also a \ref bfs() "function-type interface" for the BFS
119 120
  ///algorithm, which is convenient in the simplier cases and it can be
120 121
  ///used easier.
121 122
  ///
122 123
  ///\tparam GR The type of the digraph the algorithm runs on.
123 124
  ///The default type is \ref ListDigraph.
124 125
  ///\tparam TR The traits class that defines various types used by the
125 126
  ///algorithm. By default, it is \ref BfsDefaultTraits
126 127
  ///"BfsDefaultTraits<GR>".
127 128
  ///In most cases, this parameter should not be set directly,
128 129
  ///consider to use the named template parameters instead.
129 130
#ifdef DOXYGEN
130 131
  template <typename GR,
131 132
            typename TR>
132 133
#else
133 134
  template <typename GR=ListDigraph,
134 135
            typename TR=BfsDefaultTraits<GR> >
135 136
#endif
136 137
  class Bfs {
137 138
  public:
138 139

	
139 140
    ///The type of the digraph the algorithm runs on.
140 141
    typedef typename TR::Digraph Digraph;
141 142

	
142 143
    ///\brief The type of the map that stores the predecessor arcs of the
143 144
    ///shortest paths.
144 145
    typedef typename TR::PredMap PredMap;
145 146
    ///The type of the map that stores the distances of the nodes.
146 147
    typedef typename TR::DistMap DistMap;
147 148
    ///The type of the map that indicates which nodes are reached.
148 149
    typedef typename TR::ReachedMap ReachedMap;
149 150
    ///The type of the map that indicates which nodes are processed.
150 151
    typedef typename TR::ProcessedMap ProcessedMap;
151 152
    ///The type of the paths.
152 153
    typedef PredMapPath<Digraph, PredMap> Path;
153 154

	
154 155
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
155 156
    typedef TR Traits;
156 157

	
157 158
  private:
158 159

	
159 160
    typedef typename Digraph::Node Node;
160 161
    typedef typename Digraph::NodeIt NodeIt;
161 162
    typedef typename Digraph::Arc Arc;
162 163
    typedef typename Digraph::OutArcIt OutArcIt;
163 164

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

	
183 184
    std::vector<typename Digraph::Node> _queue;
184 185
    int _queue_head,_queue_tail,_queue_next_dist;
185 186
    int _curr_dist;
186 187

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

	
208 209
  protected:
209 210

	
210 211
    Bfs() {}
211 212

	
212 213
  public:
213 214

	
214 215
    typedef Bfs Create;
215 216

	
216 217
    ///\name Named Template Parameters
217 218

	
218 219
    ///@{
219 220

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

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

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

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

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

	
319 321
    ///@}
320 322

	
321 323
  public:
322 324

	
323 325
    ///Constructor.
324 326

	
325 327
    ///Constructor.
326 328
    ///\param g The digraph the algorithm runs on.
327 329
    Bfs(const Digraph &g) :
328 330
      G(&g),
329 331
      _pred(NULL), local_pred(false),
330 332
      _dist(NULL), local_dist(false),
331 333
      _reached(NULL), local_reached(false),
332 334
      _processed(NULL), local_processed(false)
333 335
    { }
334 336

	
335 337
    ///Destructor.
336 338
    ~Bfs()
337 339
    {
338 340
      if(local_pred) delete _pred;
339 341
      if(local_dist) delete _dist;
340 342
      if(local_reached) delete _reached;
341 343
      if(local_processed) delete _processed;
342 344
    }
343 345

	
344 346
    ///Sets the map that stores the predecessor arcs.
345 347

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

	
362 364
    ///Sets the map that indicates which nodes are reached.
363 365

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

	
380 382
    ///Sets the map that indicates which nodes are processed.
381 383

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

	
398 400
    ///Sets the map that stores the distances of the nodes.
399 401

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

	
417 419
  public:
418 420

	
419 421
    ///\name Execution Control
420 422
    ///The simplest way to execute the BFS algorithm is to use one of the
421 423
    ///member functions called \ref run(Node) "run()".\n
422 424
    ///If you need better control on the execution, you have to call
423 425
    ///\ref init() first, then you can add several source nodes with
424 426
    ///\ref addSource(). Finally the actual path computation can be
425 427
    ///performed with one of the \ref start() functions.
426 428

	
427 429
    ///@{
428 430

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

	
445 447
    ///Adds a new source node.
446 448

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

	
461 463
    ///Processes the next node.
462 464

	
463 465
    ///Processes the next node.
464 466
    ///
465 467
    ///\return The processed node.
466 468
    ///
... ...
@@ -683,385 +685,386 @@
683 685
    }
684 686

	
685 687
    ///Finds the shortest path between \c s and \c t.
686 688

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

	
707 709
    ///Runs the algorithm to visit all nodes in the digraph.
708 710

	
709 711
    ///This method runs the %BFS algorithm in order to visit all nodes
710 712
    ///in the digraph.
711 713
    ///
712 714
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
713 715
    ///\code
714 716
    ///  b.init();
715 717
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
716 718
    ///    if (!b.reached(n)) {
717 719
    ///      b.addSource(n);
718 720
    ///      b.start();
719 721
    ///    }
720 722
    ///  }
721 723
    ///\endcode
722 724
    void run() {
723 725
      init();
724 726
      for (NodeIt n(*G); n != INVALID; ++n) {
725 727
        if (!reached(n)) {
726 728
          addSource(n);
727 729
          start();
728 730
        }
729 731
      }
730 732
    }
731 733

	
732 734
    ///@}
733 735

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

	
740 742
    ///@{
741 743

	
742 744
    ///The shortest path to the given node.
743 745

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

	
752 754
    ///The distance of the given node from the root(s).
753 755

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

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

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

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

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

	
814 816
    ///Checks if the given node is reached from the root(s).
815 817

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

	
822 824
    ///@}
823 825
  };
824 826

	
825 827
  ///Default traits class of bfs() function.
826 828

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

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

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

	
852 854
    ///The type of the map that indicates which nodes are processed.
853 855

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

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

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

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

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

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

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

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

	
902 905
    ///The type of the shortest paths.
903 906

	
904 907
    ///The type of the shortest paths.
905 908
    ///It must conform to the \ref concepts::Path "Path" concept.
906 909
    typedef lemon::Path<Digraph> Path;
907 910
  };
908 911

	
909 912
  /// Default traits class used by BfsWizard
910 913

	
911 914
  /// Default traits class used by BfsWizard.
912 915
  /// \tparam GR The type of the digraph.
913 916
  template<class GR>
914 917
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 918
  {
916 919

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

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

	
937 940
    public:
938 941
    /// Constructor.
939 942

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

	
945 948
    /// Constructor.
946 949

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

	
954 957
  };
955 958

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

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

	
973 976
    typedef typename TR::Digraph Digraph;
974 977

	
975 978
    typedef typename Digraph::Node Node;
976 979
    typedef typename Digraph::NodeIt NodeIt;
977 980
    typedef typename Digraph::Arc Arc;
978 981
    typedef typename Digraph::OutArcIt OutArcIt;
979 982

	
980 983
    typedef typename TR::PredMap PredMap;
981 984
    typedef typename TR::DistMap DistMap;
982 985
    typedef typename TR::ReachedMap ReachedMap;
983 986
    typedef typename TR::ProcessedMap ProcessedMap;
984 987
    typedef typename TR::Path Path;
985 988

	
986 989
  public:
987 990

	
988 991
    /// Constructor.
989 992
    BfsWizard() : TR() {}
990 993

	
991 994
    /// Constructor that requires parameters.
992 995

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

	
999 1002
    ///Copy constructor
1000 1003
    BfsWizard(const TR &b) : TR(b) {}
1001 1004

	
1002 1005
    ~BfsWizard() {}
1003 1006

	
1004 1007
    ///Runs BFS algorithm from the given source node.
1005 1008

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

	
1025 1028
    ///Finds the shortest path between \c s and \c t.
1026 1029

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

	
1051 1054
    ///Runs BFS algorithm to visit all nodes in the digraph.
1052 1055

	
1053 1056
    ///This method runs BFS algorithm in order to visit all nodes
1054 1057
    ///in the digraph.
1055 1058
    void run()
1056 1059
    {
1057 1060
      run(INVALID);
1058 1061
    }
1059 1062

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

	
1067 1070
    ///\brief \ref named-templ-param "Named parameter" for setting
... ...
@@ -1076,385 +1079,386 @@
1076 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1077 1080
    }
1078 1081

	
1079 1082
    template<class T>
1080 1083
    struct SetReachedMapBase : public Base {
1081 1084
      typedef T ReachedMap;
1082 1085
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1083 1086
      SetReachedMapBase(const TR &b) : TR(b) {}
1084 1087
    };
1085 1088

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

	
1098 1101
    template<class T>
1099 1102
    struct SetDistMapBase : public Base {
1100 1103
      typedef T DistMap;
1101 1104
      static DistMap *createDistMap(const Digraph &) { return 0; };
1102 1105
      SetDistMapBase(const TR &b) : TR(b) {}
1103 1106
    };
1104 1107

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

	
1118 1121
    template<class T>
1119 1122
    struct SetProcessedMapBase : public Base {
1120 1123
      typedef T ProcessedMap;
1121 1124
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1125
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1126
    };
1124 1127

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

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

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

	
1165 1168
  };
1166 1169

	
1167 1170
  ///Function-type interface for BFS algorithm.
1168 1171

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

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

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

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

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

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

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

	
1280 1284
  };
1281 1285

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

	
1321 1325
    ///The traits class.
1322 1326
    typedef TR Traits;
1323 1327

	
1324 1328
    ///The type of the digraph the algorithm runs on.
1325 1329
    typedef typename Traits::Digraph Digraph;
1326 1330

	
1327 1331
    ///The visitor type used by the algorithm.
1328 1332
    typedef VS Visitor;
1329 1333

	
1330 1334
    ///The type of the map that indicates which nodes are reached.
1331 1335
    typedef typename Traits::ReachedMap ReachedMap;
1332 1336

	
1333 1337
  private:
1334 1338

	
1335 1339
    typedef typename Digraph::Node Node;
1336 1340
    typedef typename Digraph::NodeIt NodeIt;
1337 1341
    typedef typename Digraph::Arc Arc;
1338 1342
    typedef typename Digraph::OutArcIt OutArcIt;
1339 1343

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

	
1349 1353
    std::vector<typename Digraph::Node> _list;
1350 1354
    int _list_front, _list_back;
1351 1355

	
1352 1356
    //Creates the maps if necessary.
1353 1357
    void create_maps() {
1354 1358
      if(!_reached) {
1355 1359
        local_reached = true;
1356 1360
        _reached = Traits::createReachedMap(*_digraph);
1357 1361
      }
1358 1362
    }
1359 1363

	
1360 1364
  protected:
1361 1365

	
1362 1366
    BfsVisit() {}
1363 1367

	
1364 1368
  public:
1365 1369

	
1366 1370
    typedef BfsVisit Create;
1367 1371

	
1368 1372
    /// \name Named Template Parameters
1369 1373

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

	
1390 1394
  public:
1391 1395

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

	
1402 1406
    /// \brief Destructor.
1403 1407
    ~BfsVisit() {
1404 1408
      if(local_reached) delete _reached;
1405 1409
    }
1406 1410

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

	
1424 1428
  public:
1425 1429

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

	
1434 1438
    /// @{
1435 1439

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

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

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

	
19 19
#ifndef LEMON_BINOMIAL_HEAP_H
20 20
#define LEMON_BINOMIAL_HEAP_H
21 21

	
22 22
///\file
23 23
///\ingroup heaps
24 24
///\brief Binomial Heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29
#include <lemon/math.h>
30 30
#include <lemon/counter.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \ingroup heaps
35 35
  ///
36 36
  ///\brief Binomial heap data structure.
37 37
  ///
38 38
  /// This class implements the \e binomial \e heap data structure.
39 39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40 40
  ///
41 41
  /// The methods \ref increase() and \ref erase() are not efficient
42 42
  /// in a binomial heap. In case of many calls of these operations,
43 43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44 44
  /// "binary heap".
45 45
  ///
46 46
  /// \tparam PR Type of the priorities of the items.
47 47
  /// \tparam IM A read-writable item map with \c int values, used
48 48
  /// internally to handle the cross references.
49 49
  /// \tparam CMP A functor class for comparing the priorities.
50 50
  /// The default is \c std::less<PR>.
51 51
#ifdef DOXYGEN
52 52
  template <typename PR, typename IM, typename CMP>
53 53
#else
54 54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55 55
#endif
56 56
  class BinomialHeap {
57 57
  public:
58 58
    /// Type of the item-int map.
59 59
    typedef IM ItemIntMap;
60 60
    /// Type of the priorities.
61 61
    typedef PR Prio;
62 62
    /// Type of the items stored in the heap.
63 63
    typedef typename ItemIntMap::Key Item;
64 64
    /// Functor type for comparing the priorities.
65 65
    typedef CMP Compare;
66 66

	
67 67
    /// \brief Type to represent the states of the items.
68 68
    ///
69 69
    /// Each item has a state associated to it. It can be "in heap",
70 70
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 71
    /// heap's point of view, but may be useful to the user.
72 72
    ///
73 73
    /// The item-int map must be initialized in such way that it assigns
74 74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 75
    enum State {
76 76
      IN_HEAP = 0,    ///< = 0.
77 77
      PRE_HEAP = -1,  ///< = -1.
78 78
      POST_HEAP = -2  ///< = -2.
79 79
    };
80 80

	
81 81
  private:
82 82
    class Store;
83 83

	
84 84
    std::vector<Store> _data;
85 85
    int _min, _head;
86 86
    ItemIntMap &_iim;
87 87
    Compare _comp;
88 88
    int _num_items;
89 89

	
90 90
  public:
91 91
    /// \brief Constructor.
92 92
    ///
93 93
    /// Constructor.
94 94
    /// \param map A map that assigns \c int values to the items.
95 95
    /// It is used internally to handle the cross references.
96 96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97 97
    explicit BinomialHeap(ItemIntMap &map)
98 98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99 99

	
100 100
    /// \brief Constructor.
101 101
    ///
102 102
    /// Constructor.
103 103
    /// \param map A map that assigns \c int values to the items.
104 104
    /// It is used internally to handle the cross references.
105 105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106 106
    /// \param comp The function object used for comparing the priorities.
107 107
    BinomialHeap(ItemIntMap &map, const Compare &comp)
108 108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109 109

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

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

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

	
131 131
    /// \brief Set the priority of an item or insert it, if it is
132 132
    /// not stored in the heap.
133 133
    ///
134 134
    /// This method sets the priority of the given item if it is
135 135
    /// already stored in the heap. Otherwise it inserts the given
136 136
    /// item into the heap with the given priority.
137 137
    /// \param item The item.
138 138
    /// \param value The priority.
139 139
    void set (const Item& item, const Prio& value) {
140 140
      int i=_iim[item];
141 141
      if ( i >= 0 && _data[i].in ) {
142 142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143 143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144 144
      } else push(item, value);
145 145
    }
146 146

	
147 147
    /// \brief Insert an item into the heap with the given priority.
148 148
    ///
149 149
    /// This function inserts the given item into the heap with the
150 150
    /// given priority.
151 151
    /// \param item The item to insert.
152 152
    /// \param value The priority of the item.
153 153
    /// \pre \e item must not be stored in the heap.
154 154
    void push (const Item& item, const Prio& value) {
155 155
      int i=_iim[item];
156 156
      if ( i<0 ) {
157 157
        int s=_data.size();
158 158
        _iim.set( item,s );
159 159
        Store st;
160 160
        st.name=item;
161 161
        st.prio=value;
162 162
        _data.push_back(st);
163 163
        i=s;
164 164
      }
165 165
      else {
166 166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167 167
        _data[i].degree=0;
168 168
        _data[i].in=true;
169 169
        _data[i].prio=value;
170 170
      }
171 171

	
172 172
      if( 0==_num_items ) {
173 173
        _head=i;
174 174
        _min=i;
175 175
      } else {
176 176
        merge(i);
177 177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178 178
      }
179 179
      ++_num_items;
180 180
    }
181 181

	
182 182
    /// \brief Return the item having minimum priority.
183 183
    ///
184 184
    /// This function returns the item having minimum priority.
185 185
    /// \pre The heap must be non-empty.
186 186
    Item top() const { return _data[_min].name; }
187 187

	
188 188
    /// \brief The minimum priority.
189 189
    ///
190 190
    /// This function returns the minimum priority.
191 191
    /// \pre The heap must be non-empty.
192 192
    Prio prio() const { return _data[_min].prio; }
193 193

	
194 194
    /// \brief The priority of the given item.
195 195
    ///
196 196
    /// This function returns the priority of the given item.
197 197
    /// \param item The item.
198 198
    /// \pre \e item must be in the heap.
199 199
    const Prio& operator[](const Item& item) const {
200 200
      return _data[_iim[item]].prio;
201 201
    }
202 202

	
203 203
    /// \brief Remove the item having minimum priority.
204 204
    ///
205 205
    /// This function removes the item having minimum priority.
206 206
    /// \pre The heap must be non-empty.
207 207
    void pop() {
208 208
      _data[_min].in=false;
209 209

	
210 210
      int head_child=-1;
211 211
      if ( _data[_min].child!=-1 ) {
212 212
        int child=_data[_min].child;
213 213
        int neighb;
214 214
        while( child!=-1 ) {
215 215
          neighb=_data[child].right_neighbor;
216 216
          _data[child].parent=-1;
217 217
          _data[child].right_neighbor=head_child;
218 218
          head_child=child;
219 219
          child=neighb;
220 220
        }
221 221
      }
222 222

	
223 223
      if ( _data[_head].right_neighbor==-1 ) {
224 224
        // there was only one root
225 225
        _head=head_child;
226 226
      }
227 227
      else {
228 228
        // there were more roots
229 229
        if( _head!=_min )  { unlace(_min); }
230 230
        else { _head=_data[_head].right_neighbor; }
231 231
        merge(head_child);
232 232
      }
233 233
      _min=findMin();
234 234
      --_num_items;
235 235
    }
236 236

	
237 237
    /// \brief Remove the given item from the heap.
238 238
    ///
239 239
    /// This function removes the given item from the heap if it is
240 240
    /// already stored.
241 241
    /// \param item The item to delete.
242 242
    /// \pre \e item must be in the heap.
243 243
    void erase (const Item& item) {
244 244
      int i=_iim[item];
245 245
      if ( i >= 0 && _data[i].in ) {
246 246
        decrease( item, _data[_min].prio-1 );
247 247
        pop();
248 248
      }
249 249
    }
250 250

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

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

	
275 275
    /// \brief Increase the priority of an item to the given value.
276 276
    ///
277 277
    /// This function increases the priority of an item to the given value.
278 278
    /// \param item The item.
279 279
    /// \param value The priority.
280 280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281 281
    void increase (Item item, const Prio& value) {
282 282
      erase(item);
283 283
      push(item, value);
284 284
    }
285 285

	
286 286
    /// \brief Return the state of an item.
287 287
    ///
288 288
    /// This method returns \c PRE_HEAP if the given item has never
289 289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290 290
    /// and \c POST_HEAP otherwise.
291 291
    /// In the latter case it is possible that the item will get back
292 292
    /// to the heap again.
293 293
    /// \param item The item.
294 294
    State state(const Item &item) const {
295 295
      int i=_iim[item];
296 296
      if( i>=0 ) {
297 297
        if ( _data[i].in ) i=0;
298 298
        else i=-2;
299 299
      }
300 300
      return State(i);
301 301
    }
302 302

	
303 303
    /// \brief Set the state of an item in the heap.
304 304
    ///
305 305
    /// This function sets the state of the given item in the heap.
306 306
    /// It can be used to manually clear the heap when it is important
307 307
    /// to achive better time complexity.
308 308
    /// \param i The item.
309 309
    /// \param st The state. It should not be \c IN_HEAP.
310 310
    void state(const Item& i, State st) {
311 311
      switch (st) {
312 312
      case POST_HEAP:
313 313
      case PRE_HEAP:
314 314
        if (state(i) == IN_HEAP) {
315 315
          erase(i);
316 316
        }
317 317
        _iim[i] = st;
318 318
        break;
319 319
      case IN_HEAP:
320 320
        break;
321 321
      }
322 322
    }
323 323

	
324 324
  private:
325
    
325

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

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

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

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

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

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

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

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

	
414 414
    // Unlace node a (if it has siblings)
415 415
    void unlace(int a) {
416 416
      int neighb=_data[a].right_neighbor;
417 417
      int other=_head;
418 418

	
419 419
      while( _data[other].right_neighbor!=a )
420 420
        other=_data[other].right_neighbor;
421 421
      _data[other].right_neighbor=neighb;
422 422
    }
423 423

	
424 424
  private:
425 425

	
426 426
    class Store {
427 427
      friend class BinomialHeap;
428 428

	
429 429
      Item name;
430 430
      int parent;
431 431
      int right_neighbor;
432 432
      int child;
433 433
      int degree;
434 434
      bool in;
435 435
      Prio prio;
436 436

	
437 437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438 438
        in(true) {}
439 439
    };
440 440
  };
441 441

	
442 442
} //namespace lemon
443 443

	
444 444
#endif //LEMON_BINOMIAL_HEAP_H
445 445

	

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)