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

	
19 19
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))
198 198
    .run();
199 199
\endcode
200 200
The \c functorToMap() function makes an \c int to \c Color map from the
201 201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
202 202
and the previously created map. The composed map is a proper function to
203 203
get the color of each node.
204 204

	
205 205
The usage with class type algorithms is little bit harder. In this
206 206
case the function type map adaptors can not be used, because the
207 207
function map adaptors give back temporary objects.
208 208
\code
209 209
  Digraph graph;
210 210

	
211 211
  typedef Digraph::ArcMap<double> DoubleArcMap;
212 212
  DoubleArcMap length(graph);
213 213
  DoubleArcMap speed(graph);
214 214

	
215 215
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
216 216
  TimeMap time(length, speed);
217 217

	
218 218
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
219 219
  dijkstra.run(source, target);
220 220
\endcode
221 221
We have a length map and a maximum speed map on the arcs of a digraph.
222 222
The minimum time to pass the arc can be calculated as the division of
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229 229
@defgroup paths Path Structures
230 230
@ingroup datas
231 231
\brief %Path structures implemented in LEMON.
232 232

	
233 233
This group contains the path structures implemented in LEMON.
234 234

	
235 235
LEMON provides flexible data structures to work with paths.
236 236
All of them have similar interfaces and they can be copied easily with
237 237
assignment operators and copy constructors. This makes it easy and
238 238
efficient to have e.g. the Dijkstra algorithm to store its result in
239 239
any kind of path structure.
240 240

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
553 575
This group contains some simple basic graph utilities.
554 576
*/
555 577

	
556 578
/**
557 579
@defgroup misc Miscellaneous Tools
558 580
@ingroup utils
559 581
\brief Tools for development, debugging and testing.
560 582

	
561 583
This group contains several useful tools for development,
562 584
debugging and testing.
563 585
*/
564 586

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
697
Some utility applications are listed here.
698

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

	
703
/**
673 704
\anchor demoprograms
674 705

	
675 706
@defgroup demos Demo Programs
676 707

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

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

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

	
687
Some utility applications are listed here.
688

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

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

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
151 152
  private:
152 153

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

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

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

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

	
202 203
  protected:
203 204

	
204 205
    Bfs() {}
205 206

	
206 207
  public:
207 208

	
208 209
    typedef Bfs Create;
209 210

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

	
212 213
    ///@{
213 214

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

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

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

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

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

	
313 314
    ///@}
314 315

	
315 316
  public:
316 317

	
317 318
    ///Constructor.
318 319

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

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

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

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

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

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

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

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

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

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

	
411 412
  public:
412 413

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

	
421 422
    ///@{
422 423

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
571 572
    ///Executes the algorithm.
572 573

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

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

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

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

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

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

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

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

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

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

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

	
730 731
    ///@}
731 732

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

	
738 739
    ///@{
739 740

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
945 944
    /// Constructor.
946 945

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

	
954 953
  };
955 954

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

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

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

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

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

	
990 982
  public:
991 983

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

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

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

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

	
1006 998
    ~BfsWizard() {}
1007 999

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1164 1161
  };
1165 1162

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

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

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

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

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

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

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

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

	
1279 1276
  };
1280 1277

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

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

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

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

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

	
1332 1329
  private:
1333 1330

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

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

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

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

	
1359 1356
  protected:
1360 1357

	
1361 1358
    BfsVisit() {}
1362 1359

	
1363 1360
  public:
1364 1361

	
1365 1362
    typedef BfsVisit Create;
1366 1363

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

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

	
1389 1386
  public:
1390 1387

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

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

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

	
1423 1420
  public:
1424 1421

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

	
1433 1430
    /// @{
1434 1431

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1728 1725
    ///@}
1729 1726

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

	
1736 1733
    ///@{
1737 1734

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

	
1746 1743
    ///@}
1747 1744

	
1748 1745
  };
1749 1746

	
1750 1747
} //END OF NAMESPACE LEMON
1751 1748

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

	
19 19
#ifndef LEMON_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

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

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

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

	
32 32
namespace lemon {
33 33

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

	
42 42
  public:
43 43

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

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

	
52
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
53

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

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

	
58 60
  public:
59 61

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

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

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

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

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

	
81 83
    public:
82 84

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

	
85 87
      MapIt() {}
86 88

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

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

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

	
96 98
      MapIt& operator++() {
97 99
        map.notifier()->next(*this);
98 100
        return *this;
99 101
      }
100 102

	
101 103
      typename MapTraits<Map>::ConstReturnValue operator*() const {
102 104
        return map[*this];
103 105
      }
104 106

	
105 107
      typename MapTraits<Map>::ReturnValue operator*() {
106 108
        return map[*this];
107 109
      }
108 110

	
109 111
      void set(const Value& value) {
110 112
        map.set(*this, value);
111 113
      }
112 114

	
113 115
    protected:
114 116
      Map& map;
115 117

	
116 118
    };
117 119

	
118 120
    class ConstMapIt : public Item {
119 121
      typedef Item Parent;
120 122

	
121 123
    public:
122 124

	
123 125
      typedef typename Map::Value Value;
124 126

	
125 127
      ConstMapIt() {}
126 128

	
127 129
      ConstMapIt(Invalid i) : Parent(i) { }
128 130

	
129 131
      explicit ConstMapIt(Map& _map) : map(_map) {
130 132
        map.notifier()->first(*this);
131 133
      }
132 134

	
133 135
      ConstMapIt(const Map& _map, const Item& item)
134 136
        : Parent(item), map(_map) {}
135 137

	
136 138
      ConstMapIt& operator++() {
137 139
        map.notifier()->next(*this);
138 140
        return *this;
139 141
      }
140 142

	
141 143
      typename MapTraits<Map>::ConstReturnValue operator*() const {
142 144
        return map[*this];
143 145
      }
144 146

	
145 147
    protected:
146 148
      const Map& map;
147 149
    };
148 150

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

	
152 154
    public:
153 155

	
154 156
      ItemIt() {}
155 157

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

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

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

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

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

	
173 175
    };
174 176
  };
175 177

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

	
184 186
  public:
185 187

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

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

	
196
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
197

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

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

	
200 204
  public:
201 205

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

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

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

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

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

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

	
230 234
      MapIt() {}
231 235

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

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

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

	
241 245
      MapIt& operator++() {
242 246
        map.graph.next(*this);
243 247
        return *this;
244 248
      }
245 249

	
246 250
      typename MapTraits<Map>::ConstReturnValue operator*() const {
247 251
        return map[*this];
248 252
      }
249 253

	
250 254
      typename MapTraits<Map>::ReturnValue operator*() {
251 255
        return map[*this];
252 256
      }
253 257

	
254 258
      void set(const Value& value) {
255 259
        map.set(*this, value);
256 260
      }
257 261

	
258 262
    protected:
259 263
      Map& map;
260 264

	
261 265
    };
262 266

	
263 267
    class ConstMapIt : public Item {
264 268
      typedef Item Parent;
265 269

	
266 270
    public:
267 271

	
268 272
      typedef typename Map::Value Value;
269 273

	
270 274
      ConstMapIt() {}
271 275

	
272 276
      ConstMapIt(Invalid i) : Parent(i) { }
273 277

	
274 278
      explicit ConstMapIt(Map& _map) : map(_map) {
275 279
        map.graph.first(*this);
276 280
      }
277 281

	
278 282
      ConstMapIt(const Map& _map, const Item& item)
279 283
        : Parent(item), map(_map) {}
280 284

	
281 285
      ConstMapIt& operator++() {
282 286
        map.graph.next(*this);
283 287
        return *this;
284 288
      }
285 289

	
286 290
      typename MapTraits<Map>::ConstReturnValue operator*() const {
287 291
        return map[*this];
288 292
      }
289 293

	
290 294
    protected:
291 295
      const Map& map;
292 296
    };
293 297

	
294 298
    class ItemIt : public Item {
295 299
      typedef Item Parent;
296 300

	
297 301
    public:
298 302

	
299 303
      ItemIt() {}
300 304

	
301 305
      ItemIt(Invalid i) : Parent(i) { }
302 306

	
303 307
      explicit ItemIt(Map& _map) : map(_map) {
304 308
        map.graph.first(*this);
305 309
      }
306 310

	
307 311
      ItemIt(const Map& _map, const Item& item)
308 312
        : Parent(item), map(_map) {}
309 313

	
310 314
      ItemIt& operator++() {
311 315
        map.graph.next(*this);
312 316
        return *this;
313 317
      }
314 318

	
315 319
    protected:
316 320
      const Map& map;
317 321

	
318 322
    };
319 323

	
320 324
  private:
321 325

	
322 326
    const GraphType& graph;
323 327

	
324 328
  };
325 329

	
326 330
}
327 331

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

	
19 19
#ifndef LEMON_CIRCULATION_H
20 20
#define LEMON_CIRCULATION_H
21 21

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

	
26 26
///\ingroup max_flow
27 27
///\file
28 28
///\brief Push-relabel algorithm for finding a feasible circulation.
29 29
///
30 30
namespace lemon {
31 31

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

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

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

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

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

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

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

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

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

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

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

	
109 116
  };
110 117

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

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

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

	
134 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
135 142
     \geq sup(u) \quad \forall u\in V, \f]
136 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
137 144
     
138 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
139 146
     zero or negative in order to have a feasible solution (since the sum
140 147
     of the expressions on the left-hand side of the inequalities is zero).
141 148
     It means that the total demand must be greater or equal to the total
142 149
     supply and all the supplies have to be carried out from the supply nodes,
143 150
     but there could be demands that are not satisfied.
144 151
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
145 152
     constraints have to be satisfied with equality, i.e. all demands
146 153
     have to be satisfied and all supplies have to be used.
147 154
     
148 155
     If you need the opposite inequalities in the supply/demand constraints
149 156
     (i.e. the total demand is less than the total supply and all the demands
150 157
     have to be satisfied while there could be supplies that are not used),
151 158
     then you could easily transform the problem to the above form by reversing
152 159
     the direction of the arcs and taking the negative of the supply values
153 160
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
154 161

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

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

	
162 169
     \tparam GR The type of the digraph the algorithm runs on.
163 170
     \tparam LM The type of the lower bound map. The default
164 171
     map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
165 172
     \tparam UM The type of the upper bound (capacity) map.
166 173
     The default map type is \c LM.
167 174
     \tparam SM The type of the supply map. The default map type is
168 175
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
169 176
  */
170 177
#ifdef DOXYGEN
171 178
template< typename GR,
172 179
          typename LM,
173 180
          typename UM,
174 181
          typename SM,
175 182
          typename TR >
176 183
#else
177 184
template< typename GR,
178 185
          typename LM = typename GR::template ArcMap<int>,
179 186
          typename UM = LM,
180 187
          typename SM = typename GR::template NodeMap<typename UM::Value>,
181 188
          typename TR = CirculationDefaultTraits<GR, LM, UM, SM> >
182 189
#endif
183 190
  class Circulation {
184 191
  public:
185 192

	
186 193
    ///The \ref CirculationDefaultTraits "traits class" of the algorithm.
187 194
    typedef TR Traits;
188 195
    ///The type of the digraph the algorithm runs on.
189 196
    typedef typename Traits::Digraph Digraph;
190 197
    ///The type of the flow and supply values.
191 198
    typedef typename Traits::Value Value;
192 199

	
193 200
    ///The type of the lower bound map.
194 201
    typedef typename Traits::LowerMap LowerMap;
195 202
    ///The type of the upper bound (capacity) map.
196 203
    typedef typename Traits::UpperMap UpperMap;
197 204
    ///The type of the supply map.
198 205
    typedef typename Traits::SupplyMap SupplyMap;
199 206
    ///The type of the flow map.
200 207
    typedef typename Traits::FlowMap FlowMap;
201 208

	
202 209
    ///The type of the elevator.
203 210
    typedef typename Traits::Elevator Elevator;
204 211
    ///The type of the tolerance.
205 212
    typedef typename Traits::Tolerance Tolerance;
206 213

	
207 214
  private:
208 215

	
209 216
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
210 217

	
211 218
    const Digraph &_g;
212 219
    int _node_num;
213 220

	
214 221
    const LowerMap *_lo;
215 222
    const UpperMap *_up;
216 223
    const SupplyMap *_supply;
217 224

	
218 225
    FlowMap *_flow;
219 226
    bool _local_flow;
220 227

	
221 228
    Elevator* _level;
222 229
    bool _local_level;
223 230

	
224 231
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
225 232
    ExcessMap* _excess;
226 233

	
227 234
    Tolerance _tol;
228 235
    int _el;
229 236

	
230 237
  public:
231 238

	
232 239
    typedef Circulation Create;
233 240

	
234 241
    ///\name Named Template Parameters
235 242

	
236 243
    ///@{
237 244

	
238 245
    template <typename T>
239 246
    struct SetFlowMapTraits : public Traits {
240 247
      typedef T FlowMap;
241 248
      static FlowMap *createFlowMap(const Digraph&) {
242 249
        LEMON_ASSERT(false, "FlowMap is not initialized");
243 250
        return 0; // ignore warnings
244 251
      }
245 252
    };
246 253

	
247 254
    /// \brief \ref named-templ-param "Named parameter" for setting
248 255
    /// FlowMap type
249 256
    ///
250 257
    /// \ref named-templ-param "Named parameter" for setting FlowMap
251 258
    /// type.
252 259
    template <typename T>
253 260
    struct SetFlowMap
254 261
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
255 262
                           SetFlowMapTraits<T> > {
256 263
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
257 264
                          SetFlowMapTraits<T> > Create;
258 265
    };
259 266

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

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

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

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

	
314 321
    /// @}
315 322

	
316 323
  protected:
317 324

	
318 325
    Circulation() {}
319 326

	
320 327
  public:
321 328

	
322 329
    /// Constructor.
323 330

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

	
337 344
    /// Destructor.
338 345
    ~Circulation() {
339 346
      destroyStructures();
340 347
    }
341 348

	
342 349

	
343 350
  private:
344 351

	
345 352
    bool checkBoundMaps() {
346 353
      for (ArcIt e(_g);e!=INVALID;++e) {
347 354
        if (_tol.less((*_up)[e], (*_lo)[e])) return false;
348 355
      }
349 356
      return true;
350 357
    }
351 358

	
352 359
    void createStructures() {
353 360
      _node_num = _el = countNodes(_g);
354 361

	
355 362
      if (!_flow) {
356 363
        _flow = Traits::createFlowMap(_g);
357 364
        _local_flow = true;
358 365
      }
359 366
      if (!_level) {
360 367
        _level = Traits::createElevator(_g, _node_num);
361 368
        _local_level = true;
362 369
      }
363 370
      if (!_excess) {
364 371
        _excess = new ExcessMap(_g);
365 372
      }
366 373
    }
367 374

	
368 375
    void destroyStructures() {
369 376
      if (_local_flow) {
370 377
        delete _flow;
371 378
      }
372 379
      if (_local_level) {
373 380
        delete _level;
374 381
      }
375 382
      if (_excess) {
376 383
        delete _excess;
377 384
      }
378 385
    }
379 386

	
380 387
  public:
381 388

	
382 389
    /// Sets the lower bound map.
383 390

	
384 391
    /// Sets the lower bound map.
385 392
    /// \return <tt>(*this)</tt>
386 393
    Circulation& lowerMap(const LowerMap& map) {
387 394
      _lo = &map;
388 395
      return *this;
389 396
    }
390 397

	
391 398
    /// Sets the upper bound (capacity) map.
392 399

	
393 400
    /// Sets the upper bound (capacity) map.
394 401
    /// \return <tt>(*this)</tt>
395 402
    Circulation& upperMap(const UpperMap& map) {
396 403
      _up = &map;
397 404
      return *this;
398 405
    }
399 406

	
400 407
    /// Sets the supply map.
401 408

	
402 409
    /// Sets the supply map.
403 410
    /// \return <tt>(*this)</tt>
404 411
    Circulation& supplyMap(const SupplyMap& map) {
405 412
      _supply = &map;
406 413
      return *this;
407 414
    }
408 415

	
409 416
    /// \brief Sets the flow map.
410 417
    ///
411 418
    /// Sets the flow map.
412 419
    /// If you don't use this function before calling \ref run() or
413 420
    /// \ref init(), an instance will be allocated automatically.
414 421
    /// The destructor deallocates this automatically allocated map,
415 422
    /// of course.
416 423
    /// \return <tt>(*this)</tt>
417 424
    Circulation& flowMap(FlowMap& map) {
418 425
      if (_local_flow) {
419 426
        delete _flow;
420 427
        _local_flow = false;
421 428
      }
422 429
      _flow = &map;
423 430
      return *this;
424 431
    }
425 432

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

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

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

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

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

	
476 483
    ///@{
477 484

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

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

	
487 494
      createStructures();
488 495

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

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

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

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

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

	
519 526
      createStructures();
520 527

	
521 528
      for(NodeIt n(_g);n!=INVALID;++n) {
522 529
        (*_excess)[n] = (*_supply)[n];
523 530
      }
524 531

	
525 532
      for (ArcIt e(_g);e!=INVALID;++e) {
526 533
        if (!_tol.less(-(*_excess)[_g.target(e)], (*_up)[e])) {
527 534
          _flow->set(e, (*_up)[e]);
528 535
          (*_excess)[_g.target(e)] += (*_up)[e];
529 536
          (*_excess)[_g.source(e)] -= (*_up)[e];
530 537
        } else if (_tol.less(-(*_excess)[_g.target(e)], (*_lo)[e])) {
531 538
          _flow->set(e, (*_lo)[e]);
532 539
          (*_excess)[_g.target(e)] += (*_lo)[e];
533 540
          (*_excess)[_g.source(e)] -= (*_lo)[e];
534 541
        } else {
535 542
          Value fc = -(*_excess)[_g.target(e)];
536 543
          _flow->set(e, fc);
537 544
          (*_excess)[_g.target(e)] = 0;
538 545
          (*_excess)[_g.source(e)] -= fc;
539 546
        }
540 547
      }
541 548

	
542 549
      _level->initStart();
543 550
      for(NodeIt n(_g);n!=INVALID;++n)
544 551
        _level->initAddItem(n);
545 552
      _level->initFinish();
546 553
      for(NodeIt n(_g);n!=INVALID;++n)
547 554
        if(_tol.positive((*_excess)[n]))
548 555
          _level->activate(n);
549 556
    }
550 557

	
551 558
    ///Executes the algorithm
552 559

	
553 560
    ///This function executes the algorithm.
554 561
    ///
555 562
    ///\return \c true if a feasible circulation is found.
556 563
    ///
557 564
    ///\sa barrier()
558 565
    ///\sa barrierMap()
559 566
    bool start()
560 567
    {
561 568

	
562 569
      Node act;
563 570
      Node bact=INVALID;
564 571
      Node last_activated=INVALID;
565 572
      while((act=_level->highestActive())!=INVALID) {
566 573
        int actlevel=(*_level)[act];
567 574
        int mlevel=_node_num;
568 575
        Value exc=(*_excess)[act];
569 576

	
570 577
        for(OutArcIt e(_g,act);e!=INVALID; ++e) {
571 578
          Node v = _g.target(e);
572 579
          Value fc=(*_up)[e]-(*_flow)[e];
573 580
          if(!_tol.positive(fc)) continue;
574 581
          if((*_level)[v]<actlevel) {
575 582
            if(!_tol.less(fc, exc)) {
576 583
              _flow->set(e, (*_flow)[e] + exc);
577 584
              (*_excess)[v] += exc;
578 585
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
579 586
                _level->activate(v);
580 587
              (*_excess)[act] = 0;
581 588
              _level->deactivate(act);
582 589
              goto next_l;
583 590
            }
584 591
            else {
585 592
              _flow->set(e, (*_up)[e]);
586 593
              (*_excess)[v] += fc;
587 594
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
588 595
                _level->activate(v);
589 596
              exc-=fc;
590 597
            }
591 598
          }
592 599
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
593 600
        }
594 601
        for(InArcIt e(_g,act);e!=INVALID; ++e) {
595 602
          Node v = _g.source(e);
596 603
          Value fc=(*_flow)[e]-(*_lo)[e];
597 604
          if(!_tol.positive(fc)) continue;
598 605
          if((*_level)[v]<actlevel) {
599 606
            if(!_tol.less(fc, exc)) {
600 607
              _flow->set(e, (*_flow)[e] - exc);
601 608
              (*_excess)[v] += exc;
602 609
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
603 610
                _level->activate(v);
604 611
              (*_excess)[act] = 0;
605 612
              _level->deactivate(act);
606 613
              goto next_l;
607 614
            }
608 615
            else {
609 616
              _flow->set(e, (*_lo)[e]);
610 617
              (*_excess)[v] += fc;
611 618
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
612 619
                _level->activate(v);
613 620
              exc-=fc;
614 621
            }
615 622
          }
616 623
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
617 624
        }
618 625

	
619 626
        (*_excess)[act] = exc;
620 627
        if(!_tol.positive(exc)) _level->deactivate(act);
621 628
        else if(mlevel==_node_num) {
622 629
          _level->liftHighestActiveToTop();
623 630
          _el = _node_num;
624 631
          return false;
625 632
        }
626 633
        else {
627 634
          _level->liftHighestActive(mlevel+1);
628 635
          if(_level->onLevel(actlevel)==0) {
629 636
            _el = actlevel;
630 637
            return false;
631 638
          }
632 639
        }
633 640
      next_l:
634 641
        ;
635 642
      }
636 643
      return true;
637 644
    }
638 645

	
639 646
    /// Runs the algorithm.
640 647

	
641 648
    /// This function runs the algorithm.
642 649
    ///
643 650
    /// \return \c true if a feasible circulation is found.
644 651
    ///
645 652
    /// \note Apart from the return value, c.run() is just a shortcut of
646 653
    /// the following code.
647 654
    /// \code
648 655
    ///   c.greedyInit();
649 656
    ///   c.start();
650 657
    /// \endcode
651 658
    bool run() {
652 659
      greedyInit();
653 660
      return start();
654 661
    }
655 662

	
656 663
    /// @}
657 664

	
658 665
    /// \name Query Functions
659 666
    /// The results of the circulation algorithm can be obtained using
660 667
    /// these functions.\n
661 668
    /// Either \ref run() or \ref start() should be called before
662 669
    /// using them.
663 670

	
664 671
    ///@{
665 672

	
666 673
    /// \brief Returns the flow value on the given arc.
667 674
    ///
668 675
    /// Returns the flow value on the given arc.
669 676
    ///
670 677
    /// \pre Either \ref run() or \ref init() must be called before
671 678
    /// using this function.
672 679
    Value flow(const Arc& arc) const {
673 680
      return (*_flow)[arc];
674 681
    }
675 682

	
676 683
    /// \brief Returns a const reference to the flow map.
677 684
    ///
678 685
    /// Returns a const reference to the arc map storing the found flow.
679 686
    ///
680 687
    /// \pre Either \ref run() or \ref init() must be called before
681 688
    /// using this function.
682 689
    const FlowMap& flowMap() const {
683 690
      return *_flow;
684 691
    }
685 692

	
686 693
    /**
687 694
       \brief Returns \c true if the given node is in a barrier.
688 695

	
689 696
       Barrier is a set \e B of nodes for which
690 697

	
691 698
       \f[ \sum_{uv\in A: u\in B} upper(uv) -
692 699
           \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
693 700

	
694 701
       holds. The existence of a set with this property prooves that a
695 702
       feasible circualtion cannot exist.
696 703

	
697 704
       This function returns \c true if the given node is in the found
698 705
       barrier. If a feasible circulation is found, the function
699 706
       gives back \c false for every node.
700 707

	
701 708
       \pre Either \ref run() or \ref init() must be called before
702 709
       using this function.
703 710

	
704 711
       \sa barrierMap()
705 712
       \sa checkBarrier()
706 713
    */
707 714
    bool barrier(const Node& node) const
708 715
    {
709 716
      return (*_level)[node] >= _el;
710 717
    }
711 718

	
712 719
    /// \brief Gives back a barrier.
713 720
    ///
714 721
    /// This function sets \c bar to the characteristic vector of the
715 722
    /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
716 723
    /// node map with \c bool (or convertible) value type.
717 724
    ///
718 725
    /// If a feasible circulation is found, the function gives back an
719 726
    /// empty set, so \c bar[v] will be \c false for all nodes \c v.
720 727
    ///
721 728
    /// \note This function calls \ref barrier() for each node,
722 729
    /// so it runs in O(n) time.
723 730
    ///
724 731
    /// \pre Either \ref run() or \ref init() must be called before
725 732
    /// using this function.
726 733
    ///
727 734
    /// \sa barrier()
728 735
    /// \sa checkBarrier()
729 736
    template<class BarrierMap>
730 737
    void barrierMap(BarrierMap &bar) const
731 738
    {
732 739
      for(NodeIt n(_g);n!=INVALID;++n)
733 740
        bar.set(n, (*_level)[n] >= _el);
734 741
    }
735 742

	
736 743
    /// @}
737 744

	
738 745
    /// \name Checker Functions
739 746
    /// The feasibility of the results can be checked using
740 747
    /// these functions.\n
741 748
    /// Either \ref run() or \ref start() should be called before
742 749
    /// using them.
743 750

	
744 751
    ///@{
745 752

	
746 753
    ///Check if the found flow is a feasible circulation
747 754

	
748 755
    ///Check if the found flow is a feasible circulation,
749 756
    ///
750 757
    bool checkFlow() const {
751 758
      for(ArcIt e(_g);e!=INVALID;++e)
752 759
        if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
753 760
      for(NodeIt n(_g);n!=INVALID;++n)
754 761
        {
755 762
          Value dif=-(*_supply)[n];
756 763
          for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
757 764
          for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
758 765
          if(_tol.negative(dif)) return false;
759 766
        }
760 767
      return true;
761 768
    }
762 769

	
763 770
    ///Check whether or not the last execution provides a barrier
764 771

	
765 772
    ///Check whether or not the last execution provides a barrier.
766 773
    ///\sa barrier()
767 774
    ///\sa barrierMap()
768 775
    bool checkBarrier() const
769 776
    {
770 777
      Value delta=0;
771 778
      Value inf_cap = std::numeric_limits<Value>::has_infinity ?
772 779
        std::numeric_limits<Value>::infinity() :
773 780
        std::numeric_limits<Value>::max();
774 781
      for(NodeIt n(_g);n!=INVALID;++n)
775 782
        if(barrier(n))
776 783
          delta-=(*_supply)[n];
777 784
      for(ArcIt e(_g);e!=INVALID;++e)
778 785
        {
779 786
          Node s=_g.source(e);
780 787
          Node t=_g.target(e);
781 788
          if(barrier(s)&&!barrier(t)) {
782 789
            if (_tol.less(inf_cap - (*_up)[e], delta)) return false;
783 790
            delta+=(*_up)[e];
784 791
          }
785 792
          else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
786 793
        }
787 794
      return _tol.negative(delta);
788 795
    }
789 796

	
790 797
    /// @}
791 798

	
792 799
  };
793 800

	
794 801
}
795 802

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

	
19 19
#ifndef LEMON_CONCEPTS_MAPS_H
20 20
#define LEMON_CONCEPTS_MAPS_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/concept_check.h>
24 24

	
25 25
///\ingroup map_concepts
26 26
///\file
27 27
///\brief The concept of maps.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// Readable map concept
37 37

	
38 38
    /// Readable map concept.
39 39
    ///
40 40
    template<typename K, typename T>
41 41
    class ReadMap
42 42
    {
43 43
    public:
44 44
      /// The key type of the map.
45 45
      typedef K Key;
46 46
      /// \brief The value type of the map.
47 47
      /// (The type of objects associated with the keys).
48 48
      typedef T Value;
49 49

	
50 50
      /// Returns the value associated with the given key.
51 51
      Value operator[](const Key &) const {
52 52
        return *static_cast<Value *>(0);
53 53
      }
54 54

	
55 55
      template<typename _ReadMap>
56 56
      struct Constraints {
57 57
        void constraints() {
58 58
          Value val = m[key];
59 59
          val = m[key];
60 60
          typename _ReadMap::Value own_val = m[own_key];
61 61
          own_val = m[own_key];
62 62

	
63 63
          ignore_unused_variable_warning(key);
64 64
          ignore_unused_variable_warning(val);
65 65
          ignore_unused_variable_warning(own_key);
66 66
          ignore_unused_variable_warning(own_val);
67 67
        }
68 68
        const Key& key;
69 69
        const typename _ReadMap::Key& own_key;
70 70
        const _ReadMap& m;
71 71
      };
72 72

	
73 73
    };
74 74

	
75 75

	
76 76
    /// Writable map concept
77 77

	
78 78
    /// Writable map concept.
79 79
    ///
80 80
    template<typename K, typename T>
81 81
    class WriteMap
82 82
    {
83 83
    public:
84 84
      /// The key type of the map.
85 85
      typedef K Key;
86 86
      /// \brief The value type of the map.
87 87
      /// (The type of objects associated with the keys).
88 88
      typedef T Value;
89 89

	
90 90
      /// Sets the value associated with the given key.
91 91
      void set(const Key &, const Value &) {}
92 92

	
93 93
      /// Default constructor.
94 94
      WriteMap() {}
95 95

	
96 96
      template <typename _WriteMap>
97 97
      struct Constraints {
98 98
        void constraints() {
99 99
          m.set(key, val);
100 100
          m.set(own_key, own_val);
101 101

	
102 102
          ignore_unused_variable_warning(key);
103 103
          ignore_unused_variable_warning(val);
104 104
          ignore_unused_variable_warning(own_key);
105 105
          ignore_unused_variable_warning(own_val);
106 106
        }
107 107
        const Key& key;
108 108
        const Value& val;
109 109
        const typename _WriteMap::Key& own_key;
110 110
        const typename _WriteMap::Value& own_val;
111 111
        _WriteMap& m;
112 112
      };
113 113
    };
114 114

	
115 115
    /// Read/writable map concept
116 116

	
117 117
    /// Read/writable map concept.
118 118
    ///
119 119
    template<typename K, typename T>
120 120
    class ReadWriteMap : public ReadMap<K,T>,
121 121
                         public WriteMap<K,T>
122 122
    {
123 123
    public:
124 124
      /// The key type of the map.
125 125
      typedef K Key;
126 126
      /// \brief The value type of the map.
127 127
      /// (The type of objects associated with the keys).
128 128
      typedef T Value;
129 129

	
130 130
      /// Returns the value associated with the given key.
131 131
      Value operator[](const Key &) const {
132 132
        return *static_cast<Value *>(0);
133 133
      }
134 134

	
135 135
      /// Sets the value associated with the given key.
136 136
      void set(const Key &, const Value &) {}
137 137

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

	
147 147

	
148 148
    /// Dereferable map concept
149 149

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

	
168 168
    public:
169 169

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

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

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

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

	
210 211
    // @}
211 212

	
212 213
  } //namespace concepts
213 214

	
214 215
} //namespace lemon
215 216

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

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
151 152
  private:
152 153

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

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

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

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

	
201 202
  protected:
202 203

	
203 204
    Dfs() {}
204 205

	
205 206
  public:
206 207

	
207 208
    typedef Dfs Create;
208 209

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

	
211 212
    ///@{
212 213

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

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

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

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

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

	
311 312
    ///@}
312 313

	
313 314
  public:
314 315

	
315 316
    ///Constructor.
316 317

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

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

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

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

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

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

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

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

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

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

	
409 410
  public:
410 411

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

	
420 421
    ///@{
421 422

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

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

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

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

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

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

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

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

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

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

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

	
520 521
    ///Executes the algorithm.
521 522

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

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

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

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

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

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

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

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

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

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

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

	
662 663
    ///@}
663 664

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

	
670 671
    ///@{
671 672

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
877 874
    /// Constructor.
878 875

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

	
886 883
  };
887 884

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

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

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

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

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

	
922 912
  public:
923 913

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

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

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

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

	
938 928
    ~DfsWizard() {}
939 929

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1096 1091
  };
1097 1092

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

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

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

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

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

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

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

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

	
1223 1218
  };
1224 1219

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

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

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

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

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

	
1276 1271
  private:
1277 1272

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

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

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

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

	
1303 1298
  protected:
1304 1299

	
1305 1300
    DfsVisit() {}
1306 1301

	
1307 1302
  public:
1308 1303

	
1309 1304
    typedef DfsVisit Create;
1310 1305

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

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

	
1333 1328
  public:
1334 1329

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

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

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

	
1367 1362
  public:
1368 1363

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

	
1378 1373
    /// @{
1379 1374

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1613 1608
    ///@}
1614 1609

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

	
1621 1616
    ///@{
1622 1617

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

	
1631 1626
    ///@}
1632 1627

	
1633 1628
  };
1634 1629

	
1635 1630
} //END OF NAMESPACE LEMON
1636 1631

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

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

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

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

	
35 35
namespace lemon {
36 36

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
228 232
  private:
229 233

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

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

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

	
285 289
  public:
286 290

	
287 291
    typedef Dijkstra Create;
288 292

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

	
291 295
    ///@{
292 296

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

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

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

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

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

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

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

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

	
453 458
    ///@}
454 459

	
455 460
  protected:
456 461

	
457 462
    Dijkstra() {}
458 463

	
459 464
  public:
460 465

	
461 466
    ///Constructor.
462 467

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

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

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

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

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

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

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

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

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

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

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

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

	
574 579
  private:
575 580

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

	
582 587
  public:
583 588

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

	
592 597
    ///@{
593 598

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

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

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

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

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

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

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

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

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

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

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

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

	
684 689
    ///Executes the algorithm.
685 690

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

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

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

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

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

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

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

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

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

	
799 804
    ///@}
800 805

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

	
807 812
    ///@{
808 813

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
913 920

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1069 1073
    /// Constructor.
1070 1074

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

	
1080 1084
  };
1081 1085

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

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

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

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

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

	
1120 1115
  public:
1121 1116

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

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

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

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

	
1137 1132
    ~DijkstraWizard() {}
1138 1133

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

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

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

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

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

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

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

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

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

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

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

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

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

	
1265 1265
  };
1266 1266

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

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

	
1293 1293
} //END OF NAMESPACE LEMON
1294 1294

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

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

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

	
35 28
namespace lemon {
36 29

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

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

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

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

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

	
53 46
    public:
54 47

	
55 48
      typedef T Value;
56 49

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

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

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

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

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

	
74 67
      ///Subscripting operator
75 68

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

	
80 73
      ///Const subscripting operator
81 74

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

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

	
89 82
      ///Give back the square of the norm of the vector
90 83
      T normSquare() const {
91 84
        return x*x+y*y;
92 85
      }
93 86

	
94 87
      ///Increment the left hand side by \c u
95 88
      Point<T>& operator +=(const Point<T>& u) {
96 89
        x += u.x;
97 90
        y += u.y;
98 91
        return *this;
99 92
      }
100 93

	
101 94
      ///Decrement the left hand side by \c u
102 95
      Point<T>& operator -=(const Point<T>& u) {
103 96
        x -= u.x;
104 97
        y -= u.y;
105 98
        return *this;
106 99
      }
107 100

	
108 101
      ///Multiply the left hand side with a scalar
109 102
      Point<T>& operator *=(const T &u) {
110 103
        x *= u;
111 104
        y *= u;
112 105
        return *this;
113 106
      }
114 107

	
115 108
      ///Divide the left hand side by a scalar
116 109
      Point<T>& operator /=(const T &u) {
117 110
        x /= u;
118 111
        y /= u;
119 112
        return *this;
120 113
      }
121 114

	
122 115
      ///Return the scalar product of two vectors
123 116
      T operator *(const Point<T>& u) const {
124 117
        return x*u.x+y*u.y;
125 118
      }
126 119

	
127 120
      ///Return the sum of two vectors
128 121
      Point<T> operator+(const Point<T> &u) const {
129 122
        Point<T> b=*this;
130 123
        return b+=u;
131 124
      }
132 125

	
133 126
      ///Return the negative of the vector
134 127
      Point<T> operator-() const {
135 128
        Point<T> b=*this;
136 129
        b.x=-b.x; b.y=-b.y;
137 130
        return b;
138 131
      }
139 132

	
140 133
      ///Return the difference of two vectors
141 134
      Point<T> operator-(const Point<T> &u) const {
142 135
        Point<T> b=*this;
143 136
        return b-=u;
144 137
      }
145 138

	
146 139
      ///Return a vector multiplied by a scalar
147 140
      Point<T> operator*(const T &u) const {
148 141
        Point<T> b=*this;
149 142
        return b*=u;
150 143
      }
151 144

	
152 145
      ///Return a vector divided by a scalar
153 146
      Point<T> operator/(const T &u) const {
154 147
        Point<T> b=*this;
155 148
        return b/=u;
156 149
      }
157 150

	
158 151
      ///Test equality
159 152
      bool operator==(const Point<T> &u) const {
160 153
        return (x==u.x) && (y==u.y);
161 154
      }
162 155

	
163 156
      ///Test inequality
164 157
      bool operator!=(Point u) const {
165 158
        return  (x!=u.x) || (y!=u.y);
166 159
      }
167 160

	
168 161
    };
169 162

	
170 163
  ///Return a Point
171 164

	
172 165
  ///Return a Point.
173 166
  ///\relates Point
174 167
  template <typename T>
175 168
  inline Point<T> makePoint(const T& x, const T& y) {
176 169
    return Point<T>(x, y);
177 170
  }
178 171

	
179 172
  ///Return a vector multiplied by a scalar
180 173

	
181 174
  ///Return a vector multiplied by a scalar.
182 175
  ///\relates Point
183 176
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
184 177
    return x*u;
185 178
  }
186 179

	
187 180
  ///Read a plain vector from a stream
188 181

	
189 182
  ///Read a plain vector from a stream.
190 183
  ///\relates Point
191 184
  ///
192 185
  template<typename T>
193 186
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
194 187
    char c;
195 188
    if (is >> c) {
196 189
      if (c != '(') is.putback(c);
197 190
    } else {
198 191
      is.clear();
199 192
    }
200 193
    if (!(is >> z.x)) return is;
201 194
    if (is >> c) {
202 195
      if (c != ',') is.putback(c);
203 196
    } else {
204 197
      is.clear();
205 198
    }
206 199
    if (!(is >> z.y)) return is;
207 200
    if (is >> c) {
208 201
      if (c != ')') is.putback(c);
209 202
    } else {
210 203
      is.clear();
211 204
    }
212 205
    return is;
213 206
  }
214 207

	
215 208
  ///Write a plain vector to a stream
216 209

	
217 210
  ///Write a plain vector to a stream.
218 211
  ///\relates Point
219 212
  ///
220 213
  template<typename T>
221 214
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
222 215
  {
223 216
    os << "(" << z.x << "," << z.y << ")";
224 217
    return os;
225 218
  }
226 219

	
227 220
  ///Rotate by 90 degrees
228 221

	
229 222
  ///Returns the parameter rotated by 90 degrees in positive direction.
230 223
  ///\relates Point
231 224
  ///
232 225
  template<typename T>
233 226
  inline Point<T> rot90(const Point<T> &z)
234 227
  {
235 228
    return Point<T>(-z.y,z.x);
236 229
  }
237 230

	
238 231
  ///Rotate by 180 degrees
239 232

	
240 233
  ///Returns the parameter rotated by 180 degrees.
241 234
  ///\relates Point
242 235
  ///
243 236
  template<typename T>
244 237
  inline Point<T> rot180(const Point<T> &z)
245 238
  {
246 239
    return Point<T>(-z.x,-z.y);
247 240
  }
248 241

	
249 242
  ///Rotate by 270 degrees
250 243

	
251 244
  ///Returns the parameter rotated by 90 degrees in negative direction.
252 245
  ///\relates Point
253 246
  ///
254 247
  template<typename T>
255 248
  inline Point<T> rot270(const Point<T> &z)
256 249
  {
257 250
    return Point<T>(z.y,-z.x);
258 251
  }
259 252

	
260 253

	
261 254

	
262 255
  /// Bounding box of plain vectors (points).
263 256

	
264 257
  /// A class to calculate or store the bounding box of plain vectors
265 258
  /// (\ref Point "points").
266 259
  template<typename T>
267 260
  class Box {
268 261
      Point<T> _bottom_left, _top_right;
269 262
      bool _empty;
270 263
    public:
271 264

	
272 265
      ///Default constructor: creates an empty box
273 266
      Box() { _empty = true; }
274 267

	
275 268
      ///Construct a box from one point
276 269
      Box(Point<T> a) {
277 270
        _bottom_left = _top_right = a;
278 271
        _empty = false;
279 272
      }
280 273

	
281 274
      ///Construct a box from two points
282 275

	
283 276
      ///Construct a box from two points.
284 277
      ///\param a The bottom left corner.
285 278
      ///\param b The top right corner.
286 279
      ///\warning The coordinates of the bottom left corner must be no more
287 280
      ///than those of the top right one.
288 281
      Box(Point<T> a,Point<T> b)
289 282
      {
290 283
        _bottom_left = a;
291 284
        _top_right = b;
292 285
        _empty = false;
293 286
      }
294 287

	
295 288
      ///Construct a box from four numbers
296 289

	
297 290
      ///Construct a box from four numbers.
298 291
      ///\param l The left side of the box.
299 292
      ///\param b The bottom of the box.
300 293
      ///\param r The right side of the box.
301 294
      ///\param t The top of the box.
302 295
      ///\warning The left side must be no more than the right side and
303 296
      ///bottom must be no more than the top.
304 297
      Box(T l,T b,T r,T t)
305 298
      {
306 299
        _bottom_left=Point<T>(l,b);
307 300
        _top_right=Point<T>(r,t);
308 301
        _empty = false;
309 302
      }
310 303

	
311 304
      ///Return \c true if the box is empty.
312 305

	
313 306
      ///Return \c true if the box is empty (i.e. return \c false
314 307
      ///if at least one point was added to the box or the coordinates of
315 308
      ///the box were set).
316 309
      ///
317 310
      ///The coordinates of an empty box are not defined.
318 311
      bool empty() const {
319 312
        return _empty;
320 313
      }
321 314

	
322 315
      ///Make the box empty
323 316
      void clear() {
324 317
        _empty = true;
325 318
      }
326 319

	
327 320
      ///Give back the bottom left corner of the box
328 321

	
329 322
      ///Give back the bottom left corner of the box.
330 323
      ///If the box is empty, then the return value is not defined.
331 324
      Point<T> bottomLeft() const {
332 325
        return _bottom_left;
333 326
      }
334 327

	
335 328
      ///Set the bottom left corner of the box
336 329

	
337 330
      ///Set the bottom left corner of the box.
338 331
      ///\pre The box must not be empty.
339 332
      void bottomLeft(Point<T> p) {
340 333
        _bottom_left = p;
341 334
      }
342 335

	
343 336
      ///Give back the top right corner of the box
344 337

	
345 338
      ///Give back the top right corner of the box.
346 339
      ///If the box is empty, then the return value is not defined.
347 340
      Point<T> topRight() const {
348 341
        return _top_right;
349 342
      }
350 343

	
351 344
      ///Set the top right corner of the box
352 345

	
353 346
      ///Set the top right corner of the box.
354 347
      ///\pre The box must not be empty.
355 348
      void topRight(Point<T> p) {
356 349
        _top_right = p;
357 350
      }
358 351

	
359 352
      ///Give back the bottom right corner of the box
360 353

	
361 354
      ///Give back the bottom right corner of the box.
362 355
      ///If the box is empty, then the return value is not defined.
363 356
      Point<T> bottomRight() const {
364 357
        return Point<T>(_top_right.x,_bottom_left.y);
365 358
      }
366 359

	
367 360
      ///Set the bottom right corner of the box
368 361

	
369 362
      ///Set the bottom right corner of the box.
370 363
      ///\pre The box must not be empty.
371 364
      void bottomRight(Point<T> p) {
372 365
        _top_right.x = p.x;
373 366
        _bottom_left.y = p.y;
374 367
      }
375 368

	
376 369
      ///Give back the top left corner of the box
377 370

	
378 371
      ///Give back the top left corner of the box.
379 372
      ///If the box is empty, then the return value is not defined.
380 373
      Point<T> topLeft() const {
381 374
        return Point<T>(_bottom_left.x,_top_right.y);
382 375
      }
383 376

	
384 377
      ///Set the top left corner of the box
385 378

	
386 379
      ///Set the top left corner of the box.
387 380
      ///\pre The box must not be empty.
388 381
      void topLeft(Point<T> p) {
389 382
        _top_right.y = p.y;
390 383
        _bottom_left.x = p.x;
391 384
      }
392 385

	
393 386
      ///Give back the bottom of the box
394 387

	
395 388
      ///Give back the bottom of the box.
396 389
      ///If the box is empty, then the return value is not defined.
397 390
      T bottom() const {
398 391
        return _bottom_left.y;
399 392
      }
400 393

	
401 394
      ///Set the bottom of the box
402 395

	
403 396
      ///Set the bottom of the box.
404 397
      ///\pre The box must not be empty.
405 398
      void bottom(T t) {
406 399
        _bottom_left.y = t;
407 400
      }
408 401

	
409 402
      ///Give back the top of the box
410 403

	
411 404
      ///Give back the top of the box.
412 405
      ///If the box is empty, then the return value is not defined.
413 406
      T top() const {
414 407
        return _top_right.y;
415 408
      }
416 409

	
417 410
      ///Set the top of the box
418 411

	
419 412
      ///Set the top of the box.
420 413
      ///\pre The box must not be empty.
421 414
      void top(T t) {
422 415
        _top_right.y = t;
423 416
      }
424 417

	
425 418
      ///Give back the left side of the box
426 419

	
427 420
      ///Give back the left side of the box.
428 421
      ///If the box is empty, then the return value is not defined.
429 422
      T left() const {
430 423
        return _bottom_left.x;
431 424
      }
432 425

	
433 426
      ///Set the left side of the box
434 427

	
435 428
      ///Set the left side of the box.
436 429
      ///\pre The box must not be empty.
437 430
      void left(T t) {
438 431
        _bottom_left.x = t;
439 432
      }
440 433

	
441 434
      /// Give back the right side of the box
442 435

	
443 436
      /// Give back the right side of the box.
444 437
      ///If the box is empty, then the return value is not defined.
445 438
      T right() const {
446 439
        return _top_right.x;
447 440
      }
448 441

	
449 442
      ///Set the right side of the box
450 443

	
451 444
      ///Set the right side of the box.
452 445
      ///\pre The box must not be empty.
453 446
      void right(T t) {
454 447
        _top_right.x = t;
455 448
      }
456 449

	
457 450
      ///Give back the height of the box
458 451

	
459 452
      ///Give back the height of the box.
460 453
      ///If the box is empty, then the return value is not defined.
461 454
      T height() const {
462 455
        return _top_right.y-_bottom_left.y;
463 456
      }
464 457

	
465 458
      ///Give back the width of the box
466 459

	
467 460
      ///Give back the width of the box.
468 461
      ///If the box is empty, then the return value is not defined.
469 462
      T width() const {
470 463
        return _top_right.x-_bottom_left.x;
471 464
      }
472 465

	
473 466
      ///Checks whether a point is inside the box
474 467
      bool inside(const Point<T>& u) const {
475 468
        if (_empty)
476 469
          return false;
477 470
        else {
478 471
          return ( (u.x-_bottom_left.x)*(_top_right.x-u.x) >= 0 &&
479 472
                   (u.y-_bottom_left.y)*(_top_right.y-u.y) >= 0 );
480 473
        }
481 474
      }
482 475

	
483 476
      ///Increments the box with a point
484 477

	
485 478
      ///Increments the box with a point.
486 479
      ///
487 480
      Box& add(const Point<T>& u){
488 481
        if (_empty) {
489 482
          _bottom_left = _top_right = u;
490 483
          _empty = false;
491 484
        }
492 485
        else {
493 486
          if (_bottom_left.x > u.x) _bottom_left.x = u.x;
494 487
          if (_bottom_left.y > u.y) _bottom_left.y = u.y;
495 488
          if (_top_right.x < u.x) _top_right.x = u.x;
496 489
          if (_top_right.y < u.y) _top_right.y = u.y;
497 490
        }
498 491
        return *this;
499 492
      }
500 493

	
501 494
      ///Increments the box to contain another box
502 495

	
503 496
      ///Increments the box to contain another box.
504 497
      ///
505 498
      Box& add(const Box &u){
506 499
        if ( !u.empty() ){
507 500
          add(u._bottom_left);
508 501
          add(u._top_right);
509 502
        }
510 503
        return *this;
511 504
      }
512 505

	
513 506
      ///Intersection of two boxes
514 507

	
515 508
      ///Intersection of two boxes.
516 509
      ///
517 510
      Box operator&(const Box& u) const {
518 511
        Box b;
519 512
        if (_empty || u._empty) {
520 513
          b._empty = true;
521 514
        } else {
522 515
          b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x);
523 516
          b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y);
524 517
          b._top_right.x = std::min(_top_right.x, u._top_right.x);
525 518
          b._top_right.y = std::min(_top_right.y, u._top_right.y);
526 519
          b._empty = b._bottom_left.x > b._top_right.x ||
527 520
                     b._bottom_left.y > b._top_right.y;
528 521
        }
529 522
        return b;
530 523
      }
531 524

	
532 525
  };//class Box
533 526

	
534 527

	
535 528
  ///Read a box from a stream
536 529

	
537 530
  ///Read a box from a stream.
538 531
  ///\relates Box
539 532
  template<typename T>
540 533
  inline std::istream& operator>>(std::istream &is, Box<T>& b) {
541 534
    char c;
542 535
    Point<T> p;
543 536
    if (is >> c) {
544 537
      if (c != '(') is.putback(c);
545 538
    } else {
546 539
      is.clear();
547 540
    }
548 541
    if (!(is >> p)) return is;
549 542
    b.bottomLeft(p);
550 543
    if (is >> c) {
551 544
      if (c != ',') is.putback(c);
552 545
    } else {
553 546
      is.clear();
554 547
    }
555 548
    if (!(is >> p)) return is;
556 549
    b.topRight(p);
557 550
    if (is >> c) {
558 551
      if (c != ')') is.putback(c);
559 552
    } else {
560 553
      is.clear();
561 554
    }
562 555
    return is;
563 556
  }
564 557

	
565 558
  ///Write a box to a stream
566 559

	
567 560
  ///Write a box to a stream.
568 561
  ///\relates Box
569 562
  template<typename T>
570 563
  inline std::ostream& operator<<(std::ostream &os, const Box<T>& b)
571 564
  {
572 565
    os << "(" << b.bottomLeft() << "," << b.topRight() << ")";
573 566
    return os;
574 567
  }
575 568

	
576 569
  ///Map of x-coordinates of a <tt>Point</tt>-map
577 570

	
578 571
  ///Map of x-coordinates of a \ref Point "Point"-map.
579 572
  ///
580 573
  template<class M>
581 574
  class XMap
582 575
  {
583 576
    M& _map;
584 577
  public:
585 578

	
586 579
    typedef typename M::Value::Value Value;
587 580
    typedef typename M::Key Key;
588 581
    ///\e
589 582
    XMap(M& map) : _map(map) {}
590 583
    Value operator[](Key k) const {return _map[k].x;}
591 584
    void set(Key k,Value v) {_map.set(k,typename M::Value(v,_map[k].y));}
592 585
  };
593 586

	
594 587
  ///Returns an XMap class
595 588

	
596 589
  ///This function just returns an XMap class.
597 590
  ///\relates XMap
598 591
  template<class M>
599 592
  inline XMap<M> xMap(M &m)
600 593
  {
601 594
    return XMap<M>(m);
602 595
  }
603 596

	
604 597
  template<class M>
605 598
  inline XMap<M> xMap(const M &m)
606 599
  {
607 600
    return XMap<M>(m);
608 601
  }
609 602

	
610 603
  ///Constant (read only) version of XMap
611 604

	
612 605
  ///Constant (read only) version of XMap.
613 606
  ///
614 607
  template<class M>
615 608
  class ConstXMap
616 609
  {
617 610
    const M& _map;
618 611
  public:
619 612

	
620 613
    typedef typename M::Value::Value Value;
621 614
    typedef typename M::Key Key;
622 615
    ///\e
623 616
    ConstXMap(const M &map) : _map(map) {}
624 617
    Value operator[](Key k) const {return _map[k].x;}
625 618
  };
626 619

	
627 620
  ///Returns a ConstXMap class
628 621

	
629 622
  ///This function just returns a ConstXMap class.
630 623
  ///\relates ConstXMap
631 624
  template<class M>
632 625
  inline ConstXMap<M> xMap(const M &m)
633 626
  {
634 627
    return ConstXMap<M>(m);
635 628
  }
636 629

	
637 630
  ///Map of y-coordinates of a <tt>Point</tt>-map
638 631

	
639 632
  ///Map of y-coordinates of a \ref Point "Point"-map.
640 633
  ///
641 634
  template<class M>
642 635
  class YMap
643 636
  {
644 637
    M& _map;
645 638
  public:
646 639

	
647 640
    typedef typename M::Value::Value Value;
648 641
    typedef typename M::Key Key;
649 642
    ///\e
650 643
    YMap(M& map) : _map(map) {}
651 644
    Value operator[](Key k) const {return _map[k].y;}
652 645
    void set(Key k,Value v) {_map.set(k,typename M::Value(_map[k].x,v));}
653 646
  };
654 647

	
655 648
  ///Returns a YMap class
656 649

	
657 650
  ///This function just returns a YMap class.
658 651
  ///\relates YMap
659 652
  template<class M>
660 653
  inline YMap<M> yMap(M &m)
661 654
  {
662 655
    return YMap<M>(m);
663 656
  }
664 657

	
665 658
  template<class M>
666 659
  inline YMap<M> yMap(const M &m)
667 660
  {
668 661
    return YMap<M>(m);
669 662
  }
670 663

	
671 664
  ///Constant (read only) version of YMap
672 665

	
673 666
  ///Constant (read only) version of YMap.
674 667
  ///
675 668
  template<class M>
676 669
  class ConstYMap
677 670
  {
678 671
    const M& _map;
679 672
  public:
680 673

	
681 674
    typedef typename M::Value::Value Value;
682 675
    typedef typename M::Key Key;
683 676
    ///\e
684 677
    ConstYMap(const M &map) : _map(map) {}
685 678
    Value operator[](Key k) const {return _map[k].y;}
686 679
  };
687 680

	
688 681
  ///Returns a ConstYMap class
689 682

	
690 683
  ///This function just returns a ConstYMap class.
691 684
  ///\relates ConstYMap
692 685
  template<class M>
693 686
  inline ConstYMap<M> yMap(const M &m)
694 687
  {
695 688
    return ConstYMap<M>(m);
696 689
  }
697 690

	
698 691

	
699 692
  ///\brief Map of the normSquare() of a <tt>Point</tt>-map
700 693
  ///
701 694
  ///Map of the \ref Point::normSquare() "normSquare()"
702 695
  ///of a \ref Point "Point"-map.
703 696
  template<class M>
704 697
  class NormSquareMap
705 698
  {
706 699
    const M& _map;
707 700
  public:
708 701

	
709 702
    typedef typename M::Value::Value Value;
710 703
    typedef typename M::Key Key;
711 704
    ///\e
712 705
    NormSquareMap(const M &map) : _map(map) {}
713 706
    Value operator[](Key k) const {return _map[k].normSquare();}
714 707
  };
715 708

	
716 709
  ///Returns a NormSquareMap class
717 710

	
718 711
  ///This function just returns a NormSquareMap class.
719 712
  ///\relates NormSquareMap
720 713
  template<class M>
721 714
  inline NormSquareMap<M> normSquareMap(const M &m)
722 715
  {
723 716
    return NormSquareMap<M>(m);
724 717
  }
725 718

	
726 719
  /// @}
727 720

	
728 721
  } //namespce dim2
729 722

	
730 723
} //namespace lemon
731 724

	
732 725
#endif //LEMON_DIM2_H
Ignore white space 50331648 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
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_GOMORY_HU_TREE_H
20 20
#define LEMON_GOMORY_HU_TREE_H
21 21

	
22 22
#include <limits>
23 23

	
24 24
#include <lemon/core.h>
25 25
#include <lemon/preflow.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
/// \ingroup min_cut
30 30
/// \file 
31 31
/// \brief Gomory-Hu cut tree in graphs.
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup min_cut
36 36
  ///
37 37
  /// \brief Gomory-Hu cut tree algorithm
38 38
  ///
39 39
  /// The Gomory-Hu tree is a tree on the node set of a given graph, but it
40 40
  /// may contain edges which are not in the original graph. It has the
41 41
  /// property that the minimum capacity edge of the path between two nodes 
42 42
  /// in this tree has the same weight as the minimum cut in the graph
43 43
  /// between these nodes. Moreover the components obtained by removing
44 44
  /// this edge from the tree determine the corresponding minimum cut.
45 45
  /// Therefore once this tree is computed, the minimum cut between any pair
46 46
  /// of nodes can easily be obtained.
47 47
  /// 
48 48
  /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
49 49
  /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall
50 50
  /// time complexity. It calculates a rooted Gomory-Hu tree.
51 51
  /// The structure of the tree and the edge weights can be
52 52
  /// obtained using \c predNode(), \c predValue() and \c rootDist().
53 53
  /// The functions \c minCutMap() and \c minCutValue() calculate
54 54
  /// the minimum cut and the minimum cut value between any two nodes
55 55
  /// in the graph. You can also list (iterate on) the nodes and the
56 56
  /// edges of the cuts using \c MinCutNodeIt and \c MinCutEdgeIt.
57 57
  ///
58 58
  /// \tparam GR The type of the undirected graph the algorithm runs on.
59 59
  /// \tparam CAP The type of the edge map containing the capacities.
60 60
  /// The default map type is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
61 61
#ifdef DOXYGEN
62 62
  template <typename GR,
63 63
	    typename CAP>
64 64
#else
65 65
  template <typename GR,
66 66
	    typename CAP = typename GR::template EdgeMap<int> >
67 67
#endif
68 68
  class GomoryHu {
69 69
  public:
70 70

	
71 71
    /// The graph type of the algorithm
72 72
    typedef GR Graph;
73 73
    /// The capacity map type of the algorithm
74 74
    typedef CAP Capacity;
75 75
    /// The value type of capacities
76 76
    typedef typename Capacity::Value Value;
77 77
    
78 78
  private:
79 79

	
80 80
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
81 81

	
82 82
    const Graph& _graph;
83 83
    const Capacity& _capacity;
84 84

	
85 85
    Node _root;
86 86
    typename Graph::template NodeMap<Node>* _pred;
87 87
    typename Graph::template NodeMap<Value>* _weight;
88 88
    typename Graph::template NodeMap<int>* _order;
89 89

	
90 90
    void createStructures() {
91 91
      if (!_pred) {
92 92
	_pred = new typename Graph::template NodeMap<Node>(_graph);
93 93
      }
94 94
      if (!_weight) {
95 95
	_weight = new typename Graph::template NodeMap<Value>(_graph);
96 96
      }
97 97
      if (!_order) {
98 98
	_order = new typename Graph::template NodeMap<int>(_graph);
99 99
      }
100 100
    }
101 101

	
102 102
    void destroyStructures() {
103 103
      if (_pred) {
104 104
	delete _pred;
105 105
      }
106 106
      if (_weight) {
107 107
	delete _weight;
108 108
      }
109 109
      if (_order) {
110 110
	delete _order;
111 111
      }
112 112
    }
113 113
  
114 114
  public:
115 115

	
116 116
    /// \brief Constructor
117 117
    ///
118 118
    /// Constructor.
119 119
    /// \param graph The undirected graph the algorithm runs on.
120 120
    /// \param capacity The edge capacity map.
121 121
    GomoryHu(const Graph& graph, const Capacity& capacity) 
122 122
      : _graph(graph), _capacity(capacity),
123 123
	_pred(0), _weight(0), _order(0) 
124 124
    {
125 125
      checkConcept<concepts::ReadMap<Edge, Value>, Capacity>();
126 126
    }
127 127

	
128 128

	
129 129
    /// \brief Destructor
130 130
    ///
131 131
    /// Destructor.
132 132
    ~GomoryHu() {
133 133
      destroyStructures();
134 134
    }
135 135

	
136 136
  private:
137 137
  
138 138
    // Initialize the internal data structures
139 139
    void init() {
140 140
      createStructures();
141 141

	
142 142
      _root = NodeIt(_graph);
143 143
      for (NodeIt n(_graph); n != INVALID; ++n) {
144 144
        (*_pred)[n] = _root;
145 145
        (*_order)[n] = -1;
146 146
      }
147 147
      (*_pred)[_root] = INVALID;
148 148
      (*_weight)[_root] = std::numeric_limits<Value>::max(); 
149 149
    }
150 150

	
151 151

	
152 152
    // Start the algorithm
153 153
    void start() {
154 154
      Preflow<Graph, Capacity> fa(_graph, _capacity, _root, INVALID);
155 155

	
156 156
      for (NodeIt n(_graph); n != INVALID; ++n) {
157 157
	if (n == _root) continue;
158 158

	
159 159
	Node pn = (*_pred)[n];
160 160
	fa.source(n);
161 161
	fa.target(pn);
162 162

	
163 163
	fa.runMinCut();
164 164

	
165 165
	(*_weight)[n] = fa.flowValue();
166 166

	
167 167
	for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168 168
	  if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169 169
	    (*_pred)[nn] = n;
170 170
	  }
171 171
	}
172 172
	if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173 173
	  (*_pred)[n] = (*_pred)[pn];
174 174
	  (*_pred)[pn] = n;
175 175
	  (*_weight)[n] = (*_weight)[pn];
176 176
	  (*_weight)[pn] = fa.flowValue();
177 177
	}
178 178
      }
179 179

	
180 180
      (*_order)[_root] = 0;
181 181
      int index = 1;
182 182

	
183 183
      for (NodeIt n(_graph); n != INVALID; ++n) {
184 184
	std::vector<Node> st;
185 185
	Node nn = n;
186 186
	while ((*_order)[nn] == -1) {
187 187
	  st.push_back(nn);
188 188
	  nn = (*_pred)[nn];
189 189
	}
190 190
	while (!st.empty()) {
191 191
	  (*_order)[st.back()] = index++;
192 192
	  st.pop_back();
193 193
	}
194 194
      }
195 195
    }
196 196

	
197 197
  public:
198 198

	
199 199
    ///\name Execution Control
200 200
 
201 201
    ///@{
202 202

	
203 203
    /// \brief Run the Gomory-Hu algorithm.
204 204
    ///
205 205
    /// This function runs the Gomory-Hu algorithm.
206 206
    void run() {
207 207
      init();
208 208
      start();
209 209
    }
210 210
    
211 211
    /// @}
212 212

	
213 213
    ///\name Query Functions
214 214
    ///The results of the algorithm can be obtained using these
215 215
    ///functions.\n
216 216
    ///\ref run() should be called before using them.\n
217 217
    ///See also \ref MinCutNodeIt and \ref MinCutEdgeIt.
218 218

	
219 219
    ///@{
220 220

	
221 221
    /// \brief Return the predecessor node in the Gomory-Hu tree.
222 222
    ///
223 223
    /// This function returns the predecessor node of the given node
224 224
    /// in the Gomory-Hu tree.
225 225
    /// If \c node is the root of the tree, then it returns \c INVALID.
226 226
    ///
227 227
    /// \pre \ref run() must be called before using this function.
228 228
    Node predNode(const Node& node) const {
229 229
      return (*_pred)[node];
230 230
    }
231 231

	
232 232
    /// \brief Return the weight of the predecessor edge in the
233 233
    /// Gomory-Hu tree.
234 234
    ///
235 235
    /// This function returns the weight of the predecessor edge of the 
236 236
    /// given node in the Gomory-Hu tree.
237 237
    /// If \c node is the root of the tree, the result is undefined.
238 238
    ///
239 239
    /// \pre \ref run() must be called before using this function.
240 240
    Value predValue(const Node& node) const {
241 241
      return (*_weight)[node];
242 242
    }
243 243

	
244 244
    /// \brief Return the distance from the root node in the Gomory-Hu tree.
245 245
    ///
246 246
    /// This function returns the distance of the given node from the root
247 247
    /// node in the Gomory-Hu tree.
248 248
    ///
249 249
    /// \pre \ref run() must be called before using this function.
250 250
    int rootDist(const Node& node) const {
251 251
      return (*_order)[node];
252 252
    }
253 253

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

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

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

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

	
349 349
    ///@}
350 350

	
351 351
    friend class MinCutNodeIt;
352 352

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

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

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

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

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

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

	
511 511
        for(_node_it=typename Graph::NodeIt(_graph);
512 512
            _node_it!=INVALID && !_cut[_node_it];
513 513
            ++_node_it) {}
514 514
        _arc_it = _node_it!=INVALID ?
515 515
          typename Graph::OutArcIt(_graph,_node_it) : INVALID;
516 516
        while(_node_it!=INVALID && _arc_it == INVALID)
517 517
          {
518 518
            for(++_node_it; _node_it!=INVALID&&!_cut[_node_it]; ++_node_it) {}
519 519
            if(_node_it!=INVALID)
520 520
              _arc_it= typename Graph::OutArcIt(_graph,_node_it);
521 521
          }
522 522
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
523 523
      }
524 524
      /// Conversion to \c Arc
525 525

	
526 526
      /// Conversion to \c Arc.
527 527
      ///
528 528
      operator typename Graph::Arc() const
529 529
      {
530 530
        return _arc_it;
531 531
      }
532 532
      /// Conversion to \c Edge
533 533

	
534 534
      /// Conversion to \c Edge.
535 535
      ///
536 536
      operator typename Graph::Edge() const
537 537
      {
538 538
        return _arc_it;
539 539
      }
540 540
      bool operator==(Invalid) { return _node_it==INVALID; }
541 541
      bool operator!=(Invalid) { return _node_it!=INVALID; }
542 542
      /// Next edge
543 543

	
544 544
      /// Next edge.
545 545
      ///
546 546
      MinCutEdgeIt &operator++()
547 547
      {
548 548
        step();
549 549
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
550 550
        return *this;
551 551
      }
552 552
      /// Postfix incrementation
553 553
      
554 554
      /// Postfix incrementation.
555 555
      ///
556 556
      /// \warning This incrementation
557 557
      /// returns an \c Arc, not a \c MinCutEdgeIt, as one may expect.
558 558
      typename Graph::Arc operator++(int)
559 559
      {
560 560
        typename Graph::Arc e=*this;
561 561
        ++(*this);
562 562
        return e;
563 563
      }
564 564
    };
565 565

	
566 566
  };
567 567

	
568 568
}
569 569

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

	
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

	
52 52

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

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

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

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

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

	
85 85

	
86 86
  /// Constant map.
87 87

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

	
110 110
    /// Default constructor
111 111

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

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

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

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

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

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

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

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

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

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

	
151 151

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

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

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

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

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

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

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

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

	
197 197

	
198 198
  /// Identity map.
199 199

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

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

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

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

	
227 227

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

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

	
249 249
  public:
250 250

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

	
260 260
    typedef True ReferenceMapTag;
261 261

	
262 262
  public:
263 263

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

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

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

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

	
283 283
    /// Resizes the map.
284 284

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

	
294 294
  private:
295 295

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

	
298 298
  public:
299 299

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

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

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

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

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

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

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

	
336 336

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

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

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

	
373 373
    typedef True ReferenceMapTag;
374 374

	
375 375
  private:
376 376

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

	
381 381
  public:
382 382

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

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

	
397 397
  private:
398 398

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

	
401 401
  public:
402 402

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

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

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

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

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

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

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

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

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

	
465 465
  /// @}
466 466

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

	
470 470
  /// Composition of two maps
471 471

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

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

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

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

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

	
520 520

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

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

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

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

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

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

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

	
598 598

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

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

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

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

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

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

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

	
658 658

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

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

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

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

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

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

	
701 701

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

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

	
722 722
    /// Constructor
723 723

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

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

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

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

	
741 741

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

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

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

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

	
775 775
  /// This function just returns a \c ForkMap class.
776 776
  /// \relates ForkMap
777 777
  template <typename M1, typename M2>
778 778
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
779 779
    return ForkMap<M1,M2>(m1,m2);
780 780
  }
781 781

	
782 782

	
783 783
  /// Sum of two maps
784 784

	
785 785
  /// This \ref concepts::ReadMap "read-only map" returns the sum
786 786
  /// of the values of the two given maps.
787 787
  /// Its \c Key and \c Value types are inherited from \c M1.
788 788
  /// The \c Key and \c Value of \c M2 must be convertible to those of
789 789
  /// \c M1.
790 790
  ///
791 791
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
792 792
  /// \code
793 793
  ///   AddMap<M1,M2> am(m1,m2);
794 794
  /// \endcode
795 795
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
796 796
  ///
797 797
  /// The simplest way of using this map is through the addMap()
798 798
  /// function.
799 799
  ///
800 800
  /// \sa SubMap, MulMap, DivMap
801 801
  /// \sa ShiftMap, ShiftWriteMap
802 802
  template<typename M1, typename M2>
803 803
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
804 804
    const M1 &_m1;
805 805
    const M2 &_m2;
806 806
  public:
807 807
    ///\e
808 808
    typedef typename M1::Key Key;
809 809
    ///\e
810 810
    typedef typename M1::Value Value;
811 811

	
812 812
    /// Constructor
813 813
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
814 814
    ///\e
815 815
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
816 816
  };
817 817

	
818 818
  /// Returns an \c AddMap class
819 819

	
820 820
  /// This function just returns an \c AddMap class.
821 821
  ///
822 822
  /// For example, if \c m1 and \c m2 are both maps with \c double
823 823
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
824 824
  /// <tt>m1[x]+m2[x]</tt>.
825 825
  ///
826 826
  /// \relates AddMap
827 827
  template<typename M1, typename M2>
828 828
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
829 829
    return AddMap<M1, M2>(m1,m2);
830 830
  }
831 831

	
832 832

	
833 833
  /// Difference of two maps
834 834

	
835 835
  /// This \ref concepts::ReadMap "read-only map" returns the difference
836 836
  /// of the values of the two given maps.
837 837
  /// Its \c Key and \c Value types are inherited from \c M1.
838 838
  /// The \c Key and \c Value of \c M2 must be convertible to those of
839 839
  /// \c M1.
840 840
  ///
841 841
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
842 842
  /// \code
843 843
  ///   SubMap<M1,M2> sm(m1,m2);
844 844
  /// \endcode
845 845
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
846 846
  ///
847 847
  /// The simplest way of using this map is through the subMap()
848 848
  /// function.
849 849
  ///
850 850
  /// \sa AddMap, MulMap, DivMap
851 851
  template<typename M1, typename M2>
852 852
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
853 853
    const M1 &_m1;
854 854
    const M2 &_m2;
855 855
  public:
856 856
    ///\e
857 857
    typedef typename M1::Key Key;
858 858
    ///\e
859 859
    typedef typename M1::Value Value;
860 860

	
861 861
    /// Constructor
862 862
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
863 863
    ///\e
864 864
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
865 865
  };
866 866

	
867 867
  /// Returns a \c SubMap class
868 868

	
869 869
  /// This function just returns a \c SubMap class.
870 870
  ///
871 871
  /// For example, if \c m1 and \c m2 are both maps with \c double
872 872
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
873 873
  /// <tt>m1[x]-m2[x]</tt>.
874 874
  ///
875 875
  /// \relates SubMap
876 876
  template<typename M1, typename M2>
877 877
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
878 878
    return SubMap<M1, M2>(m1,m2);
879 879
  }
880 880

	
881 881

	
882 882
  /// Product of two maps
883 883

	
884 884
  /// This \ref concepts::ReadMap "read-only map" returns the product
885 885
  /// of the values of the two given maps.
886 886
  /// Its \c Key and \c Value types are inherited from \c M1.
887 887
  /// The \c Key and \c Value of \c M2 must be convertible to those of
888 888
  /// \c M1.
889 889
  ///
890 890
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
891 891
  /// \code
892 892
  ///   MulMap<M1,M2> mm(m1,m2);
893 893
  /// \endcode
894 894
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
895 895
  ///
896 896
  /// The simplest way of using this map is through the mulMap()
897 897
  /// function.
898 898
  ///
899 899
  /// \sa AddMap, SubMap, DivMap
900 900
  /// \sa ScaleMap, ScaleWriteMap
901 901
  template<typename M1, typename M2>
902 902
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
903 903
    const M1 &_m1;
904 904
    const M2 &_m2;
905 905
  public:
906 906
    ///\e
907 907
    typedef typename M1::Key Key;
908 908
    ///\e
909 909
    typedef typename M1::Value Value;
910 910

	
911 911
    /// Constructor
912 912
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
913 913
    ///\e
914 914
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
915 915
  };
916 916

	
917 917
  /// Returns a \c MulMap class
918 918

	
919 919
  /// This function just returns a \c MulMap class.
920 920
  ///
921 921
  /// For example, if \c m1 and \c m2 are both maps with \c double
922 922
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
923 923
  /// <tt>m1[x]*m2[x]</tt>.
924 924
  ///
925 925
  /// \relates MulMap
926 926
  template<typename M1, typename M2>
927 927
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
928 928
    return MulMap<M1, M2>(m1,m2);
929 929
  }
930 930

	
931 931

	
932 932
  /// Quotient of two maps
933 933

	
934 934
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
935 935
  /// of the values of the two given maps.
936 936
  /// Its \c Key and \c Value types are inherited from \c M1.
937 937
  /// The \c Key and \c Value of \c M2 must be convertible to those of
938 938
  /// \c M1.
939 939
  ///
940 940
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
941 941
  /// \code
942 942
  ///   DivMap<M1,M2> dm(m1,m2);
943 943
  /// \endcode
944 944
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
945 945
  ///
946 946
  /// The simplest way of using this map is through the divMap()
947 947
  /// function.
948 948
  ///
949 949
  /// \sa AddMap, SubMap, MulMap
950 950
  template<typename M1, typename M2>
951 951
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
952 952
    const M1 &_m1;
953 953
    const M2 &_m2;
954 954
  public:
955 955
    ///\e
956 956
    typedef typename M1::Key Key;
957 957
    ///\e
958 958
    typedef typename M1::Value Value;
959 959

	
960 960
    /// Constructor
961 961
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
962 962
    ///\e
963 963
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
964 964
  };
965 965

	
966 966
  /// Returns a \c DivMap class
967 967

	
968 968
  /// This function just returns a \c DivMap class.
969 969
  ///
970 970
  /// For example, if \c m1 and \c m2 are both maps with \c double
971 971
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
972 972
  /// <tt>m1[x]/m2[x]</tt>.
973 973
  ///
974 974
  /// \relates DivMap
975 975
  template<typename M1, typename M2>
976 976
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
977 977
    return DivMap<M1, M2>(m1,m2);
978 978
  }
979 979

	
980 980

	
981 981
  /// Shifts a map with a constant.
982 982

	
983 983
  /// This \ref concepts::ReadMap "read-only map" returns the sum of
984 984
  /// the given map and a constant value (i.e. it shifts the map with
985 985
  /// the constant). Its \c Key and \c Value are inherited from \c M.
986 986
  ///
987 987
  /// Actually,
988 988
  /// \code
989 989
  ///   ShiftMap<M> sh(m,v);
990 990
  /// \endcode
991 991
  /// is equivalent to
992 992
  /// \code
993 993
  ///   ConstMap<M::Key, M::Value> cm(v);
994 994
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
995 995
  /// \endcode
996 996
  ///
997 997
  /// The simplest way of using this map is through the shiftMap()
998 998
  /// function.
999 999
  ///
1000 1000
  /// \sa ShiftWriteMap
1001 1001
  template<typename M, typename C = typename M::Value>
1002 1002
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
1003 1003
    const M &_m;
1004 1004
    C _v;
1005 1005
  public:
1006 1006
    ///\e
1007 1007
    typedef typename M::Key Key;
1008 1008
    ///\e
1009 1009
    typedef typename M::Value Value;
1010 1010

	
1011 1011
    /// Constructor
1012 1012

	
1013 1013
    /// Constructor.
1014 1014
    /// \param m The undelying map.
1015 1015
    /// \param v The constant value.
1016 1016
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1017 1017
    ///\e
1018 1018
    Value operator[](const Key &k) const { return _m[k]+_v; }
1019 1019
  };
1020 1020

	
1021 1021
  /// Shifts a map with a constant (read-write version).
1022 1022

	
1023 1023
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1024 1024
  /// of the given map and a constant value (i.e. it shifts the map with
1025 1025
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1026 1026
  /// It makes also possible to write the map.
1027 1027
  ///
1028 1028
  /// The simplest way of using this map is through the shiftWriteMap()
1029 1029
  /// function.
1030 1030
  ///
1031 1031
  /// \sa ShiftMap
1032 1032
  template<typename M, typename C = typename M::Value>
1033 1033
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1034 1034
    M &_m;
1035 1035
    C _v;
1036 1036
  public:
1037 1037
    ///\e
1038 1038
    typedef typename M::Key Key;
1039 1039
    ///\e
1040 1040
    typedef typename M::Value Value;
1041 1041

	
1042 1042
    /// Constructor
1043 1043

	
1044 1044
    /// Constructor.
1045 1045
    /// \param m The undelying map.
1046 1046
    /// \param v The constant value.
1047 1047
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1048 1048
    ///\e
1049 1049
    Value operator[](const Key &k) const { return _m[k]+_v; }
1050 1050
    ///\e
1051 1051
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1052 1052
  };
1053 1053

	
1054 1054
  /// Returns a \c ShiftMap class
1055 1055

	
1056 1056
  /// This function just returns a \c ShiftMap class.
1057 1057
  ///
1058 1058
  /// For example, if \c m is a map with \c double values and \c v is
1059 1059
  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1060 1060
  /// <tt>m[x]+v</tt>.
1061 1061
  ///
1062 1062
  /// \relates ShiftMap
1063 1063
  template<typename M, typename C>
1064 1064
  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1065 1065
    return ShiftMap<M, C>(m,v);
1066 1066
  }
1067 1067

	
1068 1068
  /// Returns a \c ShiftWriteMap class
1069 1069

	
1070 1070
  /// This function just returns a \c ShiftWriteMap class.
1071 1071
  ///
1072 1072
  /// For example, if \c m is a map with \c double values and \c v is
1073 1073
  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1074 1074
  /// <tt>m[x]+v</tt>.
1075 1075
  /// Moreover it makes also possible to write the map.
1076 1076
  ///
1077 1077
  /// \relates ShiftWriteMap
1078 1078
  template<typename M, typename C>
1079 1079
  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1080 1080
    return ShiftWriteMap<M, C>(m,v);
1081 1081
  }
1082 1082

	
1083 1083

	
1084 1084
  /// Scales a map with a constant.
1085 1085

	
1086 1086
  /// This \ref concepts::ReadMap "read-only map" returns the value of
1087 1087
  /// the given map multiplied from the left side with a constant value.
1088 1088
  /// Its \c Key and \c Value are inherited from \c M.
1089 1089
  ///
1090 1090
  /// Actually,
1091 1091
  /// \code
1092 1092
  ///   ScaleMap<M> sc(m,v);
1093 1093
  /// \endcode
1094 1094
  /// is equivalent to
1095 1095
  /// \code
1096 1096
  ///   ConstMap<M::Key, M::Value> cm(v);
1097 1097
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1098 1098
  /// \endcode
1099 1099
  ///
1100 1100
  /// The simplest way of using this map is through the scaleMap()
1101 1101
  /// function.
1102 1102
  ///
1103 1103
  /// \sa ScaleWriteMap
1104 1104
  template<typename M, typename C = typename M::Value>
1105 1105
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1106 1106
    const M &_m;
1107 1107
    C _v;
1108 1108
  public:
1109 1109
    ///\e
1110 1110
    typedef typename M::Key Key;
1111 1111
    ///\e
1112 1112
    typedef typename M::Value Value;
1113 1113

	
1114 1114
    /// Constructor
1115 1115

	
1116 1116
    /// Constructor.
1117 1117
    /// \param m The undelying map.
1118 1118
    /// \param v The constant value.
1119 1119
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1120 1120
    ///\e
1121 1121
    Value operator[](const Key &k) const { return _v*_m[k]; }
1122 1122
  };
1123 1123

	
1124 1124
  /// Scales a map with a constant (read-write version).
1125 1125

	
1126 1126
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1127 1127
  /// the given map multiplied from the left side with a constant value.
1128 1128
  /// Its \c Key and \c Value are inherited from \c M.
1129 1129
  /// It can also be used as write map if the \c / operator is defined
1130 1130
  /// between \c Value and \c C and the given multiplier is not zero.
1131 1131
  ///
1132 1132
  /// The simplest way of using this map is through the scaleWriteMap()
1133 1133
  /// function.
1134 1134
  ///
1135 1135
  /// \sa ScaleMap
1136 1136
  template<typename M, typename C = typename M::Value>
1137 1137
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1138 1138
    M &_m;
1139 1139
    C _v;
1140 1140
  public:
1141 1141
    ///\e
1142 1142
    typedef typename M::Key Key;
1143 1143
    ///\e
1144 1144
    typedef typename M::Value Value;
1145 1145

	
1146 1146
    /// Constructor
1147 1147

	
1148 1148
    /// Constructor.
1149 1149
    /// \param m The undelying map.
1150 1150
    /// \param v The constant value.
1151 1151
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1152 1152
    ///\e
1153 1153
    Value operator[](const Key &k) const { return _v*_m[k]; }
1154 1154
    ///\e
1155 1155
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1156 1156
  };
1157 1157

	
1158 1158
  /// Returns a \c ScaleMap class
1159 1159

	
1160 1160
  /// This function just returns a \c ScaleMap class.
1161 1161
  ///
1162 1162
  /// For example, if \c m is a map with \c double values and \c v is
1163 1163
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1164 1164
  /// <tt>v*m[x]</tt>.
1165 1165
  ///
1166 1166
  /// \relates ScaleMap
1167 1167
  template<typename M, typename C>
1168 1168
  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1169 1169
    return ScaleMap<M, C>(m,v);
1170 1170
  }
1171 1171

	
1172 1172
  /// Returns a \c ScaleWriteMap class
1173 1173

	
1174 1174
  /// This function just returns a \c ScaleWriteMap class.
1175 1175
  ///
1176 1176
  /// For example, if \c m is a map with \c double values and \c v is
1177 1177
  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1178 1178
  /// <tt>v*m[x]</tt>.
1179 1179
  /// Moreover it makes also possible to write the map.
1180 1180
  ///
1181 1181
  /// \relates ScaleWriteMap
1182 1182
  template<typename M, typename C>
1183 1183
  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1184 1184
    return ScaleWriteMap<M, C>(m,v);
1185 1185
  }
1186 1186

	
1187 1187

	
1188 1188
  /// Negative of a map
1189 1189

	
1190 1190
  /// This \ref concepts::ReadMap "read-only map" returns the negative
1191 1191
  /// of the values of the given map (using the unary \c - operator).
1192 1192
  /// Its \c Key and \c Value are inherited from \c M.
1193 1193
  ///
1194 1194
  /// If M::Value is \c int, \c double etc., then
1195 1195
  /// \code
1196 1196
  ///   NegMap<M> neg(m);
1197 1197
  /// \endcode
1198 1198
  /// is equivalent to
1199 1199
  /// \code
1200 1200
  ///   ScaleMap<M> neg(m,-1);
1201 1201
  /// \endcode
1202 1202
  ///
1203 1203
  /// The simplest way of using this map is through the negMap()
1204 1204
  /// function.
1205 1205
  ///
1206 1206
  /// \sa NegWriteMap
1207 1207
  template<typename M>
1208 1208
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1209 1209
    const M& _m;
1210 1210
  public:
1211 1211
    ///\e
1212 1212
    typedef typename M::Key Key;
1213 1213
    ///\e
1214 1214
    typedef typename M::Value Value;
1215 1215

	
1216 1216
    /// Constructor
1217 1217
    NegMap(const M &m) : _m(m) {}
1218 1218
    ///\e
1219 1219
    Value operator[](const Key &k) const { return -_m[k]; }
1220 1220
  };
1221 1221

	
1222 1222
  /// Negative of a map (read-write version)
1223 1223

	
1224 1224
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1225 1225
  /// negative of the values of the given map (using the unary \c -
1226 1226
  /// operator).
1227 1227
  /// Its \c Key and \c Value are inherited from \c M.
1228 1228
  /// It makes also possible to write the map.
1229 1229
  ///
1230 1230
  /// If M::Value is \c int, \c double etc., then
1231 1231
  /// \code
1232 1232
  ///   NegWriteMap<M> neg(m);
1233 1233
  /// \endcode
1234 1234
  /// is equivalent to
1235 1235
  /// \code
1236 1236
  ///   ScaleWriteMap<M> neg(m,-1);
1237 1237
  /// \endcode
1238 1238
  ///
1239 1239
  /// The simplest way of using this map is through the negWriteMap()
1240 1240
  /// function.
1241 1241
  ///
1242 1242
  /// \sa NegMap
1243 1243
  template<typename M>
1244 1244
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1245 1245
    M &_m;
1246 1246
  public:
1247 1247
    ///\e
1248 1248
    typedef typename M::Key Key;
1249 1249
    ///\e
1250 1250
    typedef typename M::Value Value;
1251 1251

	
1252 1252
    /// Constructor
1253 1253
    NegWriteMap(M &m) : _m(m) {}
1254 1254
    ///\e
1255 1255
    Value operator[](const Key &k) const { return -_m[k]; }
1256 1256
    ///\e
1257 1257
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1258 1258
  };
1259 1259

	
1260 1260
  /// Returns a \c NegMap class
1261 1261

	
1262 1262
  /// This function just returns a \c NegMap class.
1263 1263
  ///
1264 1264
  /// For example, if \c m is a map with \c double values, then
1265 1265
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1266 1266
  ///
1267 1267
  /// \relates NegMap
1268 1268
  template <typename M>
1269 1269
  inline NegMap<M> negMap(const M &m) {
1270 1270
    return NegMap<M>(m);
1271 1271
  }
1272 1272

	
1273 1273
  /// Returns a \c NegWriteMap class
1274 1274

	
1275 1275
  /// This function just returns a \c NegWriteMap class.
1276 1276
  ///
1277 1277
  /// For example, if \c m is a map with \c double values, then
1278 1278
  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1279 1279
  /// Moreover it makes also possible to write the map.
1280 1280
  ///
1281 1281
  /// \relates NegWriteMap
1282 1282
  template <typename M>
1283 1283
  inline NegWriteMap<M> negWriteMap(M &m) {
1284 1284
    return NegWriteMap<M>(m);
1285 1285
  }
1286 1286

	
1287 1287

	
1288 1288
  /// Absolute value of a map
1289 1289

	
1290 1290
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1291 1291
  /// value of the values of the given map.
1292 1292
  /// Its \c Key and \c Value are inherited from \c M.
1293 1293
  /// \c Value must be comparable to \c 0 and the unary \c -
1294 1294
  /// operator must be defined for it, of course.
1295 1295
  ///
1296 1296
  /// The simplest way of using this map is through the absMap()
1297 1297
  /// function.
1298 1298
  template<typename M>
1299 1299
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1300 1300
    const M &_m;
1301 1301
  public:
1302 1302
    ///\e
1303 1303
    typedef typename M::Key Key;
1304 1304
    ///\e
1305 1305
    typedef typename M::Value Value;
1306 1306

	
1307 1307
    /// Constructor
1308 1308
    AbsMap(const M &m) : _m(m) {}
1309 1309
    ///\e
1310 1310
    Value operator[](const Key &k) const {
1311 1311
      Value tmp = _m[k];
1312 1312
      return tmp >= 0 ? tmp : -tmp;
1313 1313
    }
1314 1314

	
1315 1315
  };
1316 1316

	
1317 1317
  /// Returns an \c AbsMap class
1318 1318

	
1319 1319
  /// This function just returns an \c AbsMap class.
1320 1320
  ///
1321 1321
  /// For example, if \c m is a map with \c double values, then
1322 1322
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1323 1323
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1324 1324
  /// negative.
1325 1325
  ///
1326 1326
  /// \relates AbsMap
1327 1327
  template<typename M>
1328 1328
  inline AbsMap<M> absMap(const M &m) {
1329 1329
    return AbsMap<M>(m);
1330 1330
  }
1331 1331

	
1332 1332
  /// @}
1333 1333

	
1334 1334
  // Logical maps and map adaptors:
1335 1335

	
1336 1336
  /// \addtogroup maps
1337 1337
  /// @{
1338 1338

	
1339 1339
  /// Constant \c true map.
1340 1340

	
1341 1341
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1342 1342
  /// each key.
1343 1343
  ///
1344 1344
  /// Note that
1345 1345
  /// \code
1346 1346
  ///   TrueMap<K> tm;
1347 1347
  /// \endcode
1348 1348
  /// is equivalent to
1349 1349
  /// \code
1350 1350
  ///   ConstMap<K,bool> tm(true);
1351 1351
  /// \endcode
1352 1352
  ///
1353 1353
  /// \sa FalseMap
1354 1354
  /// \sa ConstMap
1355 1355
  template <typename K>
1356 1356
  class TrueMap : public MapBase<K, bool> {
1357 1357
  public:
1358 1358
    ///\e
1359 1359
    typedef K Key;
1360 1360
    ///\e
1361 1361
    typedef bool Value;
1362 1362

	
1363 1363
    /// Gives back \c true.
1364 1364
    Value operator[](const Key&) const { return true; }
1365 1365
  };
1366 1366

	
1367 1367
  /// Returns a \c TrueMap class
1368 1368

	
1369 1369
  /// This function just returns a \c TrueMap class.
1370 1370
  /// \relates TrueMap
1371 1371
  template<typename K>
1372 1372
  inline TrueMap<K> trueMap() {
1373 1373
    return TrueMap<K>();
1374 1374
  }
1375 1375

	
1376 1376

	
1377 1377
  /// Constant \c false map.
1378 1378

	
1379 1379
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1380 1380
  /// each key.
1381 1381
  ///
1382 1382
  /// Note that
1383 1383
  /// \code
1384 1384
  ///   FalseMap<K> fm;
1385 1385
  /// \endcode
1386 1386
  /// is equivalent to
1387 1387
  /// \code
1388 1388
  ///   ConstMap<K,bool> fm(false);
1389 1389
  /// \endcode
1390 1390
  ///
1391 1391
  /// \sa TrueMap
1392 1392
  /// \sa ConstMap
1393 1393
  template <typename K>
1394 1394
  class FalseMap : public MapBase<K, bool> {
1395 1395
  public:
1396 1396
    ///\e
1397 1397
    typedef K Key;
1398 1398
    ///\e
1399 1399
    typedef bool Value;
1400 1400

	
1401 1401
    /// Gives back \c false.
1402 1402
    Value operator[](const Key&) const { return false; }
1403 1403
  };
1404 1404

	
1405 1405
  /// Returns a \c FalseMap class
1406 1406

	
1407 1407
  /// This function just returns a \c FalseMap class.
1408 1408
  /// \relates FalseMap
1409 1409
  template<typename K>
1410 1410
  inline FalseMap<K> falseMap() {
1411 1411
    return FalseMap<K>();
1412 1412
  }
1413 1413

	
1414 1414
  /// @}
1415 1415

	
1416 1416
  /// \addtogroup map_adaptors
1417 1417
  /// @{
1418 1418

	
1419 1419
  /// Logical 'and' of two maps
1420 1420

	
1421 1421
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1422 1422
  /// 'and' of the values of the two given maps.
1423 1423
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1424 1424
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1425 1425
  ///
1426 1426
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1427 1427
  /// \code
1428 1428
  ///   AndMap<M1,M2> am(m1,m2);
1429 1429
  /// \endcode
1430 1430
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1431 1431
  ///
1432 1432
  /// The simplest way of using this map is through the andMap()
1433 1433
  /// function.
1434 1434
  ///
1435 1435
  /// \sa OrMap
1436 1436
  /// \sa NotMap, NotWriteMap
1437 1437
  template<typename M1, typename M2>
1438 1438
  class AndMap : public MapBase<typename M1::Key, bool> {
1439 1439
    const M1 &_m1;
1440 1440
    const M2 &_m2;
1441 1441
  public:
1442 1442
    ///\e
1443 1443
    typedef typename M1::Key Key;
1444 1444
    ///\e
1445 1445
    typedef bool Value;
1446 1446

	
1447 1447
    /// Constructor
1448 1448
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1449 1449
    ///\e
1450 1450
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1451 1451
  };
1452 1452

	
1453 1453
  /// Returns an \c AndMap class
1454 1454

	
1455 1455
  /// This function just returns an \c AndMap class.
1456 1456
  ///
1457 1457
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1458 1458
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1459 1459
  /// <tt>m1[x]&&m2[x]</tt>.
1460 1460
  ///
1461 1461
  /// \relates AndMap
1462 1462
  template<typename M1, typename M2>
1463 1463
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1464 1464
    return AndMap<M1, M2>(m1,m2);
1465 1465
  }
1466 1466

	
1467 1467

	
1468 1468
  /// Logical 'or' of two maps
1469 1469

	
1470 1470
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1471 1471
  /// 'or' of the values of the two given maps.
1472 1472
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1473 1473
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1474 1474
  ///
1475 1475
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1476 1476
  /// \code
1477 1477
  ///   OrMap<M1,M2> om(m1,m2);
1478 1478
  /// \endcode
1479 1479
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1480 1480
  ///
1481 1481
  /// The simplest way of using this map is through the orMap()
1482 1482
  /// function.
1483 1483
  ///
1484 1484
  /// \sa AndMap
1485 1485
  /// \sa NotMap, NotWriteMap
1486 1486
  template<typename M1, typename M2>
1487 1487
  class OrMap : public MapBase<typename M1::Key, bool> {
1488 1488
    const M1 &_m1;
1489 1489
    const M2 &_m2;
1490 1490
  public:
1491 1491
    ///\e
1492 1492
    typedef typename M1::Key Key;
1493 1493
    ///\e
1494 1494
    typedef bool Value;
1495 1495

	
1496 1496
    /// Constructor
1497 1497
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1498 1498
    ///\e
1499 1499
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1500 1500
  };
1501 1501

	
1502 1502
  /// Returns an \c OrMap class
1503 1503

	
1504 1504
  /// This function just returns an \c OrMap class.
1505 1505
  ///
1506 1506
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1507 1507
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1508 1508
  /// <tt>m1[x]||m2[x]</tt>.
1509 1509
  ///
1510 1510
  /// \relates OrMap
1511 1511
  template<typename M1, typename M2>
1512 1512
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1513 1513
    return OrMap<M1, M2>(m1,m2);
1514 1514
  }
1515 1515

	
1516 1516

	
1517 1517
  /// Logical 'not' of a map
1518 1518

	
1519 1519
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1520 1520
  /// negation of the values of the given map.
1521 1521
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1522 1522
  ///
1523 1523
  /// The simplest way of using this map is through the notMap()
1524 1524
  /// function.
1525 1525
  ///
1526 1526
  /// \sa NotWriteMap
1527 1527
  template <typename M>
1528 1528
  class NotMap : public MapBase<typename M::Key, bool> {
1529 1529
    const M &_m;
1530 1530
  public:
1531 1531
    ///\e
1532 1532
    typedef typename M::Key Key;
1533 1533
    ///\e
1534 1534
    typedef bool Value;
1535 1535

	
1536 1536
    /// Constructor
1537 1537
    NotMap(const M &m) : _m(m) {}
1538 1538
    ///\e
1539 1539
    Value operator[](const Key &k) const { return !_m[k]; }
1540 1540
  };
1541 1541

	
1542 1542
  /// Logical 'not' of a map (read-write version)
1543 1543

	
1544 1544
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1545 1545
  /// logical negation of the values of the given map.
1546 1546
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1547 1547
  /// It makes also possible to write the map. When a value is set,
1548 1548
  /// the opposite value is set to the original map.
1549 1549
  ///
1550 1550
  /// The simplest way of using this map is through the notWriteMap()
1551 1551
  /// function.
1552 1552
  ///
1553 1553
  /// \sa NotMap
1554 1554
  template <typename M>
1555 1555
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1556 1556
    M &_m;
1557 1557
  public:
1558 1558
    ///\e
1559 1559
    typedef typename M::Key Key;
1560 1560
    ///\e
1561 1561
    typedef bool Value;
1562 1562

	
1563 1563
    /// Constructor
1564 1564
    NotWriteMap(M &m) : _m(m) {}
1565 1565
    ///\e
1566 1566
    Value operator[](const Key &k) const { return !_m[k]; }
1567 1567
    ///\e
1568 1568
    void set(const Key &k, bool v) { _m.set(k, !v); }
1569 1569
  };
1570 1570

	
1571 1571
  /// Returns a \c NotMap class
1572 1572

	
1573 1573
  /// This function just returns a \c NotMap class.
1574 1574
  ///
1575 1575
  /// For example, if \c m is a map with \c bool values, then
1576 1576
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1577 1577
  ///
1578 1578
  /// \relates NotMap
1579 1579
  template <typename M>
1580 1580
  inline NotMap<M> notMap(const M &m) {
1581 1581
    return NotMap<M>(m);
1582 1582
  }
1583 1583

	
1584 1584
  /// Returns a \c NotWriteMap class
1585 1585

	
1586 1586
  /// This function just returns a \c NotWriteMap class.
1587 1587
  ///
1588 1588
  /// For example, if \c m is a map with \c bool values, then
1589 1589
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1590 1590
  /// Moreover it makes also possible to write the map.
1591 1591
  ///
1592 1592
  /// \relates NotWriteMap
1593 1593
  template <typename M>
1594 1594
  inline NotWriteMap<M> notWriteMap(M &m) {
1595 1595
    return NotWriteMap<M>(m);
1596 1596
  }
1597 1597

	
1598 1598

	
1599 1599
  /// Combination of two maps using the \c == operator
1600 1600

	
1601 1601
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1602 1602
  /// the keys for which the corresponding values of the two maps are
1603 1603
  /// equal.
1604 1604
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1605 1605
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1606 1606
  ///
1607 1607
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1608 1608
  /// \code
1609 1609
  ///   EqualMap<M1,M2> em(m1,m2);
1610 1610
  /// \endcode
1611 1611
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1612 1612
  ///
1613 1613
  /// The simplest way of using this map is through the equalMap()
1614 1614
  /// function.
1615 1615
  ///
1616 1616
  /// \sa LessMap
1617 1617
  template<typename M1, typename M2>
1618 1618
  class EqualMap : public MapBase<typename M1::Key, bool> {
1619 1619
    const M1 &_m1;
1620 1620
    const M2 &_m2;
1621 1621
  public:
1622 1622
    ///\e
1623 1623
    typedef typename M1::Key Key;
1624 1624
    ///\e
1625 1625
    typedef bool Value;
1626 1626

	
1627 1627
    /// Constructor
1628 1628
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1629 1629
    ///\e
1630 1630
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1631 1631
  };
1632 1632

	
1633 1633
  /// Returns an \c EqualMap class
1634 1634

	
1635 1635
  /// This function just returns an \c EqualMap class.
1636 1636
  ///
1637 1637
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1638 1638
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1639 1639
  /// <tt>m1[x]==m2[x]</tt>.
1640 1640
  ///
1641 1641
  /// \relates EqualMap
1642 1642
  template<typename M1, typename M2>
1643 1643
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1644 1644
    return EqualMap<M1, M2>(m1,m2);
1645 1645
  }
1646 1646

	
1647 1647

	
1648 1648
  /// Combination of two maps using the \c < operator
1649 1649

	
1650 1650
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1651 1651
  /// the keys for which the corresponding value of the first map is
1652 1652
  /// less then the value of the second map.
1653 1653
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1654 1654
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1655 1655
  ///
1656 1656
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1657 1657
  /// \code
1658 1658
  ///   LessMap<M1,M2> lm(m1,m2);
1659 1659
  /// \endcode
1660 1660
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1661 1661
  ///
1662 1662
  /// The simplest way of using this map is through the lessMap()
1663 1663
  /// function.
1664 1664
  ///
1665 1665
  /// \sa EqualMap
1666 1666
  template<typename M1, typename M2>
1667 1667
  class LessMap : public MapBase<typename M1::Key, bool> {
1668 1668
    const M1 &_m1;
1669 1669
    const M2 &_m2;
1670 1670
  public:
1671 1671
    ///\e
1672 1672
    typedef typename M1::Key Key;
1673 1673
    ///\e
1674 1674
    typedef bool Value;
1675 1675

	
1676 1676
    /// Constructor
1677 1677
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1678 1678
    ///\e
1679 1679
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1680 1680
  };
1681 1681

	
1682 1682
  /// Returns an \c LessMap class
1683 1683

	
1684 1684
  /// This function just returns an \c LessMap class.
1685 1685
  ///
1686 1686
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1687 1687
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1688 1688
  /// <tt>m1[x]<m2[x]</tt>.
1689 1689
  ///
1690 1690
  /// \relates LessMap
1691 1691
  template<typename M1, typename M2>
1692 1692
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1693 1693
    return LessMap<M1, M2>(m1,m2);
1694 1694
  }
1695 1695

	
1696 1696
  namespace _maps_bits {
1697 1697

	
1698 1698
    template <typename _Iterator, typename Enable = void>
1699 1699
    struct IteratorTraits {
1700 1700
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1701 1701
    };
1702 1702

	
1703 1703
    template <typename _Iterator>
1704 1704
    struct IteratorTraits<_Iterator,
1705 1705
      typename exists<typename _Iterator::container_type>::type>
1706 1706
    {
1707 1707
      typedef typename _Iterator::container_type::value_type Value;
1708 1708
    };
1709 1709

	
1710 1710
  }
1711 1711

	
1712 1712
  /// @}
1713 1713

	
1714 1714
  /// \addtogroup maps
1715 1715
  /// @{
1716 1716

	
1717 1717
  /// \brief Writable bool map for logging each \c true assigned element
1718 1718
  ///
1719 1719
  /// A \ref concepts::WriteMap "writable" bool map for logging
1720 1720
  /// each \c true assigned element, i.e it copies subsequently each
1721 1721
  /// keys set to \c true to the given iterator.
1722 1722
  /// The most important usage of it is storing certain nodes or arcs
1723 1723
  /// that were marked \c true by an algorithm.
1724 1724
  ///
1725 1725
  /// There are several algorithms that provide solutions through bool
1726 1726
  /// maps and most of them assign \c true at most once for each key.
1727 1727
  /// In these cases it is a natural request to store each \c true
1728 1728
  /// assigned elements (in order of the assignment), which can be
1729 1729
  /// easily done with LoggerBoolMap.
1730 1730
  ///
1731 1731
  /// The simplest way of using this map is through the loggerBoolMap()
1732 1732
  /// function.
1733 1733
  ///
1734 1734
  /// \tparam IT The type of the iterator.
1735 1735
  /// \tparam KEY The key type of the map. The default value set
1736 1736
  /// according to the iterator type should work in most cases.
1737 1737
  ///
1738 1738
  /// \note The container of the iterator must contain enough space
1739 1739
  /// for the elements or the iterator should be an inserter iterator.
1740 1740
#ifdef DOXYGEN
1741 1741
  template <typename IT, typename KEY>
1742 1742
#else
1743 1743
  template <typename IT,
1744 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1745 1745
#endif
1746 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1747 1747
  public:
1748 1748

	
1749 1749
    ///\e
1750 1750
    typedef KEY Key;
1751 1751
    ///\e
1752 1752
    typedef bool Value;
1753 1753
    ///\e
1754 1754
    typedef IT Iterator;
1755 1755

	
1756 1756
    /// Constructor
1757 1757
    LoggerBoolMap(Iterator it)
1758 1758
      : _begin(it), _end(it) {}
1759 1759

	
1760 1760
    /// Gives back the given iterator set for the first key
1761 1761
    Iterator begin() const {
1762 1762
      return _begin;
1763 1763
    }
1764 1764

	
1765 1765
    /// Gives back the the 'after the last' iterator
1766 1766
    Iterator end() const {
1767 1767
      return _end;
1768 1768
    }
1769 1769

	
1770 1770
    /// The set function of the map
1771 1771
    void set(const Key& key, Value value) {
1772 1772
      if (value) {
1773 1773
        *_end++ = key;
1774 1774
      }
1775 1775
    }
1776 1776

	
1777 1777
  private:
1778 1778
    Iterator _begin;
1779 1779
    Iterator _end;
1780 1780
  };
1781 1781

	
1782 1782
  /// Returns a \c LoggerBoolMap class
1783 1783

	
1784 1784
  /// This function just returns a \c LoggerBoolMap class.
1785 1785
  ///
1786 1786
  /// The most important usage of it is storing certain nodes or arcs
1787 1787
  /// that were marked \c true by an algorithm.
1788 1788
  /// For example it makes easier to store the nodes in the processing
1789 1789
  /// order of Dfs algorithm, as the following examples show.
1790 1790
  /// \code
1791 1791
  ///   std::vector<Node> v;
1792
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1792
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1793 1793
  /// \endcode
1794 1794
  /// \code
1795 1795
  ///   std::vector<Node> v(countNodes(g));
1796
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1796
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1797 1797
  /// \endcode
1798 1798
  ///
1799 1799
  /// \note The container of the iterator must contain enough space
1800 1800
  /// for the elements or the iterator should be an inserter iterator.
1801 1801
  ///
1802 1802
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1803 1803
  /// it cannot be used when a readable map is needed, for example as
1804 1804
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1805 1805
  ///
1806 1806
  /// \relates LoggerBoolMap
1807 1807
  template<typename Iterator>
1808 1808
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1809 1809
    return LoggerBoolMap<Iterator>(it);
1810 1810
  }
1811 1811

	
1812 1812
  /// @}
1813 1813

	
1814 1814
  /// \addtogroup graph_maps
1815 1815
  /// @{
1816 1816

	
1817 1817
  /// \brief Provides an immutable and unique id for each item in a graph.
1818 1818
  ///
1819 1819
  /// IdMap provides a unique and immutable id for each item of the
1820 1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1821 1821
  ///  - \b unique: different items get different ids,
1822 1822
  ///  - \b immutable: the id of an item does not change (even if you
1823 1823
  ///    delete other nodes).
1824 1824
  ///
1825 1825
  /// Using this map you get access (i.e. can read) the inner id values of
1826 1826
  /// the items stored in the graph, which is returned by the \c id()
1827 1827
  /// function of the graph. This map can be inverted with its member
1828
  /// class \c InverseMap or with the \c operator() member.
1828
  /// class \c InverseMap or with the \c operator()() member.
1829 1829
  ///
1830 1830
  /// \tparam GR The graph type.
1831 1831
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1832 1832
  /// \c GR::Edge).
1833 1833
  ///
1834 1834
  /// \see RangeIdMap
1835 1835
  template <typename GR, typename K>
1836 1836
  class IdMap : public MapBase<K, int> {
1837 1837
  public:
1838 1838
    /// The graph type of IdMap.
1839 1839
    typedef GR Graph;
1840 1840
    typedef GR Digraph;
1841 1841
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1842 1842
    typedef K Item;
1843 1843
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1844 1844
    typedef K Key;
1845 1845
    /// The value type of IdMap.
1846 1846
    typedef int Value;
1847 1847

	
1848 1848
    /// \brief Constructor.
1849 1849
    ///
1850 1850
    /// Constructor of the map.
1851 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1852 1852

	
1853 1853
    /// \brief Gives back the \e id of the item.
1854 1854
    ///
1855 1855
    /// Gives back the immutable and unique \e id of the item.
1856 1856
    int operator[](const Item& item) const { return _graph->id(item);}
1857 1857

	
1858 1858
    /// \brief Gives back the \e item by its id.
1859 1859
    ///
1860 1860
    /// Gives back the \e item by its id.
1861 1861
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1862 1862

	
1863 1863
  private:
1864 1864
    const Graph* _graph;
1865 1865

	
1866 1866
  public:
1867 1867

	
1868
    /// \brief This class represents the inverse of its owner (IdMap).
1868
    /// \brief The inverse map type of IdMap.
1869 1869
    ///
1870
    /// This class represents the inverse of its owner (IdMap).
1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871
    /// an item by its id.
1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1871 1873
    /// \see inverse()
1872 1874
    class InverseMap {
1873 1875
    public:
1874 1876

	
1875 1877
      /// \brief Constructor.
1876 1878
      ///
1877 1879
      /// Constructor for creating an id-to-item map.
1878 1880
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1879 1881

	
1880 1882
      /// \brief Constructor.
1881 1883
      ///
1882 1884
      /// Constructor for creating an id-to-item map.
1883 1885
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1884 1886

	
1885
      /// \brief Gives back the given item from its id.
1887
      /// \brief Gives back an item by its id.
1886 1888
      ///
1887
      /// Gives back the given item from its id.
1889
      /// Gives back an item by its id.
1888 1890
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1889 1891

	
1890 1892
    private:
1891 1893
      const Graph* _graph;
1892 1894
    };
1893 1895

	
1894 1896
    /// \brief Gives back the inverse of the map.
1895 1897
    ///
1896 1898
    /// Gives back the inverse of the IdMap.
1897 1899
    InverseMap inverse() const { return InverseMap(*_graph);}
1898 1900
  };
1899 1901

	
1902
  /// \brief Returns an \c IdMap class.
1903
  ///
1904
  /// This function just returns an \c IdMap class.
1905
  /// \relates IdMap
1906
  template <typename K, typename GR>
1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908
    return IdMap<GR, K>(graph);
1909
  }
1900 1910

	
1901 1911
  /// \brief General cross reference graph map type.
1902 1912

	
1903 1913
  /// This class provides simple invertable graph maps.
1904 1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1905 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1906
  /// The values of the map can be accessed
1907
  /// with stl compatible forward iterator.
1916
  /// The graph items can be accessed by their values either using
1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  /// 
1920
  /// This map is intended to be used when all associated values are
1921
  /// different (the map is actually invertable) or there are only a few
1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more 
1924
  /// suitable and more efficient for such cases. It provides iterators
1925
  /// to traverse the items with the same associated value, however
1926
  /// it does not have \c InverseMap.
1908 1927
  ///
1909 1928
  /// This type is not reference map, so it cannot be modified with
1910 1929
  /// the subscript operator.
1911 1930
  ///
1912 1931
  /// \tparam GR The graph type.
1913 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1914 1933
  /// \c GR::Edge).
1915 1934
  /// \tparam V The value type of the map.
1916 1935
  ///
1917 1936
  /// \see IterableValueMap
1918 1937
  template <typename GR, typename K, typename V>
1919 1938
  class CrossRefMap
1920 1939
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1921 1940
  private:
1922 1941

	
1923 1942
    typedef typename ItemSetTraits<GR, K>::
1924 1943
      template Map<V>::Type Map;
1925 1944

	
1926 1945
    typedef std::multimap<V, K> Container;
1927 1946
    Container _inv_map;
1928 1947

	
1929 1948
  public:
1930 1949

	
1931 1950
    /// The graph type of CrossRefMap.
1932 1951
    typedef GR Graph;
1933 1952
    typedef GR Digraph;
1934 1953
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1954
    typedef K Item;
1936 1955
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1956
    typedef K Key;
1938 1957
    /// The value type of CrossRefMap.
1939 1958
    typedef V Value;
1940 1959

	
1941 1960
    /// \brief Constructor.
1942 1961
    ///
1943 1962
    /// Construct a new CrossRefMap for the given graph.
1944 1963
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1945 1964

	
1946 1965
    /// \brief Forward iterator for values.
1947 1966
    ///
1948
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1949 1968
    /// iterator on the values of the map. The values can
1950 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1951 1970
    /// They are considered with multiplicity, so each value is
1952 1971
    /// traversed for each item it is assigned to.
1953
    class ValueIterator
1972
    class ValueIt
1954 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1955 1974
      friend class CrossRefMap;
1956 1975
    private:
1957
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1958 1977
        : it(_it) {}
1959 1978
    public:
1960 1979

	
1961
      ValueIterator() {}
1962

	
1963
      ValueIterator& operator++() { ++it; return *this; }
1964
      ValueIterator operator++(int) {
1965
        ValueIterator tmp(*this);
1980
      /// Constructor
1981
      ValueIt() {}
1982

	
1983
      /// \e
1984
      ValueIt& operator++() { ++it; return *this; }
1985
      /// \e
1986
      ValueIt operator++(int) {
1987
        ValueIt tmp(*this);
1966 1988
        operator++();
1967 1989
        return tmp;
1968 1990
      }
1969 1991

	
1992
      /// \e
1970 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1971 1995
      const Value* operator->() const { return &(it->first); }
1972 1996

	
1973
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1974
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1997
      /// \e
1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999
      /// \e
2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1975 2001

	
1976 2002
    private:
1977 2003
      typename Container::const_iterator it;
1978 2004
    };
2005
    
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
1979 2008

	
1980 2009
    /// \brief Returns an iterator to the first value.
1981 2010
    ///
1982
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1983 2012
    /// first value of the map. The values of the
1984 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1985 2014
    /// range.
1986
    ValueIterator beginValue() const {
1987
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1988 2017
    }
1989 2018

	
1990 2019
    /// \brief Returns an iterator after the last value.
1991 2020
    ///
1992
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1993 2022
    /// last value of the map. The values of the
1994 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1995 2024
    /// range.
1996
    ValueIterator endValue() const {
1997
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1998 2027
    }
1999 2028

	
2000 2029
    /// \brief Sets the value associated with the given key.
2001 2030
    ///
2002 2031
    /// Sets the value associated with the given key.
2003 2032
    void set(const Key& key, const Value& val) {
2004 2033
      Value oldval = Map::operator[](key);
2005 2034
      typename Container::iterator it;
2006 2035
      for (it = _inv_map.equal_range(oldval).first;
2007 2036
           it != _inv_map.equal_range(oldval).second; ++it) {
2008 2037
        if (it->second == key) {
2009 2038
          _inv_map.erase(it);
2010 2039
          break;
2011 2040
        }
2012 2041
      }
2013 2042
      _inv_map.insert(std::make_pair(val, key));
2014 2043
      Map::set(key, val);
2015 2044
    }
2016 2045

	
2017 2046
    /// \brief Returns the value associated with the given key.
2018 2047
    ///
2019 2048
    /// Returns the value associated with the given key.
2020 2049
    typename MapTraits<Map>::ConstReturnValue
2021 2050
    operator[](const Key& key) const {
2022 2051
      return Map::operator[](key);
2023 2052
    }
2024 2053

	
2025 2054
    /// \brief Gives back an item by its value.
2026 2055
    ///
2027 2056
    /// This function gives back an item that is assigned to
2028 2057
    /// the given value or \c INVALID if no such item exists.
2029 2058
    /// If there are more items with the same associated value,
2030 2059
    /// only one of them is returned.
2031 2060
    Key operator()(const Value& val) const {
2032 2061
      typename Container::const_iterator it = _inv_map.find(val);
2033 2062
      return it != _inv_map.end() ? it->second : INVALID;
2034 2063
    }
2064
    
2065
    /// \brief Returns the number of items with the given value.
2066
    ///
2067
    /// This function returns the number of items with the given value
2068
    /// associated with it.
2069
    int count(const Value &val) const {
2070
      return _inv_map.count(val);
2071
    }
2035 2072

	
2036 2073
  protected:
2037 2074

	
2038 2075
    /// \brief Erase the key from the map and the inverse map.
2039 2076
    ///
2040 2077
    /// Erase the key from the map and the inverse map. It is called by the
2041 2078
    /// \c AlterationNotifier.
2042 2079
    virtual void erase(const Key& key) {
2043 2080
      Value val = Map::operator[](key);
2044 2081
      typename Container::iterator it;
2045 2082
      for (it = _inv_map.equal_range(val).first;
2046 2083
           it != _inv_map.equal_range(val).second; ++it) {
2047 2084
        if (it->second == key) {
2048 2085
          _inv_map.erase(it);
2049 2086
          break;
2050 2087
        }
2051 2088
      }
2052 2089
      Map::erase(key);
2053 2090
    }
2054 2091

	
2055 2092
    /// \brief Erase more keys from the map and the inverse map.
2056 2093
    ///
2057 2094
    /// Erase more keys from the map and the inverse map. It is called by the
2058 2095
    /// \c AlterationNotifier.
2059 2096
    virtual void erase(const std::vector<Key>& keys) {
2060 2097
      for (int i = 0; i < int(keys.size()); ++i) {
2061 2098
        Value val = Map::operator[](keys[i]);
2062 2099
        typename Container::iterator it;
2063 2100
        for (it = _inv_map.equal_range(val).first;
2064 2101
             it != _inv_map.equal_range(val).second; ++it) {
2065 2102
          if (it->second == keys[i]) {
2066 2103
            _inv_map.erase(it);
2067 2104
            break;
2068 2105
          }
2069 2106
        }
2070 2107
      }
2071 2108
      Map::erase(keys);
2072 2109
    }
2073 2110

	
2074 2111
    /// \brief Clear the keys from the map and the inverse map.
2075 2112
    ///
2076 2113
    /// Clear the keys from the map and the inverse map. It is called by the
2077 2114
    /// \c AlterationNotifier.
2078 2115
    virtual void clear() {
2079 2116
      _inv_map.clear();
2080 2117
      Map::clear();
2081 2118
    }
2082 2119

	
2083 2120
  public:
2084 2121

	
2085
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2086 2123
    ///
2087
    /// The inverse of this map. The subscript operator of the map
2088
    /// gives back the item that was last assigned to the value.
2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125
    /// back an item by its value.
2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
    /// \see inverse()
2089 2128
    class InverseMap {
2090 2129
    public:
2091 2130
      /// \brief Constructor
2092 2131
      ///
2093 2132
      /// Constructor of the InverseMap.
2094 2133
      explicit InverseMap(const CrossRefMap& inverted)
2095 2134
        : _inverted(inverted) {}
2096 2135

	
2097 2136
      /// The value type of the InverseMap.
2098 2137
      typedef typename CrossRefMap::Key Value;
2099 2138
      /// The key type of the InverseMap.
2100 2139
      typedef typename CrossRefMap::Value Key;
2101 2140

	
2102 2141
      /// \brief Subscript operator.
2103 2142
      ///
2104 2143
      /// Subscript operator. It gives back an item
2105 2144
      /// that is assigned to the given value or \c INVALID
2106 2145
      /// if no such item exists.
2107 2146
      Value operator[](const Key& key) const {
2108 2147
        return _inverted(key);
2109 2148
      }
2110 2149

	
2111 2150
    private:
2112 2151
      const CrossRefMap& _inverted;
2113 2152
    };
2114 2153

	
2115
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2116 2155
    ///
2117
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2118 2157
    InverseMap inverse() const {
2119 2158
      return InverseMap(*this);
2120 2159
    }
2121 2160

	
2122 2161
  };
2123 2162

	
2124
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2125 2164
  /// items of a graph.
2126 2165
  ///
2127 2166
  /// RangeIdMap provides a unique and continuous
2128
  /// ID for each item of a given type (\c Node, \c Arc or
2167
  /// id for each item of a given type (\c Node, \c Arc or
2129 2168
  /// \c Edge) in a graph. This id is
2130 2169
  ///  - \b unique: different items get different ids,
2131 2170
  ///  - \b continuous: the range of the ids is the set of integers
2132 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2133 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2134 2173
  ///  - So, the ids can change when deleting an item of the same type.
2135 2174
  ///
2136 2175
  /// Thus this id is not (necessarily) the same as what can get using
2137 2176
  /// the \c id() function of the graph or \ref IdMap.
2138 2177
  /// This map can be inverted with its member class \c InverseMap,
2139
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2140 2179
  ///
2141 2180
  /// \tparam GR The graph type.
2142 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2143 2182
  /// \c GR::Edge).
2144 2183
  ///
2145 2184
  /// \see IdMap
2146 2185
  template <typename GR, typename K>
2147 2186
  class RangeIdMap
2148 2187
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2149 2188

	
2150 2189
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2151 2190

	
2152 2191
  public:
2153 2192
    /// The graph type of RangeIdMap.
2154 2193
    typedef GR Graph;
2155 2194
    typedef GR Digraph;
2156 2195
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2157 2196
    typedef K Item;
2158 2197
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2159 2198
    typedef K Key;
2160 2199
    /// The value type of RangeIdMap.
2161 2200
    typedef int Value;
2162 2201

	
2163 2202
    /// \brief Constructor.
2164 2203
    ///
2165 2204
    /// Constructor.
2166 2205
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2167 2206
      Item it;
2168 2207
      const typename Map::Notifier* nf = Map::notifier();
2169 2208
      for (nf->first(it); it != INVALID; nf->next(it)) {
2170 2209
        Map::set(it, _inv_map.size());
2171 2210
        _inv_map.push_back(it);
2172 2211
      }
2173 2212
    }
2174 2213

	
2175 2214
  protected:
2176 2215

	
2177 2216
    /// \brief Adds a new key to the map.
2178 2217
    ///
2179 2218
    /// Add a new key to the map. It is called by the
2180 2219
    /// \c AlterationNotifier.
2181 2220
    virtual void add(const Item& item) {
2182 2221
      Map::add(item);
2183 2222
      Map::set(item, _inv_map.size());
2184 2223
      _inv_map.push_back(item);
2185 2224
    }
2186 2225

	
2187 2226
    /// \brief Add more new keys to the map.
2188 2227
    ///
2189 2228
    /// Add more new keys to the map. It is called by the
2190 2229
    /// \c AlterationNotifier.
2191 2230
    virtual void add(const std::vector<Item>& items) {
2192 2231
      Map::add(items);
2193 2232
      for (int i = 0; i < int(items.size()); ++i) {
2194 2233
        Map::set(items[i], _inv_map.size());
2195 2234
        _inv_map.push_back(items[i]);
2196 2235
      }
2197 2236
    }
2198 2237

	
2199 2238
    /// \brief Erase the key from the map.
2200 2239
    ///
2201 2240
    /// Erase the key from the map. It is called by the
2202 2241
    /// \c AlterationNotifier.
2203 2242
    virtual void erase(const Item& item) {
2204 2243
      Map::set(_inv_map.back(), Map::operator[](item));
2205 2244
      _inv_map[Map::operator[](item)] = _inv_map.back();
2206 2245
      _inv_map.pop_back();
2207 2246
      Map::erase(item);
2208 2247
    }
2209 2248

	
2210 2249
    /// \brief Erase more keys from the map.
2211 2250
    ///
2212 2251
    /// Erase more keys from the map. It is called by the
2213 2252
    /// \c AlterationNotifier.
2214 2253
    virtual void erase(const std::vector<Item>& items) {
2215 2254
      for (int i = 0; i < int(items.size()); ++i) {
2216 2255
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2217 2256
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2218 2257
        _inv_map.pop_back();
2219 2258
      }
2220 2259
      Map::erase(items);
2221 2260
    }
2222 2261

	
2223 2262
    /// \brief Build the unique map.
2224 2263
    ///
2225 2264
    /// Build the unique map. It is called by the
2226 2265
    /// \c AlterationNotifier.
2227 2266
    virtual void build() {
2228 2267
      Map::build();
2229 2268
      Item it;
2230 2269
      const typename Map::Notifier* nf = Map::notifier();
2231 2270
      for (nf->first(it); it != INVALID; nf->next(it)) {
2232 2271
        Map::set(it, _inv_map.size());
2233 2272
        _inv_map.push_back(it);
2234 2273
      }
2235 2274
    }
2236 2275

	
2237 2276
    /// \brief Clear the keys from the map.
2238 2277
    ///
2239 2278
    /// Clear the keys from the map. It is called by the
2240 2279
    /// \c AlterationNotifier.
2241 2280
    virtual void clear() {
2242 2281
      _inv_map.clear();
2243 2282
      Map::clear();
2244 2283
    }
2245 2284

	
2246 2285
  public:
2247 2286

	
2248 2287
    /// \brief Returns the maximal value plus one.
2249 2288
    ///
2250 2289
    /// Returns the maximal value plus one in the map.
2251 2290
    unsigned int size() const {
2252 2291
      return _inv_map.size();
2253 2292
    }
2254 2293

	
2255 2294
    /// \brief Swaps the position of the two items in the map.
2256 2295
    ///
2257 2296
    /// Swaps the position of the two items in the map.
2258 2297
    void swap(const Item& p, const Item& q) {
2259 2298
      int pi = Map::operator[](p);
2260 2299
      int qi = Map::operator[](q);
2261 2300
      Map::set(p, qi);
2262 2301
      _inv_map[qi] = p;
2263 2302
      Map::set(q, pi);
2264 2303
      _inv_map[pi] = q;
2265 2304
    }
2266 2305

	
2267
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2268 2307
    ///
2269
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2270 2309
    int operator[](const Item& item) const {
2271 2310
      return Map::operator[](item);
2272 2311
    }
2273 2312

	
2274
    /// \brief Gives back the item belonging to a \e RangeId
2313
    /// \brief Gives back the item belonging to a \e range \e id
2275 2314
    ///
2276
    /// Gives back the item belonging to a \e RangeId.
2315
    /// Gives back the item belonging to the given \e range \e id.
2277 2316
    Item operator()(int id) const {
2278 2317
      return _inv_map[id];
2279 2318
    }
2280 2319

	
2281 2320
  private:
2282 2321

	
2283 2322
    typedef std::vector<Item> Container;
2284 2323
    Container _inv_map;
2285 2324

	
2286 2325
  public:
2287 2326

	
2288 2327
    /// \brief The inverse map type of RangeIdMap.
2289 2328
    ///
2290
    /// The inverse map type of RangeIdMap.
2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330
    /// back an item by its \e range \e id.
2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2291 2332
    class InverseMap {
2292 2333
    public:
2293 2334
      /// \brief Constructor
2294 2335
      ///
2295 2336
      /// Constructor of the InverseMap.
2296 2337
      explicit InverseMap(const RangeIdMap& inverted)
2297 2338
        : _inverted(inverted) {}
2298 2339

	
2299 2340

	
2300 2341
      /// The value type of the InverseMap.
2301 2342
      typedef typename RangeIdMap::Key Value;
2302 2343
      /// The key type of the InverseMap.
2303 2344
      typedef typename RangeIdMap::Value Key;
2304 2345

	
2305 2346
      /// \brief Subscript operator.
2306 2347
      ///
2307 2348
      /// Subscript operator. It gives back the item
2308
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2309 2350
      Value operator[](const Key& key) const {
2310 2351
        return _inverted(key);
2311 2352
      }
2312 2353

	
2313 2354
      /// \brief Size of the map.
2314 2355
      ///
2315 2356
      /// Returns the size of the map.
2316 2357
      unsigned int size() const {
2317 2358
        return _inverted.size();
2318 2359
      }
2319 2360

	
2320 2361
    private:
2321 2362
      const RangeIdMap& _inverted;
2322 2363
    };
2323 2364

	
2324 2365
    /// \brief Gives back the inverse of the map.
2325 2366
    ///
2326
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2327 2368
    const InverseMap inverse() const {
2328 2369
      return InverseMap(*this);
2329 2370
    }
2330 2371
  };
2331 2372

	
2373
  /// \brief Returns a \c RangeIdMap class.
2374
  ///
2375
  /// This function just returns an \c RangeIdMap class.
2376
  /// \relates RangeIdMap
2377
  template <typename K, typename GR>
2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
    return RangeIdMap<GR, K>(graph);
2380
  }
2381
  
2332 2382
  /// \brief Dynamic iterable \c bool map.
2333 2383
  ///
2334 2384
  /// This class provides a special graph map type which can store a
2335 2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2336 2386
  /// For both \c true and \c false values it is possible to iterate on
2337
  /// the keys.
2387
  /// the keys mapped to the value.
2338 2388
  ///
2339 2389
  /// This type is a reference map, so it can be modified with the
2340 2390
  /// subscript operator.
2341 2391
  ///
2342 2392
  /// \tparam GR The graph type.
2343 2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2344 2394
  /// \c GR::Edge).
2345 2395
  ///
2346 2396
  /// \see IterableIntMap, IterableValueMap
2347 2397
  /// \see CrossRefMap
2348 2398
  template <typename GR, typename K>
2349 2399
  class IterableBoolMap
2350 2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2351 2401
  private:
2352 2402
    typedef GR Graph;
2353 2403

	
2354 2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2355 2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2356 2406

	
2357 2407
    std::vector<K> _array;
2358 2408
    int _sep;
2359 2409

	
2360 2410
  public:
2361 2411

	
2362 2412
    /// Indicates that the map is reference map.
2363 2413
    typedef True ReferenceMapTag;
2364 2414

	
2365 2415
    /// The key type
2366 2416
    typedef K Key;
2367 2417
    /// The value type
2368 2418
    typedef bool Value;
2369 2419
    /// The const reference type.
2370 2420
    typedef const Value& ConstReference;
2371 2421

	
2372 2422
  private:
2373 2423

	
2374 2424
    int position(const Key& key) const {
2375 2425
      return Parent::operator[](key);
2376 2426
    }
2377 2427

	
2378 2428
  public:
2379 2429

	
2380 2430
    /// \brief Reference to the value of the map.
2381 2431
    ///
2382 2432
    /// This class is similar to the \c bool type. It can be converted to
2383 2433
    /// \c bool and it provides the same operators.
2384 2434
    class Reference {
2385 2435
      friend class IterableBoolMap;
2386 2436
    private:
2387 2437
      Reference(IterableBoolMap& map, const Key& key)
2388 2438
        : _key(key), _map(map) {}
2389 2439
    public:
2390 2440

	
2391 2441
      Reference& operator=(const Reference& value) {
2392 2442
        _map.set(_key, static_cast<bool>(value));
2393 2443
         return *this;
2394 2444
      }
2395 2445

	
2396 2446
      operator bool() const {
2397 2447
        return static_cast<const IterableBoolMap&>(_map)[_key];
2398 2448
      }
2399 2449

	
2400 2450
      Reference& operator=(bool value) {
2401 2451
        _map.set(_key, value);
2402 2452
        return *this;
2403 2453
      }
2404 2454
      Reference& operator&=(bool value) {
2405 2455
        _map.set(_key, _map[_key] & value);
2406 2456
        return *this;
2407 2457
      }
2408 2458
      Reference& operator|=(bool value) {
2409 2459
        _map.set(_key, _map[_key] | value);
2410 2460
        return *this;
2411 2461
      }
2412 2462
      Reference& operator^=(bool value) {
2413 2463
        _map.set(_key, _map[_key] ^ value);
2414 2464
        return *this;
2415 2465
      }
2416 2466
    private:
2417 2467
      Key _key;
2418 2468
      IterableBoolMap& _map;
2419 2469
    };
2420 2470

	
2421 2471
    /// \brief Constructor of the map with a default value.
2422 2472
    ///
2423 2473
    /// Constructor of the map with a default value.
2424 2474
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2425 2475
      : Parent(graph) {
2426 2476
      typename Parent::Notifier* nf = Parent::notifier();
2427 2477
      Key it;
2428 2478
      for (nf->first(it); it != INVALID; nf->next(it)) {
2429 2479
        Parent::set(it, _array.size());
2430 2480
        _array.push_back(it);
2431 2481
      }
2432 2482
      _sep = (def ? _array.size() : 0);
2433 2483
    }
2434 2484

	
2435 2485
    /// \brief Const subscript operator of the map.
2436 2486
    ///
2437 2487
    /// Const subscript operator of the map.
2438 2488
    bool operator[](const Key& key) const {
2439 2489
      return position(key) < _sep;
2440 2490
    }
2441 2491

	
2442 2492
    /// \brief Subscript operator of the map.
2443 2493
    ///
2444 2494
    /// Subscript operator of the map.
2445 2495
    Reference operator[](const Key& key) {
2446 2496
      return Reference(*this, key);
2447 2497
    }
2448 2498

	
2449 2499
    /// \brief Set operation of the map.
2450 2500
    ///
2451 2501
    /// Set operation of the map.
2452 2502
    void set(const Key& key, bool value) {
2453 2503
      int pos = position(key);
2454 2504
      if (value) {
2455 2505
        if (pos < _sep) return;
2456 2506
        Key tmp = _array[_sep];
2457 2507
        _array[_sep] = key;
2458 2508
        Parent::set(key, _sep);
2459 2509
        _array[pos] = tmp;
2460 2510
        Parent::set(tmp, pos);
2461 2511
        ++_sep;
2462 2512
      } else {
2463 2513
        if (pos >= _sep) return;
2464 2514
        --_sep;
2465 2515
        Key tmp = _array[_sep];
2466 2516
        _array[_sep] = key;
2467 2517
        Parent::set(key, _sep);
2468 2518
        _array[pos] = tmp;
2469 2519
        Parent::set(tmp, pos);
2470 2520
      }
2471 2521
    }
2472 2522

	
2473 2523
    /// \brief Set all items.
2474 2524
    ///
2475 2525
    /// Set all items in the map.
2476 2526
    /// \note Constant time operation.
2477 2527
    void setAll(bool value) {
2478 2528
      _sep = (value ? _array.size() : 0);
2479 2529
    }
2480 2530

	
2481 2531
    /// \brief Returns the number of the keys mapped to \c true.
2482 2532
    ///
2483 2533
    /// Returns the number of the keys mapped to \c true.
2484 2534
    int trueNum() const {
2485 2535
      return _sep;
2486 2536
    }
2487 2537

	
2488 2538
    /// \brief Returns the number of the keys mapped to \c false.
2489 2539
    ///
2490 2540
    /// Returns the number of the keys mapped to \c false.
2491 2541
    int falseNum() const {
2492 2542
      return _array.size() - _sep;
2493 2543
    }
2494 2544

	
2495 2545
    /// \brief Iterator for the keys mapped to \c true.
2496 2546
    ///
2497 2547
    /// Iterator for the keys mapped to \c true. It works
2498 2548
    /// like a graph item iterator, it can be converted to
2499 2549
    /// the key type of the map, incremented with \c ++ operator, and
2500 2550
    /// if the iterator leaves the last valid key, it will be equal to
2501 2551
    /// \c INVALID.
2502 2552
    class TrueIt : public Key {
2503 2553
    public:
2504 2554
      typedef Key Parent;
2505 2555

	
2506 2556
      /// \brief Creates an iterator.
2507 2557
      ///
2508 2558
      /// Creates an iterator. It iterates on the
2509 2559
      /// keys mapped to \c true.
2510 2560
      /// \param map The IterableBoolMap.
2511 2561
      explicit TrueIt(const IterableBoolMap& map)
2512 2562
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2513 2563
          _map(&map) {}
2514 2564

	
2515 2565
      /// \brief Invalid constructor \& conversion.
2516 2566
      ///
2517 2567
      /// This constructor initializes the iterator to be invalid.
2518 2568
      /// \sa Invalid for more details.
2519 2569
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2520 2570

	
2521 2571
      /// \brief Increment operator.
2522 2572
      ///
2523 2573
      /// Increment operator.
2524 2574
      TrueIt& operator++() {
2525 2575
        int pos = _map->position(*this);
2526 2576
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2527 2577
        return *this;
2528 2578
      }
2529 2579

	
2530 2580
    private:
2531 2581
      const IterableBoolMap* _map;
2532 2582
    };
2533 2583

	
2534 2584
    /// \brief Iterator for the keys mapped to \c false.
2535 2585
    ///
2536 2586
    /// Iterator for the keys mapped to \c false. It works
2537 2587
    /// like a graph item iterator, it can be converted to
2538 2588
    /// the key type of the map, incremented with \c ++ operator, and
2539 2589
    /// if the iterator leaves the last valid key, it will be equal to
2540 2590
    /// \c INVALID.
2541 2591
    class FalseIt : public Key {
2542 2592
    public:
2543 2593
      typedef Key Parent;
2544 2594

	
2545 2595
      /// \brief Creates an iterator.
2546 2596
      ///
2547 2597
      /// Creates an iterator. It iterates on the
2548 2598
      /// keys mapped to \c false.
2549 2599
      /// \param map The IterableBoolMap.
2550 2600
      explicit FalseIt(const IterableBoolMap& map)
2551 2601
        : Parent(map._sep < int(map._array.size()) ?
2552 2602
                 map._array.back() : INVALID), _map(&map) {}
2553 2603

	
2554 2604
      /// \brief Invalid constructor \& conversion.
2555 2605
      ///
2556 2606
      /// This constructor initializes the iterator to be invalid.
2557 2607
      /// \sa Invalid for more details.
2558 2608
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2559 2609

	
2560 2610
      /// \brief Increment operator.
2561 2611
      ///
2562 2612
      /// Increment operator.
2563 2613
      FalseIt& operator++() {
2564 2614
        int pos = _map->position(*this);
2565 2615
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2566 2616
        return *this;
2567 2617
      }
2568 2618

	
2569 2619
    private:
2570 2620
      const IterableBoolMap* _map;
2571 2621
    };
2572 2622

	
2573 2623
    /// \brief Iterator for the keys mapped to a given value.
2574 2624
    ///
2575 2625
    /// Iterator for the keys mapped to a given value. It works
2576 2626
    /// like a graph item iterator, it can be converted to
2577 2627
    /// the key type of the map, incremented with \c ++ operator, and
2578 2628
    /// if the iterator leaves the last valid key, it will be equal to
2579 2629
    /// \c INVALID.
2580 2630
    class ItemIt : public Key {
2581 2631
    public:
2582 2632
      typedef Key Parent;
2583 2633

	
2584 2634
      /// \brief Creates an iterator with a value.
2585 2635
      ///
2586 2636
      /// Creates an iterator with a value. It iterates on the
2587 2637
      /// keys mapped to the given value.
2588 2638
      /// \param map The IterableBoolMap.
2589 2639
      /// \param value The value.
2590 2640
      ItemIt(const IterableBoolMap& map, bool value)
2591 2641
        : Parent(value ? 
2592 2642
                 (map._sep > 0 ?
2593 2643
                  map._array[map._sep - 1] : INVALID) :
2594 2644
                 (map._sep < int(map._array.size()) ?
2595 2645
                  map._array.back() : INVALID)), _map(&map) {}
2596 2646

	
2597 2647
      /// \brief Invalid constructor \& conversion.
2598 2648
      ///
2599 2649
      /// This constructor initializes the iterator to be invalid.
2600 2650
      /// \sa Invalid for more details.
2601 2651
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2602 2652

	
2603 2653
      /// \brief Increment operator.
2604 2654
      ///
2605 2655
      /// Increment operator.
2606 2656
      ItemIt& operator++() {
2607 2657
        int pos = _map->position(*this);
2608 2658
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2609 2659
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2610 2660
        return *this;
2611 2661
      }
2612 2662

	
2613 2663
    private:
2614 2664
      const IterableBoolMap* _map;
2615 2665
    };
2616 2666

	
2617 2667
  protected:
2618 2668

	
2619 2669
    virtual void add(const Key& key) {
2620 2670
      Parent::add(key);
2621 2671
      Parent::set(key, _array.size());
2622 2672
      _array.push_back(key);
2623 2673
    }
2624 2674

	
2625 2675
    virtual void add(const std::vector<Key>& keys) {
2626 2676
      Parent::add(keys);
2627 2677
      for (int i = 0; i < int(keys.size()); ++i) {
2628 2678
        Parent::set(keys[i], _array.size());
2629 2679
        _array.push_back(keys[i]);
2630 2680
      }
2631 2681
    }
2632 2682

	
2633 2683
    virtual void erase(const Key& key) {
2634 2684
      int pos = position(key);
2635 2685
      if (pos < _sep) {
2636 2686
        --_sep;
2637 2687
        Parent::set(_array[_sep], pos);
2638 2688
        _array[pos] = _array[_sep];
2639 2689
        Parent::set(_array.back(), _sep);
2640 2690
        _array[_sep] = _array.back();
2641 2691
        _array.pop_back();
2642 2692
      } else {
2643 2693
        Parent::set(_array.back(), pos);
2644 2694
        _array[pos] = _array.back();
2645 2695
        _array.pop_back();
2646 2696
      }
2647 2697
      Parent::erase(key);
2648 2698
    }
2649 2699

	
2650 2700
    virtual void erase(const std::vector<Key>& keys) {
2651 2701
      for (int i = 0; i < int(keys.size()); ++i) {
2652 2702
        int pos = position(keys[i]);
2653 2703
        if (pos < _sep) {
2654 2704
          --_sep;
2655 2705
          Parent::set(_array[_sep], pos);
2656 2706
          _array[pos] = _array[_sep];
2657 2707
          Parent::set(_array.back(), _sep);
2658 2708
          _array[_sep] = _array.back();
2659 2709
          _array.pop_back();
2660 2710
        } else {
2661 2711
          Parent::set(_array.back(), pos);
2662 2712
          _array[pos] = _array.back();
2663 2713
          _array.pop_back();
2664 2714
        }
2665 2715
      }
2666 2716
      Parent::erase(keys);
2667 2717
    }
2668 2718

	
2669 2719
    virtual void build() {
2670 2720
      Parent::build();
2671 2721
      typename Parent::Notifier* nf = Parent::notifier();
2672 2722
      Key it;
2673 2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2674 2724
        Parent::set(it, _array.size());
2675 2725
        _array.push_back(it);
2676 2726
      }
2677 2727
      _sep = 0;
2678 2728
    }
2679 2729

	
2680 2730
    virtual void clear() {
2681 2731
      _array.clear();
2682 2732
      _sep = 0;
2683 2733
      Parent::clear();
2684 2734
    }
2685 2735

	
2686 2736
  };
2687 2737

	
2688 2738

	
2689 2739
  namespace _maps_bits {
2690 2740
    template <typename Item>
2691 2741
    struct IterableIntMapNode {
2692 2742
      IterableIntMapNode() : value(-1) {}
2693 2743
      IterableIntMapNode(int _value) : value(_value) {}
2694 2744
      Item prev, next;
2695 2745
      int value;
2696 2746
    };
2697 2747
  }
2698 2748

	
2699 2749
  /// \brief Dynamic iterable integer map.
2700 2750
  ///
2701 2751
  /// This class provides a special graph map type which can store an
2702 2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2703 2753
  /// For each non-negative value it is possible to iterate on the keys
2704 2754
  /// mapped to the value.
2705 2755
  ///
2756
  /// This map is intended to be used with small integer values, for which
2757
  /// it is efficient, and supports iteration only for non-negative values.
2758
  /// If you need large values and/or iteration for negative integers,
2759
  /// consider to use \ref IterableValueMap instead.
2760
  ///
2706 2761
  /// This type is a reference map, so it can be modified with the
2707 2762
  /// subscript operator.
2708 2763
  ///
2709 2764
  /// \note The size of the data structure depends on the largest
2710 2765
  /// value in the map.
2711 2766
  ///
2712 2767
  /// \tparam GR The graph type.
2713 2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2714 2769
  /// \c GR::Edge).
2715 2770
  ///
2716 2771
  /// \see IterableBoolMap, IterableValueMap
2717 2772
  /// \see CrossRefMap
2718 2773
  template <typename GR, typename K>
2719 2774
  class IterableIntMap
2720 2775
    : protected ItemSetTraits<GR, K>::
2721 2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2722 2777
  public:
2723 2778
    typedef typename ItemSetTraits<GR, K>::
2724 2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2725 2780

	
2726 2781
    /// The key type
2727 2782
    typedef K Key;
2728 2783
    /// The value type
2729 2784
    typedef int Value;
2730 2785
    /// The graph type
2731 2786
    typedef GR Graph;
2732 2787

	
2733 2788
    /// \brief Constructor of the map.
2734 2789
    ///
2735 2790
    /// Constructor of the map. It sets all values to -1.
2736 2791
    explicit IterableIntMap(const Graph& graph)
2737 2792
      : Parent(graph) {}
2738 2793

	
2739 2794
    /// \brief Constructor of the map with a given value.
2740 2795
    ///
2741 2796
    /// Constructor of the map with a given value.
2742 2797
    explicit IterableIntMap(const Graph& graph, int value)
2743 2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2744 2799
      if (value >= 0) {
2745 2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2746 2801
          lace(it);
2747 2802
        }
2748 2803
      }
2749 2804
    }
2750 2805

	
2751 2806
  private:
2752 2807

	
2753 2808
    void unlace(const Key& key) {
2754 2809
      typename Parent::Value& node = Parent::operator[](key);
2755 2810
      if (node.value < 0) return;
2756 2811
      if (node.prev != INVALID) {
2757 2812
        Parent::operator[](node.prev).next = node.next;
2758 2813
      } else {
2759 2814
        _first[node.value] = node.next;
2760 2815
      }
2761 2816
      if (node.next != INVALID) {
2762 2817
        Parent::operator[](node.next).prev = node.prev;
2763 2818
      }
2764 2819
      while (!_first.empty() && _first.back() == INVALID) {
2765 2820
        _first.pop_back();
2766 2821
      }
2767 2822
    }
2768 2823

	
2769 2824
    void lace(const Key& key) {
2770 2825
      typename Parent::Value& node = Parent::operator[](key);
2771 2826
      if (node.value < 0) return;
2772 2827
      if (node.value >= int(_first.size())) {
2773 2828
        _first.resize(node.value + 1, INVALID);
2774 2829
      }
2775 2830
      node.prev = INVALID;
2776 2831
      node.next = _first[node.value];
2777 2832
      if (node.next != INVALID) {
2778 2833
        Parent::operator[](node.next).prev = key;
2779 2834
      }
2780 2835
      _first[node.value] = key;
2781 2836
    }
2782 2837

	
2783 2838
  public:
2784 2839

	
2785 2840
    /// Indicates that the map is reference map.
2786 2841
    typedef True ReferenceMapTag;
2787 2842

	
2788 2843
    /// \brief Reference to the value of the map.
2789 2844
    ///
2790 2845
    /// This class is similar to the \c int type. It can
2791 2846
    /// be converted to \c int and it has the same operators.
2792 2847
    class Reference {
2793 2848
      friend class IterableIntMap;
2794 2849
    private:
2795 2850
      Reference(IterableIntMap& map, const Key& key)
2796 2851
        : _key(key), _map(map) {}
2797 2852
    public:
2798 2853

	
2799 2854
      Reference& operator=(const Reference& value) {
2800 2855
        _map.set(_key, static_cast<const int&>(value));
2801 2856
         return *this;
2802 2857
      }
2803 2858

	
2804 2859
      operator const int&() const {
2805 2860
        return static_cast<const IterableIntMap&>(_map)[_key];
2806 2861
      }
2807 2862

	
2808 2863
      Reference& operator=(int value) {
2809 2864
        _map.set(_key, value);
2810 2865
        return *this;
2811 2866
      }
2812 2867
      Reference& operator++() {
2813 2868
        _map.set(_key, _map[_key] + 1);
2814 2869
        return *this;
2815 2870
      }
2816 2871
      int operator++(int) {
2817 2872
        int value = _map[_key];
2818 2873
        _map.set(_key, value + 1);
2819 2874
        return value;
2820 2875
      }
2821 2876
      Reference& operator--() {
2822 2877
        _map.set(_key, _map[_key] - 1);
2823 2878
        return *this;
2824 2879
      }
2825 2880
      int operator--(int) {
2826 2881
        int value = _map[_key];
2827 2882
        _map.set(_key, value - 1);
2828 2883
        return value;
2829 2884
      }
2830 2885
      Reference& operator+=(int value) {
2831 2886
        _map.set(_key, _map[_key] + value);
2832 2887
        return *this;
2833 2888
      }
2834 2889
      Reference& operator-=(int value) {
2835 2890
        _map.set(_key, _map[_key] - value);
2836 2891
        return *this;
2837 2892
      }
2838 2893
      Reference& operator*=(int value) {
2839 2894
        _map.set(_key, _map[_key] * value);
2840 2895
        return *this;
2841 2896
      }
2842 2897
      Reference& operator/=(int value) {
2843 2898
        _map.set(_key, _map[_key] / value);
2844 2899
        return *this;
2845 2900
      }
2846 2901
      Reference& operator%=(int value) {
2847 2902
        _map.set(_key, _map[_key] % value);
2848 2903
        return *this;
2849 2904
      }
2850 2905
      Reference& operator&=(int value) {
2851 2906
        _map.set(_key, _map[_key] & value);
2852 2907
        return *this;
2853 2908
      }
2854 2909
      Reference& operator|=(int value) {
2855 2910
        _map.set(_key, _map[_key] | value);
2856 2911
        return *this;
2857 2912
      }
2858 2913
      Reference& operator^=(int value) {
2859 2914
        _map.set(_key, _map[_key] ^ value);
2860 2915
        return *this;
2861 2916
      }
2862 2917
      Reference& operator<<=(int value) {
2863 2918
        _map.set(_key, _map[_key] << value);
2864 2919
        return *this;
2865 2920
      }
2866 2921
      Reference& operator>>=(int value) {
2867 2922
        _map.set(_key, _map[_key] >> value);
2868 2923
        return *this;
2869 2924
      }
2870 2925

	
2871 2926
    private:
2872 2927
      Key _key;
2873 2928
      IterableIntMap& _map;
2874 2929
    };
2875 2930

	
2876 2931
    /// The const reference type.
2877 2932
    typedef const Value& ConstReference;
2878 2933

	
2879 2934
    /// \brief Gives back the maximal value plus one.
2880 2935
    ///
2881 2936
    /// Gives back the maximal value plus one.
2882 2937
    int size() const {
2883 2938
      return _first.size();
2884 2939
    }
2885 2940

	
2886 2941
    /// \brief Set operation of the map.
2887 2942
    ///
2888 2943
    /// Set operation of the map.
2889 2944
    void set(const Key& key, const Value& value) {
2890 2945
      unlace(key);
2891 2946
      Parent::operator[](key).value = value;
2892 2947
      lace(key);
2893 2948
    }
2894 2949

	
2895 2950
    /// \brief Const subscript operator of the map.
2896 2951
    ///
2897 2952
    /// Const subscript operator of the map.
2898 2953
    const Value& operator[](const Key& key) const {
2899 2954
      return Parent::operator[](key).value;
2900 2955
    }
2901 2956

	
2902 2957
    /// \brief Subscript operator of the map.
2903 2958
    ///
2904 2959
    /// Subscript operator of the map.
2905 2960
    Reference operator[](const Key& key) {
2906 2961
      return Reference(*this, key);
2907 2962
    }
2908 2963

	
2909 2964
    /// \brief Iterator for the keys with the same value.
2910 2965
    ///
2911 2966
    /// Iterator for the keys with the same value. It works
2912 2967
    /// like a graph item iterator, it can be converted to
2913 2968
    /// the item type of the map, incremented with \c ++ operator, and
2914 2969
    /// if the iterator leaves the last valid item, it will be equal to
2915 2970
    /// \c INVALID.
2916 2971
    class ItemIt : public Key {
2917 2972
    public:
2918 2973
      typedef Key Parent;
2919 2974

	
2920 2975
      /// \brief Invalid constructor \& conversion.
2921 2976
      ///
2922 2977
      /// This constructor initializes the iterator to be invalid.
2923 2978
      /// \sa Invalid for more details.
2924 2979
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2925 2980

	
2926 2981
      /// \brief Creates an iterator with a value.
2927 2982
      ///
2928 2983
      /// Creates an iterator with a value. It iterates on the
2929 2984
      /// keys mapped to the given value.
2930 2985
      /// \param map The IterableIntMap.
2931 2986
      /// \param value The value.
2932 2987
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2933 2988
        if (value < 0 || value >= int(_map->_first.size())) {
2934 2989
          Parent::operator=(INVALID);
2935 2990
        } else {
2936 2991
          Parent::operator=(_map->_first[value]);
2937 2992
        }
2938 2993
      }
2939 2994

	
2940 2995
      /// \brief Increment operator.
2941 2996
      ///
2942 2997
      /// Increment operator.
2943 2998
      ItemIt& operator++() {
2944 2999
        Parent::operator=(_map->IterableIntMap::Parent::
2945 3000
                          operator[](static_cast<Parent&>(*this)).next);
2946 3001
        return *this;
2947 3002
      }
2948 3003

	
2949 3004
    private:
2950 3005
      const IterableIntMap* _map;
2951 3006
    };
2952 3007

	
2953 3008
  protected:
2954 3009

	
2955 3010
    virtual void erase(const Key& key) {
2956 3011
      unlace(key);
2957 3012
      Parent::erase(key);
2958 3013
    }
2959 3014

	
2960 3015
    virtual void erase(const std::vector<Key>& keys) {
2961 3016
      for (int i = 0; i < int(keys.size()); ++i) {
2962 3017
        unlace(keys[i]);
2963 3018
      }
2964 3019
      Parent::erase(keys);
2965 3020
    }
2966 3021

	
2967 3022
    virtual void clear() {
2968 3023
      _first.clear();
2969 3024
      Parent::clear();
2970 3025
    }
2971 3026

	
2972 3027
  private:
2973 3028
    std::vector<Key> _first;
2974 3029
  };
2975 3030

	
2976 3031
  namespace _maps_bits {
2977 3032
    template <typename Item, typename Value>
2978 3033
    struct IterableValueMapNode {
2979 3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
2980 3035
      Item prev, next;
2981 3036
      Value value;
2982 3037
    };
2983 3038
  }
2984 3039

	
2985 3040
  /// \brief Dynamic iterable map for comparable values.
2986 3041
  ///
2987
  /// This class provides a special graph map type which can store an
3042
  /// This class provides a special graph map type which can store a
2988 3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
2989 3044
  /// For each value it is possible to iterate on the keys mapped to
2990
  /// the value.
3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047
  /// The map stores a linked list for each value, which contains
3048
  /// the items mapped to the value, and the used values are stored
3049
  /// in balanced binary tree (\c std::map).
2991 3050
  ///
2992
  /// The map stores for each value a linked list with
2993
  /// the items which mapped to the value, and the values are stored
2994
  /// in balanced binary tree. The values of the map can be accessed
2995
  /// with stl compatible forward iterator.
3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
  /// specialized for \c bool and \c int values, respectively.
2996 3053
  ///
2997 3054
  /// This type is not reference map, so it cannot be modified with
2998 3055
  /// the subscript operator.
2999 3056
  ///
3000 3057
  /// \tparam GR The graph type.
3001 3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3002 3059
  /// \c GR::Edge).
3003 3060
  /// \tparam V The value type of the map. It can be any comparable
3004 3061
  /// value type.
3005 3062
  ///
3006 3063
  /// \see IterableBoolMap, IterableIntMap
3007 3064
  /// \see CrossRefMap
3008 3065
  template <typename GR, typename K, typename V>
3009 3066
  class IterableValueMap
3010 3067
    : protected ItemSetTraits<GR, K>::
3011 3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3012 3069
  public:
3013 3070
    typedef typename ItemSetTraits<GR, K>::
3014 3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3015 3072

	
3016 3073
    /// The key type
3017 3074
    typedef K Key;
3018 3075
    /// The value type
3019 3076
    typedef V Value;
3020 3077
    /// The graph type
3021 3078
    typedef GR Graph;
3022 3079

	
3023 3080
  public:
3024 3081

	
3025 3082
    /// \brief Constructor of the map with a given value.
3026 3083
    ///
3027 3084
    /// Constructor of the map with a given value.
3028 3085
    explicit IterableValueMap(const Graph& graph,
3029 3086
                              const Value& value = Value())
3030 3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3031 3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3032 3089
        lace(it);
3033 3090
      }
3034 3091
    }
3035 3092

	
3036 3093
  protected:
3037 3094

	
3038 3095
    void unlace(const Key& key) {
3039 3096
      typename Parent::Value& node = Parent::operator[](key);
3040 3097
      if (node.prev != INVALID) {
3041 3098
        Parent::operator[](node.prev).next = node.next;
3042 3099
      } else {
3043 3100
        if (node.next != INVALID) {
3044 3101
          _first[node.value] = node.next;
3045 3102
        } else {
3046 3103
          _first.erase(node.value);
3047 3104
        }
3048 3105
      }
3049 3106
      if (node.next != INVALID) {
3050 3107
        Parent::operator[](node.next).prev = node.prev;
3051 3108
      }
3052 3109
    }
3053 3110

	
3054 3111
    void lace(const Key& key) {
3055 3112
      typename Parent::Value& node = Parent::operator[](key);
3056 3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3057 3114
      if (it == _first.end()) {
3058 3115
        node.prev = node.next = INVALID;
3059 3116
        _first.insert(std::make_pair(node.value, key));
3060 3117
      } else {
3061 3118
        node.prev = INVALID;
3062 3119
        node.next = it->second;
3063 3120
        if (node.next != INVALID) {
3064 3121
          Parent::operator[](node.next).prev = key;
3065 3122
        }
3066 3123
        it->second = key;
3067 3124
      }
3068 3125
    }
3069 3126

	
3070 3127
  public:
3071 3128

	
3072 3129
    /// \brief Forward iterator for values.
3073 3130
    ///
3074
    /// This iterator is an stl compatible forward
3131
    /// This iterator is an STL compatible forward
3075 3132
    /// iterator on the values of the map. The values can
3076 3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3077
    class ValueIterator
3134
    class ValueIt
3078 3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3079 3136
      friend class IterableValueMap;
3080 3137
    private:
3081
      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3082 3139
        : it(_it) {}
3083 3140
    public:
3084 3141

	
3085
      ValueIterator() {}
3086

	
3087
      ValueIterator& operator++() { ++it; return *this; }
3088
      ValueIterator operator++(int) {
3089
        ValueIterator tmp(*this);
3142
      /// Constructor
3143
      ValueIt() {}
3144

	
3145
      /// \e
3146
      ValueIt& operator++() { ++it; return *this; }
3147
      /// \e
3148
      ValueIt operator++(int) {
3149
        ValueIt tmp(*this);
3090 3150
        operator++();
3091 3151
        return tmp;
3092 3152
      }
3093 3153

	
3154
      /// \e
3094 3155
      const Value& operator*() const { return it->first; }
3156
      /// \e
3095 3157
      const Value* operator->() const { return &(it->first); }
3096 3158

	
3097
      bool operator==(ValueIterator jt) const { return it == jt.it; }
3098
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
3159
      /// \e
3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161
      /// \e
3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3099 3163

	
3100 3164
    private:
3101 3165
      typename std::map<Value, Key>::const_iterator it;
3102 3166
    };
3103 3167

	
3104 3168
    /// \brief Returns an iterator to the first value.
3105 3169
    ///
3106
    /// Returns an stl compatible iterator to the
3170
    /// Returns an STL compatible iterator to the
3107 3171
    /// first value of the map. The values of the
3108 3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3109 3173
    /// range.
3110
    ValueIterator beginValue() const {
3111
      return ValueIterator(_first.begin());
3174
    ValueIt beginValue() const {
3175
      return ValueIt(_first.begin());
3112 3176
    }
3113 3177

	
3114 3178
    /// \brief Returns an iterator after the last value.
3115 3179
    ///
3116
    /// Returns an stl compatible iterator after the
3180
    /// Returns an STL compatible iterator after the
3117 3181
    /// last value of the map. The values of the
3118 3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3119 3183
    /// range.
3120
    ValueIterator endValue() const {
3121
      return ValueIterator(_first.end());
3184
    ValueIt endValue() const {
3185
      return ValueIt(_first.end());
3122 3186
    }
3123 3187

	
3124 3188
    /// \brief Set operation of the map.
3125 3189
    ///
3126 3190
    /// Set operation of the map.
3127 3191
    void set(const Key& key, const Value& value) {
3128 3192
      unlace(key);
3129 3193
      Parent::operator[](key).value = value;
3130 3194
      lace(key);
3131 3195
    }
3132 3196

	
3133 3197
    /// \brief Const subscript operator of the map.
3134 3198
    ///
3135 3199
    /// Const subscript operator of the map.
3136 3200
    const Value& operator[](const Key& key) const {
3137 3201
      return Parent::operator[](key).value;
3138 3202
    }
3139 3203

	
3140 3204
    /// \brief Iterator for the keys with the same value.
3141 3205
    ///
3142 3206
    /// Iterator for the keys with the same value. It works
3143 3207
    /// like a graph item iterator, it can be converted to
3144 3208
    /// the item type of the map, incremented with \c ++ operator, and
3145 3209
    /// if the iterator leaves the last valid item, it will be equal to
3146 3210
    /// \c INVALID.
3147 3211
    class ItemIt : public Key {
3148 3212
    public:
3149 3213
      typedef Key Parent;
3150 3214

	
3151 3215
      /// \brief Invalid constructor \& conversion.
3152 3216
      ///
3153 3217
      /// This constructor initializes the iterator to be invalid.
3154 3218
      /// \sa Invalid for more details.
3155 3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3156 3220

	
3157 3221
      /// \brief Creates an iterator with a value.
3158 3222
      ///
3159 3223
      /// Creates an iterator with a value. It iterates on the
3160 3224
      /// keys which have the given value.
3161 3225
      /// \param map The IterableValueMap
3162 3226
      /// \param value The value
3163 3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3164 3228
        typename std::map<Value, Key>::const_iterator it =
3165 3229
          map._first.find(value);
3166 3230
        if (it == map._first.end()) {
3167 3231
          Parent::operator=(INVALID);
3168 3232
        } else {
3169 3233
          Parent::operator=(it->second);
3170 3234
        }
3171 3235
      }
3172 3236

	
3173 3237
      /// \brief Increment operator.
3174 3238
      ///
3175 3239
      /// Increment Operator.
3176 3240
      ItemIt& operator++() {
3177 3241
        Parent::operator=(_map->IterableValueMap::Parent::
3178 3242
                          operator[](static_cast<Parent&>(*this)).next);
3179 3243
        return *this;
3180 3244
      }
3181 3245

	
3182 3246

	
3183 3247
    private:
3184 3248
      const IterableValueMap* _map;
3185 3249
    };
3186 3250

	
3187 3251
  protected:
3188 3252

	
3189 3253
    virtual void add(const Key& key) {
3190 3254
      Parent::add(key);
3191 3255
      unlace(key);
3192 3256
    }
3193 3257

	
3194 3258
    virtual void add(const std::vector<Key>& keys) {
3195 3259
      Parent::add(keys);
3196 3260
      for (int i = 0; i < int(keys.size()); ++i) {
3197 3261
        lace(keys[i]);
3198 3262
      }
3199 3263
    }
3200 3264

	
3201 3265
    virtual void erase(const Key& key) {
3202 3266
      unlace(key);
3203 3267
      Parent::erase(key);
3204 3268
    }
3205 3269

	
3206 3270
    virtual void erase(const std::vector<Key>& keys) {
3207 3271
      for (int i = 0; i < int(keys.size()); ++i) {
3208 3272
        unlace(keys[i]);
3209 3273
      }
3210 3274
      Parent::erase(keys);
3211 3275
    }
3212 3276

	
3213 3277
    virtual void build() {
3214 3278
      Parent::build();
3215 3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3216 3280
        lace(it);
3217 3281
      }
3218 3282
    }
3219 3283

	
3220 3284
    virtual void clear() {
3221 3285
      _first.clear();
3222 3286
      Parent::clear();
3223 3287
    }
3224 3288

	
3225 3289
  private:
3226 3290
    std::map<Value, Key> _first;
3227 3291
  };
3228 3292

	
3229 3293
  /// \brief Map of the source nodes of arcs in a digraph.
3230 3294
  ///
3231 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
3232 3296
  /// which is returned by the \c source() function of the digraph.
3233 3297
  /// \tparam GR The digraph type.
3234 3298
  /// \see TargetMap
3235 3299
  template <typename GR>
3236 3300
  class SourceMap {
3237 3301
  public:
3238 3302

	
3239
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
3240 3304
    typedef typename GR::Arc Key;
3241
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
3242 3306
    typedef typename GR::Node Value;
3243 3307

	
3244 3308
    /// \brief Constructor
3245 3309
    ///
3246 3310
    /// Constructor.
3247 3311
    /// \param digraph The digraph that the map belongs to.
3248 3312
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
3249 3313

	
3250 3314
    /// \brief Returns the source node of the given arc.
3251 3315
    ///
3252 3316
    /// Returns the source node of the given arc.
3253 3317
    Value operator[](const Key& arc) const {
3254 3318
      return _graph.source(arc);
3255 3319
    }
3256 3320

	
3257 3321
  private:
3258 3322
    const GR& _graph;
3259 3323
  };
3260 3324

	
3261 3325
  /// \brief Returns a \c SourceMap class.
3262 3326
  ///
3263 3327
  /// This function just returns an \c SourceMap class.
3264 3328
  /// \relates SourceMap
3265 3329
  template <typename GR>
3266 3330
  inline SourceMap<GR> sourceMap(const GR& graph) {
3267 3331
    return SourceMap<GR>(graph);
3268 3332
  }
3269 3333

	
3270 3334
  /// \brief Map of the target nodes of arcs in a digraph.
3271 3335
  ///
3272 3336
  /// TargetMap provides access for the target node of each arc in a digraph,
3273 3337
  /// which is returned by the \c target() function of the digraph.
3274 3338
  /// \tparam GR The digraph type.
3275 3339
  /// \see SourceMap
3276 3340
  template <typename GR>
3277 3341
  class TargetMap {
3278 3342
  public:
3279 3343

	
3280
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
3281 3345
    typedef typename GR::Arc Key;
3282
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
3283 3347
    typedef typename GR::Node Value;
3284 3348

	
3285 3349
    /// \brief Constructor
3286 3350
    ///
3287 3351
    /// Constructor.
3288 3352
    /// \param digraph The digraph that the map belongs to.
3289 3353
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
3290 3354

	
3291 3355
    /// \brief Returns the target node of the given arc.
3292 3356
    ///
3293 3357
    /// Returns the target node of the given arc.
3294 3358
    Value operator[](const Key& e) const {
3295 3359
      return _graph.target(e);
3296 3360
    }
3297 3361

	
3298 3362
  private:
3299 3363
    const GR& _graph;
3300 3364
  };
3301 3365

	
3302 3366
  /// \brief Returns a \c TargetMap class.
3303 3367
  ///
3304 3368
  /// This function just returns a \c TargetMap class.
3305 3369
  /// \relates TargetMap
3306 3370
  template <typename GR>
3307 3371
  inline TargetMap<GR> targetMap(const GR& graph) {
3308 3372
    return TargetMap<GR>(graph);
3309 3373
  }
3310 3374

	
3311 3375
  /// \brief Map of the "forward" directed arc view of edges in a graph.
3312 3376
  ///
3313 3377
  /// ForwardMap provides access for the "forward" directed arc view of
3314 3378
  /// each edge in a graph, which is returned by the \c direct() function
3315 3379
  /// of the graph with \c true parameter.
3316 3380
  /// \tparam GR The graph type.
3317 3381
  /// \see BackwardMap
3318 3382
  template <typename GR>
3319 3383
  class ForwardMap {
3320 3384
  public:
3321 3385

	
3386
    /// The key type (the \c Edge type of the digraph).
3387
    typedef typename GR::Edge Key;
3388
    /// The value type (the \c Arc type of the digraph).
3322 3389
    typedef typename GR::Arc Value;
3323
    typedef typename GR::Edge Key;
3324 3390

	
3325 3391
    /// \brief Constructor
3326 3392
    ///
3327 3393
    /// Constructor.
3328 3394
    /// \param graph The graph that the map belongs to.
3329 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
3330 3396

	
3331 3397
    /// \brief Returns the "forward" directed arc view of the given edge.
3332 3398
    ///
3333 3399
    /// Returns the "forward" directed arc view of the given edge.
3334 3400
    Value operator[](const Key& key) const {
3335 3401
      return _graph.direct(key, true);
3336 3402
    }
3337 3403

	
3338 3404
  private:
3339 3405
    const GR& _graph;
3340 3406
  };
3341 3407

	
3342 3408
  /// \brief Returns a \c ForwardMap class.
3343 3409
  ///
3344 3410
  /// This function just returns an \c ForwardMap class.
3345 3411
  /// \relates ForwardMap
3346 3412
  template <typename GR>
3347 3413
  inline ForwardMap<GR> forwardMap(const GR& graph) {
3348 3414
    return ForwardMap<GR>(graph);
3349 3415
  }
3350 3416

	
3351 3417
  /// \brief Map of the "backward" directed arc view of edges in a graph.
3352 3418
  ///
3353 3419
  /// BackwardMap provides access for the "backward" directed arc view of
3354 3420
  /// each edge in a graph, which is returned by the \c direct() function
3355 3421
  /// of the graph with \c false parameter.
3356 3422
  /// \tparam GR The graph type.
3357 3423
  /// \see ForwardMap
3358 3424
  template <typename GR>
3359 3425
  class BackwardMap {
3360 3426
  public:
3361 3427

	
3428
    /// The key type (the \c Edge type of the digraph).
3429
    typedef typename GR::Edge Key;
3430
    /// The value type (the \c Arc type of the digraph).
3362 3431
    typedef typename GR::Arc Value;
3363
    typedef typename GR::Edge Key;
3364 3432

	
3365 3433
    /// \brief Constructor
3366 3434
    ///
3367 3435
    /// Constructor.
3368 3436
    /// \param graph The graph that the map belongs to.
3369 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
3370 3438

	
3371 3439
    /// \brief Returns the "backward" directed arc view of the given edge.
3372 3440
    ///
3373 3441
    /// Returns the "backward" directed arc view of the given edge.
3374 3442
    Value operator[](const Key& key) const {
3375 3443
      return _graph.direct(key, false);
3376 3444
    }
3377 3445

	
3378 3446
  private:
3379 3447
    const GR& _graph;
3380 3448
  };
3381 3449

	
3382 3450
  /// \brief Returns a \c BackwardMap class
3383 3451

	
3384 3452
  /// This function just returns a \c BackwardMap class.
3385 3453
  /// \relates BackwardMap
3386 3454
  template <typename GR>
3387 3455
  inline BackwardMap<GR> backwardMap(const GR& graph) {
3388 3456
    return BackwardMap<GR>(graph);
3389 3457
  }
3390 3458

	
3391 3459
  /// \brief Map of the in-degrees of nodes in a digraph.
3392 3460
  ///
3393 3461
  /// This map returns the in-degree of a node. Once it is constructed,
3394 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3395 3463
  /// in constant time. On the other hand, the values are updated automatically
3396 3464
  /// whenever the digraph changes.
3397 3465
  ///
3398 3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3399 3467
  /// may provide alternative ways to modify the digraph.
3400 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
3401 3469
  /// features are used. For example the functions
3402 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
3403 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3404 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3405 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
3406 3474
  ///
3407 3475
  /// \sa OutDegMap
3408 3476
  template <typename GR>
3409 3477
  class InDegMap
3410 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
3411 3479
      ::ItemNotifier::ObserverBase {
3412 3480

	
3413 3481
  public:
3414 3482

	
3415 3483
    /// The graph type of InDegMap
3416 3484
    typedef GR Graph;
3417 3485
    typedef GR Digraph;
3418 3486
    /// The key type
3419 3487
    typedef typename Digraph::Node Key;
3420 3488
    /// The value type
3421 3489
    typedef int Value;
3422 3490

	
3423 3491
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3424 3492
    ::ItemNotifier::ObserverBase Parent;
3425 3493

	
3426 3494
  private:
3427 3495

	
3428 3496
    class AutoNodeMap
3429 3497
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3430 3498
    public:
3431 3499

	
3432 3500
      typedef typename ItemSetTraits<Digraph, Key>::
3433 3501
      template Map<int>::Type Parent;
3434 3502

	
3435 3503
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3436 3504

	
3437 3505
      virtual void add(const Key& key) {
3438 3506
        Parent::add(key);
3439 3507
        Parent::set(key, 0);
3440 3508
      }
3441 3509

	
3442 3510
      virtual void add(const std::vector<Key>& keys) {
3443 3511
        Parent::add(keys);
3444 3512
        for (int i = 0; i < int(keys.size()); ++i) {
3445 3513
          Parent::set(keys[i], 0);
3446 3514
        }
3447 3515
      }
3448 3516

	
3449 3517
      virtual void build() {
3450 3518
        Parent::build();
3451 3519
        Key it;
3452 3520
        typename Parent::Notifier* nf = Parent::notifier();
3453 3521
        for (nf->first(it); it != INVALID; nf->next(it)) {
3454 3522
          Parent::set(it, 0);
3455 3523
        }
3456 3524
      }
3457 3525
    };
3458 3526

	
3459 3527
  public:
3460 3528

	
3461 3529
    /// \brief Constructor.
3462 3530
    ///
3463 3531
    /// Constructor for creating an in-degree map.
3464 3532
    explicit InDegMap(const Digraph& graph)
3465 3533
      : _digraph(graph), _deg(graph) {
3466 3534
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3467 3535

	
3468 3536
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3469 3537
        _deg[it] = countInArcs(_digraph, it);
3470 3538
      }
3471 3539
    }
3472 3540

	
3473 3541
    /// \brief Gives back the in-degree of a Node.
3474 3542
    ///
3475 3543
    /// Gives back the in-degree of a Node.
3476 3544
    int operator[](const Key& key) const {
3477 3545
      return _deg[key];
3478 3546
    }
3479 3547

	
3480 3548
  protected:
3481 3549

	
3482 3550
    typedef typename Digraph::Arc Arc;
3483 3551

	
3484 3552
    virtual void add(const Arc& arc) {
3485 3553
      ++_deg[_digraph.target(arc)];
3486 3554
    }
3487 3555

	
3488 3556
    virtual void add(const std::vector<Arc>& arcs) {
3489 3557
      for (int i = 0; i < int(arcs.size()); ++i) {
3490 3558
        ++_deg[_digraph.target(arcs[i])];
3491 3559
      }
3492 3560
    }
3493 3561

	
3494 3562
    virtual void erase(const Arc& arc) {
3495 3563
      --_deg[_digraph.target(arc)];
3496 3564
    }
3497 3565

	
3498 3566
    virtual void erase(const std::vector<Arc>& arcs) {
3499 3567
      for (int i = 0; i < int(arcs.size()); ++i) {
3500 3568
        --_deg[_digraph.target(arcs[i])];
3501 3569
      }
3502 3570
    }
3503 3571

	
3504 3572
    virtual void build() {
3505 3573
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3506 3574
        _deg[it] = countInArcs(_digraph, it);
3507 3575
      }
3508 3576
    }
3509 3577

	
3510 3578
    virtual void clear() {
3511 3579
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3512 3580
        _deg[it] = 0;
3513 3581
      }
3514 3582
    }
3515 3583
  private:
3516 3584

	
3517 3585
    const Digraph& _digraph;
3518 3586
    AutoNodeMap _deg;
3519 3587
  };
3520 3588

	
3521 3589
  /// \brief Map of the out-degrees of nodes in a digraph.
3522 3590
  ///
3523 3591
  /// This map returns the out-degree of a node. Once it is constructed,
3524 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3525 3593
  /// in constant time. On the other hand, the values are updated automatically
3526 3594
  /// whenever the digraph changes.
3527 3595
  ///
3528 3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3529 3597
  /// may provide alternative ways to modify the digraph.
3530 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
3531 3599
  /// features are used. For example the functions
3532 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
3533 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3534 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3535 3603
  /// of \ref ListDigraph will \e not update the degree values correctly.
3536 3604
  ///
3537 3605
  /// \sa InDegMap
3538 3606
  template <typename GR>
3539 3607
  class OutDegMap
3540 3608
    : protected ItemSetTraits<GR, typename GR::Arc>
3541 3609
      ::ItemNotifier::ObserverBase {
3542 3610

	
3543 3611
  public:
3544 3612

	
3545 3613
    /// The graph type of OutDegMap
3546 3614
    typedef GR Graph;
3547 3615
    typedef GR Digraph;
3548 3616
    /// The key type
3549 3617
    typedef typename Digraph::Node Key;
3550 3618
    /// The value type
3551 3619
    typedef int Value;
3552 3620

	
3553 3621
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3554 3622
    ::ItemNotifier::ObserverBase Parent;
3555 3623

	
3556 3624
  private:
3557 3625

	
3558 3626
    class AutoNodeMap
3559 3627
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3560 3628
    public:
3561 3629

	
3562 3630
      typedef typename ItemSetTraits<Digraph, Key>::
3563 3631
      template Map<int>::Type Parent;
3564 3632

	
3565 3633
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3566 3634

	
3567 3635
      virtual void add(const Key& key) {
3568 3636
        Parent::add(key);
3569 3637
        Parent::set(key, 0);
3570 3638
      }
3571 3639
      virtual void add(const std::vector<Key>& keys) {
3572 3640
        Parent::add(keys);
3573 3641
        for (int i = 0; i < int(keys.size()); ++i) {
3574 3642
          Parent::set(keys[i], 0);
3575 3643
        }
3576 3644
      }
3577 3645
      virtual void build() {
3578 3646
        Parent::build();
3579 3647
        Key it;
3580 3648
        typename Parent::Notifier* nf = Parent::notifier();
3581 3649
        for (nf->first(it); it != INVALID; nf->next(it)) {
3582 3650
          Parent::set(it, 0);
3583 3651
        }
3584 3652
      }
3585 3653
    };
3586 3654

	
3587 3655
  public:
3588 3656

	
3589 3657
    /// \brief Constructor.
3590 3658
    ///
3591 3659
    /// Constructor for creating an out-degree map.
3592 3660
    explicit OutDegMap(const Digraph& graph)
3593 3661
      : _digraph(graph), _deg(graph) {
3594 3662
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3595 3663

	
3596 3664
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3597 3665
        _deg[it] = countOutArcs(_digraph, it);
3598 3666
      }
3599 3667
    }
3600 3668

	
3601 3669
    /// \brief Gives back the out-degree of a Node.
3602 3670
    ///
3603 3671
    /// Gives back the out-degree of a Node.
3604 3672
    int operator[](const Key& key) const {
3605 3673
      return _deg[key];
3606 3674
    }
3607 3675

	
3608 3676
  protected:
3609 3677

	
3610 3678
    typedef typename Digraph::Arc Arc;
3611 3679

	
3612 3680
    virtual void add(const Arc& arc) {
3613 3681
      ++_deg[_digraph.source(arc)];
3614 3682
    }
3615 3683

	
3616 3684
    virtual void add(const std::vector<Arc>& arcs) {
3617 3685
      for (int i = 0; i < int(arcs.size()); ++i) {
3618 3686
        ++_deg[_digraph.source(arcs[i])];
3619 3687
      }
3620 3688
    }
3621 3689

	
3622 3690
    virtual void erase(const Arc& arc) {
3623 3691
      --_deg[_digraph.source(arc)];
3624 3692
    }
3625 3693

	
3626 3694
    virtual void erase(const std::vector<Arc>& arcs) {
3627 3695
      for (int i = 0; i < int(arcs.size()); ++i) {
3628 3696
        --_deg[_digraph.source(arcs[i])];
3629 3697
      }
3630 3698
    }
3631 3699

	
3632 3700
    virtual void build() {
3633 3701
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3634 3702
        _deg[it] = countOutArcs(_digraph, it);
3635 3703
      }
3636 3704
    }
3637 3705

	
3638 3706
    virtual void clear() {
3639 3707
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3640 3708
        _deg[it] = 0;
3641 3709
      }
3642 3710
    }
3643 3711
  private:
3644 3712

	
3645 3713
    const Digraph& _digraph;
3646 3714
    AutoNodeMap _deg;
3647 3715
  };
3648 3716

	
3649 3717
  /// \brief Potential difference map
3650 3718
  ///
3651 3719
  /// PotentialDifferenceMap returns the difference between the potentials of
3652 3720
  /// the source and target nodes of each arc in a digraph, i.e. it returns
3653 3721
  /// \code
3654 3722
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
3655 3723
  /// \endcode
3656 3724
  /// \tparam GR The digraph type.
3657 3725
  /// \tparam POT A node map storing the potentials.
3658 3726
  template <typename GR, typename POT>
3659 3727
  class PotentialDifferenceMap {
3660 3728
  public:
3661 3729
    /// Key type
3662 3730
    typedef typename GR::Arc Key;
3663 3731
    /// Value type
3664 3732
    typedef typename POT::Value Value;
3665 3733

	
3666 3734
    /// \brief Constructor
3667 3735
    ///
3668 3736
    /// Contructor of the map.
3669 3737
    explicit PotentialDifferenceMap(const GR& gr,
3670 3738
                                    const POT& potential)
3671 3739
      : _digraph(gr), _potential(potential) {}
3672 3740

	
3673 3741
    /// \brief Returns the potential difference for the given arc.
3674 3742
    ///
3675 3743
    /// Returns the potential difference for the given arc, i.e.
3676 3744
    /// \code
3677 3745
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
3678 3746
    /// \endcode
3679 3747
    Value operator[](const Key& arc) const {
3680 3748
      return _potential[_digraph.target(arc)] -
3681 3749
        _potential[_digraph.source(arc)];
3682 3750
    }
3683 3751

	
3684 3752
  private:
3685 3753
    const GR& _digraph;
3686 3754
    const POT& _potential;
3687 3755
  };
3688 3756

	
3689 3757
  /// \brief Returns a PotentialDifferenceMap.
3690 3758
  ///
3691 3759
  /// This function just returns a PotentialDifferenceMap.
3692 3760
  /// \relates PotentialDifferenceMap
3693 3761
  template <typename GR, typename POT>
3694 3762
  PotentialDifferenceMap<GR, POT>
3695 3763
  potentialDifferenceMap(const GR& gr, const POT& potential) {
3696 3764
    return PotentialDifferenceMap<GR, POT>(gr, potential);
3697 3765
  }
3698 3766

	
3699 3767
  /// @}
3700 3768
}
3701 3769

	
3702 3770
#endif // LEMON_MAPS_H
Ignore white space 50331648 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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_MIN_COST_ARBORESCENCE_H
20 20
#define LEMON_MIN_COST_ARBORESCENCE_H
21 21

	
22 22
///\ingroup spantree
23 23
///\file
24 24
///\brief Minimum Cost Arborescence algorithm.
25 25

	
26 26
#include <vector>
27 27

	
28 28
#include <lemon/list_graph.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/assert.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34

	
35 35
  /// \brief Default traits class for MinCostArborescence class.
36 36
  ///
37 37
  /// Default traits class for MinCostArborescence class.
38 38
  /// \param GR Digraph type.
39 39
  /// \param CM Type of the cost map.
40 40
  template <class GR, class CM>
41 41
  struct MinCostArborescenceDefaultTraits{
42 42

	
43 43
    /// \brief The digraph type the algorithm runs on.
44 44
    typedef GR Digraph;
45 45

	
46 46
    /// \brief The type of the map that stores the arc costs.
47 47
    ///
48 48
    /// The type of the map that stores the arc costs.
49 49
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
50 50
    typedef CM CostMap;
51 51

	
52 52
    /// \brief The value type of the costs.
53 53
    ///
54 54
    /// The value type of the costs.
55 55
    typedef typename CostMap::Value Value;
56 56

	
57 57
    /// \brief The type of the map that stores which arcs are in the
58 58
    /// arborescence.
59 59
    ///
60 60
    /// The type of the map that stores which arcs are in the
61 61
    /// arborescence.  It must conform to the \ref concepts::WriteMap
62 62
    /// "WriteMap" concept, and its value type must be \c bool
63 63
    /// (or convertible). Initially it will be set to \c false on each
64 64
    /// arc, then it will be set on each arborescence arc once.
65 65
    typedef typename Digraph::template ArcMap<bool> ArborescenceMap;
66 66

	
67 67
    /// \brief Instantiates a \c ArborescenceMap.
68 68
    ///
69 69
    /// This function instantiates a \c ArborescenceMap.
70 70
    /// \param digraph The digraph to which we would like to calculate
71 71
    /// the \c ArborescenceMap.
72 72
    static ArborescenceMap *createArborescenceMap(const Digraph &digraph){
73 73
      return new ArborescenceMap(digraph);
74 74
    }
75 75

	
76 76
    /// \brief The type of the \c PredMap
77 77
    ///
78 78
    /// The type of the \c PredMap. It must confrom to the
79 79
    /// \ref concepts::WriteMap "WriteMap" concept, and its value type
80 80
    /// must be the \c Arc type of the digraph.
81 81
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
82 82

	
83 83
    /// \brief Instantiates a \c PredMap.
84 84
    ///
85 85
    /// This function instantiates a \c PredMap.
86 86
    /// \param digraph The digraph to which we would like to define the
87 87
    /// \c PredMap.
88 88
    static PredMap *createPredMap(const Digraph &digraph){
89 89
      return new PredMap(digraph);
90 90
    }
91 91

	
92 92
  };
93 93

	
94 94
  /// \ingroup spantree
95 95
  ///
96 96
  /// \brief Minimum Cost Arborescence algorithm class.
97 97
  ///
98 98
  /// This class provides an efficient implementation of the
99 99
  /// Minimum Cost Arborescence algorithm. The arborescence is a tree
100 100
  /// which is directed from a given source node of the digraph. One or
101 101
  /// more sources should be given to the algorithm and it will calculate
102 102
  /// the minimum cost subgraph that is the union of arborescences with the
103 103
  /// given sources and spans all the nodes which are reachable from the
104 104
  /// sources. The time complexity of the algorithm is O(n<sup>2</sup>+e).
105 105
  ///
106 106
  /// The algorithm also provides an optimal dual solution, therefore
107 107
  /// the optimality of the solution can be checked.
108 108
  ///
109 109
  /// \param GR The digraph type the algorithm runs on.
110 110
  /// \param CM A read-only arc map storing the costs of the
111 111
  /// arcs. It is read once for each arc, so the map may involve in
112 112
  /// relatively time consuming process to compute the arc costs if
113 113
  /// it is necessary. The default map type is \ref
114 114
  /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
115 115
  /// \param TR Traits class to set various data types used
116 116
  /// by the algorithm. The default traits class is
117 117
  /// \ref MinCostArborescenceDefaultTraits
118 118
  /// "MinCostArborescenceDefaultTraits<GR, CM>".
119 119
#ifndef DOXYGEN
120 120
  template <typename GR,
121 121
            typename CM = typename GR::template ArcMap<int>,
122 122
            typename TR =
123 123
              MinCostArborescenceDefaultTraits<GR, CM> >
124 124
#else
125 125
  template <typename GR, typename CM, typedef TR>
126 126
#endif
127 127
  class MinCostArborescence {
128 128
  public:
129 129

	
130 130
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" 
131 131
    /// of the algorithm. 
132 132
    typedef TR Traits;
133 133
    /// The type of the underlying digraph.
134 134
    typedef typename Traits::Digraph Digraph;
135 135
    /// The type of the map that stores the arc costs.
136 136
    typedef typename Traits::CostMap CostMap;
137 137
    ///The type of the costs of the arcs.
138 138
    typedef typename Traits::Value Value;
139 139
    ///The type of the predecessor map.
140 140
    typedef typename Traits::PredMap PredMap;
141 141
    ///The type of the map that stores which arcs are in the arborescence.
142 142
    typedef typename Traits::ArborescenceMap ArborescenceMap;
143 143

	
144 144
    typedef MinCostArborescence Create;
145 145

	
146 146
  private:
147 147

	
148 148
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
149 149

	
150 150
    struct CostArc {
151 151

	
152 152
      Arc arc;
153 153
      Value value;
154 154

	
155 155
      CostArc() {}
156 156
      CostArc(Arc _arc, Value _value) : arc(_arc), value(_value) {}
157 157

	
158 158
    };
159 159

	
160 160
    const Digraph *_digraph;
161 161
    const CostMap *_cost;
162 162

	
163 163
    PredMap *_pred;
164 164
    bool local_pred;
165 165

	
166 166
    ArborescenceMap *_arborescence;
167 167
    bool local_arborescence;
168 168

	
169 169
    typedef typename Digraph::template ArcMap<int> ArcOrder;
170 170
    ArcOrder *_arc_order;
171 171

	
172 172
    typedef typename Digraph::template NodeMap<int> NodeOrder;
173 173
    NodeOrder *_node_order;
174 174

	
175 175
    typedef typename Digraph::template NodeMap<CostArc> CostArcMap;
176 176
    CostArcMap *_cost_arcs;
177 177

	
178 178
    struct StackLevel {
179 179

	
180 180
      std::vector<CostArc> arcs;
181 181
      int node_level;
182 182

	
183 183
    };
184 184

	
185 185
    std::vector<StackLevel> level_stack;
186 186
    std::vector<Node> queue;
187 187

	
188 188
    typedef std::vector<typename Digraph::Node> DualNodeList;
189 189

	
190 190
    DualNodeList _dual_node_list;
191 191

	
192 192
    struct DualVariable {
193 193
      int begin, end;
194 194
      Value value;
195 195

	
196 196
      DualVariable(int _begin, int _end, Value _value)
197 197
        : begin(_begin), end(_end), value(_value) {}
198 198

	
199 199
    };
200 200

	
201 201
    typedef std::vector<DualVariable> DualVariables;
202 202

	
203 203
    DualVariables _dual_variables;
204 204

	
205 205
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
206 206

	
207 207
    HeapCrossRef *_heap_cross_ref;
208 208

	
209 209
    typedef BinHeap<int, HeapCrossRef> Heap;
210 210

	
211 211
    Heap *_heap;
212 212

	
213 213
  protected:
214 214

	
215 215
    MinCostArborescence() {}
216 216

	
217 217
  private:
218 218

	
219 219
    void createStructures() {
220 220
      if (!_pred) {
221 221
        local_pred = true;
222 222
        _pred = Traits::createPredMap(*_digraph);
223 223
      }
224 224
      if (!_arborescence) {
225 225
        local_arborescence = true;
226 226
        _arborescence = Traits::createArborescenceMap(*_digraph);
227 227
      }
228 228
      if (!_arc_order) {
229 229
        _arc_order = new ArcOrder(*_digraph);
230 230
      }
231 231
      if (!_node_order) {
232 232
        _node_order = new NodeOrder(*_digraph);
233 233
      }
234 234
      if (!_cost_arcs) {
235 235
        _cost_arcs = new CostArcMap(*_digraph);
236 236
      }
237 237
      if (!_heap_cross_ref) {
238 238
        _heap_cross_ref = new HeapCrossRef(*_digraph, -1);
239 239
      }
240 240
      if (!_heap) {
241 241
        _heap = new Heap(*_heap_cross_ref);
242 242
      }
243 243
    }
244 244

	
245 245
    void destroyStructures() {
246 246
      if (local_arborescence) {
247 247
        delete _arborescence;
248 248
      }
249 249
      if (local_pred) {
250 250
        delete _pred;
251 251
      }
252 252
      if (_arc_order) {
253 253
        delete _arc_order;
254 254
      }
255 255
      if (_node_order) {
256 256
        delete _node_order;
257 257
      }
258 258
      if (_cost_arcs) {
259 259
        delete _cost_arcs;
260 260
      }
261 261
      if (_heap) {
262 262
        delete _heap;
263 263
      }
264 264
      if (_heap_cross_ref) {
265 265
        delete _heap_cross_ref;
266 266
      }
267 267
    }
268 268

	
269 269
    Arc prepare(Node node) {
270 270
      std::vector<Node> nodes;
271 271
      (*_node_order)[node] = _dual_node_list.size();
272 272
      StackLevel level;
273 273
      level.node_level = _dual_node_list.size();
274 274
      _dual_node_list.push_back(node);
275 275
      for (InArcIt it(*_digraph, node); it != INVALID; ++it) {
276 276
        Arc arc = it;
277 277
        Node source = _digraph->source(arc);
278 278
        Value value = (*_cost)[it];
279 279
        if (source == node || (*_node_order)[source] == -3) continue;
280 280
        if ((*_cost_arcs)[source].arc == INVALID) {
281 281
          (*_cost_arcs)[source].arc = arc;
282 282
          (*_cost_arcs)[source].value = value;
283 283
          nodes.push_back(source);
284 284
        } else {
285 285
          if ((*_cost_arcs)[source].value > value) {
286 286
            (*_cost_arcs)[source].arc = arc;
287 287
            (*_cost_arcs)[source].value = value;
288 288
          }
289 289
        }
290 290
      }
291 291
      CostArc minimum = (*_cost_arcs)[nodes[0]];
292 292
      for (int i = 1; i < int(nodes.size()); ++i) {
293 293
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
294 294
          minimum = (*_cost_arcs)[nodes[i]];
295 295
        }
296 296
      }
297 297
      (*_arc_order)[minimum.arc] = _dual_variables.size();
298 298
      DualVariable var(_dual_node_list.size() - 1,
299 299
                       _dual_node_list.size(), minimum.value);
300 300
      _dual_variables.push_back(var);
301 301
      for (int i = 0; i < int(nodes.size()); ++i) {
302 302
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
303 303
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
304 304
        (*_cost_arcs)[nodes[i]].arc = INVALID;
305 305
      }
306 306
      level_stack.push_back(level);
307 307
      return minimum.arc;
308 308
    }
309 309

	
310 310
    Arc contract(Node node) {
311 311
      int node_bottom = bottom(node);
312 312
      std::vector<Node> nodes;
313 313
      while (!level_stack.empty() &&
314 314
             level_stack.back().node_level >= node_bottom) {
315 315
        for (int i = 0; i < int(level_stack.back().arcs.size()); ++i) {
316 316
          Arc arc = level_stack.back().arcs[i].arc;
317 317
          Node source = _digraph->source(arc);
318 318
          Value value = level_stack.back().arcs[i].value;
319 319
          if ((*_node_order)[source] >= node_bottom) continue;
320 320
          if ((*_cost_arcs)[source].arc == INVALID) {
321 321
            (*_cost_arcs)[source].arc = arc;
322 322
            (*_cost_arcs)[source].value = value;
323 323
            nodes.push_back(source);
324 324
          } else {
325 325
            if ((*_cost_arcs)[source].value > value) {
326 326
              (*_cost_arcs)[source].arc = arc;
327 327
              (*_cost_arcs)[source].value = value;
328 328
            }
329 329
          }
330 330
        }
331 331
        level_stack.pop_back();
332 332
      }
333 333
      CostArc minimum = (*_cost_arcs)[nodes[0]];
334 334
      for (int i = 1; i < int(nodes.size()); ++i) {
335 335
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
336 336
          minimum = (*_cost_arcs)[nodes[i]];
337 337
        }
338 338
      }
339 339
      (*_arc_order)[minimum.arc] = _dual_variables.size();
340 340
      DualVariable var(node_bottom, _dual_node_list.size(), minimum.value);
341 341
      _dual_variables.push_back(var);
342 342
      StackLevel level;
343 343
      level.node_level = node_bottom;
344 344
      for (int i = 0; i < int(nodes.size()); ++i) {
345 345
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
346 346
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
347 347
        (*_cost_arcs)[nodes[i]].arc = INVALID;
348 348
      }
349 349
      level_stack.push_back(level);
350 350
      return minimum.arc;
351 351
    }
352 352

	
353 353
    int bottom(Node node) {
354 354
      int k = level_stack.size() - 1;
355 355
      while (level_stack[k].node_level > (*_node_order)[node]) {
356 356
        --k;
357 357
      }
358 358
      return level_stack[k].node_level;
359 359
    }
360 360

	
361 361
    void finalize(Arc arc) {
362 362
      Node node = _digraph->target(arc);
363 363
      _heap->push(node, (*_arc_order)[arc]);
364 364
      _pred->set(node, arc);
365 365
      while (!_heap->empty()) {
366 366
        Node source = _heap->top();
367 367
        _heap->pop();
368 368
        (*_node_order)[source] = -1;
369 369
        for (OutArcIt it(*_digraph, source); it != INVALID; ++it) {
370 370
          if ((*_arc_order)[it] < 0) continue;
371 371
          Node target = _digraph->target(it);
372 372
          switch(_heap->state(target)) {
373 373
          case Heap::PRE_HEAP:
374 374
            _heap->push(target, (*_arc_order)[it]);
375 375
            _pred->set(target, it);
376 376
            break;
377 377
          case Heap::IN_HEAP:
378 378
            if ((*_arc_order)[it] < (*_heap)[target]) {
379 379
              _heap->decrease(target, (*_arc_order)[it]);
380 380
              _pred->set(target, it);
381 381
            }
382 382
            break;
383 383
          case Heap::POST_HEAP:
384 384
            break;
385 385
          }
386 386
        }
387 387
        _arborescence->set((*_pred)[source], true);
388 388
      }
389 389
    }
390 390

	
391 391

	
392 392
  public:
393 393

	
394 394
    /// \name Named Template Parameters
395 395

	
396 396
    /// @{
397 397

	
398 398
    template <class T>
399 399
    struct SetArborescenceMapTraits : public Traits {
400 400
      typedef T ArborescenceMap;
401 401
      static ArborescenceMap *createArborescenceMap(const Digraph &)
402 402
      {
403 403
        LEMON_ASSERT(false, "ArborescenceMap is not initialized");
404 404
        return 0; // ignore warnings
405 405
      }
406 406
    };
407 407

	
408 408
    /// \brief \ref named-templ-param "Named parameter" for
409 409
    /// setting \c ArborescenceMap type
410 410
    ///
411 411
    /// \ref named-templ-param "Named parameter" for setting
412 412
    /// \c ArborescenceMap type.
413 413
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept,
414 414
    /// and its value type must be \c bool (or convertible).
415 415
    /// Initially it will be set to \c false on each arc,
416 416
    /// then it will be set on each arborescence arc once.
417 417
    template <class T>
418 418
    struct SetArborescenceMap
419 419
      : public MinCostArborescence<Digraph, CostMap,
420 420
                                   SetArborescenceMapTraits<T> > {
421 421
    };
422 422

	
423 423
    template <class T>
424 424
    struct SetPredMapTraits : public Traits {
425 425
      typedef T PredMap;
426 426
      static PredMap *createPredMap(const Digraph &)
427 427
      {
428 428
        LEMON_ASSERT(false, "PredMap is not initialized");
429 429
        return 0; // ignore warnings
430 430
      }
431 431
    };
432 432

	
433 433
    /// \brief \ref named-templ-param "Named parameter" for
434 434
    /// setting \c PredMap type
435 435
    ///
436 436
    /// \ref named-templ-param "Named parameter" for setting
437 437
    /// \c PredMap type.
438 438
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 
439 439
    /// and its value type must be the \c Arc type of the digraph.
440 440
    template <class T>
441 441
    struct SetPredMap
442 442
      : public MinCostArborescence<Digraph, CostMap, SetPredMapTraits<T> > {
443 443
    };
444 444

	
445 445
    /// @}
446 446

	
447 447
    /// \brief Constructor.
448 448
    ///
449 449
    /// \param digraph The digraph the algorithm will run on.
450 450
    /// \param cost The cost map used by the algorithm.
451 451
    MinCostArborescence(const Digraph& digraph, const CostMap& cost)
452 452
      : _digraph(&digraph), _cost(&cost), _pred(0), local_pred(false),
453 453
        _arborescence(0), local_arborescence(false),
454 454
        _arc_order(0), _node_order(0), _cost_arcs(0),
455 455
        _heap_cross_ref(0), _heap(0) {}
456 456

	
457 457
    /// \brief Destructor.
458 458
    ~MinCostArborescence() {
459 459
      destroyStructures();
460 460
    }
461 461

	
462 462
    /// \brief Sets the arborescence map.
463 463
    ///
464 464
    /// Sets the arborescence map.
465 465
    /// \return <tt>(*this)</tt>
466 466
    MinCostArborescence& arborescenceMap(ArborescenceMap& m) {
467 467
      if (local_arborescence) {
468 468
        delete _arborescence;
469 469
      }
470 470
      local_arborescence = false;
471 471
      _arborescence = &m;
472 472
      return *this;
473 473
    }
474 474

	
475 475
    /// \brief Sets the predecessor map.
476 476
    ///
477 477
    /// Sets the predecessor map.
478 478
    /// \return <tt>(*this)</tt>
479 479
    MinCostArborescence& predMap(PredMap& m) {
480 480
      if (local_pred) {
481 481
        delete _pred;
482 482
      }
483 483
      local_pred = false;
484 484
      _pred = &m;
485 485
      return *this;
486 486
    }
487 487

	
488 488
    /// \name Execution Control
489 489
    /// The simplest way to execute the algorithm is to use
490 490
    /// one of the member functions called \c run(...). \n
491
    /// If you need more control on the execution,
492
    /// first you must call \ref init(), then you can add several
491
    /// If you need better control on the execution,
492
    /// you have to call \ref init() first, then you can add several
493 493
    /// source nodes with \ref addSource().
494 494
    /// Finally \ref start() will perform the arborescence
495 495
    /// computation.
496 496

	
497 497
    ///@{
498 498

	
499 499
    /// \brief Initializes the internal data structures.
500 500
    ///
501 501
    /// Initializes the internal data structures.
502 502
    ///
503 503
    void init() {
504 504
      createStructures();
505 505
      _heap->clear();
506 506
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
507 507
        (*_cost_arcs)[it].arc = INVALID;
508 508
        (*_node_order)[it] = -3;
509 509
        (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
510 510
        _pred->set(it, INVALID);
511 511
      }
512 512
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
513 513
        _arborescence->set(it, false);
514 514
        (*_arc_order)[it] = -1;
515 515
      }
516 516
      _dual_node_list.clear();
517 517
      _dual_variables.clear();
518 518
    }
519 519

	
520 520
    /// \brief Adds a new source node.
521 521
    ///
522 522
    /// Adds a new source node to the algorithm.
523 523
    void addSource(Node source) {
524 524
      std::vector<Node> nodes;
525 525
      nodes.push_back(source);
526 526
      while (!nodes.empty()) {
527 527
        Node node = nodes.back();
528 528
        nodes.pop_back();
529 529
        for (OutArcIt it(*_digraph, node); it != INVALID; ++it) {
530 530
          Node target = _digraph->target(it);
531 531
          if ((*_node_order)[target] == -3) {
532 532
            (*_node_order)[target] = -2;
533 533
            nodes.push_back(target);
534 534
            queue.push_back(target);
535 535
          }
536 536
        }
537 537
      }
538 538
      (*_node_order)[source] = -1;
539 539
    }
540 540

	
541 541
    /// \brief Processes the next node in the priority queue.
542 542
    ///
543 543
    /// Processes the next node in the priority queue.
544 544
    ///
545 545
    /// \return The processed node.
546 546
    ///
547 547
    /// \warning The queue must not be empty.
548 548
    Node processNextNode() {
549 549
      Node node = queue.back();
550 550
      queue.pop_back();
551 551
      if ((*_node_order)[node] == -2) {
552 552
        Arc arc = prepare(node);
553 553
        Node source = _digraph->source(arc);
554 554
        while ((*_node_order)[source] != -1) {
555 555
          if ((*_node_order)[source] >= 0) {
556 556
            arc = contract(source);
557 557
          } else {
558 558
            arc = prepare(source);
559 559
          }
560 560
          source = _digraph->source(arc);
561 561
        }
562 562
        finalize(arc);
563 563
        level_stack.clear();
564 564
      }
565 565
      return node;
566 566
    }
567 567

	
568 568
    /// \brief Returns the number of the nodes to be processed.
569 569
    ///
570 570
    /// Returns the number of the nodes to be processed in the priority
571 571
    /// queue.
572 572
    int queueSize() const {
573 573
      return queue.size();
574 574
    }
575 575

	
576 576
    /// \brief Returns \c false if there are nodes to be processed.
577 577
    ///
578 578
    /// Returns \c false if there are nodes to be processed.
579 579
    bool emptyQueue() const {
580 580
      return queue.empty();
581 581
    }
582 582

	
583 583
    /// \brief Executes the algorithm.
584 584
    ///
585 585
    /// Executes the algorithm.
586 586
    ///
587 587
    /// \pre init() must be called and at least one node should be added
588 588
    /// with addSource() before using this function.
589 589
    ///
590 590
    ///\note mca.start() is just a shortcut of the following code.
591 591
    ///\code
592 592
    ///while (!mca.emptyQueue()) {
593 593
    ///  mca.processNextNode();
594 594
    ///}
595 595
    ///\endcode
596 596
    void start() {
597 597
      while (!emptyQueue()) {
598 598
        processNextNode();
599 599
      }
600 600
    }
601 601

	
602 602
    /// \brief Runs %MinCostArborescence algorithm from node \c s.
603 603
    ///
604 604
    /// This method runs the %MinCostArborescence algorithm from
605 605
    /// a root node \c s.
606 606
    ///
607 607
    /// \note mca.run(s) is just a shortcut of the following code.
608 608
    /// \code
609 609
    /// mca.init();
610 610
    /// mca.addSource(s);
611 611
    /// mca.start();
612 612
    /// \endcode
613 613
    void run(Node s) {
614 614
      init();
615 615
      addSource(s);
616 616
      start();
617 617
    }
618 618

	
619 619
    ///@}
620 620

	
621 621
    /// \name Query Functions
622 622
    /// The result of the %MinCostArborescence algorithm can be obtained
623 623
    /// using these functions.\n
624 624
    /// Either run() or start() must be called before using them.
625 625

	
626 626
    /// @{
627 627

	
628 628
    /// \brief Returns the cost of the arborescence.
629 629
    ///
630 630
    /// Returns the cost of the arborescence.
631 631
    Value arborescenceCost() const {
632 632
      Value sum = 0;
633 633
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
634 634
        if (arborescence(it)) {
635 635
          sum += (*_cost)[it];
636 636
        }
637 637
      }
638 638
      return sum;
639 639
    }
640 640

	
641 641
    /// \brief Returns \c true if the arc is in the arborescence.
642 642
    ///
643 643
    /// Returns \c true if the given arc is in the arborescence.
644 644
    /// \param arc An arc of the digraph.
645 645
    /// \pre \ref run() must be called before using this function.
646 646
    bool arborescence(Arc arc) const {
647 647
      return (*_pred)[_digraph->target(arc)] == arc;
648 648
    }
649 649

	
650 650
    /// \brief Returns a const reference to the arborescence map.
651 651
    ///
652 652
    /// Returns a const reference to the arborescence map.
653 653
    /// \pre \ref run() must be called before using this function.
654 654
    const ArborescenceMap& arborescenceMap() const {
655 655
      return *_arborescence;
656 656
    }
657 657

	
658 658
    /// \brief Returns the predecessor arc of the given node.
659 659
    ///
660 660
    /// Returns the predecessor arc of the given node.
661 661
    /// \pre \ref run() must be called before using this function.
662 662
    Arc pred(Node node) const {
663 663
      return (*_pred)[node];
664 664
    }
665 665

	
666 666
    /// \brief Returns a const reference to the pred map.
667 667
    ///
668 668
    /// Returns a const reference to the pred map.
669 669
    /// \pre \ref run() must be called before using this function.
670 670
    const PredMap& predMap() const {
671 671
      return *_pred;
672 672
    }
673 673

	
674 674
    /// \brief Indicates that a node is reachable from the sources.
675 675
    ///
676 676
    /// Indicates that a node is reachable from the sources.
677 677
    bool reached(Node node) const {
678 678
      return (*_node_order)[node] != -3;
679 679
    }
680 680

	
681 681
    /// \brief Indicates that a node is processed.
682 682
    ///
683 683
    /// Indicates that a node is processed. The arborescence path exists
684 684
    /// from the source to the given node.
685 685
    bool processed(Node node) const {
686 686
      return (*_node_order)[node] == -1;
687 687
    }
688 688

	
689 689
    /// \brief Returns the number of the dual variables in basis.
690 690
    ///
691 691
    /// Returns the number of the dual variables in basis.
692 692
    int dualNum() const {
693 693
      return _dual_variables.size();
694 694
    }
695 695

	
696 696
    /// \brief Returns the value of the dual solution.
697 697
    ///
698 698
    /// Returns the value of the dual solution. It should be
699 699
    /// equal to the arborescence value.
700 700
    Value dualValue() const {
701 701
      Value sum = 0;
702 702
      for (int i = 0; i < int(_dual_variables.size()); ++i) {
703 703
        sum += _dual_variables[i].value;
704 704
      }
705 705
      return sum;
706 706
    }
707 707

	
708 708
    /// \brief Returns the number of the nodes in the dual variable.
709 709
    ///
710 710
    /// Returns the number of the nodes in the dual variable.
711 711
    int dualSize(int k) const {
712 712
      return _dual_variables[k].end - _dual_variables[k].begin;
713 713
    }
714 714

	
715 715
    /// \brief Returns the value of the dual variable.
716 716
    ///
717 717
    /// Returns the the value of the dual variable.
718 718
    Value dualValue(int k) const {
719 719
      return _dual_variables[k].value;
720 720
    }
721 721

	
722 722
    /// \brief LEMON iterator for getting a dual variable.
723 723
    ///
724 724
    /// This class provides a common style LEMON iterator for getting a
725 725
    /// dual variable of \ref MinCostArborescence algorithm.
726 726
    /// It iterates over a subset of the nodes.
727 727
    class DualIt {
728 728
    public:
729 729

	
730 730
      /// \brief Constructor.
731 731
      ///
732 732
      /// Constructor for getting the nodeset of the dual variable
733 733
      /// of \ref MinCostArborescence algorithm.
734 734
      DualIt(const MinCostArborescence& algorithm, int variable)
735 735
        : _algorithm(&algorithm)
736 736
      {
737 737
        _index = _algorithm->_dual_variables[variable].begin;
738 738
        _last = _algorithm->_dual_variables[variable].end;
739 739
      }
740 740

	
741 741
      /// \brief Conversion to \c Node.
742 742
      ///
743 743
      /// Conversion to \c Node.
744 744
      operator Node() const {
745 745
        return _algorithm->_dual_node_list[_index];
746 746
      }
747 747

	
748 748
      /// \brief Increment operator.
749 749
      ///
750 750
      /// Increment operator.
751 751
      DualIt& operator++() {
752 752
        ++_index;
753 753
        return *this;
754 754
      }
755 755

	
756 756
      /// \brief Validity checking
757 757
      ///
758 758
      /// Checks whether the iterator is invalid.
759 759
      bool operator==(Invalid) const {
760 760
        return _index == _last;
761 761
      }
762 762

	
763 763
      /// \brief Validity checking
764 764
      ///
765 765
      /// Checks whether the iterator is valid.
766 766
      bool operator!=(Invalid) const {
767 767
        return _index != _last;
768 768
      }
769 769

	
770 770
    private:
771 771
      const MinCostArborescence* _algorithm;
772 772
      int _index, _last;
773 773
    };
774 774

	
775 775
    /// @}
776 776

	
777 777
  };
778 778

	
779 779
  /// \ingroup spantree
780 780
  ///
781 781
  /// \brief Function type interface for MinCostArborescence algorithm.
782 782
  ///
783 783
  /// Function type interface for MinCostArborescence algorithm.
784 784
  /// \param digraph The digraph the algorithm runs on.
785 785
  /// \param cost An arc map storing the costs.
786 786
  /// \param source The source node of the arborescence.
787 787
  /// \retval arborescence An arc map with \c bool (or convertible) value
788 788
  /// type that stores the arborescence.
789 789
  /// \return The total cost of the arborescence.
790 790
  ///
791 791
  /// \sa MinCostArborescence
792 792
  template <typename Digraph, typename CostMap, typename ArborescenceMap>
793 793
  typename CostMap::Value minCostArborescence(const Digraph& digraph,
794 794
                                              const CostMap& cost,
795 795
                                              typename Digraph::Node source,
796 796
                                              ArborescenceMap& arborescence) {
797 797
    typename MinCostArborescence<Digraph, CostMap>
798 798
      ::template SetArborescenceMap<ArborescenceMap>
799 799
      ::Create mca(digraph, cost);
800 800
    mca.arborescenceMap(arborescence);
801 801
    mca.run(source);
802 802
    return mca.arborescenceCost();
803 803
  }
804 804

	
805 805
}
806 806

	
807 807
#endif
Ignore white space 50331648 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_PREFLOW_H
20 20
#define LEMON_PREFLOW_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24

	
25 25
/// \file
26 26
/// \ingroup max_flow
27 27
/// \brief Implementation of the preflow algorithm.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  /// \brief Default traits class of Preflow class.
32 32
  ///
33 33
  /// Default traits class of Preflow class.
34 34
  /// \tparam GR Digraph type.
35 35
  /// \tparam CAP Capacity map type.
36 36
  template <typename GR, typename CAP>
37 37
  struct PreflowDefaultTraits {
38 38

	
39 39
    /// \brief The type of the digraph the algorithm runs on.
40 40
    typedef GR Digraph;
41 41

	
42 42
    /// \brief The type of the map that stores the arc capacities.
43 43
    ///
44 44
    /// The type of the map that stores the arc capacities.
45 45
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
46 46
    typedef CAP CapacityMap;
47 47

	
48 48
    /// \brief The type of the flow values.
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#ifdef DOXYGEN
56
    typedef GR::ArcMap<Value> FlowMap;
57
#else
55 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59
#endif
56 60

	
57 61
    /// \brief Instantiates a FlowMap.
58 62
    ///
59 63
    /// This function instantiates a \ref FlowMap.
60 64
    /// \param digraph The digraph for which we would like to define
61 65
    /// the flow map.
62 66
    static FlowMap* createFlowMap(const Digraph& digraph) {
63 67
      return new FlowMap(digraph);
64 68
    }
65 69

	
66 70
    /// \brief The elevator type used by Preflow algorithm.
67 71
    ///
68 72
    /// The elevator type used by Preflow algorithm.
69 73
    ///
70
    /// \sa Elevator
71
    /// \sa LinkedElevator
72
    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
74
    /// \sa Elevator, LinkedElevator
75
#ifdef DOXYGEN
76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77
#else
78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79
#endif
73 80

	
74 81
    /// \brief Instantiates an Elevator.
75 82
    ///
76 83
    /// This function instantiates an \ref Elevator.
77 84
    /// \param digraph The digraph for which we would like to define
78 85
    /// the elevator.
79 86
    /// \param max_level The maximum level of the elevator.
80 87
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
81 88
      return new Elevator(digraph, max_level);
82 89
    }
83 90

	
84 91
    /// \brief The tolerance used by the algorithm
85 92
    ///
86 93
    /// The tolerance used by the algorithm to handle inexact computation.
87 94
    typedef lemon::Tolerance<Value> Tolerance;
88 95

	
89 96
  };
90 97

	
91 98

	
92 99
  /// \ingroup max_flow
93 100
  ///
94 101
  /// \brief %Preflow algorithm class.
95 102
  ///
96 103
  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
97 104
  /// \e push-relabel algorithm producing a \ref max_flow
98 105
  /// "flow of maximum value" in a digraph.
99 106
  /// The preflow algorithms are the fastest known maximum
100 107
  /// flow algorithms. The current implementation uses a mixture of the
101 108
  /// \e "highest label" and the \e "bound decrease" heuristics.
102 109
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
103 110
  ///
104 111
  /// The algorithm consists of two phases. After the first phase
105 112
  /// the maximum flow value and the minimum cut is obtained. The
106 113
  /// second phase constructs a feasible maximum flow on each arc.
107 114
  ///
108 115
  /// \tparam GR The type of the digraph the algorithm runs on.
109 116
  /// \tparam CAP The type of the capacity map. The default map
110 117
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
111 118
#ifdef DOXYGEN
112 119
  template <typename GR, typename CAP, typename TR>
113 120
#else
114 121
  template <typename GR,
115 122
            typename CAP = typename GR::template ArcMap<int>,
116 123
            typename TR = PreflowDefaultTraits<GR, CAP> >
117 124
#endif
118 125
  class Preflow {
119 126
  public:
120 127

	
121 128
    ///The \ref PreflowDefaultTraits "traits class" of the algorithm.
122 129
    typedef TR Traits;
123 130
    ///The type of the digraph the algorithm runs on.
124 131
    typedef typename Traits::Digraph Digraph;
125 132
    ///The type of the capacity map.
126 133
    typedef typename Traits::CapacityMap CapacityMap;
127 134
    ///The type of the flow values.
128 135
    typedef typename Traits::Value Value;
129 136

	
130 137
    ///The type of the flow map.
131 138
    typedef typename Traits::FlowMap FlowMap;
132 139
    ///The type of the elevator.
133 140
    typedef typename Traits::Elevator Elevator;
134 141
    ///The type of the tolerance.
135 142
    typedef typename Traits::Tolerance Tolerance;
136 143

	
137 144
  private:
138 145

	
139 146
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
140 147

	
141 148
    const Digraph& _graph;
142 149
    const CapacityMap* _capacity;
143 150

	
144 151
    int _node_num;
145 152

	
146 153
    Node _source, _target;
147 154

	
148 155
    FlowMap* _flow;
149 156
    bool _local_flow;
150 157

	
151 158
    Elevator* _level;
152 159
    bool _local_level;
153 160

	
154 161
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
155 162
    ExcessMap* _excess;
156 163

	
157 164
    Tolerance _tolerance;
158 165

	
159 166
    bool _phase;
160 167

	
161 168

	
162 169
    void createStructures() {
163 170
      _node_num = countNodes(_graph);
164 171

	
165 172
      if (!_flow) {
166 173
        _flow = Traits::createFlowMap(_graph);
167 174
        _local_flow = true;
168 175
      }
169 176
      if (!_level) {
170 177
        _level = Traits::createElevator(_graph, _node_num);
171 178
        _local_level = true;
172 179
      }
173 180
      if (!_excess) {
174 181
        _excess = new ExcessMap(_graph);
175 182
      }
176 183
    }
177 184

	
178 185
    void destroyStructures() {
179 186
      if (_local_flow) {
180 187
        delete _flow;
181 188
      }
182 189
      if (_local_level) {
183 190
        delete _level;
184 191
      }
185 192
      if (_excess) {
186 193
        delete _excess;
187 194
      }
188 195
    }
189 196

	
190 197
  public:
191 198

	
192 199
    typedef Preflow Create;
193 200

	
194 201
    ///\name Named Template Parameters
195 202

	
196 203
    ///@{
197 204

	
198 205
    template <typename T>
199 206
    struct SetFlowMapTraits : public Traits {
200 207
      typedef T FlowMap;
201 208
      static FlowMap *createFlowMap(const Digraph&) {
202 209
        LEMON_ASSERT(false, "FlowMap is not initialized");
203 210
        return 0; // ignore warnings
204 211
      }
205 212
    };
206 213

	
207 214
    /// \brief \ref named-templ-param "Named parameter" for setting
208 215
    /// FlowMap type
209 216
    ///
210 217
    /// \ref named-templ-param "Named parameter" for setting FlowMap
211 218
    /// type.
212 219
    template <typename T>
213 220
    struct SetFlowMap
214 221
      : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
215 222
      typedef Preflow<Digraph, CapacityMap,
216 223
                      SetFlowMapTraits<T> > Create;
217 224
    };
218 225

	
219 226
    template <typename T>
220 227
    struct SetElevatorTraits : public Traits {
221 228
      typedef T Elevator;
222 229
      static Elevator *createElevator(const Digraph&, int) {
223 230
        LEMON_ASSERT(false, "Elevator is not initialized");
224 231
        return 0; // ignore warnings
225 232
      }
226 233
    };
227 234

	
228 235
    /// \brief \ref named-templ-param "Named parameter" for setting
229 236
    /// Elevator type
230 237
    ///
231 238
    /// \ref named-templ-param "Named parameter" for setting Elevator
232 239
    /// type. If this named parameter is used, then an external
233 240
    /// elevator object must be passed to the algorithm using the
234 241
    /// \ref elevator(Elevator&) "elevator()" function before calling
235 242
    /// \ref run() or \ref init().
236 243
    /// \sa SetStandardElevator
237 244
    template <typename T>
238 245
    struct SetElevator
239 246
      : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
240 247
      typedef Preflow<Digraph, CapacityMap,
241 248
                      SetElevatorTraits<T> > Create;
242 249
    };
243 250

	
244 251
    template <typename T>
245 252
    struct SetStandardElevatorTraits : public Traits {
246 253
      typedef T Elevator;
247 254
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
248 255
        return new Elevator(digraph, max_level);
249 256
      }
250 257
    };
251 258

	
252 259
    /// \brief \ref named-templ-param "Named parameter" for setting
253 260
    /// Elevator type with automatic allocation
254 261
    ///
255 262
    /// \ref named-templ-param "Named parameter" for setting Elevator
256 263
    /// type with automatic allocation.
257 264
    /// The Elevator should have standard constructor interface to be
258 265
    /// able to automatically created by the algorithm (i.e. the
259 266
    /// digraph and the maximum level should be passed to it).
260 267
    /// However an external elevator object could also be passed to the
261 268
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
262 269
    /// before calling \ref run() or \ref init().
263 270
    /// \sa SetElevator
264 271
    template <typename T>
265 272
    struct SetStandardElevator
266 273
      : public Preflow<Digraph, CapacityMap,
267 274
                       SetStandardElevatorTraits<T> > {
268 275
      typedef Preflow<Digraph, CapacityMap,
269 276
                      SetStandardElevatorTraits<T> > Create;
270 277
    };
271 278

	
272 279
    /// @}
273 280

	
274 281
  protected:
275 282

	
276 283
    Preflow() {}
277 284

	
278 285
  public:
279 286

	
280 287

	
281 288
    /// \brief The constructor of the class.
282 289
    ///
283 290
    /// The constructor of the class.
284 291
    /// \param digraph The digraph the algorithm runs on.
285 292
    /// \param capacity The capacity of the arcs.
286 293
    /// \param source The source node.
287 294
    /// \param target The target node.
288 295
    Preflow(const Digraph& digraph, const CapacityMap& capacity,
289 296
            Node source, Node target)
290 297
      : _graph(digraph), _capacity(&capacity),
291 298
        _node_num(0), _source(source), _target(target),
292 299
        _flow(0), _local_flow(false),
293 300
        _level(0), _local_level(false),
294 301
        _excess(0), _tolerance(), _phase() {}
295 302

	
296 303
    /// \brief Destructor.
297 304
    ///
298 305
    /// Destructor.
299 306
    ~Preflow() {
300 307
      destroyStructures();
301 308
    }
302 309

	
303 310
    /// \brief Sets the capacity map.
304 311
    ///
305 312
    /// Sets the capacity map.
306 313
    /// \return <tt>(*this)</tt>
307 314
    Preflow& capacityMap(const CapacityMap& map) {
308 315
      _capacity = &map;
309 316
      return *this;
310 317
    }
311 318

	
312 319
    /// \brief Sets the flow map.
313 320
    ///
314 321
    /// Sets the flow map.
315 322
    /// If you don't use this function before calling \ref run() or
316 323
    /// \ref init(), an instance will be allocated automatically.
317 324
    /// The destructor deallocates this automatically allocated map,
318 325
    /// of course.
319 326
    /// \return <tt>(*this)</tt>
320 327
    Preflow& flowMap(FlowMap& map) {
321 328
      if (_local_flow) {
322 329
        delete _flow;
323 330
        _local_flow = false;
324 331
      }
325 332
      _flow = &map;
326 333
      return *this;
327 334
    }
328 335

	
329 336
    /// \brief Sets the source node.
330 337
    ///
331 338
    /// Sets the source node.
332 339
    /// \return <tt>(*this)</tt>
333 340
    Preflow& source(const Node& node) {
334 341
      _source = node;
335 342
      return *this;
336 343
    }
337 344

	
338 345
    /// \brief Sets the target node.
339 346
    ///
340 347
    /// Sets the target node.
341 348
    /// \return <tt>(*this)</tt>
342 349
    Preflow& target(const Node& node) {
343 350
      _target = node;
344 351
      return *this;
345 352
    }
346 353

	
347 354
    /// \brief Sets the elevator used by algorithm.
348 355
    ///
349 356
    /// Sets the elevator used by algorithm.
350 357
    /// If you don't use this function before calling \ref run() or
351 358
    /// \ref init(), an instance will be allocated automatically.
352 359
    /// The destructor deallocates this automatically allocated elevator,
353 360
    /// of course.
354 361
    /// \return <tt>(*this)</tt>
355 362
    Preflow& elevator(Elevator& elevator) {
356 363
      if (_local_level) {
357 364
        delete _level;
358 365
        _local_level = false;
359 366
      }
360 367
      _level = &elevator;
361 368
      return *this;
362 369
    }
363 370

	
364 371
    /// \brief Returns a const reference to the elevator.
365 372
    ///
366 373
    /// Returns a const reference to the elevator.
367 374
    ///
368 375
    /// \pre Either \ref run() or \ref init() must be called before
369 376
    /// using this function.
370 377
    const Elevator& elevator() const {
371 378
      return *_level;
372 379
    }
373 380

	
374 381
    /// \brief Sets the tolerance used by the algorithm.
375 382
    ///
376 383
    /// Sets the tolerance object used by the algorithm.
377 384
    /// \return <tt>(*this)</tt>
378 385
    Preflow& tolerance(const Tolerance& tolerance) {
379 386
      _tolerance = tolerance;
380 387
      return *this;
381 388
    }
382 389

	
383 390
    /// \brief Returns a const reference to the tolerance.
384 391
    ///
385 392
    /// Returns a const reference to the tolerance object used by
386 393
    /// the algorithm.
387 394
    const Tolerance& tolerance() const {
388 395
      return _tolerance;
389 396
    }
390 397

	
391 398
    /// \name Execution Control
392 399
    /// The simplest way to execute the preflow algorithm is to use
393 400
    /// \ref run() or \ref runMinCut().\n
394
    /// If you need more control on the initial solution or the execution,
395
    /// first you have to call one of the \ref init() functions, then
401
    /// If you need better control on the initial solution or the execution,
402
    /// you have to call one of the \ref init() functions first, then
396 403
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
397 404

	
398 405
    ///@{
399 406

	
400 407
    /// \brief Initializes the internal data structures.
401 408
    ///
402 409
    /// Initializes the internal data structures and sets the initial
403 410
    /// flow to zero on each arc.
404 411
    void init() {
405 412
      createStructures();
406 413

	
407 414
      _phase = true;
408 415
      for (NodeIt n(_graph); n != INVALID; ++n) {
409 416
        (*_excess)[n] = 0;
410 417
      }
411 418

	
412 419
      for (ArcIt e(_graph); e != INVALID; ++e) {
413 420
        _flow->set(e, 0);
414 421
      }
415 422

	
416 423
      typename Digraph::template NodeMap<bool> reached(_graph, false);
417 424

	
418 425
      _level->initStart();
419 426
      _level->initAddItem(_target);
420 427

	
421 428
      std::vector<Node> queue;
422 429
      reached[_source] = true;
423 430

	
424 431
      queue.push_back(_target);
425 432
      reached[_target] = true;
426 433
      while (!queue.empty()) {
427 434
        _level->initNewLevel();
428 435
        std::vector<Node> nqueue;
429 436
        for (int i = 0; i < int(queue.size()); ++i) {
430 437
          Node n = queue[i];
431 438
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
432 439
            Node u = _graph.source(e);
433 440
            if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
434 441
              reached[u] = true;
435 442
              _level->initAddItem(u);
436 443
              nqueue.push_back(u);
437 444
            }
438 445
          }
439 446
        }
440 447
        queue.swap(nqueue);
441 448
      }
442 449
      _level->initFinish();
443 450

	
444 451
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
445 452
        if (_tolerance.positive((*_capacity)[e])) {
446 453
          Node u = _graph.target(e);
447 454
          if ((*_level)[u] == _level->maxLevel()) continue;
448 455
          _flow->set(e, (*_capacity)[e]);
449 456
          (*_excess)[u] += (*_capacity)[e];
450 457
          if (u != _target && !_level->active(u)) {
451 458
            _level->activate(u);
452 459
          }
453 460
        }
454 461
      }
455 462
    }
456 463

	
457 464
    /// \brief Initializes the internal data structures using the
458 465
    /// given flow map.
459 466
    ///
460 467
    /// Initializes the internal data structures and sets the initial
461 468
    /// flow to the given \c flowMap. The \c flowMap should contain a
462 469
    /// flow or at least a preflow, i.e. at each node excluding the
463 470
    /// source node the incoming flow should greater or equal to the
464 471
    /// outgoing flow.
465 472
    /// \return \c false if the given \c flowMap is not a preflow.
466 473
    template <typename FlowMap>
467 474
    bool init(const FlowMap& flowMap) {
468 475
      createStructures();
469 476

	
470 477
      for (ArcIt e(_graph); e != INVALID; ++e) {
471 478
        _flow->set(e, flowMap[e]);
472 479
      }
473 480

	
474 481
      for (NodeIt n(_graph); n != INVALID; ++n) {
475 482
        Value excess = 0;
476 483
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
477 484
          excess += (*_flow)[e];
478 485
        }
479 486
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
480 487
          excess -= (*_flow)[e];
481 488
        }
482 489
        if (excess < 0 && n != _source) return false;
483 490
        (*_excess)[n] = excess;
484 491
      }
485 492

	
486 493
      typename Digraph::template NodeMap<bool> reached(_graph, false);
487 494

	
488 495
      _level->initStart();
489 496
      _level->initAddItem(_target);
490 497

	
491 498
      std::vector<Node> queue;
492 499
      reached[_source] = true;
493 500

	
494 501
      queue.push_back(_target);
495 502
      reached[_target] = true;
496 503
      while (!queue.empty()) {
497 504
        _level->initNewLevel();
498 505
        std::vector<Node> nqueue;
499 506
        for (int i = 0; i < int(queue.size()); ++i) {
500 507
          Node n = queue[i];
501 508
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
502 509
            Node u = _graph.source(e);
503 510
            if (!reached[u] &&
504 511
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
505 512
              reached[u] = true;
506 513
              _level->initAddItem(u);
507 514
              nqueue.push_back(u);
508 515
            }
509 516
          }
510 517
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
511 518
            Node v = _graph.target(e);
512 519
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
513 520
              reached[v] = true;
514 521
              _level->initAddItem(v);
515 522
              nqueue.push_back(v);
516 523
            }
517 524
          }
518 525
        }
519 526
        queue.swap(nqueue);
520 527
      }
521 528
      _level->initFinish();
522 529

	
523 530
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
524 531
        Value rem = (*_capacity)[e] - (*_flow)[e];
525 532
        if (_tolerance.positive(rem)) {
526 533
          Node u = _graph.target(e);
527 534
          if ((*_level)[u] == _level->maxLevel()) continue;
528 535
          _flow->set(e, (*_capacity)[e]);
529 536
          (*_excess)[u] += rem;
530 537
          if (u != _target && !_level->active(u)) {
531 538
            _level->activate(u);
532 539
          }
533 540
        }
534 541
      }
535 542
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
536 543
        Value rem = (*_flow)[e];
537 544
        if (_tolerance.positive(rem)) {
538 545
          Node v = _graph.source(e);
539 546
          if ((*_level)[v] == _level->maxLevel()) continue;
540 547
          _flow->set(e, 0);
541 548
          (*_excess)[v] += rem;
542 549
          if (v != _target && !_level->active(v)) {
543 550
            _level->activate(v);
544 551
          }
545 552
        }
546 553
      }
547 554
      return true;
548 555
    }
549 556

	
550 557
    /// \brief Starts the first phase of the preflow algorithm.
551 558
    ///
552 559
    /// The preflow algorithm consists of two phases, this method runs
553 560
    /// the first phase. After the first phase the maximum flow value
554 561
    /// and a minimum value cut can already be computed, although a
555 562
    /// maximum flow is not yet obtained. So after calling this method
556 563
    /// \ref flowValue() returns the value of a maximum flow and \ref
557 564
    /// minCut() returns a minimum cut.
558 565
    /// \pre One of the \ref init() functions must be called before
559 566
    /// using this function.
560 567
    void startFirstPhase() {
561 568
      _phase = true;
562 569

	
563 570
      Node n = _level->highestActive();
564 571
      int level = _level->highestActiveLevel();
565 572
      while (n != INVALID) {
566 573
        int num = _node_num;
567 574

	
568 575
        while (num > 0 && n != INVALID) {
569 576
          Value excess = (*_excess)[n];
570 577
          int new_level = _level->maxLevel();
571 578

	
572 579
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
573 580
            Value rem = (*_capacity)[e] - (*_flow)[e];
574 581
            if (!_tolerance.positive(rem)) continue;
575 582
            Node v = _graph.target(e);
576 583
            if ((*_level)[v] < level) {
577 584
              if (!_level->active(v) && v != _target) {
578 585
                _level->activate(v);
579 586
              }
580 587
              if (!_tolerance.less(rem, excess)) {
581 588
                _flow->set(e, (*_flow)[e] + excess);
582 589
                (*_excess)[v] += excess;
583 590
                excess = 0;
584 591
                goto no_more_push_1;
585 592
              } else {
586 593
                excess -= rem;
587 594
                (*_excess)[v] += rem;
588 595
                _flow->set(e, (*_capacity)[e]);
589 596
              }
590 597
            } else if (new_level > (*_level)[v]) {
591 598
              new_level = (*_level)[v];
592 599
            }
593 600
          }
594 601

	
595 602
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
596 603
            Value rem = (*_flow)[e];
597 604
            if (!_tolerance.positive(rem)) continue;
598 605
            Node v = _graph.source(e);
599 606
            if ((*_level)[v] < level) {
600 607
              if (!_level->active(v) && v != _target) {
601 608
                _level->activate(v);
602 609
              }
603 610
              if (!_tolerance.less(rem, excess)) {
604 611
                _flow->set(e, (*_flow)[e] - excess);
605 612
                (*_excess)[v] += excess;
606 613
                excess = 0;
607 614
                goto no_more_push_1;
608 615
              } else {
609 616
                excess -= rem;
610 617
                (*_excess)[v] += rem;
611 618
                _flow->set(e, 0);
612 619
              }
613 620
            } else if (new_level > (*_level)[v]) {
614 621
              new_level = (*_level)[v];
615 622
            }
616 623
          }
617 624

	
618 625
        no_more_push_1:
619 626

	
620 627
          (*_excess)[n] = excess;
621 628

	
622 629
          if (excess != 0) {
623 630
            if (new_level + 1 < _level->maxLevel()) {
624 631
              _level->liftHighestActive(new_level + 1);
625 632
            } else {
626 633
              _level->liftHighestActiveToTop();
627 634
            }
628 635
            if (_level->emptyLevel(level)) {
629 636
              _level->liftToTop(level);
630 637
            }
631 638
          } else {
632 639
            _level->deactivate(n);
633 640
          }
634 641

	
635 642
          n = _level->highestActive();
636 643
          level = _level->highestActiveLevel();
637 644
          --num;
638 645
        }
639 646

	
640 647
        num = _node_num * 20;
641 648
        while (num > 0 && n != INVALID) {
642 649
          Value excess = (*_excess)[n];
643 650
          int new_level = _level->maxLevel();
644 651

	
645 652
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
646 653
            Value rem = (*_capacity)[e] - (*_flow)[e];
647 654
            if (!_tolerance.positive(rem)) continue;
648 655
            Node v = _graph.target(e);
649 656
            if ((*_level)[v] < level) {
650 657
              if (!_level->active(v) && v != _target) {
651 658
                _level->activate(v);
652 659
              }
653 660
              if (!_tolerance.less(rem, excess)) {
654 661
                _flow->set(e, (*_flow)[e] + excess);
655 662
                (*_excess)[v] += excess;
656 663
                excess = 0;
657 664
                goto no_more_push_2;
658 665
              } else {
659 666
                excess -= rem;
660 667
                (*_excess)[v] += rem;
661 668
                _flow->set(e, (*_capacity)[e]);
662 669
              }
663 670
            } else if (new_level > (*_level)[v]) {
664 671
              new_level = (*_level)[v];
665 672
            }
666 673
          }
667 674

	
668 675
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
669 676
            Value rem = (*_flow)[e];
670 677
            if (!_tolerance.positive(rem)) continue;
671 678
            Node v = _graph.source(e);
672 679
            if ((*_level)[v] < level) {
673 680
              if (!_level->active(v) && v != _target) {
674 681
                _level->activate(v);
675 682
              }
676 683
              if (!_tolerance.less(rem, excess)) {
677 684
                _flow->set(e, (*_flow)[e] - excess);
678 685
                (*_excess)[v] += excess;
679 686
                excess = 0;
680 687
                goto no_more_push_2;
681 688
              } else {
682 689
                excess -= rem;
683 690
                (*_excess)[v] += rem;
684 691
                _flow->set(e, 0);
685 692
              }
686 693
            } else if (new_level > (*_level)[v]) {
687 694
              new_level = (*_level)[v];
688 695
            }
689 696
          }
690 697

	
691 698
        no_more_push_2:
692 699

	
693 700
          (*_excess)[n] = excess;
694 701

	
695 702
          if (excess != 0) {
696 703
            if (new_level + 1 < _level->maxLevel()) {
697 704
              _level->liftActiveOn(level, new_level + 1);
698 705
            } else {
699 706
              _level->liftActiveToTop(level);
700 707
            }
701 708
            if (_level->emptyLevel(level)) {
702 709
              _level->liftToTop(level);
703 710
            }
704 711
          } else {
705 712
            _level->deactivate(n);
706 713
          }
707 714

	
708 715
          while (level >= 0 && _level->activeFree(level)) {
709 716
            --level;
710 717
          }
711 718
          if (level == -1) {
712 719
            n = _level->highestActive();
713 720
            level = _level->highestActiveLevel();
714 721
          } else {
715 722
            n = _level->activeOn(level);
716 723
          }
717 724
          --num;
718 725
        }
719 726
      }
720 727
    }
721 728

	
722 729
    /// \brief Starts the second phase of the preflow algorithm.
723 730
    ///
724 731
    /// The preflow algorithm consists of two phases, this method runs
725 732
    /// the second phase. After calling one of the \ref init() functions
726 733
    /// and \ref startFirstPhase() and then \ref startSecondPhase(),
727 734
    /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
728 735
    /// value of a maximum flow, \ref minCut() returns a minimum cut
729 736
    /// \pre One of the \ref init() functions and \ref startFirstPhase()
730 737
    /// must be called before using this function.
731 738
    void startSecondPhase() {
732 739
      _phase = false;
733 740

	
734 741
      typename Digraph::template NodeMap<bool> reached(_graph);
735 742
      for (NodeIt n(_graph); n != INVALID; ++n) {
736 743
        reached[n] = (*_level)[n] < _level->maxLevel();
737 744
      }
738 745

	
739 746
      _level->initStart();
740 747
      _level->initAddItem(_source);
741 748

	
742 749
      std::vector<Node> queue;
743 750
      queue.push_back(_source);
744 751
      reached[_source] = true;
745 752

	
746 753
      while (!queue.empty()) {
747 754
        _level->initNewLevel();
748 755
        std::vector<Node> nqueue;
749 756
        for (int i = 0; i < int(queue.size()); ++i) {
750 757
          Node n = queue[i];
751 758
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
752 759
            Node v = _graph.target(e);
753 760
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
754 761
              reached[v] = true;
755 762
              _level->initAddItem(v);
756 763
              nqueue.push_back(v);
757 764
            }
758 765
          }
759 766
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
760 767
            Node u = _graph.source(e);
761 768
            if (!reached[u] &&
762 769
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
763 770
              reached[u] = true;
764 771
              _level->initAddItem(u);
765 772
              nqueue.push_back(u);
766 773
            }
767 774
          }
768 775
        }
769 776
        queue.swap(nqueue);
770 777
      }
771 778
      _level->initFinish();
772 779

	
773 780
      for (NodeIt n(_graph); n != INVALID; ++n) {
774 781
        if (!reached[n]) {
775 782
          _level->dirtyTopButOne(n);
776 783
        } else if ((*_excess)[n] > 0 && _target != n) {
777 784
          _level->activate(n);
778 785
        }
779 786
      }
780 787

	
781 788
      Node n;
782 789
      while ((n = _level->highestActive()) != INVALID) {
783 790
        Value excess = (*_excess)[n];
784 791
        int level = _level->highestActiveLevel();
785 792
        int new_level = _level->maxLevel();
786 793

	
787 794
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
788 795
          Value rem = (*_capacity)[e] - (*_flow)[e];
789 796
          if (!_tolerance.positive(rem)) continue;
790 797
          Node v = _graph.target(e);
791 798
          if ((*_level)[v] < level) {
792 799
            if (!_level->active(v) && v != _source) {
793 800
              _level->activate(v);
794 801
            }
795 802
            if (!_tolerance.less(rem, excess)) {
796 803
              _flow->set(e, (*_flow)[e] + excess);
797 804
              (*_excess)[v] += excess;
798 805
              excess = 0;
799 806
              goto no_more_push;
800 807
            } else {
801 808
              excess -= rem;
802 809
              (*_excess)[v] += rem;
803 810
              _flow->set(e, (*_capacity)[e]);
804 811
            }
805 812
          } else if (new_level > (*_level)[v]) {
806 813
            new_level = (*_level)[v];
807 814
          }
808 815
        }
809 816

	
810 817
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
811 818
          Value rem = (*_flow)[e];
812 819
          if (!_tolerance.positive(rem)) continue;
813 820
          Node v = _graph.source(e);
814 821
          if ((*_level)[v] < level) {
815 822
            if (!_level->active(v) && v != _source) {
816 823
              _level->activate(v);
817 824
            }
818 825
            if (!_tolerance.less(rem, excess)) {
819 826
              _flow->set(e, (*_flow)[e] - excess);
820 827
              (*_excess)[v] += excess;
821 828
              excess = 0;
822 829
              goto no_more_push;
823 830
            } else {
824 831
              excess -= rem;
825 832
              (*_excess)[v] += rem;
826 833
              _flow->set(e, 0);
827 834
            }
828 835
          } else if (new_level > (*_level)[v]) {
829 836
            new_level = (*_level)[v];
830 837
          }
831 838
        }
832 839

	
833 840
      no_more_push:
834 841

	
835 842
        (*_excess)[n] = excess;
836 843

	
837 844
        if (excess != 0) {
838 845
          if (new_level + 1 < _level->maxLevel()) {
839 846
            _level->liftHighestActive(new_level + 1);
840 847
          } else {
841 848
            // Calculation error
842 849
            _level->liftHighestActiveToTop();
843 850
          }
844 851
          if (_level->emptyLevel(level)) {
845 852
            // Calculation error
846 853
            _level->liftToTop(level);
847 854
          }
848 855
        } else {
849 856
          _level->deactivate(n);
850 857
        }
851 858

	
852 859
      }
853 860
    }
854 861

	
855 862
    /// \brief Runs the preflow algorithm.
856 863
    ///
857 864
    /// Runs the preflow algorithm.
858 865
    /// \note pf.run() is just a shortcut of the following code.
859 866
    /// \code
860 867
    ///   pf.init();
861 868
    ///   pf.startFirstPhase();
862 869
    ///   pf.startSecondPhase();
863 870
    /// \endcode
864 871
    void run() {
865 872
      init();
866 873
      startFirstPhase();
867 874
      startSecondPhase();
868 875
    }
869 876

	
870 877
    /// \brief Runs the preflow algorithm to compute the minimum cut.
871 878
    ///
872 879
    /// Runs the preflow algorithm to compute the minimum cut.
873 880
    /// \note pf.runMinCut() is just a shortcut of the following code.
874 881
    /// \code
875 882
    ///   pf.init();
876 883
    ///   pf.startFirstPhase();
877 884
    /// \endcode
878 885
    void runMinCut() {
879 886
      init();
880 887
      startFirstPhase();
881 888
    }
882 889

	
883 890
    /// @}
884 891

	
885 892
    /// \name Query Functions
886 893
    /// The results of the preflow algorithm can be obtained using these
887 894
    /// functions.\n
888 895
    /// Either one of the \ref run() "run*()" functions or one of the
889 896
    /// \ref startFirstPhase() "start*()" functions should be called
890 897
    /// before using them.
891 898

	
892 899
    ///@{
893 900

	
894 901
    /// \brief Returns the value of the maximum flow.
895 902
    ///
896 903
    /// Returns the value of the maximum flow by returning the excess
897 904
    /// of the target node. This value equals to the value of
898 905
    /// the maximum flow already after the first phase of the algorithm.
899 906
    ///
900 907
    /// \pre Either \ref run() or \ref init() must be called before
901 908
    /// using this function.
902 909
    Value flowValue() const {
903 910
      return (*_excess)[_target];
904 911
    }
905 912

	
906 913
    /// \brief Returns the flow value on the given arc.
907 914
    ///
908 915
    /// Returns the flow value on the given arc. This method can
909 916
    /// be called after the second phase of the algorithm.
910 917
    ///
911 918
    /// \pre Either \ref run() or \ref init() must be called before
912 919
    /// using this function.
913 920
    Value flow(const Arc& arc) const {
914 921
      return (*_flow)[arc];
915 922
    }
916 923

	
917 924
    /// \brief Returns a const reference to the flow map.
918 925
    ///
919 926
    /// Returns a const reference to the arc map storing the found flow.
920 927
    /// This method can be called after the second phase of the algorithm.
921 928
    ///
922 929
    /// \pre Either \ref run() or \ref init() must be called before
923 930
    /// using this function.
924 931
    const FlowMap& flowMap() const {
925 932
      return *_flow;
926 933
    }
927 934

	
928 935
    /// \brief Returns \c true when the node is on the source side of the
929 936
    /// minimum cut.
930 937
    ///
931 938
    /// Returns true when the node is on the source side of the found
932 939
    /// minimum cut. This method can be called both after running \ref
933 940
    /// startFirstPhase() and \ref startSecondPhase().
934 941
    ///
935 942
    /// \pre Either \ref run() or \ref init() must be called before
936 943
    /// using this function.
937 944
    bool minCut(const Node& node) const {
938 945
      return ((*_level)[node] == _level->maxLevel()) == _phase;
939 946
    }
940 947

	
941 948
    /// \brief Gives back a minimum value cut.
942 949
    ///
943 950
    /// Sets \c cutMap to the characteristic vector of a minimum value
944 951
    /// cut. \c cutMap should be a \ref concepts::WriteMap "writable"
945 952
    /// node map with \c bool (or convertible) value type.
946 953
    ///
947 954
    /// This method can be called both after running \ref startFirstPhase()
948 955
    /// and \ref startSecondPhase(). The result after the second phase
949 956
    /// could be slightly different if inexact computation is used.
950 957
    ///
951 958
    /// \note This function calls \ref minCut() for each node, so it runs in
952 959
    /// O(n) time.
953 960
    ///
954 961
    /// \pre Either \ref run() or \ref init() must be called before
955 962
    /// using this function.
956 963
    template <typename CutMap>
957 964
    void minCutMap(CutMap& cutMap) const {
958 965
      for (NodeIt n(_graph); n != INVALID; ++n) {
959 966
        cutMap.set(n, minCut(n));
960 967
      }
961 968
    }
962 969

	
963 970
    /// @}
964 971
  };
965 972
}
966 973

	
967 974
#endif
Ignore white space 50331648 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
25 26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
26 29

	
27 30
#include "test_tools.h"
28 31

	
29 32
using namespace lemon;
30 33
using namespace lemon::concepts;
31 34

	
32 35
struct A {};
33 36
inline bool operator<(A, A) { return true; }
34 37
struct B {};
35 38

	
36 39
class C {
37 40
  int x;
38 41
public:
39 42
  C(int _x) : x(_x) {}
40 43
};
41 44

	
42 45
class F {
43 46
public:
44 47
  typedef A argument_type;
45 48
  typedef B result_type;
46 49

	
47 50
  B operator()(const A&) const { return B(); }
48 51
private:
49 52
  F& operator=(const F&);
50 53
};
51 54

	
52 55
int func(A) { return 3; }
53 56

	
54 57
int binc(int a, B) { return a+1; }
55 58

	
56 59
typedef ReadMap<A, double> DoubleMap;
57 60
typedef ReadWriteMap<A, double> DoubleWriteMap;
58 61
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
59 62

	
60 63
typedef ReadMap<A, bool> BoolMap;
61 64
typedef ReadWriteMap<A, bool> BoolWriteMap;
62 65
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
63 66

	
67
template<typename Map1, typename Map2, typename ItemIt>
68
void compareMap(const Map1& map1, const Map2& map2, ItemIt it) {
69
  for (; it != INVALID; ++it)
70
    check(map1[it] == map2[it], "The maps are not equal");
71
}
72

	
64 73
int main()
65 74
{
66 75
  // Map concepts
67 76
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
68 77
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
69 78
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
70 79
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
71 80
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
72 81
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
73 82
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
74 83
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
75 84

	
76 85
  // NullMap
77 86
  {
78 87
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
79 88
    NullMap<A,B> map1;
80 89
    NullMap<A,B> map2 = map1;
81 90
    map1 = nullMap<A,B>();
82 91
  }
83 92

	
84 93
  // ConstMap
85 94
  {
86 95
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
87 96
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
88 97
    ConstMap<A,B> map1;
89 98
    ConstMap<A,B> map2 = B();
90 99
    ConstMap<A,B> map3 = map1;
91 100
    map1 = constMap<A>(B());
92 101
    map1 = constMap<A,B>();
93 102
    map1.setAll(B());
94 103
    ConstMap<A,C> map4(C(1));
95 104
    ConstMap<A,C> map5 = map4;
96 105
    map4 = constMap<A>(C(2));
97 106
    map4.setAll(C(3));
98 107

	
99 108
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
100 109
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
101 110

	
102 111
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
103 112
    ConstMap<A,Const<int,10> > map6;
104 113
    ConstMap<A,Const<int,10> > map7 = map6;
105 114
    map6 = constMap<A,int,10>();
106 115
    map7 = constMap<A,Const<int,10> >();
107 116
    check(map6[A()] == 10 && map7[A()] == 10,
108 117
          "Something is wrong with ConstMap");
109 118
  }
110 119

	
111 120
  // IdentityMap
112 121
  {
113 122
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
114 123
    IdentityMap<A> map1;
115 124
    IdentityMap<A> map2 = map1;
116 125
    map1 = identityMap<A>();
117 126

	
118 127
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
119 128
    check(identityMap<double>()[1.0] == 1.0 &&
120 129
          identityMap<double>()[3.14] == 3.14,
121 130
          "Something is wrong with IdentityMap");
122 131
  }
123 132

	
124 133
  // RangeMap
125 134
  {
126 135
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
127 136
    RangeMap<B> map1;
128 137
    RangeMap<B> map2(10);
129 138
    RangeMap<B> map3(10,B());
130 139
    RangeMap<B> map4 = map1;
131 140
    RangeMap<B> map5 = rangeMap<B>();
132 141
    RangeMap<B> map6 = rangeMap<B>(10);
133 142
    RangeMap<B> map7 = rangeMap(10,B());
134 143

	
135 144
    checkConcept< ReferenceMap<int, double, double&, const double&>,
136 145
                  RangeMap<double> >();
137 146
    std::vector<double> v(10, 0);
138 147
    v[5] = 100;
139 148
    RangeMap<double> map8(v);
140 149
    RangeMap<double> map9 = rangeMap(v);
141 150
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
142 151
          "Something is wrong with RangeMap");
143 152
  }
144 153

	
145 154
  // SparseMap
146 155
  {
147 156
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
148 157
    SparseMap<A,B> map1;
149 158
    SparseMap<A,B> map2 = B();
150 159
    SparseMap<A,B> map3 = sparseMap<A,B>();
151 160
    SparseMap<A,B> map4 = sparseMap<A>(B());
152 161

	
153 162
    checkConcept< ReferenceMap<double, int, int&, const int&>,
154 163
                  SparseMap<double, int> >();
155 164
    std::map<double, int> m;
156 165
    SparseMap<double, int> map5(m);
157 166
    SparseMap<double, int> map6(m,10);
158 167
    SparseMap<double, int> map7 = sparseMap(m);
159 168
    SparseMap<double, int> map8 = sparseMap(m,10);
160 169

	
161 170
    check(map5[1.0] == 0 && map5[3.14] == 0 &&
162 171
          map6[1.0] == 10 && map6[3.14] == 10,
163 172
          "Something is wrong with SparseMap");
164 173
    map5[1.0] = map6[3.14] = 100;
165 174
    check(map5[1.0] == 100 && map5[3.14] == 0 &&
166 175
          map6[1.0] == 10 && map6[3.14] == 100,
167 176
          "Something is wrong with SparseMap");
168 177
  }
169 178

	
170 179
  // ComposeMap
171 180
  {
172 181
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
173 182
    checkConcept<ReadMap<B,double>, CompMap>();
174 183
    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
175 184
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
176 185

	
177 186
    SparseMap<double, bool> m1(false); m1[3.14] = true;
178 187
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
179 188
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1],
180 189
          "Something is wrong with ComposeMap")
181 190
  }
182 191

	
183 192
  // CombineMap
184 193
  {
185 194
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
186 195
    checkConcept<ReadMap<A,double>, CombMap>();
187 196
    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
188 197
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
189 198

	
190 199
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
191 200
          "Something is wrong with CombineMap");
192 201
  }
193 202

	
194 203
  // FunctorToMap, MapToFunctor
195 204
  {
196 205
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
197 206
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
198 207
    FunctorToMap<F> map1;
199 208
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
200 209
    B b = functorToMap(F())[A()];
201 210

	
202 211
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
203 212
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
204 213

	
205 214
    check(functorToMap(&func)[A()] == 3,
206 215
          "Something is wrong with FunctorToMap");
207 216
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
208 217
          "Something is wrong with MapToFunctor");
209 218
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
210 219
          mapToFunctor(functorToMap(&func))[A()] == 3,
211 220
          "Something is wrong with FunctorToMap or MapToFunctor");
212 221
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
213 222
          "Something is wrong with FunctorToMap or MapToFunctor");
214 223
  }
215 224

	
216 225
  // ConvertMap
217 226
  {
218 227
    checkConcept<ReadMap<double,double>,
219 228
      ConvertMap<ReadMap<double, int>, double> >();
220 229
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
221 230
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
222 231
  }
223 232

	
224 233
  // ForkMap
225 234
  {
226 235
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
227 236

	
228 237
    typedef RangeMap<double> RM;
229 238
    typedef SparseMap<int, double> SM;
230 239
    RM m1(10, -1);
231 240
    SM m2(-1);
232 241
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
233 242
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
234 243
    ForkMap<RM, SM> map1(m1,m2);
235 244
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
236 245
    map2.set(5, 10);
237 246
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 &&
238 247
          m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
239 248
          "Something is wrong with ForkMap");
240 249
  }
241 250

	
242 251
  // Arithmetic maps:
243 252
  // - AddMap, SubMap, MulMap, DivMap
244 253
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
245 254
  // - NegMap, NegWriteMap, AbsMap
246 255
  {
247 256
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
248 257
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
249 258
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
250 259
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
251 260

	
252 261
    ConstMap<int, double> c1(1.0), c2(3.14);
253 262
    IdentityMap<int> im;
254 263
    ConvertMap<IdentityMap<int>, double> id(im);
255 264
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0,
256 265
          "Something is wrong with AddMap");
257 266
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,
258 267
          "Something is wrong with SubMap");
259 268
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28,
260 269
          "Something is wrong with MulMap");
261 270
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57,
262 271
          "Something is wrong with DivMap");
263 272

	
264 273
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
265 274
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
266 275
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
267 276
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
268 277
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
269 278
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
270 279
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
271 280

	
272 281
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
273 282
          "Something is wrong with ShiftMap");
274 283
    check(shiftWriteMap(id, 2.0)[1] == 3.0 &&
275 284
          shiftWriteMap(id, 2.0)[10] == 12.0,
276 285
          "Something is wrong with ShiftWriteMap");
277 286
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
278 287
          "Something is wrong with ScaleMap");
279 288
    check(scaleWriteMap(id, 2.0)[1] == 2.0 &&
280 289
          scaleWriteMap(id, 2.0)[10] == 20.0,
281 290
          "Something is wrong with ScaleWriteMap");
282 291
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
283 292
          "Something is wrong with NegMap");
284 293
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
285 294
          "Something is wrong with NegWriteMap");
286 295
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
287 296
          "Something is wrong with AbsMap");
288 297
  }
289 298

	
290 299
  // Logical maps:
291 300
  // - TrueMap, FalseMap
292 301
  // - AndMap, OrMap
293 302
  // - NotMap, NotWriteMap
294 303
  // - EqualMap, LessMap
295 304
  {
296 305
    checkConcept<BoolMap, TrueMap<A> >();
297 306
    checkConcept<BoolMap, FalseMap<A> >();
298 307
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
299 308
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
300 309
    checkConcept<BoolMap, NotMap<BoolMap> >();
301 310
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
302 311
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
303 312
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
304 313

	
305 314
    TrueMap<int> tm;
306 315
    FalseMap<int> fm;
307 316
    RangeMap<bool> rm(2);
308 317
    rm[0] = true; rm[1] = false;
309 318
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
310 319
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
311 320
          "Something is wrong with AndMap");
312 321
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
313 322
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
314 323
          "Something is wrong with OrMap");
315 324
    check(!notMap(rm)[0] && notMap(rm)[1],
316 325
          "Something is wrong with NotMap");
317 326
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
318 327
          "Something is wrong with NotWriteMap");
319 328

	
320 329
    ConstMap<int, double> cm(2.0);
321 330
    IdentityMap<int> im;
322 331
    ConvertMap<IdentityMap<int>, double> id(im);
323 332
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
324 333
          "Something is wrong with LessMap");
325 334
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
326 335
          "Something is wrong with EqualMap");
327 336
  }
328 337

	
329 338
  // LoggerBoolMap
330 339
  {
331 340
    typedef std::vector<int> vec;
341
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
342
    checkConcept<WriteMap<int, bool>,
343
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
344

	
332 345
    vec v1;
333 346
    vec v2(10);
334 347
    LoggerBoolMap<std::back_insert_iterator<vec> >
335 348
      map1(std::back_inserter(v1));
336 349
    LoggerBoolMap<vec::iterator> map2(v2.begin());
337 350
    map1.set(10, false);
338 351
    map1.set(20, true);   map2.set(20, true);
339 352
    map1.set(30, false);  map2.set(40, false);
340 353
    map1.set(50, true);   map2.set(50, true);
341 354
    map1.set(60, true);   map2.set(60, true);
342 355
    check(v1.size() == 3 && v2.size() == 10 &&
343 356
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
344 357
          v2[0]==20 && v2[1]==50 && v2[2]==60,
345 358
          "Something is wrong with LoggerBoolMap");
346 359

	
347 360
    int i = 0;
348 361
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
349 362
          it != map2.end(); ++it )
350 363
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
364
    
365
    typedef ListDigraph Graph;
366
    DIGRAPH_TYPEDEFS(Graph);
367
    Graph gr;
368

	
369
    Node n0 = gr.addNode();
370
    Node n1 = gr.addNode();
371
    Node n2 = gr.addNode();
372
    Node n3 = gr.addNode();
373
    
374
    gr.addArc(n3, n0);
375
    gr.addArc(n3, n2);
376
    gr.addArc(n0, n2);
377
    gr.addArc(n2, n1);
378
    gr.addArc(n0, n1);
379
    
380
    {
381
      std::vector<Node> v;
382
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
383

	
384
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
385
            "Something is wrong with LoggerBoolMap");
386
    }
387
    {
388
      std::vector<Node> v(countNodes(gr));
389
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
390
      
391
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
392
            "Something is wrong with LoggerBoolMap");
393
    }
394
  }
395
  
396
  // IdMap, RangeIdMap
397
  {
398
    typedef ListDigraph Graph;
399
    DIGRAPH_TYPEDEFS(Graph);
400

	
401
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
402
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
403
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
404
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
405
    
406
    Graph gr;
407
    IdMap<Graph, Node> nmap(gr);
408
    IdMap<Graph, Arc> amap(gr);
409
    RangeIdMap<Graph, Node> nrmap(gr);
410
    RangeIdMap<Graph, Arc> armap(gr);
411
    
412
    Node n0 = gr.addNode();
413
    Node n1 = gr.addNode();
414
    Node n2 = gr.addNode();
415
    
416
    Arc a0 = gr.addArc(n0, n1);
417
    Arc a1 = gr.addArc(n0, n2);
418
    Arc a2 = gr.addArc(n2, n1);
419
    Arc a3 = gr.addArc(n2, n0);
420
    
421
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
422
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
423
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
424

	
425
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
426
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
427
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
428
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
429

	
430
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
431
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
432
    
433
    check(nrmap.size() == 3 && armap.size() == 4,
434
          "Wrong RangeIdMap::size()");
435

	
436
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
437
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
438
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
439
    
440
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
441
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
442
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
443
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
444

	
445
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
446
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
447
    
448
    gr.erase(n1);
449
    
450
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
451
    nrmap.swap(n2, n0);
452
    if (armap[a1] == 1) armap.swap(a1, a3);
453
    armap.swap(a3, a1);
454
    
455
    check(nrmap.size() == 2 && armap.size() == 2,
456
          "Wrong RangeIdMap::size()");
457

	
458
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
459
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
460
    
461
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
462
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
463

	
464
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
465
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
466
  }
467
  
468
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
469
  {
470
    typedef ListGraph Graph;
471
    GRAPH_TYPEDEFS(Graph);
472
    
473
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
474
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
475
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
476
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
477
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
478
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
479

	
480
    Graph gr;
481
    Node n0 = gr.addNode();
482
    Node n1 = gr.addNode();
483
    Node n2 = gr.addNode();
484
    
485
    gr.addEdge(n0,n1);
486
    gr.addEdge(n1,n2);
487
    gr.addEdge(n0,n2);
488
    gr.addEdge(n2,n1);
489
    gr.addEdge(n1,n2);
490
    gr.addEdge(n0,n1);
491
    
492
    for (EdgeIt e(gr); e != INVALID; ++e) {
493
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
494
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
495
    }
496
    
497
    compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
498
               targetMap(orienter(gr, constMap<Edge, bool>(false))),
499
               EdgeIt(gr));
500

	
501
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
502
    Digraph dgr(gr, constMap<Edge, bool>(true));
503
    OutDegMap<Digraph> odm(dgr);
504
    InDegMap<Digraph> idm(dgr);
505
    
506
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
507
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
508
   
509
    gr.addEdge(n2, n0);
510

	
511
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
512
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
513
  }
514
  
515
  // CrossRefMap
516
  {
517
    typedef ListDigraph Graph;
518
    DIGRAPH_TYPEDEFS(Graph);
519

	
520
    checkConcept<ReadWriteMap<Node, int>,
521
                 CrossRefMap<Graph, Node, int> >();
522
    checkConcept<ReadWriteMap<Node, bool>,
523
                 CrossRefMap<Graph, Node, bool> >();
524
    checkConcept<ReadWriteMap<Node, double>,
525
                 CrossRefMap<Graph, Node, double> >();
526
    
527
    Graph gr;
528
    typedef CrossRefMap<Graph, Node, char> CRMap;
529
    CRMap map(gr);
530
    
531
    Node n0 = gr.addNode();
532
    Node n1 = gr.addNode();
533
    Node n2 = gr.addNode();
534
    
535
    map.set(n0, 'A');
536
    map.set(n1, 'B');
537
    map.set(n2, 'C');
538
    
539
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
540
          "Wrong CrossRefMap");
541
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
542
          "Wrong CrossRefMap");
543
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
544
          "Wrong CrossRefMap");
545
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
546
          "Wrong CrossRefMap::count()");
547
    
548
    CRMap::ValueIt it = map.beginValue();
549
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
550
          it == map.endValue(), "Wrong value iterator");
551
    
552
    map.set(n2, 'A');
553

	
554
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
555
          "Wrong CrossRefMap");
556
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
557
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
558
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
559
          "Wrong CrossRefMap");
560
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
561
          "Wrong CrossRefMap::count()");
562

	
563
    it = map.beginValue();
564
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
565
          it == map.endValue(), "Wrong value iterator");
566

	
567
    map.set(n0, 'C');
568

	
569
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
570
          "Wrong CrossRefMap");
571
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
572
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
573
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
574
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
575
          "Wrong CrossRefMap::count()");
576

	
577
    it = map.beginValue();
578
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
579
          it == map.endValue(), "Wrong value iterator");
351 580
  }
352 581

	
353 582
  // CrossRefMap
354 583
  {
355 584
    typedef SmartDigraph Graph;
356 585
    DIGRAPH_TYPEDEFS(Graph);
357 586

	
358 587
    checkConcept<ReadWriteMap<Node, int>,
359 588
                 CrossRefMap<Graph, Node, int> >();
360 589
    
361 590
    Graph gr;
362 591
    typedef CrossRefMap<Graph, Node, char> CRMap;
363 592
    typedef CRMap::ValueIterator ValueIt;
364 593
    CRMap map(gr);
365 594
    
366 595
    Node n0 = gr.addNode();
367 596
    Node n1 = gr.addNode();
368 597
    Node n2 = gr.addNode();
369 598
    
370 599
    map.set(n0, 'A');
371 600
    map.set(n1, 'B');
372 601
    map.set(n2, 'C');
373 602
    map.set(n2, 'A');
374 603
    map.set(n0, 'C');
375 604

	
376 605
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
377 606
          "Wrong CrossRefMap");
378 607
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
379 608
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
380 609
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
381 610

	
382 611
    ValueIt it = map.beginValue();
383 612
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 613
          it == map.endValue(), "Wrong value iterator");
385 614
  }
386 615
  
387 616
  // Iterable bool map
388 617
  {
389 618
    typedef SmartGraph Graph;
390 619
    typedef SmartGraph::Node Item;
391 620

	
392 621
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
393 622
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
394 623

	
395 624
    const int num = 10;
396 625
    Graph g;
397 626
    std::vector<Item> items;
398 627
    for (int i = 0; i < num; ++i) {
399 628
      items.push_back(g.addNode());
400 629
    }
401 630

	
402 631
    Ibm map1(g, true);
403 632
    int n = 0;
404 633
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
405 634
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
406 635
      ++n;
407 636
    }
408 637
    check(n == num, "Wrong number");
409 638

	
410 639
    n = 0;
411 640
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
412 641
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
413 642
        ++n;
414 643
    }
415 644
    check(n == num, "Wrong number");
416 645
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
417 646
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
418 647

	
419 648
    map1[items[5]] = true;
420 649

	
421 650
    n = 0;
422 651
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
423 652
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
424 653
        ++n;
425 654
    }
426 655
    check(n == num, "Wrong number");
427 656

	
428 657
    map1[items[num / 2]] = false;
429 658
    check(map1[items[num / 2]] == false, "Wrong map value");
430 659

	
431 660
    n = 0;
432 661
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
433 662
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
434 663
        ++n;
435 664
    }
436 665
    check(n == num - 1, "Wrong number");
437 666

	
438 667
    n = 0;
439 668
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
440 669
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
441 670
        ++n;
442 671
    }
443 672
    check(n == 1, "Wrong number");
444 673

	
445 674
    map1[items[0]] = false;
446 675
    check(map1[items[0]] == false, "Wrong map value");
447 676

	
448 677
    map1[items[num - 1]] = false;
449 678
    check(map1[items[num - 1]] == false, "Wrong map value");
450 679

	
451 680
    n = 0;
452 681
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
453 682
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
454 683
        ++n;
455 684
    }
456 685
    check(n == num - 3, "Wrong number");
457 686
    check(map1.trueNum() == num - 3, "Wrong number");
458 687

	
459 688
    n = 0;
460 689
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
461 690
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
462 691
        ++n;
463 692
    }
464 693
    check(n == 3, "Wrong number");
465 694
    check(map1.falseNum() == 3, "Wrong number");
466 695
  }
467 696

	
468 697
  // Iterable int map
469 698
  {
470 699
    typedef SmartGraph Graph;
471 700
    typedef SmartGraph::Node Item;
472 701
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
473 702

	
474 703
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
475 704

	
476 705
    const int num = 10;
477 706
    Graph g;
478 707
    std::vector<Item> items;
479 708
    for (int i = 0; i < num; ++i) {
480 709
      items.push_back(g.addNode());
481 710
    }
482 711

	
483 712
    Iim map1(g);
484 713
    check(map1.size() == 0, "Wrong size");
485 714

	
486 715
    for (int i = 0; i < num; ++i) {
487 716
      map1[items[i]] = i;
488 717
    }
489 718
    check(map1.size() == num, "Wrong size");
490 719

	
491 720
    for (int i = 0; i < num; ++i) {
492 721
      Iim::ItemIt it(map1, i);
493 722
      check(static_cast<Item>(it) == items[i], "Wrong value");
494 723
      ++it;
495 724
      check(static_cast<Item>(it) == INVALID, "Wrong value");
496 725
    }
497 726

	
498 727
    for (int i = 0; i < num; ++i) {
499 728
      map1[items[i]] = i % 2;
500 729
    }
501 730
    check(map1.size() == 2, "Wrong size");
502 731

	
503 732
    int n = 0;
504 733
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
505 734
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
506 735
      ++n;
507 736
    }
508 737
    check(n == (num + 1) / 2, "Wrong number");
509 738

	
510 739
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
511 740
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
512 741
      ++n;
513 742
    }
514 743
    check(n == num, "Wrong number");
515 744

	
516 745
  }
517 746

	
518 747
  // Iterable value map
519 748
  {
520 749
    typedef SmartGraph Graph;
521 750
    typedef SmartGraph::Node Item;
522 751
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
523 752

	
524 753
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
525 754

	
526 755
    const int num = 10;
527 756
    Graph g;
528 757
    std::vector<Item> items;
529 758
    for (int i = 0; i < num; ++i) {
530 759
      items.push_back(g.addNode());
531 760
    }
532 761

	
533 762
    Ivm map1(g, 0.0);
534 763
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
535 764
    check(*map1.beginValue() == 0.0, "Wrong value");
536 765

	
537 766
    for (int i = 0; i < num; ++i) {
538 767
      map1.set(items[i], static_cast<double>(i));
539 768
    }
540 769
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
541 770

	
542 771
    for (int i = 0; i < num; ++i) {
543 772
      Ivm::ItemIt it(map1, static_cast<double>(i));
544 773
      check(static_cast<Item>(it) == items[i], "Wrong value");
545 774
      ++it;
546 775
      check(static_cast<Item>(it) == INVALID, "Wrong value");
547 776
    }
548 777

	
549
    for (Ivm::ValueIterator vit = map1.beginValue();
778
    for (Ivm::ValueIt vit = map1.beginValue();
550 779
         vit != map1.endValue(); ++vit) {
551 780
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
552
            "Wrong ValueIterator");
781
            "Wrong ValueIt");
553 782
    }
554 783

	
555 784
    for (int i = 0; i < num; ++i) {
556 785
      map1.set(items[i], static_cast<double>(i % 2));
557 786
    }
558 787
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
559 788

	
560 789
    int n = 0;
561 790
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
562 791
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
563 792
      ++n;
564 793
    }
565 794
    check(n == (num + 1) / 2, "Wrong number");
566 795

	
567 796
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
568 797
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
569 798
      ++n;
570 799
    }
571 800
    check(n == num, "Wrong number");
572 801

	
573 802
  }
574 803
  return 0;
575 804
}
0 comments (0 inline)