gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small doc improvements
0 8 0
default
8 files changed with 42 insertions and 28 deletions:
↑ Collapse diff ↑
Ignore white space 384 line context
... ...
@@ -186,409 +186,409 @@
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 matrices Matrices
230 230
@ingroup datas
231 231
\brief Two dimensional data storages implemented in LEMON.
232 232

	
233 233
This group contains two dimensional data storages implemented in LEMON.
234 234
*/
235 235

	
236 236
/**
237 237
@defgroup paths Path Structures
238 238
@ingroup datas
239 239
\brief %Path structures implemented in LEMON.
240 240

	
241 241
This group contains the path structures implemented in LEMON.
242 242

	
243 243
LEMON provides flexible data structures to work with paths.
244 244
All of them have similar interfaces and they can be copied easily with
245 245
assignment operators and copy constructors. This makes it easy and
246 246
efficient to have e.g. the Dijkstra algorithm to store its result in
247 247
any kind of path structure.
248 248

	
249 249
\sa lemon::concepts::Path
250 250
*/
251 251

	
252 252
/**
253 253
@defgroup auxdat Auxiliary Data Structures
254 254
@ingroup datas
255 255
\brief Auxiliary data structures implemented in LEMON.
256 256

	
257 257
This group contains some data structures implemented in LEMON in
258 258
order to make it easier to implement combinatorial algorithms.
259 259
*/
260 260

	
261 261
/**
262 262
@defgroup algs Algorithms
263 263
\brief This group contains the several algorithms
264 264
implemented in LEMON.
265 265

	
266 266
This group contains the several algorithms
267 267
implemented in LEMON.
268 268
*/
269 269

	
270 270
/**
271 271
@defgroup search Graph Search
272 272
@ingroup algs
273 273
\brief Common graph search algorithms.
274 274

	
275 275
This group contains the common graph search algorithms, namely
276 276
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
277 277
*/
278 278

	
279 279
/**
280 280
@defgroup shortest_path Shortest Path Algorithms
281 281
@ingroup algs
282 282
\brief Algorithms for finding shortest paths.
283 283

	
284 284
This group contains the algorithms for finding shortest paths in digraphs.
285 285

	
286 286
 - \ref Dijkstra algorithm for finding shortest paths from a source node
287 287
   when all arc lengths are non-negative.
288 288
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
289 289
   from a source node when arc lenghts can be either positive or negative,
290 290
   but the digraph should not contain directed cycles with negative total
291 291
   length.
292 292
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
293 293
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
294 294
   lenghts can be either positive or negative, but the digraph should
295 295
   not contain directed cycles with negative total length.
296 296
 - \ref Suurballe A successive shortest path algorithm for finding
297 297
   arc-disjoint paths between two nodes having minimum total length.
298 298
*/
299 299

	
300 300
/**
301 301
@defgroup max_flow Maximum Flow Algorithms
302 302
@ingroup algs
303 303
\brief Algorithms for finding maximum flows.
304 304

	
305 305
This group contains the algorithms for finding maximum flows and
306 306
feasible circulations.
307 307

	
308 308
The \e maximum \e flow \e problem is to find a flow of maximum value between
309 309
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
310 310
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
311 311
\f$s, t \in V\f$ source and target nodes.
312 312
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
313 313
following optimization problem.
314 314

	
315 315
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
316 316
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
317 317
    \quad \forall u\in V\setminus\{s,t\} \f]
318 318
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
319 319

	
320 320
LEMON contains several algorithms for solving maximum flow problems:
321 321
- \ref EdmondsKarp Edmonds-Karp algorithm.
322 322
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
323 323
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
324 324
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
325 325

	
326 326
In most cases the \ref Preflow "Preflow" algorithm provides the
327 327
fastest method for computing a maximum flow. All implementations
328 328
also provide functions to query the minimum cut, which is the dual
329 329
problem of maximum flow.
330 330

	
331 331
\ref Circulation is a preflow push-relabel algorithm implemented directly 
332 332
for finding feasible circulations, which is a somewhat different problem,
333 333
but it is strongly related to maximum flow.
334 334
For more information, see \ref Circulation.
335 335
*/
336 336

	
337 337
/**
338 338
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 339
@ingroup algs
340 340

	
341 341
\brief Algorithms for finding minimum cost flows and circulations.
342 342

	
343 343
This group contains the algorithms for finding minimum cost flows and
344 344
circulations. For more information about this problem and its dual
345 345
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
346 346

	
347 347
LEMON contains several algorithms for this problem.
348 348
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
349 349
   pivot strategies.
350 350
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
351 351
   cost scaling.
352 352
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
353 353
   capacity scaling.
354 354
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
355 355
 - \ref CycleCanceling Cycle-Canceling algorithms.
356 356

	
357 357
In general NetworkSimplex is the most efficient implementation,
358 358
but in special cases other algorithms could be faster.
359 359
For example, if the total supply and/or capacities are rather small,
360 360
CapacityScaling is usually the fastest algorithm (without effective scaling).
361 361
*/
362 362

	
363 363
/**
364 364
@defgroup min_cut Minimum Cut Algorithms
365 365
@ingroup algs
366 366

	
367 367
\brief Algorithms for finding minimum cut in graphs.
368 368

	
369 369
This group contains the algorithms for finding minimum cut in graphs.
370 370

	
371 371
The \e minimum \e cut \e problem is to find a non-empty and non-complete
372 372
\f$X\f$ subset of the nodes with minimum overall capacity on
373 373
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
374 374
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
375 375
cut is the \f$X\f$ solution of the next optimization problem:
376 376

	
377 377
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
378
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
378
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 379

	
380 380
LEMON contains several algorithms related to minimum cut problems:
381 381

	
382 382
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
383 383
  in directed graphs.
384 384
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
385 385
  calculating minimum cut in undirected graphs.
386 386
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
387 387
  all-pairs minimum cut in undirected graphs.
388 388

	
389 389
If you want to find minimum cut just between two distinict nodes,
390 390
see the \ref max_flow "maximum flow problem".
391 391
*/
392 392

	
393 393
/**
394 394
@defgroup graph_properties Connectivity and Other Graph Properties
395 395
@ingroup algs
396 396
\brief Algorithms for discovering the graph properties
397 397

	
398 398
This group contains the algorithms for discovering the graph properties
399 399
like connectivity, bipartiteness, euler property, simplicity etc.
400 400

	
401
\image html edge_biconnected_components.png
402
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
401
\image html connected_components.png
402
\image latex connected_components.eps "Connected components" width=\textwidth
403 403
*/
404 404

	
405 405
/**
406 406
@defgroup planar Planarity Embedding and Drawing
407 407
@ingroup algs
408 408
\brief Algorithms for planarity checking, embedding and drawing
409 409

	
410 410
This group contains the algorithms for planarity checking,
411 411
embedding and drawing.
412 412

	
413 413
\image html planar.png
414 414
\image latex planar.eps "Plane graph" width=\textwidth
415 415
*/
416 416

	
417 417
/**
418 418
@defgroup matching Matching Algorithms
419 419
@ingroup algs
420 420
\brief Algorithms for finding matchings in graphs and bipartite graphs.
421 421

	
422 422
This group contains the algorithms for calculating
423 423
matchings in graphs and bipartite graphs. The general matching problem is
424 424
finding a subset of the edges for which each node has at most one incident
425 425
edge.
426 426

	
427 427
There are several different algorithms for calculate matchings in
428 428
graphs.  The matching problems in bipartite graphs are generally
429 429
easier than in general graphs. The goal of the matching optimization
430 430
can be finding maximum cardinality, maximum weight or minimum cost
431 431
matching. The search can be constrained to find perfect or
432 432
maximum cardinality matching.
433 433

	
434 434
The matching algorithms implemented in LEMON:
435 435
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
436 436
  for calculating maximum cardinality matching in bipartite graphs.
437 437
- \ref PrBipartiteMatching Push-relabel algorithm
438 438
  for calculating maximum cardinality matching in bipartite graphs.
439 439
- \ref MaxWeightedBipartiteMatching
440 440
  Successive shortest path algorithm for calculating maximum weighted
441 441
  matching and maximum weighted bipartite matching in bipartite graphs.
442 442
- \ref MinCostMaxBipartiteMatching
443 443
  Successive shortest path algorithm for calculating minimum cost maximum
444 444
  matching in bipartite graphs.
445 445
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
446 446
  maximum cardinality matching in general graphs.
447 447
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
448 448
  maximum weighted matching in general graphs.
449 449
- \ref MaxWeightedPerfectMatching
450 450
  Edmond's blossom shrinking algorithm for calculating maximum weighted
451 451
  perfect matching in general graphs.
452 452

	
453 453
\image html bipartite_matching.png
454 454
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
455 455
*/
456 456

	
457 457
/**
458 458
@defgroup spantree Minimum Spanning Tree Algorithms
459 459
@ingroup algs
460 460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
461 461

	
462 462
This group contains the algorithms for finding minimum cost spanning
463 463
trees and arborescences.
464 464
*/
465 465

	
466 466
/**
467 467
@defgroup auxalg Auxiliary Algorithms
468 468
@ingroup algs
469 469
\brief Auxiliary algorithms implemented in LEMON.
470 470

	
471 471
This group contains some algorithms implemented in LEMON
472 472
in order to make it easier to implement complex algorithms.
473 473
*/
474 474

	
475 475
/**
476 476
@defgroup approx Approximation Algorithms
477 477
@ingroup algs
478 478
\brief Approximation algorithms.
479 479

	
480 480
This group contains the approximation and heuristic algorithms
481 481
implemented in LEMON.
482 482
*/
483 483

	
484 484
/**
485 485
@defgroup gen_opt_group General Optimization Tools
486 486
\brief This group contains some general optimization frameworks
487 487
implemented in LEMON.
488 488

	
489 489
This group contains some general optimization frameworks
490 490
implemented in LEMON.
491 491
*/
492 492

	
493 493
/**
494 494
@defgroup lp_group Lp and Mip Solvers
495 495
@ingroup gen_opt_group
496 496
\brief Lp and Mip solver interfaces for LEMON.
497 497

	
498 498
This group contains Lp and Mip solver interfaces for LEMON. The
499 499
various LP solvers could be used in the same manner with this
500 500
interface.
501 501
*/
502 502

	
503 503
/**
504 504
@defgroup lp_utils Tools for Lp and Mip Solvers
505 505
@ingroup lp_group
506 506
\brief Helper tools to the Lp and Mip solvers.
507 507

	
508 508
This group adds some helper tools to general optimization framework
509 509
implemented in LEMON.
510 510
*/
511 511

	
512 512
/**
513 513
@defgroup metah Metaheuristics
514 514
@ingroup gen_opt_group
515 515
\brief Metaheuristics for LEMON library.
516 516

	
517 517
This group contains some metaheuristic optimization tools.
518 518
*/
519 519

	
520 520
/**
521 521
@defgroup utils Tools and Utilities
522 522
\brief Tools and utilities for programming in LEMON
523 523

	
524 524
Tools and utilities for programming in LEMON.
525 525
*/
526 526

	
527 527
/**
528 528
@defgroup gutils Basic Graph Utilities
529 529
@ingroup utils
530 530
\brief Simple basic graph utilities.
531 531

	
532 532
This group contains some simple basic graph utilities.
533 533
*/
534 534

	
535 535
/**
536 536
@defgroup misc Miscellaneous Tools
537 537
@ingroup utils
538 538
\brief Tools for development, debugging and testing.
539 539

	
540 540
This group contains several useful tools for development,
541 541
debugging and testing.
542 542
*/
543 543

	
544 544
/**
545 545
@defgroup timecount Time Measuring and Counting
546 546
@ingroup misc
547 547
\brief Simple tools for measuring the performance of algorithms.
548 548

	
549 549
This group contains simple tools for measuring the performance
550 550
of algorithms.
551 551
*/
552 552

	
553 553
/**
554 554
@defgroup exceptions Exceptions
555 555
@ingroup utils
556 556
\brief Exceptions defined in LEMON.
557 557

	
558 558
This group contains the exceptions defined in LEMON.
559 559
*/
560 560

	
561 561
/**
562 562
@defgroup io_group Input-Output
563 563
\brief Graph Input-Output methods
564 564

	
565 565
This group contains the tools for importing and exporting graphs
566 566
and graph related data. Now it supports the \ref lgf-format
567 567
"LEMON Graph Format", the \c DIMACS format and the encapsulated
568 568
postscript (EPS) format.
569 569
*/
570 570

	
571 571
/**
572 572
@defgroup lemon_io LEMON Graph Format
573 573
@ingroup io_group
574 574
\brief Reading and writing LEMON Graph Format.
575 575

	
576 576
This group contains methods for reading and writing
577 577
\ref lgf-format "LEMON Graph Format".
578 578
*/
579 579

	
580 580
/**
581 581
@defgroup eps_io Postscript Exporting
582 582
@ingroup io_group
583 583
\brief General \c EPS drawer and graph exporter
584 584

	
585 585
This group contains general \c EPS drawing methods and special
586 586
graph exporting tools.
587 587
*/
588 588

	
589 589
/**
590 590
@defgroup dimacs_group DIMACS format
591 591
@ingroup io_group
592 592
\brief Read and write files in DIMACS format
593 593

	
594 594
Tools to read a digraph from or write it to a file in DIMACS format data.
Ignore white space 384 line context
... ...
@@ -224,386 +224,386 @@
224 224
    ///\c PredMap type.
225 225
    ///
226 226
    ///\ref named-templ-param "Named parameter" for setting
227 227
    ///\c PredMap type.
228 228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229 229
    template <class T>
230 230
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 231
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 232
    };
233 233

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

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

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

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

	
313 313
    ///@}
314 314

	
315 315
  public:
316 316

	
317 317
    ///Constructor.
318 318

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

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

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

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

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

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

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

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

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

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

	
411 411
  public:
412 412

	
413 413
    ///\name Execution Control
414 414
    ///The simplest way to execute the BFS algorithm is to use one of the
415 415
    ///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
416
    ///If you need better control on the execution, you have to call
417
    ///\ref init() first, then you can add several source nodes with
418 418
    ///\ref addSource(). Finally the actual path computation can be
419 419
    ///performed with one of the \ref start() functions.
420 420

	
421 421
    ///@{
422 422

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
571 571
    ///Executes the algorithm.
572 572

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

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

	
598 598
    ///Executes the algorithm until the given target node is reached.
599 599
    ///
600 600
    ///This method runs the %BFS algorithm from the root node(s)
601 601
    ///in order to compute the shortest path to \c t.
602 602
    ///
603 603
    ///The algorithm computes
604 604
    ///- the shortest path to \c t,
605 605
    ///- the distance of \c t from the root(s).
606 606
    ///
607 607
    ///\pre init() must be called and at least one root node should be
608 608
    ///added with addSource() before using this function.
609 609
    ///
... ...
@@ -1236,386 +1236,386 @@
1236 1236
    void examine(const Arc&) {}
1237 1237

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

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

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

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

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

	
1279 1279
  };
1280 1280

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

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

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

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

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

	
1332 1332
  private:
1333 1333

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

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

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

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

	
1359 1359
  protected:
1360 1360

	
1361 1361
    BfsVisit() {}
1362 1362

	
1363 1363
  public:
1364 1364

	
1365 1365
    typedef BfsVisit Create;
1366 1366

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

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

	
1389 1389
  public:
1390 1390

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

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

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

	
1423 1423
  public:
1424 1424

	
1425 1425
    /// \name Execution Control
1426 1426
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1427
    /// 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
1428
    /// If you need better control on the execution, you have to call
1429
    /// \ref init() first, then you can add several source nodes with
1430 1430
    /// \ref addSource(). Finally the actual path computation can be
1431 1431
    /// performed with one of the \ref start() functions.
1432 1432

	
1433 1433
    /// @{
1434 1434

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

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

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

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

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

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

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

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

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

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

	
1621 1621
    /// \brief Executes the algorithm until a condition is met.
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 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 algorithm.
454 461
    ///
455 462
    /// Sets the tolerance used by algorithm.
456 463
    Circulation& tolerance(const Tolerance& tolerance) const {
457 464
      _tol = tolerance;
458 465
      return *this;
459 466
    }
460 467

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

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

	
474 481
    ///@{
475 482

	
476 483
    /// Initializes the internal data structures.
477 484

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

	
485 492
      createStructures();
486 493

	
487 494
      for(NodeIt n(_g);n!=INVALID;++n) {
488 495
        (*_excess)[n] = (*_supply)[n];
489 496
      }
490 497

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

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

	
508 515
    /// Initializes the internal data structures using a greedy approach.
509 516

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

	
517 524
      createStructures();
518 525

	
519 526
      for(NodeIt n(_g);n!=INVALID;++n) {
520 527
        (*_excess)[n] = (*_supply)[n];
521 528
      }
522 529

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

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

	
549 556
    ///Executes the algorithm
550 557

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

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

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

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

	
637 644
    /// Runs the algorithm.
638 645

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

	
654 661
    /// @}
655 662

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

	
662 669
    ///@{
663 670

	
Ignore white space 384 line context
... ...
@@ -222,386 +222,386 @@
222 222
    ///\brief \ref named-templ-param "Named parameter" for setting
223 223
    ///\c PredMap type.
224 224
    ///
225 225
    ///\ref named-templ-param "Named parameter" for setting
226 226
    ///\c PredMap type.
227 227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
228 228
    template <class T>
229 229
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
230 230
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
231 231
    };
232 232

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

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

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

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

	
311 311
    ///@}
312 312

	
313 313
  public:
314 314

	
315 315
    ///Constructor.
316 316

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

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

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

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

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

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

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

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

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

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

	
409 409
  public:
410 410

	
411 411
    ///\name Execution Control
412 412
    ///The simplest way to execute the DFS algorithm is to use one of the
413 413
    ///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()
414
    ///If you need better control on the execution, you have to call
415
    ///\ref init() first, then you can add a source node with \ref addSource()
416 416
    ///and perform the actual computation with \ref start().
417 417
    ///This procedure can be repeated if there are nodes that have not
418 418
    ///been reached.
419 419

	
420 420
    ///@{
421 421

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

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

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

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

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

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

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

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

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

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

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

	
520 520
    ///Executes the algorithm.
521 521

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

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

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

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

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

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

	
592 592
    ///This method runs the %DFS algorithm from node \c s
593 593
    ///in order to compute the DFS path to each node.
594 594
    ///
595 595
    ///The algorithm computes
596 596
    ///- the %DFS tree,
597 597
    ///- the distance of each node from the root in the %DFS tree.
598 598
    ///
599 599
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
600 600
    ///\code
601 601
    ///  d.init();
602 602
    ///  d.addSource(s);
603 603
    ///  d.start();
604 604
    ///\endcode
605 605
    void run(Node s) {
606 606
      init();
607 607
      addSource(s);
... ...
@@ -1180,386 +1180,386 @@
1180 1180
    template <typename _Visitor>
1181 1181
    struct Constraints {
1182 1182
      void constraints() {
1183 1183
        Arc arc;
1184 1184
        Node node;
1185 1185
        visitor.start(node);
1186 1186
        visitor.stop(arc);
1187 1187
        visitor.reach(node);
1188 1188
        visitor.discover(arc);
1189 1189
        visitor.examine(arc);
1190 1190
        visitor.leave(node);
1191 1191
        visitor.backtrack(arc);
1192 1192
      }
1193 1193
      _Visitor& visitor;
1194 1194
    };
1195 1195
  };
1196 1196
#endif
1197 1197

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

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

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

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

	
1223 1223
  };
1224 1224

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

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

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

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

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

	
1276 1276
  private:
1277 1277

	
1278 1278
    typedef typename Digraph::Node Node;
1279 1279
    typedef typename Digraph::NodeIt NodeIt;
1280 1280
    typedef typename Digraph::Arc Arc;
1281 1281
    typedef typename Digraph::OutArcIt OutArcIt;
1282 1282

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

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

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

	
1303 1303
  protected:
1304 1304

	
1305 1305
    DfsVisit() {}
1306 1306

	
1307 1307
  public:
1308 1308

	
1309 1309
    typedef DfsVisit Create;
1310 1310

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

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

	
1333 1333
  public:
1334 1334

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

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

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

	
1367 1367
  public:
1368 1368

	
1369 1369
    /// \name Execution Control
1370 1370
    /// The simplest way to execute the DFS algorithm is to use one of the
1371 1371
    /// 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()
1372
    /// If you need better control on the execution, you have to call
1373
    /// \ref init() first, then you can add a source node with \ref addSource()
1374 1374
    /// and perform the actual computation with \ref start().
1375 1375
    /// This procedure can be repeated if there are nodes that have not
1376 1376
    /// been reached.
1377 1377

	
1378 1378
    /// @{
1379 1379

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

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

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

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

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

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

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

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

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

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

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

	
1564 1564
    /// This method runs the %DFS algorithm from node \c s
1565 1565
    /// in order to compute the DFS path to node \c t
Ignore white space 384 line context
... ...
@@ -395,386 +395,386 @@
395 395
    ///using the \ref heap() function before calling \ref run(Node) "run()"
396 396
    ///or \ref init().
397 397
    ///\sa SetStandardHeap
398 398
    template <class H, class CR = typename Digraph::template NodeMap<int> >
399 399
    struct SetHeap
400 400
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
401 401
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
402 402
    };
403 403

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

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

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

	
453 453
    ///@}
454 454

	
455 455
  protected:
456 456

	
457 457
    Dijkstra() {}
458 458

	
459 459
  public:
460 460

	
461 461
    ///Constructor.
462 462

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

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

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

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

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

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

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

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

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

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

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

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

	
574 574
  private:
575 575

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

	
582 582
  public:
583 583

	
584 584
    ///\name Execution Control
585 585
    ///The simplest way to execute the %Dijkstra algorithm is to use
586 586
    ///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
587
    ///If you need better control on the execution, you have to call
588
    ///\ref init() first, then you can add several source nodes with
589 589
    ///\ref addSource(). Finally the actual path computation can be
590 590
    ///performed with one of the \ref start() functions.
591 591

	
592 592
    ///@{
593 593

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

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

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

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

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

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

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

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

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

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

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

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

	
684 684
    ///Executes the algorithm.
685 685

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

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

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

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

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

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

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

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

	
779 779
    ///This method runs the %Dijkstra algorithm from node \c s
780 780
    ///in order to compute the shortest path to node \c t
Ignore white space 384 line context
... ...
@@ -170,401 +170,401 @@
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 384 line context
... ...
@@ -299,386 +299,386 @@
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.
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 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 use 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 algorithm.
375 382
    ///
376 383
    /// Sets the tolerance used by algorithm.
377 384
    Preflow& tolerance(const Tolerance& tolerance) const {
378 385
      _tolerance = tolerance;
379 386
      return *this;
380 387
    }
381 388

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

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

	
396 403
    ///@{
397 404

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

	
405 412
      _phase = true;
406 413
      for (NodeIt n(_graph); n != INVALID; ++n) {
407 414
        (*_excess)[n] = 0;
408 415
      }
409 416

	
410 417
      for (ArcIt e(_graph); e != INVALID; ++e) {
411 418
        _flow->set(e, 0);
412 419
      }
413 420

	
414 421
      typename Digraph::template NodeMap<bool> reached(_graph, false);
415 422

	
416 423
      _level->initStart();
417 424
      _level->initAddItem(_target);
418 425

	
419 426
      std::vector<Node> queue;
420 427
      reached[_source] = true;
421 428

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

	
442 449
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
443 450
        if (_tolerance.positive((*_capacity)[e])) {
444 451
          Node u = _graph.target(e);
445 452
          if ((*_level)[u] == _level->maxLevel()) continue;
446 453
          _flow->set(e, (*_capacity)[e]);
447 454
          (*_excess)[u] += (*_capacity)[e];
448 455
          if (u != _target && !_level->active(u)) {
449 456
            _level->activate(u);
450 457
          }
451 458
        }
452 459
      }
453 460
    }
454 461

	
455 462
    /// \brief Initializes the internal data structures using the
456 463
    /// given flow map.
457 464
    ///
458 465
    /// Initializes the internal data structures and sets the initial
459 466
    /// flow to the given \c flowMap. The \c flowMap should contain a
460 467
    /// flow or at least a preflow, i.e. at each node excluding the
461 468
    /// source node the incoming flow should greater or equal to the
462 469
    /// outgoing flow.
463 470
    /// \return \c false if the given \c flowMap is not a preflow.
464 471
    template <typename FlowMap>
465 472
    bool init(const FlowMap& flowMap) {
466 473
      createStructures();
467 474

	
468 475
      for (ArcIt e(_graph); e != INVALID; ++e) {
469 476
        _flow->set(e, flowMap[e]);
470 477
      }
471 478

	
472 479
      for (NodeIt n(_graph); n != INVALID; ++n) {
473 480
        Value excess = 0;
474 481
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
475 482
          excess += (*_flow)[e];
476 483
        }
477 484
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
478 485
          excess -= (*_flow)[e];
479 486
        }
480 487
        if (excess < 0 && n != _source) return false;
481 488
        (*_excess)[n] = excess;
482 489
      }
483 490

	
484 491
      typename Digraph::template NodeMap<bool> reached(_graph, false);
485 492

	
486 493
      _level->initStart();
487 494
      _level->initAddItem(_target);
488 495

	
489 496
      std::vector<Node> queue;
490 497
      reached[_source] = true;
491 498

	
492 499
      queue.push_back(_target);
493 500
      reached[_target] = true;
494 501
      while (!queue.empty()) {
495 502
        _level->initNewLevel();
496 503
        std::vector<Node> nqueue;
497 504
        for (int i = 0; i < int(queue.size()); ++i) {
498 505
          Node n = queue[i];
499 506
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
500 507
            Node u = _graph.source(e);
501 508
            if (!reached[u] &&
502 509
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
503 510
              reached[u] = true;
504 511
              _level->initAddItem(u);
505 512
              nqueue.push_back(u);
506 513
            }
507 514
          }
508 515
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
509 516
            Node v = _graph.target(e);
510 517
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
511 518
              reached[v] = true;
512 519
              _level->initAddItem(v);
513 520
              nqueue.push_back(v);
514 521
            }
515 522
          }
516 523
        }
517 524
        queue.swap(nqueue);
518 525
      }
519 526
      _level->initFinish();
520 527

	
521 528
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
522 529
        Value rem = (*_capacity)[e] - (*_flow)[e];
523 530
        if (_tolerance.positive(rem)) {
524 531
          Node u = _graph.target(e);
525 532
          if ((*_level)[u] == _level->maxLevel()) continue;
526 533
          _flow->set(e, (*_capacity)[e]);
527 534
          (*_excess)[u] += rem;
528 535
          if (u != _target && !_level->active(u)) {
529 536
            _level->activate(u);
530 537
          }
531 538
        }
532 539
      }
533 540
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
534 541
        Value rem = (*_flow)[e];
535 542
        if (_tolerance.positive(rem)) {
536 543
          Node v = _graph.source(e);
537 544
          if ((*_level)[v] == _level->maxLevel()) continue;
538 545
          _flow->set(e, 0);
539 546
          (*_excess)[v] += rem;
540 547
          if (v != _target && !_level->active(v)) {
541 548
            _level->activate(v);
542 549
          }
543 550
        }
544 551
      }
545 552
      return true;
546 553
    }
547 554

	
548 555
    /// \brief Starts the first phase of the preflow algorithm.
549 556
    ///
550 557
    /// The preflow algorithm consists of two phases, this method runs
551 558
    /// the first phase. After the first phase the maximum flow value
552 559
    /// and a minimum value cut can already be computed, although a
553 560
    /// maximum flow is not yet obtained. So after calling this method
554 561
    /// \ref flowValue() returns the value of a maximum flow and \ref
555 562
    /// minCut() returns a minimum cut.
556 563
    /// \pre One of the \ref init() functions must be called before
557 564
    /// using this function.
558 565
    void startFirstPhase() {
559 566
      _phase = true;
560 567

	
561 568
      Node n = _level->highestActive();
562 569
      int level = _level->highestActiveLevel();
563 570
      while (n != INVALID) {
564 571
        int num = _node_num;
565 572

	
566 573
        while (num > 0 && n != INVALID) {
567 574
          Value excess = (*_excess)[n];
568 575
          int new_level = _level->maxLevel();
569 576

	
570 577
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
571 578
            Value rem = (*_capacity)[e] - (*_flow)[e];
572 579
            if (!_tolerance.positive(rem)) continue;
573 580
            Node v = _graph.target(e);
574 581
            if ((*_level)[v] < level) {
575 582
              if (!_level->active(v) && v != _target) {
576 583
                _level->activate(v);
577 584
              }
578 585
              if (!_tolerance.less(rem, excess)) {
579 586
                _flow->set(e, (*_flow)[e] + excess);
580 587
                (*_excess)[v] += excess;
581 588
                excess = 0;
582 589
                goto no_more_push_1;
583 590
              } else {
584 591
                excess -= rem;
585 592
                (*_excess)[v] += rem;
0 comments (0 inline)