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

	
19
#ifndef LEMON_BELLMAN_FORD_H
20
#define LEMON_BELLMAN_FORD_H
21

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

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

	
32
#include <limits>
33

	
34
namespace lemon {
35

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

	
68
  template <typename V>
69
  struct BellmanFordDefaultOperationTraits<V, false> {
70
    typedef V Value;
71
    static Value zero() {
72
      return static_cast<Value>(0);
73
    }
74
    static Value infinity() {
75
      return std::numeric_limits<Value>::max();
76
    }
77
    static Value plus(const Value& left, const Value& right) {
78
      if (left == infinity() || right == infinity()) return infinity();
79
      return left + right;
80
    }
81
    static bool less(const Value& left, const Value& right) {
82
      return left < right;
83
    }
84
  };
85
  
86
  /// \brief Default traits class of BellmanFord class.
87
  ///
88
  /// Default traits class of BellmanFord class.
89
  /// \param GR The type of the digraph.
90
  /// \param LEN The type of the length map.
91
  template<typename GR, typename LEN>
92
  struct BellmanFordDefaultTraits {
93
    /// The type of the digraph the algorithm runs on. 
94
    typedef GR Digraph;
95

	
96
    /// \brief The type of the map that stores the arc lengths.
97
    ///
98
    /// The type of the map that stores the arc lengths.
99
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
100
    typedef LEN LengthMap;
101

	
102
    /// The type of the arc lengths.
103
    typedef typename LEN::Value Value;
104

	
105
    /// \brief Operation traits for Bellman-Ford algorithm.
106
    ///
107
    /// It defines the used operations and the infinity value for the
108
    /// given \c Value type.
109
    /// \see BellmanFordDefaultOperationTraits
110
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
111
 
112
    /// \brief The type of the map that stores the last arcs of the 
113
    /// shortest paths.
114
    /// 
115
    /// The type of the map that stores the last
116
    /// arcs of the shortest paths.
117
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
118
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
119

	
120
    /// \brief Instantiates a \c PredMap.
121
    /// 
122
    /// This function instantiates a \ref PredMap. 
123
    /// \param g is the digraph to which we would like to define the
124
    /// \ref PredMap.
125
    static PredMap *createPredMap(const GR& g) {
126
      return new PredMap(g);
127
    }
128

	
129
    /// \brief The type of the map that stores the distances of the nodes.
130
    ///
131
    /// The type of the map that stores the distances of the nodes.
132
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
133
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
134

	
135
    /// \brief Instantiates a \c DistMap.
136
    ///
137
    /// This function instantiates a \ref DistMap. 
138
    /// \param g is the digraph to which we would like to define the 
139
    /// \ref DistMap.
140
    static DistMap *createDistMap(const GR& g) {
141
      return new DistMap(g);
142
    }
143

	
144
  };
145
  
146
  /// \brief %BellmanFord algorithm class.
147
  ///
148
  /// \ingroup shortest_path
149
  /// This class provides an efficient implementation of the Bellman-Ford 
150
  /// algorithm. The maximum time complexity of the algorithm is
151
  /// <tt>O(ne)</tt>.
152
  ///
153
  /// The Bellman-Ford algorithm solves the single-source shortest path
154
  /// problem when the arcs can have negative lengths, but the digraph
155
  /// should not contain directed cycles with negative total length.
156
  /// If all arc costs are non-negative, consider to use the Dijkstra
157
  /// algorithm instead, since it is more efficient.
158
  ///
159
  /// The arc lengths are passed to the algorithm using a
160
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
161
  /// kind of length. The type of the length values is determined by the
162
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
163
  ///
164
  /// There is also a \ref bellmanFord() "function-type interface" for the
165
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
166
  /// it can be used easier.
167
  ///
168
  /// \tparam GR The type of the digraph the algorithm runs on.
169
  /// The default type is \ref ListDigraph.
170
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
171
  /// the lengths of the arcs. The default map type is
172
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
173
#ifdef DOXYGEN
174
  template <typename GR, typename LEN, typename TR>
175
#else
176
  template <typename GR=ListDigraph,
177
            typename LEN=typename GR::template ArcMap<int>,
178
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
179
#endif
180
  class BellmanFord {
181
  public:
182

	
183
    ///The type of the underlying digraph.
184
    typedef typename TR::Digraph Digraph;
185
    
186
    /// \brief The type of the arc lengths.
187
    typedef typename TR::LengthMap::Value Value;
188
    /// \brief The type of the map that stores the arc lengths.
189
    typedef typename TR::LengthMap LengthMap;
190
    /// \brief The type of the map that stores the last
191
    /// arcs of the shortest paths.
192
    typedef typename TR::PredMap PredMap;
193
    /// \brief The type of the map that stores the distances of the nodes.
194
    typedef typename TR::DistMap DistMap;
195
    /// The type of the paths.
196
    typedef PredMapPath<Digraph, PredMap> Path;
197
    ///\brief The \ref BellmanFordDefaultOperationTraits
198
    /// "operation traits class" of the algorithm.
199
    typedef typename TR::OperationTraits OperationTraits;
200

	
201
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
202
    typedef TR Traits;
203

	
204
  private:
205

	
206
    typedef typename Digraph::Node Node;
207
    typedef typename Digraph::NodeIt NodeIt;
208
    typedef typename Digraph::Arc Arc;
209
    typedef typename Digraph::OutArcIt OutArcIt;
210

	
211
    // Pointer to the underlying digraph.
212
    const Digraph *_gr;
213
    // Pointer to the length map
214
    const LengthMap *_length;
215
    // Pointer to the map of predecessors arcs.
216
    PredMap *_pred;
217
    // Indicates if _pred is locally allocated (true) or not.
218
    bool _local_pred;
219
    // Pointer to the map of distances.
220
    DistMap *_dist;
221
    // Indicates if _dist is locally allocated (true) or not.
222
    bool _local_dist;
223

	
224
    typedef typename Digraph::template NodeMap<bool> MaskMap;
225
    MaskMap *_mask;
226

	
227
    std::vector<Node> _process;
228

	
229
    // Creates the maps if necessary.
230
    void create_maps() {
231
      if(!_pred) {
232
	_local_pred = true;
233
	_pred = Traits::createPredMap(*_gr);
234
      }
235
      if(!_dist) {
236
	_local_dist = true;
237
	_dist = Traits::createDistMap(*_gr);
238
      }
239
      _mask = new MaskMap(*_gr, false);
240
    }
241
    
242
  public :
243
 
244
    typedef BellmanFord Create;
245

	
246
    /// \name Named Template Parameters
247

	
248
    ///@{
249

	
250
    template <class T>
251
    struct SetPredMapTraits : public Traits {
252
      typedef T PredMap;
253
      static PredMap *createPredMap(const Digraph&) {
254
        LEMON_ASSERT(false, "PredMap is not initialized");
255
        return 0; // ignore warnings
256
      }
257
    };
258

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

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

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

	
312
  protected:
313
    
314
    BellmanFord() {}
315

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

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

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

	
361
    /// \brief Sets the map that stores the distances of the nodes.
362
    ///
363
    /// Sets the map that stores the distances of the nodes calculated
364
    /// by the algorithm.
365
    /// If you don't use this function before calling \ref run()
366
    /// or \ref init(), an instance will be allocated automatically.
367
    /// The destructor deallocates this automatically allocated map,
368
    /// of course.
369
    /// \return <tt>(*this)</tt>
370
    BellmanFord &distMap(DistMap &map) {
371
      if(_local_dist) {
372
	delete _dist;
373
	_local_dist=false;
374
      }
375
      _dist = &map;
376
      return *this;
377
    }
378

	
379
    /// \name Execution Control
380
    /// The simplest way to execute the Bellman-Ford algorithm is to use
381
    /// one of the member functions called \ref run().\n
382
    /// If you need better control on the execution, you have to call
383
    /// \ref init() first, then you can add several source nodes
384
    /// with \ref addSource(). Finally the actual path computation can be
385
    /// performed with \ref start(), \ref checkedStart() or
386
    /// \ref limitedStart().
387

	
388
    ///@{
389

	
390
    /// \brief Initializes the internal data structures.
391
    /// 
392
    /// Initializes the internal data structures. The optional parameter
393
    /// is the initial distance of each node.
394
    void init(const Value value = OperationTraits::infinity()) {
395
      create_maps();
396
      for (NodeIt it(*_gr); it != INVALID; ++it) {
397
	_pred->set(it, INVALID);
398
	_dist->set(it, value);
399
      }
400
      _process.clear();
401
      if (OperationTraits::less(value, OperationTraits::infinity())) {
402
	for (NodeIt it(*_gr); it != INVALID; ++it) {
403
	  _process.push_back(it);
404
	  _mask->set(it, true);
405
	}
406
      }
407
    }
408
    
409
    /// \brief Adds a new source node.
410
    ///
411
    /// This function adds a new source node. The optional second parameter
412
    /// is the initial distance of the node.
413
    void addSource(Node source, Value dst = OperationTraits::zero()) {
414
      _dist->set(source, dst);
415
      if (!(*_mask)[source]) {
416
	_process.push_back(source);
417
	_mask->set(source, true);
418
      }
419
    }
420

	
421
    /// \brief Executes one round from the Bellman-Ford algorithm.
422
    ///
423
    /// If the algoritm calculated the distances in the previous round
424
    /// exactly for the paths of at most \c k arcs, then this function
425
    /// will calculate the distances exactly for the paths of at most
426
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
427
    /// calculates the shortest path distances exactly for the paths
428
    /// consisting of at most \c k arcs.
429
    ///
430
    /// \warning The paths with limited arc number cannot be retrieved
431
    /// easily with \ref path() or \ref predArc() functions. If you also
432
    /// need the shortest paths and not only the distances, you should
433
    /// store the \ref predMap() "predecessor map" after each iteration
434
    /// and build the path manually.
435
    ///
436
    /// \return \c true when the algorithm have not found more shorter
437
    /// paths.
438
    ///
439
    /// \see ActiveIt
440
    bool processNextRound() {
441
      for (int i = 0; i < int(_process.size()); ++i) {
442
	_mask->set(_process[i], false);
443
      }
444
      std::vector<Node> nextProcess;
445
      std::vector<Value> values(_process.size());
446
      for (int i = 0; i < int(_process.size()); ++i) {
447
	values[i] = (*_dist)[_process[i]];
448
      }
449
      for (int i = 0; i < int(_process.size()); ++i) {
450
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
451
	  Node target = _gr->target(it);
452
	  Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
453
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
454
	    _pred->set(target, it);
455
	    _dist->set(target, relaxed);
456
	    if (!(*_mask)[target]) {
457
	      _mask->set(target, true);
458
	      nextProcess.push_back(target);
459
	    }
460
	  }	  
461
	}
462
      }
463
      _process.swap(nextProcess);
464
      return _process.empty();
465
    }
466

	
467
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
468
    ///
469
    /// If the algorithm calculated the distances in the previous round
470
    /// at least for the paths of at most \c k arcs, then this function
471
    /// will calculate the distances at least for the paths of at most
472
    /// <tt>k+1</tt> arcs.
473
    /// This function does not make it possible to calculate the shortest
474
    /// path distances exactly for paths consisting of at most \c k arcs,
475
    /// this is why it is called weak round.
476
    ///
477
    /// \return \c true when the algorithm have not found more shorter
478
    /// paths.
479
    ///
480
    /// \see ActiveIt
481
    bool processNextWeakRound() {
482
      for (int i = 0; i < int(_process.size()); ++i) {
483
	_mask->set(_process[i], false);
484
      }
485
      std::vector<Node> nextProcess;
486
      for (int i = 0; i < int(_process.size()); ++i) {
487
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
488
	  Node target = _gr->target(it);
489
	  Value relaxed = 
490
	    OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
491
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
492
	    _pred->set(target, it);
493
	    _dist->set(target, relaxed);
494
	    if (!(*_mask)[target]) {
495
	      _mask->set(target, true);
496
	      nextProcess.push_back(target);
497
	    }
498
	  }	  
499
	}
500
      }
501
      _process.swap(nextProcess);
502
      return _process.empty();
503
    }
504

	
505
    /// \brief Executes the algorithm.
506
    ///
507
    /// Executes the algorithm.
508
    ///
509
    /// This method runs the Bellman-Ford algorithm from the root node(s)
510
    /// in order to compute the shortest path to each node.
511
    ///
512
    /// The algorithm computes
513
    /// - the shortest path tree (forest),
514
    /// - the distance of each node from the root(s).
515
    ///
516
    /// \pre init() must be called and at least one root node should be
517
    /// added with addSource() before using this function.
518
    void start() {
519
      int num = countNodes(*_gr) - 1;
520
      for (int i = 0; i < num; ++i) {
521
	if (processNextWeakRound()) break;
522
      }
523
    }
524

	
525
    /// \brief Executes the algorithm and checks the negative cycles.
526
    ///
527
    /// Executes the algorithm and checks the negative cycles.
528
    ///
529
    /// This method runs the Bellman-Ford algorithm from the root node(s)
530
    /// in order to compute the shortest path to each node and also checks
531
    /// if the digraph contains cycles with negative total length.
532
    ///
533
    /// The algorithm computes 
534
    /// - the shortest path tree (forest),
535
    /// - the distance of each node from the root(s).
536
    /// 
537
    /// \return \c false if there is a negative cycle in the digraph.
538
    ///
539
    /// \pre init() must be called and at least one root node should be
540
    /// added with addSource() before using this function. 
541
    bool checkedStart() {
542
      int num = countNodes(*_gr);
543
      for (int i = 0; i < num; ++i) {
544
	if (processNextWeakRound()) return true;
545
      }
546
      return _process.empty();
547
    }
548

	
549
    /// \brief Executes the algorithm with arc number limit.
550
    ///
551
    /// Executes the algorithm with arc number limit.
552
    ///
553
    /// This method runs the Bellman-Ford algorithm from the root node(s)
554
    /// in order to compute the shortest path distance for each node
555
    /// using only the paths consisting of at most \c num arcs.
556
    ///
557
    /// The algorithm computes
558
    /// - the limited distance of each node from the root(s),
559
    /// - the predecessor arc for each node.
560
    ///
561
    /// \warning The paths with limited arc number cannot be retrieved
562
    /// easily with \ref path() or \ref predArc() functions. If you also
563
    /// need the shortest paths and not only the distances, you should
564
    /// store the \ref predMap() "predecessor map" after each iteration
565
    /// and build the path manually.
566
    ///
567
    /// \pre init() must be called and at least one root node should be
568
    /// added with addSource() before using this function. 
569
    void limitedStart(int num) {
570
      for (int i = 0; i < num; ++i) {
571
	if (processNextRound()) break;
572
      }
573
    }
574
    
575
    /// \brief Runs the algorithm from the given root node.
576
    ///    
577
    /// This method runs the Bellman-Ford algorithm from the given root
578
    /// node \c s in order to compute the shortest path to each node.
579
    ///
580
    /// The algorithm computes
581
    /// - the shortest path tree (forest),
582
    /// - the distance of each node from the root(s).
583
    ///
584
    /// \note bf.run(s) is just a shortcut of the following code.
585
    /// \code
586
    ///   bf.init();
587
    ///   bf.addSource(s);
588
    ///   bf.start();
589
    /// \endcode
590
    void run(Node s) {
591
      init();
592
      addSource(s);
593
      start();
594
    }
595
    
596
    /// \brief Runs the algorithm from the given root node with arc
597
    /// number limit.
598
    ///    
599
    /// This method runs the Bellman-Ford algorithm from the given root
600
    /// node \c s in order to compute the shortest path distance for each
601
    /// node using only the paths consisting of at most \c num arcs.
602
    ///
603
    /// The algorithm computes
604
    /// - the limited distance of each node from the root(s),
605
    /// - the predecessor arc for each node.
606
    ///
607
    /// \warning The paths with limited arc number cannot be retrieved
608
    /// easily with \ref path() or \ref predArc() functions. If you also
609
    /// need the shortest paths and not only the distances, you should
610
    /// store the \ref predMap() "predecessor map" after each iteration
611
    /// and build the path manually.
612
    ///
613
    /// \note bf.run(s, num) is just a shortcut of the following code.
614
    /// \code
615
    ///   bf.init();
616
    ///   bf.addSource(s);
617
    ///   bf.limitedStart(num);
618
    /// \endcode
619
    void run(Node s, int num) {
620
      init();
621
      addSource(s);
622
      limitedStart(num);
623
    }
624
    
625
    ///@}
626

	
627
    /// \brief LEMON iterator for getting the active nodes.
628
    ///
629
    /// This class provides a common style LEMON iterator that traverses
630
    /// the active nodes of the Bellman-Ford algorithm after the last
631
    /// phase. These nodes should be checked in the next phase to
632
    /// find augmenting arcs outgoing from them.
633
    class ActiveIt {
634
    public:
635

	
636
      /// \brief Constructor.
637
      ///
638
      /// Constructor for getting the active nodes of the given BellmanFord
639
      /// instance. 
640
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
641
      {
642
        _index = _algorithm->_process.size() - 1;
643
      }
644

	
645
      /// \brief Invalid constructor.
646
      ///
647
      /// Invalid constructor.
648
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
649

	
650
      /// \brief Conversion to \c Node.
651
      ///
652
      /// Conversion to \c Node.
653
      operator Node() const { 
654
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
655
      }
656

	
657
      /// \brief Increment operator.
658
      ///
659
      /// Increment operator.
660
      ActiveIt& operator++() {
661
        --_index;
662
        return *this; 
663
      }
664

	
665
      bool operator==(const ActiveIt& it) const { 
666
        return static_cast<Node>(*this) == static_cast<Node>(it); 
667
      }
668
      bool operator!=(const ActiveIt& it) const { 
669
        return static_cast<Node>(*this) != static_cast<Node>(it); 
670
      }
671
      bool operator<(const ActiveIt& it) const { 
672
        return static_cast<Node>(*this) < static_cast<Node>(it); 
673
      }
674
      
675
    private:
676
      const BellmanFord* _algorithm;
677
      int _index;
678
    };
679
    
680
    /// \name Query Functions
681
    /// The result of the Bellman-Ford algorithm can be obtained using these
682
    /// functions.\n
683
    /// Either \ref run() or \ref init() should be called before using them.
684
    
685
    ///@{
686

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

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

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

	
773
    /// \brief Gives back a negative cycle.
774
    ///    
775
    /// This function gives back a directed cycle with negative total
776
    /// length if the algorithm has already found one.
777
    /// Otherwise it gives back an empty path.
778
    lemon::Path<Digraph> negativeCycle() {
779
      typename Digraph::template NodeMap<int> state(*_gr, -1);
780
      lemon::Path<Digraph> cycle;
781
      for (int i = 0; i < int(_process.size()); ++i) {
782
        if (state[_process[i]] != -1) continue;
783
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
784
             v = _gr->source((*_pred)[v])) {
785
          if (state[v] == i) {
786
            cycle.addFront((*_pred)[v]);
787
            for (Node u = _gr->source((*_pred)[v]); u != v;
788
                 u = _gr->source((*_pred)[u])) {
789
              cycle.addFront((*_pred)[u]);
790
            }
791
            return cycle;
792
          }
793
          else if (state[v] >= 0) {
794
            break;
795
          }
796
          state[v] = i;
797
        }
798
      }
799
      return cycle;
800
    }
801
    
802
    ///@}
803
  };
804
 
805
  /// \brief Default traits class of bellmanFord() function.
806
  ///
807
  /// Default traits class of bellmanFord() function.
808
  /// \tparam GR The type of the digraph.
809
  /// \tparam LEN The type of the length map.
810
  template <typename GR, typename LEN>
811
  struct BellmanFordWizardDefaultTraits {
812
    /// The type of the digraph the algorithm runs on. 
813
    typedef GR Digraph;
814

	
815
    /// \brief The type of the map that stores the arc lengths.
816
    ///
817
    /// The type of the map that stores the arc lengths.
818
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
819
    typedef LEN LengthMap;
820

	
821
    /// The type of the arc lengths.
822
    typedef typename LEN::Value Value;
823

	
824
    /// \brief Operation traits for Bellman-Ford algorithm.
825
    ///
826
    /// It defines the used operations and the infinity value for the
827
    /// given \c Value type.
828
    /// \see BellmanFordDefaultOperationTraits
829
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
830

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

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

	
847
    /// \brief The type of the map that stores the distances of the nodes.
848
    ///
849
    /// The type of the map that stores the distances of the nodes.
850
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
851
    typedef typename GR::template NodeMap<Value> DistMap;
852

	
853
    /// \brief Instantiates a \c DistMap.
854
    ///
855
    /// This function instantiates a \ref DistMap. 
856
    /// \param g is the digraph to which we would like to define the
857
    /// \ref DistMap.
858
    static DistMap *createDistMap(const GR &g) {
859
      return new DistMap(g);
860
    }
861

	
862
    ///The type of the shortest paths.
863

	
864
    ///The type of the shortest paths.
865
    ///It must meet the \ref concepts::Path "Path" concept.
866
    typedef lemon::Path<Digraph> Path;
867
  };
868
  
869
  /// \brief Default traits class used by BellmanFordWizard.
870
  ///
871
  /// Default traits class used by BellmanFordWizard.
872
  /// \tparam GR The type of the digraph.
873
  /// \tparam LEN The type of the length map.
874
  template <typename GR, typename LEN>
875
  class BellmanFordWizardBase 
876
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
877

	
878
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
879
  protected:
880
    // Type of the nodes in the digraph.
881
    typedef typename Base::Digraph::Node Node;
882

	
883
    // Pointer to the underlying digraph.
884
    void *_graph;
885
    // Pointer to the length map
886
    void *_length;
887
    // Pointer to the map of predecessors arcs.
888
    void *_pred;
889
    // Pointer to the map of distances.
890
    void *_dist;
891
    //Pointer to the shortest path to the target node.
892
    void *_path;
893
    //Pointer to the distance of the target node.
894
    void *_di;
895

	
896
    public:
897
    /// Constructor.
898
    
899
    /// This constructor does not require parameters, it initiates
900
    /// all of the attributes to default values \c 0.
901
    BellmanFordWizardBase() :
902
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
903

	
904
    /// Constructor.
905
    
906
    /// This constructor requires two parameters,
907
    /// others are initiated to \c 0.
908
    /// \param gr The digraph the algorithm runs on.
909
    /// \param len The length map.
910
    BellmanFordWizardBase(const GR& gr, 
911
			  const LEN& len) :
912
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
913
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
914
      _pred(0), _dist(0), _path(0), _di(0) {}
915

	
916
  };
917
  
918
  /// \brief Auxiliary class for the function-type interface of the
919
  /// \ref BellmanFord "Bellman-Ford" algorithm.
920
  ///
921
  /// This auxiliary class is created to implement the
922
  /// \ref bellmanFord() "function-type interface" of the
923
  /// \ref BellmanFord "Bellman-Ford" algorithm.
924
  /// It does not have own \ref run() method, it uses the
925
  /// functions and features of the plain \ref BellmanFord.
926
  ///
927
  /// This class should only be used through the \ref bellmanFord()
928
  /// function, which makes it easier to use the algorithm.
929
  template<class TR>
930
  class BellmanFordWizard : public TR {
931
    typedef TR Base;
932

	
933
    typedef typename TR::Digraph Digraph;
934

	
935
    typedef typename Digraph::Node Node;
936
    typedef typename Digraph::NodeIt NodeIt;
937
    typedef typename Digraph::Arc Arc;
938
    typedef typename Digraph::OutArcIt ArcIt;
939
    
940
    typedef typename TR::LengthMap LengthMap;
941
    typedef typename LengthMap::Value Value;
942
    typedef typename TR::PredMap PredMap;
943
    typedef typename TR::DistMap DistMap;
944
    typedef typename TR::Path Path;
945

	
946
  public:
947
    /// Constructor.
948
    BellmanFordWizard() : TR() {}
949

	
950
    /// \brief Constructor that requires parameters.
951
    ///
952
    /// Constructor that requires parameters.
953
    /// These parameters will be the default values for the traits class.
954
    /// \param gr The digraph the algorithm runs on.
955
    /// \param len The length map.
956
    BellmanFordWizard(const Digraph& gr, const LengthMap& len) 
957
      : TR(gr, len) {}
958

	
959
    /// \brief Copy constructor
960
    BellmanFordWizard(const TR &b) : TR(b) {}
961

	
962
    ~BellmanFordWizard() {}
963

	
964
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
965
    ///    
966
    /// This method runs the Bellman-Ford algorithm from the given source
967
    /// node in order to compute the shortest path to each node.
968
    void run(Node s) {
969
      BellmanFord<Digraph,LengthMap,TR> 
970
	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
971
           *reinterpret_cast<const LengthMap*>(Base::_length));
972
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
973
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
974
      bf.run(s);
975
    }
976

	
977
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
978
    /// between \c s and \c t.
979
    ///
980
    /// This method runs the Bellman-Ford algorithm from node \c s
981
    /// in order to compute the shortest path to node \c t.
982
    /// Actually, it computes the shortest path to each node, but using
983
    /// this function you can retrieve the distance and the shortest path
984
    /// for a single target node easier.
985
    ///
986
    /// \return \c true if \c t is reachable form \c s.
987
    bool run(Node s, Node t) {
988
      BellmanFord<Digraph,LengthMap,TR>
989
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
990
           *reinterpret_cast<const LengthMap*>(Base::_length));
991
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
992
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
993
      bf.run(s);
994
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
995
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
996
      return bf.reached(t);
997
    }
998

	
999
    template<class T>
1000
    struct SetPredMapBase : public Base {
1001
      typedef T PredMap;
1002
      static PredMap *createPredMap(const Digraph &) { return 0; };
1003
      SetPredMapBase(const TR &b) : TR(b) {}
1004
    };
1005
    
1006
    /// \brief \ref named-templ-param "Named parameter" for setting
1007
    /// the predecessor map.
1008
    ///
1009
    /// \ref named-templ-param "Named parameter" for setting
1010
    /// the map that stores the predecessor arcs of the nodes.
1011
    template<class T>
1012
    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
1013
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1014
      return BellmanFordWizard<SetPredMapBase<T> >(*this);
1015
    }
1016
    
1017
    template<class T>
1018
    struct SetDistMapBase : public Base {
1019
      typedef T DistMap;
1020
      static DistMap *createDistMap(const Digraph &) { return 0; };
1021
      SetDistMapBase(const TR &b) : TR(b) {}
1022
    };
1023
    
1024
    /// \brief \ref named-templ-param "Named parameter" for setting
1025
    /// the distance map.
1026
    ///
1027
    /// \ref named-templ-param "Named parameter" for setting
1028
    /// the map that stores the distances of the nodes calculated
1029
    /// by the algorithm.
1030
    template<class T>
1031
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1032
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1033
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1034
    }
1035

	
1036
    template<class T>
1037
    struct SetPathBase : public Base {
1038
      typedef T Path;
1039
      SetPathBase(const TR &b) : TR(b) {}
1040
    };
1041

	
1042
    /// \brief \ref named-func-param "Named parameter" for getting
1043
    /// the shortest path to the target node.
1044
    ///
1045
    /// \ref named-func-param "Named parameter" for getting
1046
    /// the shortest path to the target node.
1047
    template<class T>
1048
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1049
    {
1050
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1051
      return BellmanFordWizard<SetPathBase<T> >(*this);
1052
    }
1053

	
1054
    /// \brief \ref named-func-param "Named parameter" for getting
1055
    /// the distance of the target node.
1056
    ///
1057
    /// \ref named-func-param "Named parameter" for getting
1058
    /// the distance of the target node.
1059
    BellmanFordWizard dist(const Value &d)
1060
    {
1061
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1062
      return *this;
1063
    }
1064
    
1065
  };
1066
  
1067
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1068
  /// algorithm.
1069
  ///
1070
  /// \ingroup shortest_path
1071
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1072
  /// algorithm.
1073
  ///
1074
  /// This function also has several \ref named-templ-func-param 
1075
  /// "named parameters", they are declared as the members of class 
1076
  /// \ref BellmanFordWizard.
1077
  /// The following examples show how to use these parameters.
1078
  /// \code
1079
  ///   // Compute shortest path from node s to each node
1080
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1081
  ///
1082
  ///   // Compute shortest path from s to t
1083
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1084
  /// \endcode
1085
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1086
  /// to the end of the parameter list.
1087
  /// \sa BellmanFordWizard
1088
  /// \sa BellmanFord
1089
  template<typename GR, typename LEN>
1090
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1091
  bellmanFord(const GR& digraph,
1092
	      const LEN& length)
1093
  {
1094
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1095
  }
1096

	
1097
} //END OF NAMESPACE LEMON
1098

	
1099
#endif
1100

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

	
19
#ifndef LEMON_BINOM_HEAP_H
20
#define LEMON_BINOM_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Binomial Heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30
#include <lemon/counter.h>
31

	
32
namespace lemon {
33

	
34
  /// \ingroup heaps
35
  ///
36
  ///\brief Binomial heap data structure.
37
  ///
38
  /// This class implements the \e binomial \e heap data structure.
39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40
  ///
41
  /// The methods \ref increase() and \ref erase() are not efficient
42
  /// in a binomial heap. In case of many calls of these operations,
43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44
  /// "binary heap".
45
  ///
46
  /// \tparam PR Type of the priorities of the items.
47
  /// \tparam IM A read-writable item map with \c int values, used
48
  /// internally to handle the cross references.
49
  /// \tparam CMP A functor class for comparing the priorities.
50
  /// The default is \c std::less<PR>.
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class BinomHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Functor type for comparing the priorities.
65
    typedef CMP Compare;
66

	
67
    /// \brief Type to represent the states of the items.
68
    ///
69
    /// Each item has a state associated to it. It can be "in heap",
70
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71
    /// heap's point of view, but may be useful to the user.
72
    ///
73
    /// The item-int map must be initialized in such way that it assigns
74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75
    enum State {
76
      IN_HEAP = 0,    ///< = 0.
77
      PRE_HEAP = -1,  ///< = -1.
78
      POST_HEAP = -2  ///< = -2.
79
    };
80

	
81
  private:
82
    class Store;
83

	
84
    std::vector<Store> _data;
85
    int _min, _head;
86
    ItemIntMap &_iim;
87
    Compare _comp;
88
    int _num_items;
89

	
90
  public:
91
    /// \brief Constructor.
92
    ///
93
    /// Constructor.
94
    /// \param map A map that assigns \c int values to the items.
95
    /// It is used internally to handle the cross references.
96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97
    explicit BinomHeap(ItemIntMap &map)
98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99

	
100
    /// \brief Constructor.
101
    ///
102
    /// Constructor.
103
    /// \param map A map that assigns \c int values to the items.
104
    /// It is used internally to handle the cross references.
105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106
    /// \param comp The function object used for comparing the priorities.
107
    BinomHeap(ItemIntMap &map, const Compare &comp)
108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109

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

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

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

	
131
    /// \brief Set the priority of an item or insert it, if it is
132
    /// not stored in the heap.
133
    ///
134
    /// This method sets the priority of the given item if it is
135
    /// already stored in the heap. Otherwise it inserts the given
136
    /// item into the heap with the given priority.
137
    /// \param item The item.
138
    /// \param value The priority.
139
    void set (const Item& item, const Prio& value) {
140
      int i=_iim[item];
141
      if ( i >= 0 && _data[i].in ) {
142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144
      } else push(item, value);
145
    }
146

	
147
    /// \brief Insert an item into the heap with the given priority.
148
    ///
149
    /// This function inserts the given item into the heap with the
150
    /// given priority.
151
    /// \param item The item to insert.
152
    /// \param value The priority of the item.
153
    /// \pre \e item must not be stored in the heap.
154
    void push (const Item& item, const Prio& value) {
155
      int i=_iim[item];
156
      if ( i<0 ) {
157
        int s=_data.size();
158
        _iim.set( item,s );
159
        Store st;
160
        st.name=item;
161
        st.prio=value;
162
        _data.push_back(st);
163
        i=s;
164
      }
165
      else {
166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
        _data[i].prio=value;
170
      }
171

	
172
      if( 0==_num_items ) {
173
        _head=i;
174
        _min=i;
175
      } else {
176
        merge(i);
177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178
      }
179
      ++_num_items;
180
    }
181

	
182
    /// \brief Return the item having minimum priority.
183
    ///
184
    /// This function returns the item having minimum priority.
185
    /// \pre The heap must be non-empty.
186
    Item top() const { return _data[_min].name; }
187

	
188
    /// \brief The minimum priority.
189
    ///
190
    /// This function returns the minimum priority.
191
    /// \pre The heap must be non-empty.
192
    Prio prio() const { return _data[_min].prio; }
193

	
194
    /// \brief The priority of the given item.
195
    ///
196
    /// This function returns the priority of the given item.
197
    /// \param item The item.
198
    /// \pre \e item must be in the heap.
199
    const Prio& operator[](const Item& item) const {
200
      return _data[_iim[item]].prio;
201
    }
202

	
203
    /// \brief Remove the item having minimum priority.
204
    ///
205
    /// This function removes the item having minimum priority.
206
    /// \pre The heap must be non-empty.
207
    void pop() {
208
      _data[_min].in=false;
209

	
210
      int head_child=-1;
211
      if ( _data[_min].child!=-1 ) {
212
        int child=_data[_min].child;
213
        int neighb;
214
        while( child!=-1 ) {
215
          neighb=_data[child].right_neighbor;
216
          _data[child].parent=-1;
217
          _data[child].right_neighbor=head_child;
218
          head_child=child;
219
          child=neighb;
220
        }
221
      }
222

	
223
      if ( _data[_head].right_neighbor==-1 ) {
224
        // there was only one root
225
        _head=head_child;
226
      }
227
      else {
228
        // there were more roots
229
        if( _head!=_min )  { unlace(_min); }
230
        else { _head=_data[_head].right_neighbor; }
231
        merge(head_child);
232
      }
233
      _min=findMin();
234
      --_num_items;
235
    }
236

	
237
    /// \brief Remove the given item from the heap.
238
    ///
239
    /// This function removes the given item from the heap if it is
240
    /// already stored.
241
    /// \param item The item to delete.
242
    /// \pre \e item must be in the heap.
243
    void erase (const Item& item) {
244
      int i=_iim[item];
245
      if ( i >= 0 && _data[i].in ) {
246
        decrease( item, _data[_min].prio-1 );
247
        pop();
248
      }
249
    }
250

	
251
    /// \brief Decrease the priority of an item to the given value.
252
    ///
253
    /// This function decreases the priority of an item to the given value.
254
    /// \param item The item.
255
    /// \param value The priority.
256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257
    void decrease (Item item, const Prio& value) {
258
      int i=_iim[item];
259
      int p=_data[i].parent;
260
      _data[i].prio=value;
261
      
262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263
        _data[i].name=_data[p].name;
264
        _data[i].prio=_data[p].prio;
265
        _data[p].name=item;
266
        _data[p].prio=value;
267
        _iim[_data[i].name]=i;
268
        i=p;
269
        p=_data[p].parent;
270
      }
271
      _iim[item]=i;
272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273
    }
274

	
275
    /// \brief Increase the priority of an item to the given value.
276
    ///
277
    /// This function increases the priority of an item to the given value.
278
    /// \param item The item.
279
    /// \param value The priority.
280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281
    void increase (Item item, const Prio& value) {
282
      erase(item);
283
      push(item, value);
284
    }
285

	
286
    /// \brief Return the state of an item.
287
    ///
288
    /// This method returns \c PRE_HEAP if the given item has never
289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290
    /// and \c POST_HEAP otherwise.
291
    /// In the latter case it is possible that the item will get back
292
    /// to the heap again.
293
    /// \param item The item.
294
    State state(const Item &item) const {
295
      int i=_iim[item];
296
      if( i>=0 ) {
297
        if ( _data[i].in ) i=0;
298
        else i=-2;
299
      }
300
      return State(i);
301
    }
302

	
303
    /// \brief Set the state of an item in the heap.
304
    ///
305
    /// This function sets the state of the given item in the heap.
306
    /// It can be used to manually clear the heap when it is important
307
    /// to achive better time complexity.
308
    /// \param i The item.
309
    /// \param st The state. It should not be \c IN_HEAP.
310
    void state(const Item& i, State st) {
311
      switch (st) {
312
      case POST_HEAP:
313
      case PRE_HEAP:
314
        if (state(i) == IN_HEAP) {
315
          erase(i);
316
        }
317
        _iim[i] = st;
318
        break;
319
      case IN_HEAP:
320
        break;
321
      }
322
    }
323

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

	
342
    // Merge the heap with another heap starting at the given position
343
    void merge(int a) {
344
      if( _head==-1 || a==-1 ) return;
345
      if( _data[a].right_neighbor==-1 &&
346
          _data[a].degree<=_data[_head].degree ) {
347
        _data[a].right_neighbor=_head;
348
        _head=a;
349
      } else {
350
        interleave(a);
351
      }
352
      if( _data[_head].right_neighbor==-1 ) return;
353
      
354
      int x=_head;
355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356
      while( x_next!=-1 ) {
357
        if( _data[x].degree!=_data[x_next].degree ||
358
            ( _data[x_next].right_neighbor!=-1 &&
359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360
          x_prev=x;
361
          x=x_next;
362
        }
363
        else {
364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365
            if( x_prev==-1 ) {
366
              _head=x_next;
367
            } else {
368
              _data[x_prev].right_neighbor=x_next;
369
            }
370
            fuse(x,x_next);
371
            x=x_next;
372
          }
373
          else {
374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375
            fuse(x_next,x);
376
          }
377
        }
378
        x_next=_data[x].right_neighbor;
379
      }
380
    }
381

	
382
    // Interleave the elements of the given list into the list of the roots
383
    void interleave(int a) {
384
      int p=_head, q=a;
385
      int curr=_data.size();
386
      _data.push_back(Store());
387
      
388
      while( p!=-1 || q!=-1 ) {
389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390
          _data[curr].right_neighbor=p;
391
          curr=p;
392
          p=_data[p].right_neighbor;
393
        }
394
        else {
395
          _data[curr].right_neighbor=q;
396
          curr=q;
397
          q=_data[q].right_neighbor;
398
        }
399
      }
400
      
401
      _head=_data.back().right_neighbor;
402
      _data.pop_back();
403
    }
404

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

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

	
414
    // Unlace node a (if it has siblings)
415
    void unlace(int a) {
416
      int neighb=_data[a].right_neighbor;
417
      int other=_head;
418

	
419
      while( _data[other].right_neighbor!=a )
420
        other=_data[other].right_neighbor;
421
      _data[other].right_neighbor=neighb;
422
    }
423

	
424
  private:
425

	
426
    class Store {
427
      friend class BinomHeap;
428

	
429
      Item name;
430
      int parent;
431
      int right_neighbor;
432
      int child;
433
      int degree;
434
      bool in;
435
      Prio prio;
436

	
437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438
        in(true) {}
439
    };
440
  };
441

	
442
} //namespace lemon
443

	
444
#endif //LEMON_BINOM_HEAP_H
445

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

	
19
#ifndef LEMON_BUCKET_HEAP_H
20
#define LEMON_BUCKET_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Bucket heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  namespace _bucket_heap_bits {
33

	
34
    template <bool MIN>
35
    struct DirectionTraits {
36
      static bool less(int left, int right) {
37
        return left < right;
38
      }
39
      static void increase(int& value) {
40
        ++value;
41
      }
42
    };
43

	
44
    template <>
45
    struct DirectionTraits<false> {
46
      static bool less(int left, int right) {
47
        return left > right;
48
      }
49
      static void increase(int& value) {
50
        --value;
51
      }
52
    };
53

	
54
  }
55

	
56
  /// \ingroup heaps
57
  ///
58
  /// \brief Bucket heap data structure.
59
  ///
60
  /// This class implements the \e bucket \e heap data structure.
61
  /// It practically conforms to the \ref concepts::Heap "heap concept",
62
  /// but it has some limitations.
63
  ///
64
  /// The bucket heap is a very simple structure. It can store only
65
  /// \c int priorities and it maintains a list of items for each priority
66
  /// in the range <tt>[0..C)</tt>. So it should only be used when the
67
  /// priorities are small. It is not intended to use as a Dijkstra heap.
68
  ///
69
  /// \tparam IM A read-writable item map with \c int values, used
70
  /// internally to handle the cross references.
71
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
72
  /// The default is \e min-heap. If this parameter is set to \c false,
73
  /// then the comparison is reversed, so the top(), prio() and pop()
74
  /// functions deal with the item having maximum priority instead of the
75
  /// minimum.
76
  ///
77
  /// \sa SimpleBucketHeap
78
  template <typename IM, bool MIN = true>
79
  class BucketHeap {
80

	
81
  public:
82

	
83
    /// Type of the item-int map.
84
    typedef IM ItemIntMap;
85
    /// Type of the priorities.
86
    typedef int Prio;
87
    /// Type of the items stored in the heap.
88
    typedef typename ItemIntMap::Key Item;
89
    /// Type of the item-priority pairs.
90
    typedef std::pair<Item,Prio> Pair;
91

	
92
  private:
93

	
94
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
95

	
96
  public:
97

	
98
    /// \brief Type to represent the states of the items.
99
    ///
100
    /// Each item has a state associated to it. It can be "in heap",
101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
102
    /// heap's point of view, but may be useful to the user.
103
    ///
104
    /// The item-int map must be initialized in such way that it assigns
105
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
106
    enum State {
107
      IN_HEAP = 0,    ///< = 0.
108
      PRE_HEAP = -1,  ///< = -1.
109
      POST_HEAP = -2  ///< = -2.
110
    };
111

	
112
  public:
113

	
114
    /// \brief Constructor.
115
    ///
116
    /// Constructor.
117
    /// \param map A map that assigns \c int values to the items.
118
    /// It is used internally to handle the cross references.
119
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
120
    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
121

	
122
    /// \brief The number of items stored in the heap.
123
    ///
124
    /// This function returns the number of items stored in the heap.
125
    int size() const { return _data.size(); }
126

	
127
    /// \brief Check if the heap is empty.
128
    ///
129
    /// This function returns \c true if the heap is empty.
130
    bool empty() const { return _data.empty(); }
131

	
132
    /// \brief Make the heap empty.
133
    ///
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
139
    void clear() {
140
      _data.clear(); _first.clear(); _minimum = 0;
141
    }
142

	
143
  private:
144

	
145
    void relocateLast(int idx) {
146
      if (idx + 1 < int(_data.size())) {
147
        _data[idx] = _data.back();
148
        if (_data[idx].prev != -1) {
149
          _data[_data[idx].prev].next = idx;
150
        } else {
151
          _first[_data[idx].value] = idx;
152
        }
153
        if (_data[idx].next != -1) {
154
          _data[_data[idx].next].prev = idx;
155
        }
156
        _iim[_data[idx].item] = idx;
157
      }
158
      _data.pop_back();
159
    }
160

	
161
    void unlace(int idx) {
162
      if (_data[idx].prev != -1) {
163
        _data[_data[idx].prev].next = _data[idx].next;
164
      } else {
165
        _first[_data[idx].value] = _data[idx].next;
166
      }
167
      if (_data[idx].next != -1) {
168
        _data[_data[idx].next].prev = _data[idx].prev;
169
      }
170
    }
171

	
172
    void lace(int idx) {
173
      if (int(_first.size()) <= _data[idx].value) {
174
        _first.resize(_data[idx].value + 1, -1);
175
      }
176
      _data[idx].next = _first[_data[idx].value];
177
      if (_data[idx].next != -1) {
178
        _data[_data[idx].next].prev = idx;
179
      }
180
      _first[_data[idx].value] = idx;
181
      _data[idx].prev = -1;
182
    }
183

	
184
  public:
185

	
186
    /// \brief Insert a pair of item and priority into the heap.
187
    ///
188
    /// This function inserts \c p.first to the heap with priority
189
    /// \c p.second.
190
    /// \param p The pair to insert.
191
    /// \pre \c p.first must not be stored in the heap.
192
    void push(const Pair& p) {
193
      push(p.first, p.second);
194
    }
195

	
196
    /// \brief Insert an item into the heap with the given priority.
197
    ///
198
    /// This function inserts the given item into the heap with the
199
    /// given priority.
200
    /// \param i The item to insert.
201
    /// \param p The priority of the item.
202
    /// \pre \e i must not be stored in the heap.
203
    void push(const Item &i, const Prio &p) {
204
      int idx = _data.size();
205
      _iim[i] = idx;
206
      _data.push_back(BucketItem(i, p));
207
      lace(idx);
208
      if (Direction::less(p, _minimum)) {
209
        _minimum = p;
210
      }
211
    }
212

	
213
    /// \brief Return the item having minimum priority.
214
    ///
215
    /// This function returns the item having minimum priority.
216
    /// \pre The heap must be non-empty.
217
    Item top() const {
218
      while (_first[_minimum] == -1) {
219
        Direction::increase(_minimum);
220
      }
221
      return _data[_first[_minimum]].item;
222
    }
223

	
224
    /// \brief The minimum priority.
225
    ///
226
    /// This function returns the minimum priority.
227
    /// \pre The heap must be non-empty.
228
    Prio prio() const {
229
      while (_first[_minimum] == -1) {
230
        Direction::increase(_minimum);
231
      }
232
      return _minimum;
233
    }
234

	
235
    /// \brief Remove the item having minimum priority.
236
    ///
237
    /// This function removes the item having minimum priority.
238
    /// \pre The heap must be non-empty.
239
    void pop() {
240
      while (_first[_minimum] == -1) {
241
        Direction::increase(_minimum);
242
      }
243
      int idx = _first[_minimum];
244
      _iim[_data[idx].item] = -2;
245
      unlace(idx);
246
      relocateLast(idx);
247
    }
248

	
249
    /// \brief Remove the given item from the heap.
250
    ///
251
    /// This function removes the given item from the heap if it is
252
    /// already stored.
253
    /// \param i The item to delete.
254
    /// \pre \e i must be in the heap.
255
    void erase(const Item &i) {
256
      int idx = _iim[i];
257
      _iim[_data[idx].item] = -2;
258
      unlace(idx);
259
      relocateLast(idx);
260
    }
261

	
262
    /// \brief The priority of the given item.
263
    ///
264
    /// This function returns the priority of the given item.
265
    /// \param i The item.
266
    /// \pre \e i must be in the heap.
267
    Prio operator[](const Item &i) const {
268
      int idx = _iim[i];
269
      return _data[idx].value;
270
    }
271

	
272
    /// \brief Set the priority of an item or insert it, if it is
273
    /// not stored in the heap.
274
    ///
275
    /// This method sets the priority of the given item if it is
276
    /// already stored in the heap. Otherwise it inserts the given
277
    /// item into the heap with the given priority.
278
    /// \param i The item.
279
    /// \param p The priority.
280
    void set(const Item &i, const Prio &p) {
281
      int idx = _iim[i];
282
      if (idx < 0) {
283
        push(i, p);
284
      } else if (Direction::less(p, _data[idx].value)) {
285
        decrease(i, p);
286
      } else {
287
        increase(i, p);
288
      }
289
    }
290

	
291
    /// \brief Decrease the priority of an item to the given value.
292
    ///
293
    /// This function decreases the priority of an item to the given value.
294
    /// \param i The item.
295
    /// \param p The priority.
296
    /// \pre \e i must be stored in the heap with priority at least \e p.
297
    void decrease(const Item &i, const Prio &p) {
298
      int idx = _iim[i];
299
      unlace(idx);
300
      _data[idx].value = p;
301
      if (Direction::less(p, _minimum)) {
302
        _minimum = p;
303
      }
304
      lace(idx);
305
    }
306

	
307
    /// \brief Increase the priority of an item to the given value.
308
    ///
309
    /// This function increases the priority of an item to the given value.
310
    /// \param i The item.
311
    /// \param p The priority.
312
    /// \pre \e i must be stored in the heap with priority at most \e p.
313
    void increase(const Item &i, const Prio &p) {
314
      int idx = _iim[i];
315
      unlace(idx);
316
      _data[idx].value = p;
317
      lace(idx);
318
    }
319

	
320
    /// \brief Return the state of an item.
321
    ///
322
    /// This method returns \c PRE_HEAP if the given item has never
323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324
    /// and \c POST_HEAP otherwise.
325
    /// In the latter case it is possible that the item will get back
326
    /// to the heap again.
327
    /// \param i The item.
328
    State state(const Item &i) const {
329
      int idx = _iim[i];
330
      if (idx >= 0) idx = 0;
331
      return State(idx);
332
    }
333

	
334
    /// \brief Set the state of an item in the heap.
335
    ///
336
    /// This function sets the state of the given item in the heap.
337
    /// It can be used to manually clear the heap when it is important
338
    /// to achive better time complexity.
339
    /// \param i The item.
340
    /// \param st The state. It should not be \c IN_HEAP.
341
    void state(const Item& i, State st) {
342
      switch (st) {
343
      case POST_HEAP:
344
      case PRE_HEAP:
345
        if (state(i) == IN_HEAP) {
346
          erase(i);
347
        }
348
        _iim[i] = st;
349
        break;
350
      case IN_HEAP:
351
        break;
352
      }
353
    }
354

	
355
  private:
356

	
357
    struct BucketItem {
358
      BucketItem(const Item& _item, int _value)
359
        : item(_item), value(_value) {}
360

	
361
      Item item;
362
      int value;
363

	
364
      int prev, next;
365
    };
366

	
367
    ItemIntMap& _iim;
368
    std::vector<int> _first;
369
    std::vector<BucketItem> _data;
370
    mutable int _minimum;
371

	
372
  }; // class BucketHeap
373

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

	
402
  public:
403

	
404
    /// Type of the item-int map.
405
    typedef IM ItemIntMap;
406
    /// Type of the priorities.
407
    typedef int Prio;
408
    /// Type of the items stored in the heap.
409
    typedef typename ItemIntMap::Key Item;
410
    /// Type of the item-priority pairs.
411
    typedef std::pair<Item,Prio> Pair;
412

	
413
  private:
414

	
415
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
416

	
417
  public:
418

	
419
    /// \brief Type to represent the states of the items.
420
    ///
421
    /// Each item has a state associated to it. It can be "in heap",
422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
423
    /// heap's point of view, but may be useful to the user.
424
    ///
425
    /// The item-int map must be initialized in such way that it assigns
426
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
427
    enum State {
428
      IN_HEAP = 0,    ///< = 0.
429
      PRE_HEAP = -1,  ///< = -1.
430
      POST_HEAP = -2  ///< = -2.
431
    };
432

	
433
  public:
434

	
435
    /// \brief Constructor.
436
    ///
437
    /// Constructor.
438
    /// \param map A map that assigns \c int values to the items.
439
    /// It is used internally to handle the cross references.
440
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
441
    explicit SimpleBucketHeap(ItemIntMap &map)
442
      : _iim(map), _free(-1), _num(0), _minimum(0) {}
443

	
444
    /// \brief The number of items stored in the heap.
445
    ///
446
    /// This function returns the number of items stored in the heap.
447
    int size() const { return _num; }
448

	
449
    /// \brief Check if the heap is empty.
450
    ///
451
    /// This function returns \c true if the heap is empty.
452
    bool empty() const { return _num == 0; }
453

	
454
    /// \brief Make the heap empty.
455
    ///
456
    /// This functon makes the heap empty.
457
    /// It does not change the cross reference map. If you want to reuse
458
    /// a heap that is not surely empty, you should first clear it and
459
    /// then you should set the cross reference map to \c PRE_HEAP
460
    /// for each item.
461
    void clear() {
462
      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
463
    }
464

	
465
    /// \brief Insert a pair of item and priority into the heap.
466
    ///
467
    /// This function inserts \c p.first to the heap with priority
468
    /// \c p.second.
469
    /// \param p The pair to insert.
470
    /// \pre \c p.first must not be stored in the heap.
471
    void push(const Pair& p) {
472
      push(p.first, p.second);
473
    }
474

	
475
    /// \brief Insert an item into the heap with the given priority.
476
    ///
477
    /// This function inserts the given item into the heap with the
478
    /// given priority.
479
    /// \param i The item to insert.
480
    /// \param p The priority of the item.
481
    /// \pre \e i must not be stored in the heap.
482
    void push(const Item &i, const Prio &p) {
483
      int idx;
484
      if (_free == -1) {
485
        idx = _data.size();
486
        _data.push_back(BucketItem(i));
487
      } else {
488
        idx = _free;
489
        _free = _data[idx].next;
490
        _data[idx].item = i;
491
      }
492
      _iim[i] = idx;
493
      if (p >= int(_first.size())) _first.resize(p + 1, -1);
494
      _data[idx].next = _first[p];
495
      _first[p] = idx;
496
      if (Direction::less(p, _minimum)) {
497
        _minimum = p;
498
      }
499
      ++_num;
500
    }
501

	
502
    /// \brief Return the item having minimum priority.
503
    ///
504
    /// This function returns the item having minimum priority.
505
    /// \pre The heap must be non-empty.
506
    Item top() const {
507
      while (_first[_minimum] == -1) {
508
        Direction::increase(_minimum);
509
      }
510
      return _data[_first[_minimum]].item;
511
    }
512

	
513
    /// \brief The minimum priority.
514
    ///
515
    /// This function returns the minimum priority.
516
    /// \pre The heap must be non-empty.
517
    Prio prio() const {
518
      while (_first[_minimum] == -1) {
519
        Direction::increase(_minimum);
520
      }
521
      return _minimum;
522
    }
523

	
524
    /// \brief Remove the item having minimum priority.
525
    ///
526
    /// This function removes the item having minimum priority.
527
    /// \pre The heap must be non-empty.
528
    void pop() {
529
      while (_first[_minimum] == -1) {
530
        Direction::increase(_minimum);
531
      }
532
      int idx = _first[_minimum];
533
      _iim[_data[idx].item] = -2;
534
      _first[_minimum] = _data[idx].next;
535
      _data[idx].next = _free;
536
      _free = idx;
537
      --_num;
538
    }
539

	
540
    /// \brief The priority of the given item.
541
    ///
542
    /// This function returns the priority of the given item.
543
    /// \param i The item.
544
    /// \pre \e i must be in the heap.
545
    /// \warning This operator is not a constant time function because
546
    /// it scans the whole data structure to find the proper value.
547
    Prio operator[](const Item &i) const {
548
      for (int k = 0; k < int(_first.size()); ++k) {
549
        int idx = _first[k];
550
        while (idx != -1) {
551
          if (_data[idx].item == i) {
552
            return k;
553
          }
554
          idx = _data[idx].next;
555
        }
556
      }
557
      return -1;
558
    }
559

	
560
    /// \brief Return the state of an item.
561
    ///
562
    /// This method returns \c PRE_HEAP if the given item has never
563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564
    /// and \c POST_HEAP otherwise.
565
    /// In the latter case it is possible that the item will get back
566
    /// to the heap again.
567
    /// \param i The item.
568
    State state(const Item &i) const {
569
      int idx = _iim[i];
570
      if (idx >= 0) idx = 0;
571
      return State(idx);
572
    }
573

	
574
  private:
575

	
576
    struct BucketItem {
577
      BucketItem(const Item& _item)
578
        : item(_item) {}
579

	
580
      Item item;
581
      int next;
582
    };
583

	
584
    ItemIntMap& _iim;
585
    std::vector<int> _first;
586
    std::vector<BucketItem> _data;
587
    int _free, _num;
588
    mutable int _minimum;
589

	
590
  }; // class SimpleBucketHeap
591

	
592
}
593

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

	
19
#ifndef LEMON_FIB_HEAP_H
20
#define LEMON_FIB_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Fibonacci heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30

	
31
namespace lemon {
32

	
33
  /// \ingroup heaps
34
  ///
35
  /// \brief Fibonacci heap data structure.
36
  ///
37
  /// This class implements the \e Fibonacci \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The methods \ref increase() and \ref erase() are not efficient in a
41
  /// Fibonacci heap. In case of many calls of these operations, it is
42
  /// better to use other heap structure, e.g. \ref BinHeap "binary heap".
43
  ///
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
49
#ifdef DOXYGEN
50
  template <typename PR, typename IM, typename CMP>
51
#else
52
  template <typename PR, typename IM, typename CMP = std::less<PR> >
53
#endif
54
  class FibHeap {
55
  public:
56

	
57
    /// Type of the item-int map.
58
    typedef IM ItemIntMap;
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
62
    typedef typename ItemIntMap::Key Item;
63
    /// Type of the item-priority pairs.
64
    typedef std::pair<Item,Prio> Pair;
65
    /// Functor type for comparing the priorities.
66
    typedef CMP Compare;
67

	
68
  private:
69
    class Store;
70

	
71
    std::vector<Store> _data;
72
    int _minimum;
73
    ItemIntMap &_iim;
74
    Compare _comp;
75
    int _num;
76

	
77
  public:
78

	
79
    /// \brief Type to represent the states of the items.
80
    ///
81
    /// Each item has a state associated to it. It can be "in heap",
82
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
83
    /// heap's point of view, but may be useful to the user.
84
    ///
85
    /// The item-int map must be initialized in such way that it assigns
86
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
87
    enum State {
88
      IN_HEAP = 0,    ///< = 0.
89
      PRE_HEAP = -1,  ///< = -1.
90
      POST_HEAP = -2  ///< = -2.
91
    };
92

	
93
    /// \brief Constructor.
94
    ///
95
    /// Constructor.
96
    /// \param map A map that assigns \c int values to the items.
97
    /// It is used internally to handle the cross references.
98
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
99
    explicit FibHeap(ItemIntMap &map)
100
      : _minimum(0), _iim(map), _num() {}
101

	
102
    /// \brief Constructor.
103
    ///
104
    /// Constructor.
105
    /// \param map A map that assigns \c int values to the items.
106
    /// It is used internally to handle the cross references.
107
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
108
    /// \param comp The function object used for comparing the priorities.
109
    FibHeap(ItemIntMap &map, const Compare &comp)
110
      : _minimum(0), _iim(map), _comp(comp), _num() {}
111

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

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

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

	
133
    /// \brief Insert an item into the heap with the given priority.
134
    ///
135
    /// This function inserts the given item into the heap with the
136
    /// given priority.
137
    /// \param item The item to insert.
138
    /// \param prio The priority of the item.
139
    /// \pre \e item must not be stored in the heap.
140
    void push (const Item& item, const Prio& prio) {
141
      int i=_iim[item];
142
      if ( i < 0 ) {
143
        int s=_data.size();
144
        _iim.set( item, s );
145
        Store st;
146
        st.name=item;
147
        _data.push_back(st);
148
        i=s;
149
      } else {
150
        _data[i].parent=_data[i].child=-1;
151
        _data[i].degree=0;
152
        _data[i].in=true;
153
        _data[i].marked=false;
154
      }
155

	
156
      if ( _num ) {
157
        _data[_data[_minimum].right_neighbor].left_neighbor=i;
158
        _data[i].right_neighbor=_data[_minimum].right_neighbor;
159
        _data[_minimum].right_neighbor=i;
160
        _data[i].left_neighbor=_minimum;
161
        if ( _comp( prio, _data[_minimum].prio) ) _minimum=i;
162
      } else {
163
        _data[i].right_neighbor=_data[i].left_neighbor=i;
164
        _minimum=i;
165
      }
166
      _data[i].prio=prio;
167
      ++_num;
168
    }
169

	
170
    /// \brief Return the item having minimum priority.
171
    ///
172
    /// This function returns the item having minimum priority.
173
    /// \pre The heap must be non-empty.
174
    Item top() const { return _data[_minimum].name; }
175

	
176
    /// \brief The minimum priority.
177
    ///
178
    /// This function returns the minimum priority.
179
    /// \pre The heap must be non-empty.
180
    Prio prio() const { return _data[_minimum].prio; }
181

	
182
    /// \brief Remove the item having minimum priority.
183
    ///
184
    /// This function removes the item having minimum priority.
185
    /// \pre The heap must be non-empty.
186
    void pop() {
187
      /*The first case is that there are only one root.*/
188
      if ( _data[_minimum].left_neighbor==_minimum ) {
189
        _data[_minimum].in=false;
190
        if ( _data[_minimum].degree!=0 ) {
191
          makeRoot(_data[_minimum].child);
192
          _minimum=_data[_minimum].child;
193
          balance();
194
        }
195
      } else {
196
        int right=_data[_minimum].right_neighbor;
197
        unlace(_minimum);
198
        _data[_minimum].in=false;
199
        if ( _data[_minimum].degree > 0 ) {
200
          int left=_data[_minimum].left_neighbor;
201
          int child=_data[_minimum].child;
202
          int last_child=_data[child].left_neighbor;
203

	
204
          makeRoot(child);
205

	
206
          _data[left].right_neighbor=child;
207
          _data[child].left_neighbor=left;
208
          _data[right].left_neighbor=last_child;
209
          _data[last_child].right_neighbor=right;
210
        }
211
        _minimum=right;
212
        balance();
213
      } // the case where there are more roots
214
      --_num;
215
    }
216

	
217
    /// \brief Remove the given item from the heap.
218
    ///
219
    /// This function removes the given item from the heap if it is
220
    /// already stored.
221
    /// \param item The item to delete.
222
    /// \pre \e item must be in the heap.
223
    void erase (const Item& item) {
224
      int i=_iim[item];
225

	
226
      if ( i >= 0 && _data[i].in ) {
227
        if ( _data[i].parent!=-1 ) {
228
          int p=_data[i].parent;
229
          cut(i,p);
230
          cascade(p);
231
        }
232
        _minimum=i;     //As if its prio would be -infinity
233
        pop();
234
      }
235
    }
236

	
237
    /// \brief The priority of the given item.
238
    ///
239
    /// This function returns the priority of the given item.
240
    /// \param item The item.
241
    /// \pre \e item must be in the heap.
242
    Prio operator[](const Item& item) const {
243
      return _data[_iim[item]].prio;
244
    }
245

	
246
    /// \brief Set the priority of an item or insert it, if it is
247
    /// not stored in the heap.
248
    ///
249
    /// This method sets the priority of the given item if it is
250
    /// already stored in the heap. Otherwise it inserts the given
251
    /// item into the heap with the given priority.
252
    /// \param item The item.
253
    /// \param prio The priority.
254
    void set (const Item& item, const Prio& prio) {
255
      int i=_iim[item];
256
      if ( i >= 0 && _data[i].in ) {
257
        if ( _comp(prio, _data[i].prio) ) decrease(item, prio);
258
        if ( _comp(_data[i].prio, prio) ) increase(item, prio);
259
      } else push(item, prio);
260
    }
261

	
262
    /// \brief Decrease the priority of an item to the given value.
263
    ///
264
    /// This function decreases the priority of an item to the given value.
265
    /// \param item The item.
266
    /// \param prio The priority.
267
    /// \pre \e item must be stored in the heap with priority at least \e prio.
268
    void decrease (const Item& item, const Prio& prio) {
269
      int i=_iim[item];
270
      _data[i].prio=prio;
271
      int p=_data[i].parent;
272

	
273
      if ( p!=-1 && _comp(prio, _data[p].prio) ) {
274
        cut(i,p);
275
        cascade(p);
276
      }
277
      if ( _comp(prio, _data[_minimum].prio) ) _minimum=i;
278
    }
279

	
280
    /// \brief Increase the priority of an item to the given value.
281
    ///
282
    /// This function increases the priority of an item to the given value.
283
    /// \param item The item.
284
    /// \param prio The priority.
285
    /// \pre \e item must be stored in the heap with priority at most \e prio.
286
    void increase (const Item& item, const Prio& prio) {
287
      erase(item);
288
      push(item, prio);
289
    }
290

	
291
    /// \brief Return the state of an item.
292
    ///
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param item The item.
299
    State state(const Item &item) const {
300
      int i=_iim[item];
301
      if( i>=0 ) {
302
        if ( _data[i].in ) i=0;
303
        else i=-2;
304
      }
305
      return State(i);
306
    }
307

	
308
    /// \brief Set the state of an item in the heap.
309
    ///
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
313
    /// \param i The item.
314
    /// \param st The state. It should not be \c IN_HEAP.
315
    void state(const Item& i, State st) {
316
      switch (st) {
317
      case POST_HEAP:
318
      case PRE_HEAP:
319
        if (state(i) == IN_HEAP) {
320
          erase(i);
321
        }
322
        _iim[i] = st;
323
        break;
324
      case IN_HEAP:
325
        break;
326
      }
327
    }
328

	
329
  private:
330

	
331
    void balance() {
332

	
333
      int maxdeg=int( std::floor( 2.08*log(double(_data.size()))))+1;
334

	
335
      std::vector<int> A(maxdeg,-1);
336

	
337
      /*
338
       *Recall that now minimum does not point to the minimum prio element.
339
       *We set minimum to this during balance().
340
       */
341
      int anchor=_data[_minimum].left_neighbor;
342
      int next=_minimum;
343
      bool end=false;
344

	
345
      do {
346
        int active=next;
347
        if ( anchor==active ) end=true;
348
        int d=_data[active].degree;
349
        next=_data[active].right_neighbor;
350

	
351
        while (A[d]!=-1) {
352
          if( _comp(_data[active].prio, _data[A[d]].prio) ) {
353
            fuse(active,A[d]);
354
          } else {
355
            fuse(A[d],active);
356
            active=A[d];
357
          }
358
          A[d]=-1;
359
          ++d;
360
        }
361
        A[d]=active;
362
      } while ( !end );
363

	
364

	
365
      while ( _data[_minimum].parent >=0 )
366
        _minimum=_data[_minimum].parent;
367
      int s=_minimum;
368
      int m=_minimum;
369
      do {
370
        if ( _comp(_data[s].prio, _data[_minimum].prio) ) _minimum=s;
371
        s=_data[s].right_neighbor;
372
      } while ( s != m );
373
    }
374

	
375
    void makeRoot(int c) {
376
      int s=c;
377
      do {
378
        _data[s].parent=-1;
379
        s=_data[s].right_neighbor;
380
      } while ( s != c );
381
    }
382

	
383
    void cut(int a, int b) {
384
      /*
385
       *Replacing a from the children of b.
386
       */
387
      --_data[b].degree;
388

	
389
      if ( _data[b].degree !=0 ) {
390
        int child=_data[b].child;
391
        if ( child==a )
392
          _data[b].child=_data[child].right_neighbor;
393
        unlace(a);
394
      }
395

	
396

	
397
      /*Lacing a to the roots.*/
398
      int right=_data[_minimum].right_neighbor;
399
      _data[_minimum].right_neighbor=a;
400
      _data[a].left_neighbor=_minimum;
401
      _data[a].right_neighbor=right;
402
      _data[right].left_neighbor=a;
403

	
404
      _data[a].parent=-1;
405
      _data[a].marked=false;
406
    }
407

	
408
    void cascade(int a) {
409
      if ( _data[a].parent!=-1 ) {
410
        int p=_data[a].parent;
411

	
412
        if ( _data[a].marked==false ) _data[a].marked=true;
413
        else {
414
          cut(a,p);
415
          cascade(p);
416
        }
417
      }
418
    }
419

	
420
    void fuse(int a, int b) {
421
      unlace(b);
422

	
423
      /*Lacing b under a.*/
424
      _data[b].parent=a;
425

	
426
      if (_data[a].degree==0) {
427
        _data[b].left_neighbor=b;
428
        _data[b].right_neighbor=b;
429
        _data[a].child=b;
430
      } else {
431
        int child=_data[a].child;
432
        int last_child=_data[child].left_neighbor;
433
        _data[child].left_neighbor=b;
434
        _data[b].right_neighbor=child;
435
        _data[last_child].right_neighbor=b;
436
        _data[b].left_neighbor=last_child;
437
      }
438

	
439
      ++_data[a].degree;
440

	
441
      _data[b].marked=false;
442
    }
443

	
444
    /*
445
     *It is invoked only if a has siblings.
446
     */
447
    void unlace(int a) {
448
      int leftn=_data[a].left_neighbor;
449
      int rightn=_data[a].right_neighbor;
450
      _data[leftn].right_neighbor=rightn;
451
      _data[rightn].left_neighbor=leftn;
452
    }
453

	
454

	
455
    class Store {
456
      friend class FibHeap;
457

	
458
      Item name;
459
      int parent;
460
      int left_neighbor;
461
      int right_neighbor;
462
      int child;
463
      int degree;
464
      bool marked;
465
      bool in;
466
      Prio prio;
467

	
468
      Store() : parent(-1), child(-1), degree(), marked(false), in(true) {}
469
    };
470
  };
471

	
472
} //namespace lemon
473

	
474
#endif //LEMON_FIB_HEAP_H
475

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

	
19
#ifndef LEMON_FOURARY_HEAP_H
20
#define LEMON_FOURARY_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief Fourary heap data structure.
35
  ///
36
  /// This class implements the \e fourary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The fourary heap is a specialization of the \ref KaryHeap "K-ary heap"
40
  /// for <tt>K=4</tt>. It is similar to the \ref BinHeap "binary heap",
41
  /// but its nodes have at most four children, instead of two.
42
  ///
43
  /// \tparam PR Type of the priorities of the items.
44
  /// \tparam IM A read-writable item map with \c int values, used
45
  /// internally to handle the cross references.
46
  /// \tparam CMP A functor class for comparing the priorities.
47
  /// The default is \c std::less<PR>.
48
  ///
49
  ///\sa BinHeap
50
  ///\sa KaryHeap
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class FouraryHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Type of the item-priority pairs.
65
    typedef std::pair<Item,Prio> Pair;
66
    /// Functor type for comparing the priorities.
67
    typedef CMP Compare;
68

	
69
    /// \brief Type to represent the states of the items.
70
    ///
71
    /// Each item has a state associated to it. It can be "in heap",
72
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
73
    /// heap's point of view, but may be useful to the user.
74
    ///
75
    /// The item-int map must be initialized in such way that it assigns
76
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
77
    enum State {
78
      IN_HEAP = 0,    ///< = 0.
79
      PRE_HEAP = -1,  ///< = -1.
80
      POST_HEAP = -2  ///< = -2.
81
    };
82

	
83
  private:
84
    std::vector<Pair> _data;
85
    Compare _comp;
86
    ItemIntMap &_iim;
87

	
88
  public:
89
    /// \brief Constructor.
90
    ///
91
    /// Constructor.
92
    /// \param map A map that assigns \c int values to the items.
93
    /// It is used internally to handle the cross references.
94
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
95
    explicit FouraryHeap(ItemIntMap &map) : _iim(map) {}
96

	
97
    /// \brief Constructor.
98
    ///
99
    /// Constructor.
100
    /// \param map A map that assigns \c int values to the items.
101
    /// It is used internally to handle the cross references.
102
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
103
    /// \param comp The function object used for comparing the priorities.
104
    FouraryHeap(ItemIntMap &map, const Compare &comp)
105
      : _iim(map), _comp(comp) {}
106

	
107
    /// \brief The number of items stored in the heap.
108
    ///
109
    /// This function returns the number of items stored in the heap.
110
    int size() const { return _data.size(); }
111

	
112
    /// \brief Check if the heap is empty.
113
    ///
114
    /// This function returns \c true if the heap is empty.
115
    bool empty() const { return _data.empty(); }
116

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

	
126
  private:
127
    static int parent(int i) { return (i-1)/4; }
128
    static int firstChild(int i) { return 4*i+1; }
129

	
130
    bool less(const Pair &p1, const Pair &p2) const {
131
      return _comp(p1.second, p2.second);
132
    }
133

	
134
    void bubbleUp(int hole, Pair p) {
135
      int par = parent(hole);
136
      while( hole>0 && less(p,_data[par]) ) {
137
        move(_data[par],hole);
138
        hole = par;
139
        par = parent(hole);
140
      }
141
      move(p, hole);
142
    }
143

	
144
    void bubbleDown(int hole, Pair p, int length) {
145
      if( length>1 ) {
146
        int child = firstChild(hole);
147
        while( child+3<length ) {
148
          int min=child;
149
          if( less(_data[++child], _data[min]) ) min=child;
150
          if( less(_data[++child], _data[min]) ) min=child;
151
          if( less(_data[++child], _data[min]) ) min=child;
152
          if( !less(_data[min], p) )
153
            goto ok;
154
          move(_data[min], hole);
155
          hole = min;
156
          child = firstChild(hole);
157
        }
158
        if ( child<length ) {
159
          int min = child;
160
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
161
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
162
          if( less(_data[min], p) ) {
163
            move(_data[min], hole);
164
            hole = min;
165
          }
166
        }
167
      }
168
    ok:
169
      move(p, hole);
170
    }
171

	
172
    void move(const Pair &p, int i) {
173
      _data[i] = p;
174
      _iim.set(p.first, i);
175
    }
176

	
177
  public:
178
    /// \brief Insert a pair of item and priority into the heap.
179
    ///
180
    /// This function inserts \c p.first to the heap with priority
181
    /// \c p.second.
182
    /// \param p The pair to insert.
183
    /// \pre \c p.first must not be stored in the heap.
184
    void push(const Pair &p) {
185
      int n = _data.size();
186
      _data.resize(n+1);
187
      bubbleUp(n, p);
188
    }
189

	
190
    /// \brief Insert an item into the heap with the given priority.
191
    ///
192
    /// This function inserts the given item into the heap with the
193
    /// given priority.
194
    /// \param i The item to insert.
195
    /// \param p The priority of the item.
196
    /// \pre \e i must not be stored in the heap.
197
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
198

	
199
    /// \brief Return the item having minimum priority.
200
    ///
201
    /// This function returns the item having minimum priority.
202
    /// \pre The heap must be non-empty.
203
    Item top() const { return _data[0].first; }
204

	
205
    /// \brief The minimum priority.
206
    ///
207
    /// This function returns the minimum priority.
208
    /// \pre The heap must be non-empty.
209
    Prio prio() const { return _data[0].second; }
210

	
211
    /// \brief Remove the item having minimum priority.
212
    ///
213
    /// This function removes the item having minimum priority.
214
    /// \pre The heap must be non-empty.
215
    void pop() {
216
      int n = _data.size()-1;
217
      _iim.set(_data[0].first, POST_HEAP);
218
      if (n>0) bubbleDown(0, _data[n], n);
219
      _data.pop_back();
220
    }
221

	
222
    /// \brief Remove the given item from the heap.
223
    ///
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
228
    void erase(const Item &i) {
229
      int h = _iim[i];
230
      int n = _data.size()-1;
231
      _iim.set(_data[h].first, POST_HEAP);
232
      if( h<n ) {
233
        if( less(_data[parent(h)], _data[n]) )
234
          bubbleDown(h, _data[n], n);
235
        else
236
          bubbleUp(h, _data[n]);
237
      }
238
      _data.pop_back();
239
    }
240

	
241
    /// \brief The priority of the given item.
242
    ///
243
    /// This function returns the priority of the given item.
244
    /// \param i The item.
245
    /// \pre \e i must be in the heap.
246
    Prio operator[](const Item &i) const {
247
      int idx = _iim[i];
248
      return _data[idx].second;
249
    }
250

	
251
    /// \brief Set the priority of an item or insert it, if it is
252
    /// not stored in the heap.
253
    ///
254
    /// This method sets the priority of the given item if it is
255
    /// already stored in the heap. Otherwise it inserts the given
256
    /// item into the heap with the given priority.
257
    /// \param i The item.
258
    /// \param p The priority.
259
    void set(const Item &i, const Prio &p) {
260
      int idx = _iim[i];
261
      if( idx < 0 )
262
        push(i,p);
263
      else if( _comp(p, _data[idx].second) )
264
        bubbleUp(idx, Pair(i,p));
265
      else
266
        bubbleDown(idx, Pair(i,p), _data.size());
267
    }
268

	
269
    /// \brief Decrease the priority of an item to the given value.
270
    ///
271
    /// This function decreases the priority of an item to the given value.
272
    /// \param i The item.
273
    /// \param p The priority.
274
    /// \pre \e i must be stored in the heap with priority at least \e p.
275
    void decrease(const Item &i, const Prio &p) {
276
      int idx = _iim[i];
277
      bubbleUp(idx, Pair(i,p));
278
    }
279

	
280
    /// \brief Increase the priority of an item to the given value.
281
    ///
282
    /// This function increases the priority of an item to the given value.
283
    /// \param i The item.
284
    /// \param p The priority.
285
    /// \pre \e i must be stored in the heap with priority at most \e p.
286
    void increase(const Item &i, const Prio &p) {
287
      int idx = _iim[i];
288
      bubbleDown(idx, Pair(i,p), _data.size());
289
    }
290

	
291
    /// \brief Return the state of an item.
292
    ///
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param i The item.
299
    State state(const Item &i) const {
300
      int s = _iim[i];
301
      if (s>=0) s=0;
302
      return State(s);
303
    }
304

	
305
    /// \brief Set the state of an item in the heap.
306
    ///
307
    /// This function sets the state of the given item in the heap.
308
    /// It can be used to manually clear the heap when it is important
309
    /// to achive better time complexity.
310
    /// \param i The item.
311
    /// \param st The state. It should not be \c IN_HEAP.
312
    void state(const Item& i, State st) {
313
      switch (st) {
314
        case POST_HEAP:
315
        case PRE_HEAP:
316
          if (state(i) == IN_HEAP) erase(i);
317
          _iim[i] = st;
318
          break;
319
        case IN_HEAP:
320
          break;
321
      }
322
    }
323

	
324
    /// \brief Replace an item in the heap.
325
    ///
326
    /// This function replaces item \c i with item \c j.
327
    /// Item \c i must be in the heap, while \c j must be out of the heap.
328
    /// After calling this method, item \c i will be out of the
329
    /// heap and \c j will be in the heap with the same prioriority
330
    /// as item \c i had before.
331
    void replace(const Item& i, const Item& j) {
332
      int idx = _iim[i];
333
      _iim.set(i, _iim[j]);
334
      _iim.set(j, idx);
335
      _data[idx].first = j;
336
    }
337

	
338
  }; // class FouraryHeap
339

	
340
} // namespace lemon
341

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

	
19
#ifndef LEMON_KARY_HEAP_H
20
#define LEMON_KARY_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief K-ary heap data structure.
35
  ///
36
  /// This class implements the \e K-ary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The \ref KaryHeap "K-ary heap" is a generalization of the
40
  /// \ref BinHeap "binary heap" structure, its nodes have at most
41
  /// \c K children, instead of two.
42
  /// \ref BinHeap and \ref FouraryHeap are specialized implementations
43
  /// of this structure for <tt>K=2</tt> and <tt>K=4</tt>, respectively.
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam K The degree of the heap, each node have at most \e K
49
  /// children. The default is 16. Powers of two are suggested to use
50
  /// so that the multiplications and divisions needed to traverse the
51
  /// nodes of the heap could be performed faster.
52
  /// \tparam CMP A functor class for comparing the priorities.
53
  /// The default is \c std::less<PR>.
54
  ///
55
  ///\sa BinHeap
56
  ///\sa FouraryHeap
57
#ifdef DOXYGEN
58
  template <typename PR, typename IM, int K, typename CMP>
59
#else
60
  template <typename PR, typename IM, int K = 16,
61
            typename CMP = std::less<PR> >
62
#endif
63
  class KaryHeap {
64
  public:
65
    /// Type of the item-int map.
66
    typedef IM ItemIntMap;
67
    /// Type of the priorities.
68
    typedef PR Prio;
69
    /// Type of the items stored in the heap.
70
    typedef typename ItemIntMap::Key Item;
71
    /// Type of the item-priority pairs.
72
    typedef std::pair<Item,Prio> Pair;
73
    /// Functor type for comparing the priorities.
74
    typedef CMP Compare;
75

	
76
    /// \brief Type to represent the states of the items.
77
    ///
78
    /// Each item has a state associated to it. It can be "in heap",
79
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
80
    /// heap's point of view, but may be useful to the user.
81
    ///
82
    /// The item-int map must be initialized in such way that it assigns
83
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
84
    enum State {
85
      IN_HEAP = 0,    ///< = 0.
86
      PRE_HEAP = -1,  ///< = -1.
87
      POST_HEAP = -2  ///< = -2.
88
    };
89

	
90
  private:
91
    std::vector<Pair> _data;
92
    Compare _comp;
93
    ItemIntMap &_iim;
94

	
95
  public:
96
    /// \brief Constructor.
97
    ///
98
    /// Constructor.
99
    /// \param map A map that assigns \c int values to the items.
100
    /// It is used internally to handle the cross references.
101
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
102
    explicit KaryHeap(ItemIntMap &map) : _iim(map) {}
103

	
104
    /// \brief Constructor.
105
    ///
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param comp The function object used for comparing the priorities.
111
    KaryHeap(ItemIntMap &map, const Compare &comp)
112
      : _iim(map), _comp(comp) {}
113

	
114
    /// \brief The number of items stored in the heap.
115
    ///
116
    /// This function returns the number of items stored in the heap.
117
    int size() const { return _data.size(); }
118

	
119
    /// \brief Check if the heap is empty.
120
    ///
121
    /// This function returns \c true if the heap is empty.
122
    bool empty() const { return _data.empty(); }
123

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

	
133
  private:
134
    int parent(int i) { return (i-1)/K; }
135
    int firstChild(int i) { return K*i+1; }
136

	
137
    bool less(const Pair &p1, const Pair &p2) const {
138
      return _comp(p1.second, p2.second);
139
    }
140

	
141
    void bubbleUp(int hole, Pair p) {
142
      int par = parent(hole);
143
      while( hole>0 && less(p,_data[par]) ) {
144
        move(_data[par],hole);
145
        hole = par;
146
        par = parent(hole);
147
      }
148
      move(p, hole);
149
    }
150

	
151
    void bubbleDown(int hole, Pair p, int length) {
152
      if( length>1 ) {
153
        int child = firstChild(hole);
154
        while( child+K<=length ) {
155
          int min=child;
156
          for (int i=1; i<K; ++i) {
157
            if( less(_data[child+i], _data[min]) )
158
              min=child+i;
159
          }
160
          if( !less(_data[min], p) )
161
            goto ok;
162
          move(_data[min], hole);
163
          hole = min;
164
          child = firstChild(hole);
165
        }
166
        if ( child<length ) {
167
          int min = child;
168
          while (++child < length) {
169
            if( less(_data[child], _data[min]) )
170
              min=child;
171
          }
172
          if( less(_data[min], p) ) {
173
            move(_data[min], hole);
174
            hole = min;
175
          }
176
        }
177
      }
178
    ok:
179
      move(p, hole);
180
    }
181

	
182
    void move(const Pair &p, int i) {
183
      _data[i] = p;
184
      _iim.set(p.first, i);
185
    }
186

	
187
  public:
188
    /// \brief Insert a pair of item and priority into the heap.
189
    ///
190
    /// This function inserts \c p.first to the heap with priority
191
    /// \c p.second.
192
    /// \param p The pair to insert.
193
    /// \pre \c p.first must not be stored in the heap.
194
    void push(const Pair &p) {
195
      int n = _data.size();
196
      _data.resize(n+1);
197
      bubbleUp(n, p);
198
    }
199

	
200
    /// \brief Insert an item into the heap with the given priority.
201
    ///
202
    /// This function inserts the given item into the heap with the
203
    /// given priority.
204
    /// \param i The item to insert.
205
    /// \param p The priority of the item.
206
    /// \pre \e i must not be stored in the heap.
207
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
208

	
209
    /// \brief Return the item having minimum priority.
210
    ///
211
    /// This function returns the item having minimum priority.
212
    /// \pre The heap must be non-empty.
213
    Item top() const { return _data[0].first; }
214

	
215
    /// \brief The minimum priority.
216
    ///
217
    /// This function returns the minimum priority.
218
    /// \pre The heap must be non-empty.
219
    Prio prio() const { return _data[0].second; }
220

	
221
    /// \brief Remove the item having minimum priority.
222
    ///
223
    /// This function removes the item having minimum priority.
224
    /// \pre The heap must be non-empty.
225
    void pop() {
226
      int n = _data.size()-1;
227
      _iim.set(_data[0].first, POST_HEAP);
228
      if (n>0) bubbleDown(0, _data[n], n);
229
      _data.pop_back();
230
    }
231

	
232
    /// \brief Remove the given item from the heap.
233
    ///
234
    /// This function removes the given item from the heap if it is
235
    /// already stored.
236
    /// \param i The item to delete.
237
    /// \pre \e i must be in the heap.
238
    void erase(const Item &i) {
239
      int h = _iim[i];
240
      int n = _data.size()-1;
241
      _iim.set(_data[h].first, POST_HEAP);
242
      if( h<n ) {
243
        if( less(_data[parent(h)], _data[n]) )
244
          bubbleDown(h, _data[n], n);
245
        else
246
          bubbleUp(h, _data[n]);
247
      }
248
      _data.pop_back();
249
    }
250

	
251
    /// \brief The priority of the given item.
252
    ///
253
    /// This function returns the priority of the given item.
254
    /// \param i The item.
255
    /// \pre \e i must be in the heap.
256
    Prio operator[](const Item &i) const {
257
      int idx = _iim[i];
258
      return _data[idx].second;
259
    }
260

	
261
    /// \brief Set the priority of an item or insert it, if it is
262
    /// not stored in the heap.
263
    ///
264
    /// This method sets the priority of the given item if it is
265
    /// already stored in the heap. Otherwise it inserts the given
266
    /// item into the heap with the given priority.
267
    /// \param i The item.
268
    /// \param p The priority.
269
    void set(const Item &i, const Prio &p) {
270
      int idx = _iim[i];
271
      if( idx<0 )
272
        push(i,p);
273
      else if( _comp(p, _data[idx].second) )
274
        bubbleUp(idx, Pair(i,p));
275
      else
276
        bubbleDown(idx, Pair(i,p), _data.size());
277
    }
278

	
279
    /// \brief Decrease the priority of an item to the given value.
280
    ///
281
    /// This function decreases the priority of an item to the given value.
282
    /// \param i The item.
283
    /// \param p The priority.
284
    /// \pre \e i must be stored in the heap with priority at least \e p.
285
    void decrease(const Item &i, const Prio &p) {
286
      int idx = _iim[i];
287
      bubbleUp(idx, Pair(i,p));
288
    }
289

	
290
    /// \brief Increase the priority of an item to the given value.
291
    ///
292
    /// This function increases the priority of an item to the given value.
293
    /// \param i The item.
294
    /// \param p The priority.
295
    /// \pre \e i must be stored in the heap with priority at most \e p.
296
    void increase(const Item &i, const Prio &p) {
297
      int idx = _iim[i];
298
      bubbleDown(idx, Pair(i,p), _data.size());
299
    }
300

	
301
    /// \brief Return the state of an item.
302
    ///
303
    /// This method returns \c PRE_HEAP if the given item has never
304
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
305
    /// and \c POST_HEAP otherwise.
306
    /// In the latter case it is possible that the item will get back
307
    /// to the heap again.
308
    /// \param i The item.
309
    State state(const Item &i) const {
310
      int s = _iim[i];
311
      if (s>=0) s=0;
312
      return State(s);
313
    }
314

	
315
    /// \brief Set the state of an item in the heap.
316
    ///
317
    /// This function sets the state of the given item in the heap.
318
    /// It can be used to manually clear the heap when it is important
319
    /// to achive better time complexity.
320
    /// \param i The item.
321
    /// \param st The state. It should not be \c IN_HEAP.
322
    void state(const Item& i, State st) {
323
      switch (st) {
324
        case POST_HEAP:
325
        case PRE_HEAP:
326
          if (state(i) == IN_HEAP) erase(i);
327
          _iim[i] = st;
328
          break;
329
        case IN_HEAP:
330
          break;
331
      }
332
    }
333

	
334
    /// \brief Replace an item in the heap.
335
    ///
336
    /// This function replaces item \c i with item \c j.
337
    /// Item \c i must be in the heap, while \c j must be out of the heap.
338
    /// After calling this method, item \c i will be out of the
339
    /// heap and \c j will be in the heap with the same prioriority
340
    /// as item \c i had before.
341
    void replace(const Item& i, const Item& j) {
342
      int idx=_iim[i];
343
      _iim.set(i, _iim[j]);
344
      _iim.set(j, idx);
345
      _data[idx].first=j;
346
    }
347

	
348
  }; // class KaryHeap
349

	
350
} // namespace lemon
351

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

	
19
#ifndef LEMON_PAIRING_HEAP_H
20
#define LEMON_PAIRING_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Pairing heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30

	
31
namespace lemon {
32

	
33
  /// \ingroup heaps
34
  ///
35
  ///\brief Pairing Heap.
36
  ///
37
  /// This class implements the \e pairing \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The methods \ref increase() and \ref erase() are not efficient
41
  /// in a pairing heap. In case of many calls of these operations,
42
  /// it is better to use other heap structure, e.g. \ref BinHeap
43
  /// "binary heap".
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam CMP A functor class for comparing the priorities.
49
  /// The default is \c std::less<PR>.
50
#ifdef DOXYGEN
51
  template <typename PR, typename IM, typename CMP>
52
#else
53
  template <typename PR, typename IM, typename CMP = std::less<PR> >
54
#endif
55
  class PairingHeap {
56
  public:
57
    /// Type of the item-int map.
58
    typedef IM ItemIntMap;
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
62
    typedef typename ItemIntMap::Key Item;
63
    /// Functor type for comparing the priorities.
64
    typedef CMP Compare;
65

	
66
    /// \brief Type to represent the states of the items.
67
    ///
68
    /// Each item has a state associated to it. It can be "in heap",
69
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
70
    /// heap's point of view, but may be useful to the user.
71
    ///
72
    /// The item-int map must be initialized in such way that it assigns
73
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
74
    enum State {
75
      IN_HEAP = 0,    ///< = 0.
76
      PRE_HEAP = -1,  ///< = -1.
77
      POST_HEAP = -2  ///< = -2.
78
    };
79

	
80
  private:
81
    class store;
82

	
83
    std::vector<store> _data;
84
    int _min;
85
    ItemIntMap &_iim;
86
    Compare _comp;
87
    int _num_items;
88

	
89
  public:
90
    /// \brief Constructor.
91
    ///
92
    /// Constructor.
93
    /// \param map A map that assigns \c int values to the items.
94
    /// It is used internally to handle the cross references.
95
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
96
    explicit PairingHeap(ItemIntMap &map)
97
      : _min(0), _iim(map), _num_items(0) {}
98

	
99
    /// \brief Constructor.
100
    ///
101
    /// Constructor.
102
    /// \param map A map that assigns \c int values to the items.
103
    /// It is used internally to handle the cross references.
104
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
105
    /// \param comp The function object used for comparing the priorities.
106
    PairingHeap(ItemIntMap &map, const Compare &comp)
107
      : _min(0), _iim(map), _comp(comp), _num_items(0) {}
108

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

	
114
    /// \brief Check if the heap is empty.
115
    ///
116
    /// This function returns \c true if the heap is empty.
117
    bool empty() const { return _num_items==0; }
118

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

	
132
    /// \brief Set the priority of an item or insert it, if it is
133
    /// not stored in the heap.
134
    ///
135
    /// This method sets the priority of the given item if it is
136
    /// already stored in the heap. Otherwise it inserts the given
137
    /// item into the heap with the given priority.
138
    /// \param item The item.
139
    /// \param value The priority.
140
    void set (const Item& item, const Prio& value) {
141
      int i=_iim[item];
142
      if ( i>=0 && _data[i].in ) {
143
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
144
        if ( _comp(_data[i].prio, value) ) increase(item, value);
145
      } else push(item, value);
146
    }
147

	
148
    /// \brief Insert an item into the heap with the given priority.
149
    ///
150
    /// This function inserts the given item into the heap with the
151
    /// given priority.
152
    /// \param item The item to insert.
153
    /// \param value The priority of the item.
154
    /// \pre \e item must not be stored in the heap.
155
    void push (const Item& item, const Prio& value) {
156
      int i=_iim[item];
157
      if( i<0 ) {
158
        int s=_data.size();
159
        _iim.set(item, s);
160
        store st;
161
        st.name=item;
162
        _data.push_back(st);
163
        i=s;
164
      } else {
165
        _data[i].parent=_data[i].child=-1;
166
        _data[i].left_child=false;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
      }
170

	
171
      _data[i].prio=value;
172

	
173
      if ( _num_items!=0 ) {
174
        if ( _comp( value, _data[_min].prio) ) {
175
          fuse(i,_min);
176
          _min=i;
177
        }
178
        else fuse(_min,i);
179
      }
180
      else _min=i;
181

	
182
      ++_num_items;
183
    }
184

	
185
    /// \brief Return the item having minimum priority.
186
    ///
187
    /// This function returns the item having minimum priority.
188
    /// \pre The heap must be non-empty.
189
    Item top() const { return _data[_min].name; }
190

	
191
    /// \brief The minimum priority.
192
    ///
193
    /// This function returns the minimum priority.
194
    /// \pre The heap must be non-empty.
195
    const Prio& prio() const { return _data[_min].prio; }
196

	
197
    /// \brief The priority of the given item.
198
    ///
199
    /// This function returns the priority of the given item.
200
    /// \param item The item.
201
    /// \pre \e item must be in the heap.
202
    const Prio& operator[](const Item& item) const {
203
      return _data[_iim[item]].prio;
204
    }
205

	
206
    /// \brief Remove the item having minimum priority.
207
    ///
208
    /// This function removes the item having minimum priority.
209
    /// \pre The heap must be non-empty.
210
    void pop() {
211
      std::vector<int> trees;
212
      int i=0, child_right = 0;
213
      _data[_min].in=false;
214

	
215
      if( -1!=_data[_min].child ) {
216
        i=_data[_min].child;
217
        trees.push_back(i);
218
        _data[i].parent = -1;
219
        _data[_min].child = -1;
220

	
221
        int ch=-1;
222
        while( _data[i].child!=-1 ) {
223
          ch=_data[i].child;
224
          if( _data[ch].left_child && i==_data[ch].parent ) {
225
            break;
226
          } else {
227
            if( _data[ch].left_child ) {
228
              child_right=_data[ch].parent;
229
              _data[ch].parent = i;
230
              --_data[i].degree;
231
            }
232
            else {
233
              child_right=ch;
234
              _data[i].child=-1;
235
              _data[i].degree=0;
236
            }
237
            _data[child_right].parent = -1;
238
            trees.push_back(child_right);
239
            i = child_right;
240
          }
241
        }
242

	
243
        int num_child = trees.size();
244
        int other;
245
        for( i=0; i<num_child-1; i+=2 ) {
246
          if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) {
247
            other=trees[i];
248
            trees[i]=trees[i+1];
249
            trees[i+1]=other;
250
          }
251
          fuse( trees[i], trees[i+1] );
252
        }
253

	
254
        i = (0==(num_child % 2)) ? num_child-2 : num_child-1;
255
        while(i>=2) {
256
          if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) {
257
            other=trees[i];
258
            trees[i]=trees[i-2];
259
            trees[i-2]=other;
260
          }
261
          fuse( trees[i-2], trees[i] );
262
          i-=2;
263
        }
264
        _min = trees[0];
265
      }
266
      else {
267
        _min = _data[_min].child;
268
      }
269

	
270
      if (_min >= 0) _data[_min].left_child = false;
271
      --_num_items;
272
    }
273

	
274
    /// \brief Remove the given item from the heap.
275
    ///
276
    /// This function removes the given item from the heap if it is
277
    /// already stored.
278
    /// \param item The item to delete.
279
    /// \pre \e item must be in the heap.
280
    void erase (const Item& item) {
281
      int i=_iim[item];
282
      if ( i>=0 && _data[i].in ) {
283
        decrease( item, _data[_min].prio-1 );
284
        pop();
285
      }
286
    }
287

	
288
    /// \brief Decrease the priority of an item to the given value.
289
    ///
290
    /// This function decreases the priority of an item to the given value.
291
    /// \param item The item.
292
    /// \param value The priority.
293
    /// \pre \e item must be stored in the heap with priority at least \e value.
294
    void decrease (Item item, const Prio& value) {
295
      int i=_iim[item];
296
      _data[i].prio=value;
297
      int p=_data[i].parent;
298

	
299
      if( _data[i].left_child && i!=_data[p].child ) {
300
        p=_data[p].parent;
301
      }
302

	
303
      if ( p!=-1 && _comp(value,_data[p].prio) ) {
304
        cut(i,p);
305
        if ( _comp(_data[_min].prio,value) ) {
306
          fuse(_min,i);
307
        } else {
308
          fuse(i,_min);
309
          _min=i;
310
        }
311
      }
312
    }
313

	
314
    /// \brief Increase the priority of an item to the given value.
315
    ///
316
    /// This function increases the priority of an item to the given value.
317
    /// \param item The item.
318
    /// \param value The priority.
319
    /// \pre \e item must be stored in the heap with priority at most \e value.
320
    void increase (Item item, const Prio& value) {
321
      erase(item);
322
      push(item,value);
323
    }
324

	
325
    /// \brief Return the state of an item.
326
    ///
327
    /// This method returns \c PRE_HEAP if the given item has never
328
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
329
    /// and \c POST_HEAP otherwise.
330
    /// In the latter case it is possible that the item will get back
331
    /// to the heap again.
332
    /// \param item The item.
333
    State state(const Item &item) const {
334
      int i=_iim[item];
335
      if( i>=0 ) {
336
        if( _data[i].in ) i=0;
337
        else i=-2;
338
      }
339
      return State(i);
340
    }
341

	
342
    /// \brief Set the state of an item in the heap.
343
    ///
344
    /// This function sets the state of the given item in the heap.
345
    /// It can be used to manually clear the heap when it is important
346
    /// to achive better time complexity.
347
    /// \param i The item.
348
    /// \param st The state. It should not be \c IN_HEAP.
349
    void state(const Item& i, State st) {
350
      switch (st) {
351
      case POST_HEAP:
352
      case PRE_HEAP:
353
        if (state(i) == IN_HEAP) erase(i);
354
        _iim[i]=st;
355
        break;
356
      case IN_HEAP:
357
        break;
358
      }
359
    }
360

	
361
  private:
362

	
363
    void cut(int a, int b) {
364
      int child_a;
365
      switch (_data[a].degree) {
366
        case 2:
367
          child_a = _data[_data[a].child].parent;
368
          if( _data[a].left_child ) {
369
            _data[child_a].left_child=true;
370
            _data[b].child=child_a;
371
            _data[child_a].parent=_data[a].parent;
372
          }
373
          else {
374
            _data[child_a].left_child=false;
375
            _data[child_a].parent=b;
376
            if( a!=_data[b].child )
377
              _data[_data[b].child].parent=child_a;
378
            else
379
              _data[b].child=child_a;
380
          }
381
          --_data[a].degree;
382
          _data[_data[a].child].parent=a;
383
          break;
384

	
385
        case 1:
386
          child_a = _data[a].child;
387
          if( !_data[child_a].left_child ) {
388
            --_data[a].degree;
389
            if( _data[a].left_child ) {
390
              _data[child_a].left_child=true;
391
              _data[child_a].parent=_data[a].parent;
392
              _data[b].child=child_a;
393
            }
394
            else {
395
              _data[child_a].left_child=false;
396
              _data[child_a].parent=b;
397
              if( a!=_data[b].child )
398
                _data[_data[b].child].parent=child_a;
399
              else
400
                _data[b].child=child_a;
401
            }
402
            _data[a].child=-1;
403
          }
404
          else {
405
            --_data[b].degree;
406
            if( _data[a].left_child ) {
407
              _data[b].child =
408
                (1==_data[b].degree) ? _data[a].parent : -1;
409
            } else {
410
              if (1==_data[b].degree)
411
                _data[_data[b].child].parent=b;
412
              else
413
                _data[b].child=-1;
414
            }
415
          }
416
          break;
417

	
418
        case 0:
419
          --_data[b].degree;
420
          if( _data[a].left_child ) {
421
            _data[b].child =
422
              (0!=_data[b].degree) ? _data[a].parent : -1;
423
          } else {
424
            if( 0!=_data[b].degree )
425
              _data[_data[b].child].parent=b;
426
            else
427
              _data[b].child=-1;
428
          }
429
          break;
430
      }
431
      _data[a].parent=-1;
432
      _data[a].left_child=false;
433
    }
434

	
435
    void fuse(int a, int b) {
436
      int child_a = _data[a].child;
437
      int child_b = _data[b].child;
438
      _data[a].child=b;
439
      _data[b].parent=a;
440
      _data[b].left_child=true;
441

	
442
      if( -1!=child_a ) {
443
        _data[b].child=child_a;
444
        _data[child_a].parent=b;
445
        _data[child_a].left_child=false;
446
        ++_data[b].degree;
447

	
448
        if( -1!=child_b ) {
449
           _data[b].child=child_b;
450
           _data[child_b].parent=child_a;
451
        }
452
      }
453
      else { ++_data[a].degree; }
454
    }
455

	
456
    class store {
457
      friend class PairingHeap;
458

	
459
      Item name;
460
      int parent;
461
      int child;
462
      bool left_child;
463
      int degree;
464
      bool in;
465
      Prio prio;
466

	
467
      store() : parent(-1), child(-1), left_child(false), degree(0), in(true) {}
468
    };
469
  };
470

	
471
} //namespace lemon
472

	
473
#endif //LEMON_PAIRING_HEAP_H
474

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

	
19
#ifndef LEMON_RADIX_HEAP_H
20
#define LEMON_RADIX_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Radix heap implementation.
25

	
26
#include <vector>
27
#include <lemon/error.h>
28

	
29
namespace lemon {
30

	
31

	
32
  /// \ingroup heaps
33
  ///
34
  /// \brief Radix heap data structure.
35
  ///
36
  /// This class implements the \e radix \e heap data structure.
37
  /// It practically conforms to the \ref concepts::Heap "heap concept",
38
  /// but it has some limitations due its special implementation.
39
  /// The type of the priorities must be \c int and the priority of an
40
  /// item cannot be decreased under the priority of the last removed item.
41
  ///
42
  /// \tparam IM A read-writable item map with \c int values, used
43
  /// internally to handle the cross references.
44
  template <typename IM>
45
  class RadixHeap {
46

	
47
  public:
48

	
49
    /// Type of the item-int map.
50
    typedef IM ItemIntMap;
51
    /// Type of the priorities.
52
    typedef int Prio;
53
    /// Type of the items stored in the heap.
54
    typedef typename ItemIntMap::Key Item;
55

	
56
    /// \brief Exception thrown by RadixHeap.
57
    ///
58
    /// This exception is thrown when an item is inserted into a
59
    /// RadixHeap with a priority smaller than the last erased one.
60
    /// \see RadixHeap
61
    class PriorityUnderflowError : public Exception {
62
    public:
63
      virtual const char* what() const throw() {
64
        return "lemon::RadixHeap::PriorityUnderflowError";
65
      }
66
    };
67

	
68
    /// \brief Type to represent the states of the items.
69
    ///
70
    /// Each item has a state associated to it. It can be "in heap",
71
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
72
    /// heap's point of view, but may be useful to the user.
73
    ///
74
    /// The item-int map must be initialized in such way that it assigns
75
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
76
    enum State {
77
      IN_HEAP = 0,    ///< = 0.
78
      PRE_HEAP = -1,  ///< = -1.
79
      POST_HEAP = -2  ///< = -2.
80
    };
81

	
82
  private:
83

	
84
    struct RadixItem {
85
      int prev, next, box;
86
      Item item;
87
      int prio;
88
      RadixItem(Item _item, int _prio) : item(_item), prio(_prio) {}
89
    };
90

	
91
    struct RadixBox {
92
      int first;
93
      int min, size;
94
      RadixBox(int _min, int _size) : first(-1), min(_min), size(_size) {}
95
    };
96

	
97
    std::vector<RadixItem> _data;
98
    std::vector<RadixBox> _boxes;
99

	
100
    ItemIntMap &_iim;
101

	
102
  public:
103

	
104
    /// \brief Constructor.
105
    ///
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param minimum The initial minimum value of the heap.
111
    /// \param capacity The initial capacity of the heap.
112
    RadixHeap(ItemIntMap &map, int minimum = 0, int capacity = 0)
113
      : _iim(map)
114
    {
115
      _boxes.push_back(RadixBox(minimum, 1));
116
      _boxes.push_back(RadixBox(minimum + 1, 1));
117
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
118
        extend();
119
      }
120
    }
121

	
122
    /// \brief The number of items stored in the heap.
123
    ///
124
    /// This function returns the number of items stored in the heap.
125
    int size() const { return _data.size(); }
126

	
127
    /// \brief Check if the heap is empty.
128
    ///
129
    /// This function returns \c true if the heap is empty.
130
    bool empty() const { return _data.empty(); }
131

	
132
    /// \brief Make the heap empty.
133
    ///
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
139
    /// \param minimum The minimum value of the heap.
140
    /// \param capacity The capacity of the heap.
141
    void clear(int minimum = 0, int capacity = 0) {
142
      _data.clear(); _boxes.clear();
143
      _boxes.push_back(RadixBox(minimum, 1));
144
      _boxes.push_back(RadixBox(minimum + 1, 1));
145
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
146
        extend();
147
      }
148
    }
149

	
150
  private:
151

	
152
    bool upper(int box, Prio pr) {
153
      return pr < _boxes[box].min;
154
    }
155

	
156
    bool lower(int box, Prio pr) {
157
      return pr >= _boxes[box].min + _boxes[box].size;
158
    }
159

	
160
    // Remove item from the box list
161
    void remove(int index) {
162
      if (_data[index].prev >= 0) {
163
        _data[_data[index].prev].next = _data[index].next;
164
      } else {
165
        _boxes[_data[index].box].first = _data[index].next;
166
      }
167
      if (_data[index].next >= 0) {
168
        _data[_data[index].next].prev = _data[index].prev;
169
      }
170
    }
171

	
172
    // Insert item into the box list
173
    void insert(int box, int index) {
174
      if (_boxes[box].first == -1) {
175
        _boxes[box].first = index;
176
        _data[index].next = _data[index].prev = -1;
177
      } else {
178
        _data[index].next = _boxes[box].first;
179
        _data[_boxes[box].first].prev = index;
180
        _data[index].prev = -1;
181
        _boxes[box].first = index;
182
      }
183
      _data[index].box = box;
184
    }
185

	
186
    // Add a new box to the box list
187
    void extend() {
188
      int min = _boxes.back().min + _boxes.back().size;
189
      int bs = 2 * _boxes.back().size;
190
      _boxes.push_back(RadixBox(min, bs));
191
    }
192

	
193
    // Move an item up into the proper box.
194
    void bubbleUp(int index) {
195
      if (!lower(_data[index].box, _data[index].prio)) return;
196
      remove(index);
197
      int box = findUp(_data[index].box, _data[index].prio);
198
      insert(box, index);
199
    }
200

	
201
    // Find up the proper box for the item with the given priority
202
    int findUp(int start, int pr) {
203
      while (lower(start, pr)) {
204
        if (++start == int(_boxes.size())) {
205
          extend();
206
        }
207
      }
208
      return start;
209
    }
210

	
211
    // Move an item down into the proper box
212
    void bubbleDown(int index) {
213
      if (!upper(_data[index].box, _data[index].prio)) return;
214
      remove(index);
215
      int box = findDown(_data[index].box, _data[index].prio);
216
      insert(box, index);
217
    }
218

	
219
    // Find down the proper box for the item with the given priority
220
    int findDown(int start, int pr) {
221
      while (upper(start, pr)) {
222
        if (--start < 0) throw PriorityUnderflowError();
223
      }
224
      return start;
225
    }
226

	
227
    // Find the first non-empty box
228
    int findFirst() {
229
      int first = 0;
230
      while (_boxes[first].first == -1) ++first;
231
      return first;
232
    }
233

	
234
    // Gives back the minimum priority of the given box
235
    int minValue(int box) {
236
      int min = _data[_boxes[box].first].prio;
237
      for (int k = _boxes[box].first; k != -1; k = _data[k].next) {
238
        if (_data[k].prio < min) min = _data[k].prio;
239
      }
240
      return min;
241
    }
242

	
243
    // Rearrange the items of the heap and make the first box non-empty
244
    void moveDown() {
245
      int box = findFirst();
246
      if (box == 0) return;
247
      int min = minValue(box);
248
      for (int i = 0; i <= box; ++i) {
249
        _boxes[i].min = min;
250
        min += _boxes[i].size;
251
      }
252
      int curr = _boxes[box].first, next;
253
      while (curr != -1) {
254
        next = _data[curr].next;
255
        bubbleDown(curr);
256
        curr = next;
257
      }
258
    }
259

	
260
    void relocateLast(int index) {
261
      if (index != int(_data.size()) - 1) {
262
        _data[index] = _data.back();
263
        if (_data[index].prev != -1) {
264
          _data[_data[index].prev].next = index;
265
        } else {
266
          _boxes[_data[index].box].first = index;
267
        }
268
        if (_data[index].next != -1) {
269
          _data[_data[index].next].prev = index;
270
        }
271
        _iim[_data[index].item] = index;
272
      }
273
      _data.pop_back();
274
    }
275

	
276
  public:
277

	
278
    /// \brief Insert an item into the heap with the given priority.
279
    ///
280
    /// This function inserts the given item into the heap with the
281
    /// given priority.
282
    /// \param i The item to insert.
283
    /// \param p The priority of the item.
284
    /// \pre \e i must not be stored in the heap.
285
    /// \warning This method may throw an \c UnderFlowPriorityException.
286
    void push(const Item &i, const Prio &p) {
287
      int n = _data.size();
288
      _iim.set(i, n);
289
      _data.push_back(RadixItem(i, p));
290
      while (lower(_boxes.size() - 1, p)) {
291
        extend();
292
      }
293
      int box = findDown(_boxes.size() - 1, p);
294
      insert(box, n);
295
    }
296

	
297
    /// \brief Return the item having minimum priority.
298
    ///
299
    /// This function returns the item having minimum priority.
300
    /// \pre The heap must be non-empty.
301
    Item top() const {
302
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
303
      return _data[_boxes[0].first].item;
304
    }
305

	
306
    /// \brief The minimum priority.
307
    ///
308
    /// This function returns the minimum priority.
309
    /// \pre The heap must be non-empty.
310
    Prio prio() const {
311
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
312
      return _data[_boxes[0].first].prio;
313
     }
314

	
315
    /// \brief Remove the item having minimum priority.
316
    ///
317
    /// This function removes the item having minimum priority.
318
    /// \pre The heap must be non-empty.
319
    void pop() {
320
      moveDown();
321
      int index = _boxes[0].first;
322
      _iim[_data[index].item] = POST_HEAP;
323
      remove(index);
324
      relocateLast(index);
325
    }
326

	
327
    /// \brief Remove the given item from the heap.
328
    ///
329
    /// This function removes the given item from the heap if it is
330
    /// already stored.
331
    /// \param i The item to delete.
332
    /// \pre \e i must be in the heap.
333
    void erase(const Item &i) {
334
      int index = _iim[i];
335
      _iim[i] = POST_HEAP;
336
      remove(index);
337
      relocateLast(index);
338
   }
339

	
340
    /// \brief The priority of the given item.
341
    ///
342
    /// This function returns the priority of the given item.
343
    /// \param i The item.
344
    /// \pre \e i must be in the heap.
345
    Prio operator[](const Item &i) const {
346
      int idx = _iim[i];
347
      return _data[idx].prio;
348
    }
349

	
350
    /// \brief Set the priority of an item or insert it, if it is
351
    /// not stored in the heap.
352
    ///
353
    /// This method sets the priority of the given item if it is
354
    /// already stored in the heap. Otherwise it inserts the given
355
    /// item into the heap with the given priority.
356
    /// \param i The item.
357
    /// \param p The priority.
358
    /// \pre \e i must be in the heap.
359
    /// \warning This method may throw an \c UnderFlowPriorityException.
360
    void set(const Item &i, const Prio &p) {
361
      int idx = _iim[i];
362
      if( idx < 0 ) {
363
        push(i, p);
364
      }
365
      else if( p >= _data[idx].prio ) {
366
        _data[idx].prio = p;
367
        bubbleUp(idx);
368
      } else {
369
        _data[idx].prio = p;
370
        bubbleDown(idx);
371
      }
372
    }
373

	
374
    /// \brief Decrease the priority of an item to the given value.
375
    ///
376
    /// This function decreases the priority of an item to the given value.
377
    /// \param i The item.
378
    /// \param p The priority.
379
    /// \pre \e i must be stored in the heap with priority at least \e p.
380
    /// \warning This method may throw an \c UnderFlowPriorityException.
381
    void decrease(const Item &i, const Prio &p) {
382
      int idx = _iim[i];
383
      _data[idx].prio = p;
384
      bubbleDown(idx);
385
    }
386

	
387
    /// \brief Increase the priority of an item to the given value.
388
    ///
389
    /// This function increases the priority of an item to the given value.
390
    /// \param i The item.
391
    /// \param p The priority.
392
    /// \pre \e i must be stored in the heap with priority at most \e p.
393
    void increase(const Item &i, const Prio &p) {
394
      int idx = _iim[i];
395
      _data[idx].prio = p;
396
      bubbleUp(idx);
397
    }
398

	
399
    /// \brief Return the state of an item.
400
    ///
401
    /// This method returns \c PRE_HEAP if the given item has never
402
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
403
    /// and \c POST_HEAP otherwise.
404
    /// In the latter case it is possible that the item will get back
405
    /// to the heap again.
406
    /// \param i The item.
407
    State state(const Item &i) const {
408
      int s = _iim[i];
409
      if( s >= 0 ) s = 0;
410
      return State(s);
411
    }
412

	
413
    /// \brief Set the state of an item in the heap.
414
    ///
415
    /// This function sets the state of the given item in the heap.
416
    /// It can be used to manually clear the heap when it is important
417
    /// to achive better time complexity.
418
    /// \param i The item.
419
    /// \param st The state. It should not be \c IN_HEAP.
420
    void state(const Item& i, State st) {
421
      switch (st) {
422
      case POST_HEAP:
423
      case PRE_HEAP:
424
        if (state(i) == IN_HEAP) {
425
          erase(i);
426
        }
427
        _iim[i] = st;
428
        break;
429
      case IN_HEAP:
430
        break;
431
      }
432
    }
433

	
434
  }; // class RadixHeap
435

	
436
} // namespace lemon
437

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

	
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21
#include <lemon/list_graph.h>
22
#include <lemon/lgf_reader.h>
23
#include <lemon/bellman_ford.h>
24
#include <lemon/path.h>
25

	
26
#include "graph_test.h"
27
#include "test_tools.h"
28

	
29
using namespace lemon;
30

	
31
char test_lgf[] =
32
  "@nodes\n"
33
  "label\n"
34
  "0\n"
35
  "1\n"
36
  "2\n"
37
  "3\n"
38
  "4\n"
39
  "@arcs\n"
40
  "    length\n"
41
  "0 1 3\n"
42
  "1 2 -3\n"
43
  "1 2 -5\n"
44
  "1 3 -2\n"
45
  "0 2 -1\n"
46
  "1 2 -4\n"
47
  "0 3 2\n"
48
  "4 2 -5\n"
49
  "2 3 1\n"
50
  "@attributes\n"
51
  "source 0\n"
52
  "target 3\n";
53

	
54

	
55
void checkBellmanFordCompile()
56
{
57
  typedef int Value;
58
  typedef concepts::Digraph Digraph;
59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60
  typedef BellmanFord<Digraph, LengthMap> BF;
61
  typedef Digraph::Node Node;
62
  typedef Digraph::Arc Arc;
63

	
64
  Digraph gr;
65
  Node s, t, n;
66
  Arc e;
67
  Value l;
68
  int k;
69
  bool b;
70
  BF::DistMap d(gr);
71
  BF::PredMap p(gr);
72
  LengthMap length;
73
  concepts::Path<Digraph> pp;
74

	
75
  {
76
    BF bf_test(gr,length);
77
    const BF& const_bf_test = bf_test;
78

	
79
    bf_test.run(s);
80
    bf_test.run(s,k);
81

	
82
    bf_test.init();
83
    bf_test.addSource(s);
84
    bf_test.addSource(s, 1);
85
    b = bf_test.processNextRound();
86
    b = bf_test.processNextWeakRound();
87

	
88
    bf_test.start();
89
    bf_test.checkedStart();
90
    bf_test.limitedStart(k);
91

	
92
    l  = const_bf_test.dist(t);
93
    e  = const_bf_test.predArc(t);
94
    s  = const_bf_test.predNode(t);
95
    b  = const_bf_test.reached(t);
96
    d  = const_bf_test.distMap();
97
    p  = const_bf_test.predMap();
98
    pp = const_bf_test.path(t);
99
    
100
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
101
  }
102
  {
103
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
104
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
105
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
106
      ::Create bf_test(gr,length);
107

	
108
    LengthMap length_map;
109
    concepts::ReadWriteMap<Node,Arc> pred_map;
110
    concepts::ReadWriteMap<Node,Value> dist_map;
111
    
112
    bf_test
113
      .lengthMap(length_map)
114
      .predMap(pred_map)
115
      .distMap(dist_map);
116

	
117
    bf_test.run(s);
118
    bf_test.run(s,k);
119

	
120
    bf_test.init();
121
    bf_test.addSource(s);
122
    bf_test.addSource(s, 1);
123
    b = bf_test.processNextRound();
124
    b = bf_test.processNextWeakRound();
125

	
126
    bf_test.start();
127
    bf_test.checkedStart();
128
    bf_test.limitedStart(k);
129

	
130
    l  = bf_test.dist(t);
131
    e  = bf_test.predArc(t);
132
    s  = bf_test.predNode(t);
133
    b  = bf_test.reached(t);
134
    pp = bf_test.path(t);
135
  }
136
}
137

	
138
void checkBellmanFordFunctionCompile()
139
{
140
  typedef int Value;
141
  typedef concepts::Digraph Digraph;
142
  typedef Digraph::Arc Arc;
143
  typedef Digraph::Node Node;
144
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
145

	
146
  Digraph g;
147
  bool b;
148
  bellmanFord(g,LengthMap()).run(Node());
149
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
150
  bellmanFord(g,LengthMap())
151
    .predMap(concepts::ReadWriteMap<Node,Arc>())
152
    .distMap(concepts::ReadWriteMap<Node,Value>())
153
    .run(Node());
154
  b=bellmanFord(g,LengthMap())
155
    .predMap(concepts::ReadWriteMap<Node,Arc>())
156
    .distMap(concepts::ReadWriteMap<Node,Value>())
157
    .path(concepts::Path<Digraph>())
158
    .dist(Value())
159
    .run(Node(),Node());
160
}
161

	
162

	
163
template <typename Digraph, typename Value>
164
void checkBellmanFord() {
165
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
166
  typedef typename Digraph::template ArcMap<Value> LengthMap;
167

	
168
  Digraph gr;
169
  Node s, t;
170
  LengthMap length(gr);
171

	
172
  std::istringstream input(test_lgf);
173
  digraphReader(gr, input).
174
    arcMap("length", length).
175
    node("source", s).
176
    node("target", t).
177
    run();
178

	
179
  BellmanFord<Digraph, LengthMap>
180
    bf(gr, length);
181
  bf.run(s);
182
  Path<Digraph> p = bf.path(t);
183

	
184
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
185
  check(p.length() == 3, "path() found a wrong path.");
186
  check(checkPath(gr, p), "path() found a wrong path.");
187
  check(pathSource(gr, p) == s, "path() found a wrong path.");
188
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
189
  
190
  ListPath<Digraph> path;
191
  Value dist;
192
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
193

	
194
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
195
  check(path.length() == 3, "path() found a wrong path.");
196
  check(checkPath(gr, path), "path() found a wrong path.");
197
  check(pathSource(gr, path) == s, "path() found a wrong path.");
198
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
199

	
200
  for(ArcIt e(gr); e!=INVALID; ++e) {
201
    Node u=gr.source(e);
202
    Node v=gr.target(e);
203
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
204
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
205
          bf.dist(v) - bf.dist(u) - length[e]);
206
  }
207

	
208
  for(NodeIt v(gr); v!=INVALID; ++v) {
209
    if (bf.reached(v)) {
210
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
211
      if (bf.predArc(v)!=INVALID ) {
212
        Arc e=bf.predArc(v);
213
        Node u=gr.source(e);
214
        check(u==bf.predNode(v),"Wrong tree.");
215
        check(bf.dist(v) - bf.dist(u) == length[e],
216
              "Wrong distance! Difference: " <<
217
              bf.dist(v) - bf.dist(u) - length[e]);
218
      }
219
    }
220
  }
221
}
222

	
223
void checkBellmanFordNegativeCycle() {
224
  DIGRAPH_TYPEDEFS(SmartDigraph);
225

	
226
  SmartDigraph gr;
227
  IntArcMap length(gr);
228
  
229
  Node n1 = gr.addNode();
230
  Node n2 = gr.addNode();
231
  Node n3 = gr.addNode();
232
  Node n4 = gr.addNode();
233
  
234
  Arc a1 = gr.addArc(n1, n2);
235
  Arc a2 = gr.addArc(n2, n2);
236
  
237
  length[a1] = 2;
238
  length[a2] = -1;
239
  
240
  {
241
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
242
    bf.run(n1);
243
    StaticPath<SmartDigraph> p = bf.negativeCycle();
244
    check(p.length() == 1 && p.front() == p.back() && p.front() == a2,
245
          "Wrong negative cycle.");
246
  }
247
 
248
  length[a2] = 0;
249
  
250
  {
251
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
252
    bf.run(n1);
253
    check(bf.negativeCycle().empty(),
254
          "Negative cycle should not be found.");
255
  }
256
  
257
  length[gr.addArc(n1, n3)] = 5;
258
  length[gr.addArc(n4, n3)] = 1;
259
  length[gr.addArc(n2, n4)] = 2;
260
  length[gr.addArc(n3, n2)] = -4;
261
  
262
  {
263
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
264
    bf.init();
265
    bf.addSource(n1);
266
    for (int i = 0; i < 4; ++i) {
267
      check(bf.negativeCycle().empty(),
268
            "Negative cycle should not be found.");
269
      bf.processNextRound();
270
    }
271
    StaticPath<SmartDigraph> p = bf.negativeCycle();
272
    check(p.length() == 3, "Wrong negative cycle.");
273
    check(length[p.nth(0)] + length[p.nth(1)] + length[p.nth(2)] == -1,
274
          "Wrong negative cycle.");
275
  }
276
}
277

	
278
int main() {
279
  checkBellmanFord<ListDigraph, int>();
280
  checkBellmanFord<SmartDigraph, double>();
281
  checkBellmanFordNegativeCycle();
282
  return 0;
283
}
Ignore white space 6 line context
... ...
@@ -37,636 +37,679 @@
37 37
usage of different physical graph implementations. These differences
38 38
appear in the size of graph we require to handle, memory or time usage
39 39
limitations or in the set of operations through which the graph can be
40 40
accessed.  LEMON provides several physical graph structures to meet
41 41
the diverging requirements of the possible users.  In order to save on
42 42
running time or on memory usage, some structures may fail to provide
43 43
some graph features like arc/edge or node deletion.
44 44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
195 195
  graphToEps(graph, "graph.eps")
196 196
    .coords(coords).scaleToA4().undirected()
197 197
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
198 198
    .run();
199 199
\endcode
200 200
The \c functorToMap() function makes an \c int to \c Color map from the
201 201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
202 202
and the previously created map. The composed map is a proper function to
203 203
get the color of each node.
204 204

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

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

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

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

	
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
304
/**
262 305
@defgroup algs Algorithms
263 306
\brief This group contains the several algorithms
264 307
implemented in LEMON.
265 308

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

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

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

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

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

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

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

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

	
352
/**
301 353
@defgroup max_flow Maximum Flow Algorithms
302 354
@ingroup algs
303 355
\brief Algorithms for finding maximum flows.
304 356

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

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

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

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

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

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

	
337 389
/**
338 390
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 391
@ingroup algs
340 392

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

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

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

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

	
363 415
/**
364 416
@defgroup min_cut Minimum Cut Algorithms
365 417
@ingroup algs
366 418

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

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

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

	
377 429
\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]
430
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 431

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

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

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

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

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

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

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

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

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

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

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

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

	
434 462
The matching algorithms implemented in LEMON:
435 463
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
436 464
  for calculating maximum cardinality matching in bipartite graphs.
437 465
- \ref PrBipartiteMatching Push-relabel algorithm
438 466
  for calculating maximum cardinality matching in bipartite graphs.
439 467
- \ref MaxWeightedBipartiteMatching
440 468
  Successive shortest path algorithm for calculating maximum weighted
441 469
  matching and maximum weighted bipartite matching in bipartite graphs.
442 470
- \ref MinCostMaxBipartiteMatching
443 471
  Successive shortest path algorithm for calculating minimum cost maximum
444 472
  matching in bipartite graphs.
445 473
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
446 474
  maximum cardinality matching in general graphs.
447 475
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
448 476
  maximum weighted matching in general graphs.
449 477
- \ref MaxWeightedPerfectMatching
450 478
  Edmond's blossom shrinking algorithm for calculating maximum weighted
451 479
  perfect matching in general graphs.
452 480

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

	
457 485
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
486
@defgroup graph_properties Connectivity and Other Graph Properties
459 487
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
488
\brief Algorithms for discovering the graph properties
461 489

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
512 555
/**
513 556
@defgroup metah Metaheuristics
514 557
@ingroup gen_opt_group
515 558
\brief Metaheuristics for LEMON library.
516 559

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

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

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

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

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

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

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

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

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

	
553 596
/**
554 597
@defgroup exceptions Exceptions
555 598
@ingroup utils
556 599
\brief Exceptions defined in LEMON.
557 600

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

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

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

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

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

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

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

	
589 632
/**
590
@defgroup dimacs_group DIMACS format
633
@defgroup dimacs_group DIMACS Format
591 634
@ingroup io_group
592 635
\brief Read and write files in DIMACS format
593 636

	
594 637
Tools to read a digraph from or write it to a file in DIMACS format data.
595 638
*/
596 639

	
597 640
/**
598 641
@defgroup nauty_group NAUTY Format
599 642
@ingroup io_group
600 643
\brief Read \e Nauty format
601 644

	
602 645
Tool to read graphs from \e Nauty format data.
603 646
*/
604 647

	
605 648
/**
606 649
@defgroup concept Concepts
607 650
\brief Skeleton classes and concept checking classes
608 651

	
609 652
This group contains the data/algorithm skeletons and concept checking
610 653
classes implemented in LEMON.
611 654

	
612 655
The purpose of the classes in this group is fourfold.
613 656

	
614 657
- These classes contain the documentations of the %concepts. In order
615 658
  to avoid document multiplications, an implementation of a concept
616 659
  simply refers to the corresponding concept class.
617 660

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

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

	
631 674
- Finally, They can serve as a skeleton of a new implementation of a concept.
632 675
*/
633 676

	
634 677
/**
635 678
@defgroup graph_concepts Graph Structure Concepts
636 679
@ingroup concept
637 680
\brief Skeleton and concept checking classes for graph structures
638 681

	
639 682
This group contains the skeletons and concept checking classes of LEMON's
640 683
graph structures and helper classes used to implement these.
641 684
*/
642 685

	
643 686
/**
644 687
@defgroup map_concepts Map Concepts
645 688
@ingroup concept
646 689
\brief Skeleton and concept checking classes for maps
647 690

	
648 691
This group contains the skeletons and concept checking classes of maps.
649 692
*/
650 693

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

	
697
Some utility applications are listed here.
698

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

	
703
/**
652 704
\anchor demoprograms
653 705

	
654 706
@defgroup demos Demo Programs
655 707

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

	
659 711
In order to compile them, use the <tt>make demo</tt> or the
660 712
<tt>make check</tt> commands.
661 713
*/
662 714

	
663
/**
664
@defgroup tools Standalone Utility Applications
665

	
666
Some utility applications are listed here.
667

	
668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
669
them, as well.
670
*/
671

	
672 715
}
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt \
4 4
	lemon/config.h.cmake
5 5

	
6 6
pkgconfig_DATA += lemon/lemon.pc
7 7

	
8 8
lib_LTLIBRARIES += lemon/libemon.la
9 9

	
10 10
lemon_libemon_la_SOURCES = \
11 11
	lemon/arg_parser.cc \
12 12
	lemon/base.cc \
13 13
	lemon/color.cc \
14 14
	lemon/lp_base.cc \
15 15
	lemon/lp_skeleton.cc \
16 16
	lemon/random.cc \
17 17
	lemon/bits/windows.cc
18 18

	
19 19
nodist_lemon_HEADERS = lemon/config.h	
20 20

	
21 21
lemon_libemon_la_CXXFLAGS = \
22 22
	$(AM_CXXFLAGS) \
23 23
	$(GLPK_CFLAGS) \
24 24
	$(CPLEX_CFLAGS) \
25 25
	$(SOPLEX_CXXFLAGS) \
26 26
	$(CLP_CXXFLAGS) \
27 27
	$(CBC_CXXFLAGS)
28 28

	
29 29
lemon_libemon_la_LDFLAGS = \
30 30
	$(GLPK_LIBS) \
31 31
	$(CPLEX_LIBS) \
32 32
	$(SOPLEX_LIBS) \
33 33
	$(CLP_LIBS) \
34 34
	$(CBC_LIBS)
35 35

	
36 36
if HAVE_GLPK
37 37
lemon_libemon_la_SOURCES += lemon/glpk.cc
38 38
endif
39 39

	
40 40
if HAVE_CPLEX
41 41
lemon_libemon_la_SOURCES += lemon/cplex.cc
42 42
endif
43 43

	
44 44
if HAVE_SOPLEX
45 45
lemon_libemon_la_SOURCES += lemon/soplex.cc
46 46
endif
47 47

	
48 48
if HAVE_CLP
49 49
lemon_libemon_la_SOURCES += lemon/clp.cc
50 50
endif
51 51

	
52 52
if HAVE_CBC
53 53
lemon_libemon_la_SOURCES += lemon/cbc.cc
54 54
endif
55 55

	
56 56
lemon_HEADERS += \
57 57
	lemon/adaptors.h \
58 58
	lemon/arg_parser.h \
59 59
	lemon/assert.h \
60
	lemon/bellman_ford.h \
60 61
	lemon/bfs.h \
61 62
	lemon/bin_heap.h \
63
	lemon/binom_heap.h \
64
	lemon/bucket_heap.h \
62 65
	lemon/cbc.h \
63 66
	lemon/circulation.h \
64 67
	lemon/clp.h \
65 68
	lemon/color.h \
66 69
	lemon/concept_check.h \
67 70
	lemon/connectivity.h \
68 71
	lemon/counter.h \
69 72
	lemon/core.h \
70 73
	lemon/cplex.h \
71 74
	lemon/dfs.h \
72 75
	lemon/dijkstra.h \
73 76
	lemon/dim2.h \
74 77
	lemon/dimacs.h \
75 78
	lemon/edge_set.h \
76 79
	lemon/elevator.h \
77 80
	lemon/error.h \
78 81
	lemon/euler.h \
82
	lemon/fib_heap.h \
83
	lemon/fourary_heap.h \
79 84
	lemon/full_graph.h \
80 85
	lemon/glpk.h \
81 86
	lemon/gomory_hu.h \
82 87
	lemon/graph_to_eps.h \
83 88
	lemon/grid_graph.h \
84 89
	lemon/hypercube_graph.h \
90
	lemon/kary_heap.h \
85 91
	lemon/kruskal.h \
86 92
	lemon/hao_orlin.h \
87 93
	lemon/lgf_reader.h \
88 94
	lemon/lgf_writer.h \
89 95
	lemon/list_graph.h \
90 96
	lemon/lp.h \
91 97
	lemon/lp_base.h \
92 98
	lemon/lp_skeleton.h \
93
	lemon/list_graph.h \
94 99
	lemon/maps.h \
95 100
	lemon/matching.h \
96 101
	lemon/math.h \
97 102
	lemon/min_cost_arborescence.h \
98 103
	lemon/nauty_reader.h \
99 104
	lemon/network_simplex.h \
105
	lemon/pairing_heap.h \
100 106
	lemon/path.h \
101 107
	lemon/preflow.h \
108
	lemon/radix_heap.h \
102 109
	lemon/radix_sort.h \
103 110
	lemon/random.h \
104 111
	lemon/smart_graph.h \
105 112
	lemon/soplex.h \
106 113
	lemon/suurballe.h \
107 114
	lemon/time_measure.h \
108 115
	lemon/tolerance.h \
109 116
	lemon/unionfind.h \
110 117
	lemon/bits/windows.h
111 118

	
112 119
bits_HEADERS += \
113 120
	lemon/bits/alteration_notifier.h \
114 121
	lemon/bits/array_map.h \
115 122
	lemon/bits/bezier.h \
116 123
	lemon/bits/default_map.h \
117 124
	lemon/bits/edge_set_extender.h \
118 125
	lemon/bits/enable_if.h \
119 126
	lemon/bits/graph_adaptor_extender.h \
120 127
	lemon/bits/graph_extender.h \
121 128
	lemon/bits/map_extender.h \
122 129
	lemon/bits/path_dump.h \
123 130
	lemon/bits/solver_bits.h \
124 131
	lemon/bits/traits.h \
125 132
	lemon/bits/variant.h \
126 133
	lemon/bits/vector_map.h
127 134

	
128 135
concept_HEADERS += \
129 136
	lemon/concepts/digraph.h \
130 137
	lemon/concepts/graph.h \
131 138
	lemon/concepts/graph_components.h \
132 139
	lemon/concepts/heap.h \
133 140
	lemon/concepts/maps.h \
134 141
	lemon/concepts/path.h
Ignore white space 6 line context
... ...
@@ -225,386 +225,386 @@
225 225
    ///\c PredMap type.
226 226
    ///
227 227
    ///\ref named-templ-param "Named parameter" for setting
228 228
    ///\c PredMap type.
229 229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
230 230
    template <class T>
231 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
232 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
233 233
    };
234 234

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

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

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

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

	
314 314
    ///@}
315 315

	
316 316
  public:
317 317

	
318 318
    ///Constructor.
319 319

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

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

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

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

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

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

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

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

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

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

	
412 412
  public:
413 413

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

	
422 422
    ///@{
423 423

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
572 572
    ///Executes the algorithm.
573 573

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

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

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

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

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

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

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

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

	
1276 1276
  };
1277 1277

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

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

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

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

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

	
1329 1329
  private:
1330 1330

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

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

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

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

	
1356 1356
  protected:
1357 1357

	
1358 1358
    BfsVisit() {}
1359 1359

	
1360 1360
  public:
1361 1361

	
1362 1362
    typedef BfsVisit Create;
1363 1363

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

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

	
1386 1386
  public:
1387 1387

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

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

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

	
1420 1420
  public:
1421 1421

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

	
1430 1430
    /// @{
1431 1431

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

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

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

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

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

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

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

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

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

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

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

	
19 19
#ifndef LEMON_BIN_HEAP_H
20 20
#define LEMON_BIN_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Binary Heap implementation.
24
///\brief Binary heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32
  ///\ingroup auxdat
32
  /// \ingroup heaps
33 33
  ///
34
  ///\brief A Binary Heap implementation.
34
  /// \brief Binary heap data structure.
35 35
  ///
36
  ///This class implements the \e binary \e heap data structure. 
37
  /// 
38
  ///A \e heap is a data structure for storing items with specified values
39
  ///called \e priorities in such a way that finding the item with minimum
40
  ///priority is efficient. \c Comp specifies the ordering of the priorities.
41
  ///In a heap one can change the priority of an item, add or erase an
42
  ///item, etc.
36
  /// This class implements the \e binary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
43 38
  ///
44
  ///\tparam PR Type of the priority of the items.
45
  ///\tparam IM A read and writable item map with int values, used internally
46
  ///to handle the cross references.
47
  ///\tparam Comp A functor class for the ordering of the priorities.
48
  ///The default is \c std::less<PR>.
49
  ///
50
  ///\sa FibHeap
51
  ///\sa Dijkstra
52
  template <typename PR, typename IM, typename Comp = std::less<PR> >
39
  /// \tparam PR Type of the priorities of the items.
40
  /// \tparam IM A read-writable item map with \c int values, used
41
  /// internally to handle the cross references.
42
  /// \tparam CMP A functor class for comparing the priorities.
43
  /// The default is \c std::less<PR>.
44
#ifdef DOXYGEN
45
  template <typename PR, typename IM, typename CMP>
46
#else
47
  template <typename PR, typename IM, typename CMP = std::less<PR> >
48
#endif
53 49
  class BinHeap {
50
  public:
54 51

	
55
  public:
56
    ///\e
52
    /// Type of the item-int map.
57 53
    typedef IM ItemIntMap;
58
    ///\e
54
    /// Type of the priorities.
59 55
    typedef PR Prio;
60
    ///\e
56
    /// Type of the items stored in the heap.
61 57
    typedef typename ItemIntMap::Key Item;
62
    ///\e
58
    /// Type of the item-priority pairs.
63 59
    typedef std::pair<Item,Prio> Pair;
64
    ///\e
65
    typedef Comp Compare;
60
    /// Functor type for comparing the priorities.
61
    typedef CMP Compare;
66 62

	
67
    /// \brief Type to represent the items states.
63
    /// \brief Type to represent the states of the items.
68 64
    ///
69
    /// Each Item element have a state associated to it. It may be "in heap",
70
    /// "pre heap" or "post heap". The latter two are indifferent from the
65
    /// Each item has a state associated to it. It can be "in heap",
66
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 67
    /// heap's point of view, but may be useful to the user.
72 68
    ///
73 69
    /// The item-int map must be initialized in such way that it assigns
74 70
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 71
    enum State {
76 72
      IN_HEAP = 0,    ///< = 0.
77 73
      PRE_HEAP = -1,  ///< = -1.
78 74
      POST_HEAP = -2  ///< = -2.
79 75
    };
80 76

	
81 77
  private:
82 78
    std::vector<Pair> _data;
83 79
    Compare _comp;
84 80
    ItemIntMap &_iim;
85 81

	
86 82
  public:
87
    /// \brief The constructor.
83

	
84
    /// \brief Constructor.
88 85
    ///
89
    /// The constructor.
90
    /// \param map should be given to the constructor, since it is used
91
    /// internally to handle the cross references. The value of the map
92
    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
86
    /// Constructor.
87
    /// \param map A map that assigns \c int values to the items.
88
    /// It is used internally to handle the cross references.
89
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
93 90
    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
94 91

	
95
    /// \brief The constructor.
92
    /// \brief Constructor.
96 93
    ///
97
    /// The constructor.
98
    /// \param map should be given to the constructor, since it is used
99
    /// internally to handle the cross references. The value of the map
100
    /// should be PRE_HEAP (-1) for each element.
101
    ///
102
    /// \param comp The comparator function object.
94
    /// Constructor.
95
    /// \param map A map that assigns \c int values to the items.
96
    /// It is used internally to handle the cross references.
97
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
98
    /// \param comp The function object used for comparing the priorities.
103 99
    BinHeap(ItemIntMap &map, const Compare &comp)
104 100
      : _iim(map), _comp(comp) {}
105 101

	
106 102

	
107
    /// The number of items stored in the heap.
103
    /// \brief The number of items stored in the heap.
108 104
    ///
109
    /// \brief Returns the number of items stored in the heap.
105
    /// This function returns the number of items stored in the heap.
110 106
    int size() const { return _data.size(); }
111 107

	
112
    /// \brief Checks if the heap stores no items.
108
    /// \brief Check if the heap is empty.
113 109
    ///
114
    /// Returns \c true if and only if the heap stores no items.
110
    /// This function returns \c true if the heap is empty.
115 111
    bool empty() const { return _data.empty(); }
116 112

	
117
    /// \brief Make empty this heap.
113
    /// \brief Make the heap empty.
118 114
    ///
119
    /// Make empty this heap. It does not change the cross reference map.
120
    /// If you want to reuse what is not surely empty you should first clear
121
    /// the heap and after that you should set the cross reference map for
122
    /// each item to \c PRE_HEAP.
115
    /// This functon makes the heap empty.
116
    /// It does not change the cross reference map. If you want to reuse
117
    /// a heap that is not surely empty, you should first clear it and
118
    /// then you should set the cross reference map to \c PRE_HEAP
119
    /// for each item.
123 120
    void clear() {
124 121
      _data.clear();
125 122
    }
126 123

	
127 124
  private:
128 125
    static int parent(int i) { return (i-1)/2; }
129 126

	
130
    static int second_child(int i) { return 2*i+2; }
127
    static int secondChild(int i) { return 2*i+2; }
131 128
    bool less(const Pair &p1, const Pair &p2) const {
132 129
      return _comp(p1.second, p2.second);
133 130
    }
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
137 134
      while( hole>0 && less(p,_data[par]) ) {
138 135
        move(_data[par],hole);
139 136
        hole = par;
140 137
        par = parent(hole);
141 138
      }
142 139
      move(p, hole);
143 140
      return hole;
144 141
    }
145 142

	
146
    int bubble_down(int hole, Pair p, int length) {
147
      int child = second_child(hole);
143
    int bubbleDown(int hole, Pair p, int length) {
144
      int child = secondChild(hole);
148 145
      while(child < length) {
149 146
        if( less(_data[child-1], _data[child]) ) {
150 147
          --child;
151 148
        }
152 149
        if( !less(_data[child], p) )
153 150
          goto ok;
154 151
        move(_data[child], hole);
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
158 155
      child--;
159 156
      if( child<length && less(_data[child], p) ) {
160 157
        move(_data[child], hole);
161 158
        hole=child;
162 159
      }
163 160
    ok:
164 161
      move(p, hole);
165 162
      return hole;
166 163
    }
167 164

	
168 165
    void move(const Pair &p, int i) {
169 166
      _data[i] = p;
170 167
      _iim.set(p.first, i);
171 168
    }
172 169

	
173 170
  public:
171

	
174 172
    /// \brief Insert a pair of item and priority into the heap.
175 173
    ///
176
    /// Adds \c p.first to the heap with priority \c p.second.
174
    /// This function inserts \c p.first to the heap with priority
175
    /// \c p.second.
177 176
    /// \param p The pair to insert.
177
    /// \pre \c p.first must not be stored in the heap.
178 178
    void push(const Pair &p) {
179 179
      int n = _data.size();
180 180
      _data.resize(n+1);
181
      bubble_up(n, p);
181
      bubbleUp(n, p);
182 182
    }
183 183

	
184
    /// \brief Insert an item into the heap with the given heap.
184
    /// \brief Insert an item into the heap with the given priority.
185 185
    ///
186
    /// Adds \c i to the heap with priority \c p.
186
    /// This function inserts the given item into the heap with the
187
    /// given priority.
187 188
    /// \param i The item to insert.
188 189
    /// \param p The priority of the item.
190
    /// \pre \e i must not be stored in the heap.
189 191
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
190 192

	
191
    /// \brief Returns the item with minimum priority relative to \c Compare.
193
    /// \brief Return the item having minimum priority.
192 194
    ///
193
    /// This method returns the item with minimum priority relative to \c
194
    /// Compare.
195
    /// \pre The heap must be nonempty.
195
    /// This function returns the item having minimum priority.
196
    /// \pre The heap must be non-empty.
196 197
    Item top() const {
197 198
      return _data[0].first;
198 199
    }
199 200

	
200
    /// \brief Returns the minimum priority relative to \c Compare.
201
    /// \brief The minimum priority.
201 202
    ///
202
    /// It returns the minimum priority relative to \c Compare.
203
    /// \pre The heap must be nonempty.
203
    /// This function returns the minimum priority.
204
    /// \pre The heap must be non-empty.
204 205
    Prio prio() const {
205 206
      return _data[0].second;
206 207
    }
207 208

	
208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
209
    /// \brief Remove the item having minimum priority.
209 210
    ///
210
    /// This method deletes the item with minimum priority relative to \c
211
    /// Compare from the heap.
211
    /// This function removes the item having minimum priority.
212 212
    /// \pre The heap must be non-empty.
213 213
    void pop() {
214 214
      int n = _data.size()-1;
215 215
      _iim.set(_data[0].first, POST_HEAP);
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
219 219
      _data.pop_back();
220 220
    }
221 221

	
222
    /// \brief Deletes \c i from the heap.
222
    /// \brief Remove the given item from the heap.
223 223
    ///
224
    /// This method deletes item \c i from the heap.
225
    /// \param i The item to erase.
226
    /// \pre The item should be in the heap.
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
227 228
    void erase(const Item &i) {
228 229
      int h = _iim[i];
229 230
      int n = _data.size()-1;
230 231
      _iim.set(_data[h].first, POST_HEAP);
231 232
      if( h < n ) {
232
        if ( bubble_up(h, _data[n]) == h) {
233
          bubble_down(h, _data[n], n);
233
        if ( bubbleUp(h, _data[n]) == h) {
234
          bubbleDown(h, _data[n], n);
234 235
        }
235 236
      }
236 237
      _data.pop_back();
237 238
    }
238 239

	
239

	
240
    /// \brief Returns the priority of \c i.
240
    /// \brief The priority of the given item.
241 241
    ///
242
    /// This function returns the priority of item \c i.
242
    /// This function returns the priority of the given item.
243 243
    /// \param i The item.
244
    /// \pre \c i must be in the heap.
244
    /// \pre \e i must be in the heap.
245 245
    Prio operator[](const Item &i) const {
246 246
      int idx = _iim[i];
247 247
      return _data[idx].second;
248 248
    }
249 249

	
250
    /// \brief \c i gets to the heap with priority \c p independently
251
    /// if \c i was already there.
250
    /// \brief Set the priority of an item or insert it, if it is
251
    /// not stored in the heap.
252 252
    ///
253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
254
    /// in the heap and sets the priority of \c i to \c p otherwise.
253
    /// This method sets the priority of the given item if it is
254
    /// already stored in the heap. Otherwise it inserts the given
255
    /// item into the heap with the given priority.
255 256
    /// \param i The item.
256 257
    /// \param p The priority.
257 258
    void set(const Item &i, const Prio &p) {
258 259
      int idx = _iim[i];
259 260
      if( idx < 0 ) {
260 261
        push(i,p);
261 262
      }
262 263
      else if( _comp(p, _data[idx].second) ) {
263
        bubble_up(idx, Pair(i,p));
264
        bubbleUp(idx, Pair(i,p));
264 265
      }
265 266
      else {
266
        bubble_down(idx, Pair(i,p), _data.size());
267
        bubbleDown(idx, Pair(i,p), _data.size());
267 268
      }
268 269
    }
269 270

	
270
    /// \brief Decreases the priority of \c i to \c p.
271
    /// \brief Decrease the priority of an item to the given value.
271 272
    ///
272
    /// This method decreases the priority of item \c i to \c p.
273
    /// This function decreases the priority of an item to the given value.
273 274
    /// \param i The item.
274 275
    /// \param p The priority.
275
    /// \pre \c i must be stored in the heap with priority at least \c
276
    /// p relative to \c Compare.
276
    /// \pre \e i must be stored in the heap with priority at least \e p.
277 277
    void decrease(const Item &i, const Prio &p) {
278 278
      int idx = _iim[i];
279
      bubble_up(idx, Pair(i,p));
279
      bubbleUp(idx, Pair(i,p));
280 280
    }
281 281

	
282
    /// \brief Increases the priority of \c i to \c p.
282
    /// \brief Increase the priority of an item to the given value.
283 283
    ///
284
    /// This method sets the priority of item \c i to \c p.
284
    /// This function increases the priority of an item to the given value.
285 285
    /// \param i The item.
286 286
    /// \param p The priority.
287
    /// \pre \c i must be stored in the heap with priority at most \c
288
    /// p relative to \c Compare.
287
    /// \pre \e i must be stored in the heap with priority at most \e p.
289 288
    void increase(const Item &i, const Prio &p) {
290 289
      int idx = _iim[i];
291
      bubble_down(idx, Pair(i,p), _data.size());
290
      bubbleDown(idx, Pair(i,p), _data.size());
292 291
    }
293 292

	
294
    /// \brief Returns if \c item is in, has already been in, or has
295
    /// never been in the heap.
293
    /// \brief Return the state of an item.
296 294
    ///
297
    /// This method returns PRE_HEAP if \c item has never been in the
298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
299
    /// otherwise. In the latter case it is possible that \c item will
300
    /// get back to the heap again.
295
    /// This method returns \c PRE_HEAP if the given item has never
296
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
297
    /// and \c POST_HEAP otherwise.
298
    /// In the latter case it is possible that the item will get back
299
    /// to the heap again.
301 300
    /// \param i The item.
302 301
    State state(const Item &i) const {
303 302
      int s = _iim[i];
304 303
      if( s>=0 )
305 304
        s=0;
306 305
      return State(s);
307 306
    }
308 307

	
309
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
310 309
    ///
311
    /// Sets the state of the \c item in the heap. It can be used to
312
    /// manually clear the heap when it is important to achive the
313
    /// better time complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
314 313
    /// \param i The item.
315 314
    /// \param st The state. It should not be \c IN_HEAP.
316 315
    void state(const Item& i, State st) {
317 316
      switch (st) {
318 317
      case POST_HEAP:
319 318
      case PRE_HEAP:
320 319
        if (state(i) == IN_HEAP) {
321 320
          erase(i);
322 321
        }
323 322
        _iim[i] = st;
324 323
        break;
325 324
      case IN_HEAP:
326 325
        break;
327 326
      }
328 327
    }
329 328

	
330
    /// \brief Replaces an item in the heap.
329
    /// \brief Replace an item in the heap.
331 330
    ///
332
    /// The \c i item is replaced with \c j item. The \c i item should
333
    /// be in the heap, while the \c j should be out of the heap. The
334
    /// \c i item will out of the heap and \c j will be in the heap
335
    /// with the same prioriority as prevoiusly the \c i item.
331
    /// This function replaces item \c i with item \c j.
332
    /// Item \c i must be in the heap, while \c j must be out of the heap.
333
    /// After calling this method, item \c i will be out of the
334
    /// heap and \c j will be in the heap with the same prioriority
335
    /// as item \c i had before.
336 336
    void replace(const Item& i, const Item& j) {
337 337
      int idx = _iim[i];
338 338
      _iim.set(i, _iim[j]);
339 339
      _iim.set(j, idx);
340 340
      _data[idx].first = j;
341 341
    }
342 342

	
343 343
  }; // class BinHeap
344 344

	
345 345
} // namespace lemon
346 346

	
347 347
#endif // LEMON_BIN_HEAP_H
Ignore white space 384 line context
... ...
@@ -348,278 +348,278 @@
348 348
    }
349 349

	
350 350

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

	
355 355
      NodeIt() {}
356 356

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

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

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

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

	
371 371
    };
372 372

	
373 373

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

	
378 378
      ArcIt() { }
379 379

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

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

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

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

	
394 394
    };
395 395

	
396 396

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

	
401 401
      OutArcIt() { }
402 402

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

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

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

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

	
418 418
    };
419 419

	
420 420

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

	
425 425
      InArcIt() { }
426 426

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

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

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

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

	
442 442
    };
443 443

	
444 444

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

	
449 449
      EdgeIt() { }
450 450

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

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

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

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

	
465 465
    };
466 466

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

	
473 473
      IncEdgeIt() { }
474 474

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

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

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

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

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

	
506 506
    // \brief Base node of the iterator
507 507
    //
508 508
    // Returns the base node (ie. the target in this case) of the iterator
509 509
    Node baseNode(const InArcIt &e) const {
510 510
      return Parent::target(static_cast<const Arc&>(e));
511 511
    }
512 512
    // \brief Running node of the iterator
513 513
    //
514 514
    // Returns the running node (ie. the source in this case) of the
515 515
    // iterator
516 516
    Node runningNode(const InArcIt &e) const {
517 517
      return Parent::source(static_cast<const Arc&>(e));
518 518
    }
519 519

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

	
533 533

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

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

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

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

	
555 555
    };
556 556

	
557 557

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

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

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

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

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

	
580 580
    };
581 581

	
582 582

	
583 583
    // Alteration extension
584 584

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

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

	
610 610

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

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

	
623 623
}
624 624

	
625 625
#endif
Ignore white space 6 line context
... ...
@@ -415,337 +415,337 @@
415 415

	
416 416

	
417 417
    class NodeIt : public Node {
418 418
      const Graph* _graph;
419 419
    public:
420 420

	
421 421
      NodeIt() {}
422 422

	
423 423
      NodeIt(Invalid i) : Node(i) { }
424 424

	
425 425
      explicit NodeIt(const Graph& graph) : _graph(&graph) {
426 426
        _graph->first(static_cast<Node&>(*this));
427 427
      }
428 428

	
429 429
      NodeIt(const Graph& graph, const Node& node)
430 430
        : Node(node), _graph(&graph) {}
431 431

	
432 432
      NodeIt& operator++() {
433 433
        _graph->next(*this);
434 434
        return *this;
435 435
      }
436 436

	
437 437
    };
438 438

	
439 439

	
440 440
    class ArcIt : public Arc {
441 441
      const Graph* _graph;
442 442
    public:
443 443

	
444 444
      ArcIt() { }
445 445

	
446 446
      ArcIt(Invalid i) : Arc(i) { }
447 447

	
448 448
      explicit ArcIt(const Graph& graph) : _graph(&graph) {
449 449
        _graph->first(static_cast<Arc&>(*this));
450 450
      }
451 451

	
452 452
      ArcIt(const Graph& graph, const Arc& arc) :
453 453
        Arc(arc), _graph(&graph) { }
454 454

	
455 455
      ArcIt& operator++() {
456 456
        _graph->next(*this);
457 457
        return *this;
458 458
      }
459 459

	
460 460
    };
461 461

	
462 462

	
463 463
    class OutArcIt : public Arc {
464 464
      const Graph* _graph;
465 465
    public:
466 466

	
467 467
      OutArcIt() { }
468 468

	
469 469
      OutArcIt(Invalid i) : Arc(i) { }
470 470

	
471 471
      OutArcIt(const Graph& graph, const Node& node)
472 472
        : _graph(&graph) {
473 473
        _graph->firstOut(*this, node);
474 474
      }
475 475

	
476 476
      OutArcIt(const Graph& graph, const Arc& arc)
477 477
        : Arc(arc), _graph(&graph) {}
478 478

	
479 479
      OutArcIt& operator++() {
480 480
        _graph->nextOut(*this);
481 481
        return *this;
482 482
      }
483 483

	
484 484
    };
485 485

	
486 486

	
487 487
    class InArcIt : public Arc {
488 488
      const Graph* _graph;
489 489
    public:
490 490

	
491 491
      InArcIt() { }
492 492

	
493 493
      InArcIt(Invalid i) : Arc(i) { }
494 494

	
495 495
      InArcIt(const Graph& graph, const Node& node)
496 496
        : _graph(&graph) {
497 497
        _graph->firstIn(*this, node);
498 498
      }
499 499

	
500 500
      InArcIt(const Graph& graph, const Arc& arc) :
501 501
        Arc(arc), _graph(&graph) {}
502 502

	
503 503
      InArcIt& operator++() {
504 504
        _graph->nextIn(*this);
505 505
        return *this;
506 506
      }
507 507

	
508 508
    };
509 509

	
510 510

	
511 511
    class EdgeIt : public Parent::Edge {
512 512
      const Graph* _graph;
513 513
    public:
514 514

	
515 515
      EdgeIt() { }
516 516

	
517 517
      EdgeIt(Invalid i) : Edge(i) { }
518 518

	
519 519
      explicit EdgeIt(const Graph& graph) : _graph(&graph) {
520 520
        _graph->first(static_cast<Edge&>(*this));
521 521
      }
522 522

	
523 523
      EdgeIt(const Graph& graph, const Edge& edge) :
524 524
        Edge(edge), _graph(&graph) { }
525 525

	
526 526
      EdgeIt& operator++() {
527 527
        _graph->next(*this);
528 528
        return *this;
529 529
      }
530 530

	
531 531
    };
532 532

	
533 533
    class IncEdgeIt : public Parent::Edge {
534 534
      friend class GraphExtender;
535 535
      const Graph* _graph;
536 536
      bool _direction;
537 537
    public:
538 538

	
539 539
      IncEdgeIt() { }
540 540

	
541 541
      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
542 542

	
543 543
      IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) {
544 544
        _graph->firstInc(*this, _direction, node);
545 545
      }
546 546

	
547 547
      IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node)
548 548
        : _graph(&graph), Edge(edge) {
549 549
        _direction = (_graph->source(edge) == node);
550 550
      }
551 551

	
552 552
      IncEdgeIt& operator++() {
553 553
        _graph->nextInc(*this, _direction);
554 554
        return *this;
555 555
      }
556 556
    };
557 557

	
558 558
    // \brief Base node of the iterator
559 559
    //
560 560
    // Returns the base node (ie. the source in this case) of the iterator
561 561
    Node baseNode(const OutArcIt &arc) const {
562 562
      return Parent::source(static_cast<const Arc&>(arc));
563 563
    }
564 564
    // \brief Running node of the iterator
565 565
    //
566 566
    // Returns the running node (ie. the target in this case) of the
567 567
    // iterator
568 568
    Node runningNode(const OutArcIt &arc) const {
569 569
      return Parent::target(static_cast<const Arc&>(arc));
570 570
    }
571 571

	
572 572
    // \brief Base node of the iterator
573 573
    //
574 574
    // Returns the base node (ie. the target in this case) of the iterator
575 575
    Node baseNode(const InArcIt &arc) const {
576 576
      return Parent::target(static_cast<const Arc&>(arc));
577 577
    }
578 578
    // \brief Running node of the iterator
579 579
    //
580 580
    // Returns the running node (ie. the source in this case) of the
581 581
    // iterator
582 582
    Node runningNode(const InArcIt &arc) const {
583 583
      return Parent::source(static_cast<const Arc&>(arc));
584 584
    }
585 585

	
586 586
    // Base node of the iterator
587 587
    //
588 588
    // Returns the base node of the iterator
589 589
    Node baseNode(const IncEdgeIt &edge) const {
590 590
      return edge._direction ? u(edge) : v(edge);
591 591
    }
592 592
    // Running node of the iterator
593 593
    //
594 594
    // Returns the running node of the iterator
595 595
    Node runningNode(const IncEdgeIt &edge) const {
596 596
      return edge._direction ? v(edge) : u(edge);
597 597
    }
598 598

	
599 599
    // Mappable extension
600 600

	
601 601
    template <typename _Value>
602 602
    class NodeMap
603 603
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
604 604
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
605 605

	
606 606
    public:
607
      NodeMap(const Graph& graph)
607
      explicit NodeMap(const Graph& graph)
608 608
        : Parent(graph) {}
609 609
      NodeMap(const Graph& graph, const _Value& value)
610 610
        : Parent(graph, value) {}
611 611

	
612 612
    private:
613 613
      NodeMap& operator=(const NodeMap& cmap) {
614 614
        return operator=<NodeMap>(cmap);
615 615
      }
616 616

	
617 617
      template <typename CMap>
618 618
      NodeMap& operator=(const CMap& cmap) {
619 619
        Parent::operator=(cmap);
620 620
        return *this;
621 621
      }
622 622

	
623 623
    };
624 624

	
625 625
    template <typename _Value>
626 626
    class ArcMap
627 627
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
628 628
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
629 629

	
630 630
    public:
631
      ArcMap(const Graph& graph)
631
      explicit ArcMap(const Graph& graph)
632 632
        : Parent(graph) {}
633 633
      ArcMap(const Graph& graph, const _Value& value)
634 634
        : Parent(graph, value) {}
635 635

	
636 636
    private:
637 637
      ArcMap& operator=(const ArcMap& cmap) {
638 638
        return operator=<ArcMap>(cmap);
639 639
      }
640 640

	
641 641
      template <typename CMap>
642 642
      ArcMap& operator=(const CMap& cmap) {
643 643
        Parent::operator=(cmap);
644 644
        return *this;
645 645
      }
646 646
    };
647 647

	
648 648

	
649 649
    template <typename _Value>
650 650
    class EdgeMap
651 651
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
652 652
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
653 653

	
654 654
    public:
655
      EdgeMap(const Graph& graph)
655
      explicit EdgeMap(const Graph& graph)
656 656
        : Parent(graph) {}
657 657

	
658 658
      EdgeMap(const Graph& graph, const _Value& value)
659 659
        : Parent(graph, value) {}
660 660

	
661 661
    private:
662 662
      EdgeMap& operator=(const EdgeMap& cmap) {
663 663
        return operator=<EdgeMap>(cmap);
664 664
      }
665 665

	
666 666
      template <typename CMap>
667 667
      EdgeMap& operator=(const CMap& cmap) {
668 668
        Parent::operator=(cmap);
669 669
        return *this;
670 670
      }
671 671

	
672 672
    };
673 673

	
674 674
    // Alteration extension
675 675

	
676 676
    Node addNode() {
677 677
      Node node = Parent::addNode();
678 678
      notifier(Node()).add(node);
679 679
      return node;
680 680
    }
681 681

	
682 682
    Edge addEdge(const Node& from, const Node& to) {
683 683
      Edge edge = Parent::addEdge(from, to);
684 684
      notifier(Edge()).add(edge);
685 685
      std::vector<Arc> ev;
686 686
      ev.push_back(Parent::direct(edge, true));
687 687
      ev.push_back(Parent::direct(edge, false));
688 688
      notifier(Arc()).add(ev);
689 689
      return edge;
690 690
    }
691 691

	
692 692
    void clear() {
693 693
      notifier(Arc()).clear();
694 694
      notifier(Edge()).clear();
695 695
      notifier(Node()).clear();
696 696
      Parent::clear();
697 697
    }
698 698

	
699 699
    template <typename Graph, typename NodeRefMap, typename EdgeRefMap>
700 700
    void build(const Graph& graph, NodeRefMap& nodeRef,
701 701
               EdgeRefMap& edgeRef) {
702 702
      Parent::build(graph, nodeRef, edgeRef);
703 703
      notifier(Node()).build();
704 704
      notifier(Edge()).build();
705 705
      notifier(Arc()).build();
706 706
    }
707 707

	
708 708
    void erase(const Node& node) {
709 709
      Arc arc;
710 710
      Parent::firstOut(arc, node);
711 711
      while (arc != INVALID ) {
712 712
        erase(arc);
713 713
        Parent::firstOut(arc, node);
714 714
      }
715 715

	
716 716
      Parent::firstIn(arc, node);
717 717
      while (arc != INVALID ) {
718 718
        erase(arc);
719 719
        Parent::firstIn(arc, node);
720 720
      }
721 721

	
722 722
      notifier(Node()).erase(node);
723 723
      Parent::erase(node);
724 724
    }
725 725

	
726 726
    void erase(const Edge& edge) {
727 727
      std::vector<Arc> av;
728 728
      av.push_back(Parent::direct(edge, true));
729 729
      av.push_back(Parent::direct(edge, false));
730 730
      notifier(Arc()).erase(av);
731 731
      notifier(Edge()).erase(edge);
732 732
      Parent::erase(edge);
733 733
    }
734 734

	
735 735
    GraphExtender() {
736 736
      node_notifier.setContainer(*this);
737 737
      arc_notifier.setContainer(*this);
738 738
      edge_notifier.setContainer(*this);
739 739
    }
740 740

	
741 741
    ~GraphExtender() {
742 742
      edge_notifier.clear();
743 743
      arc_notifier.clear();
744 744
      node_notifier.clear();
745 745
    }
746 746

	
747 747
  };
748 748

	
749 749
}
750 750

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

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

	
468 477
    /// \name Execution Control
469 478
    /// 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
479
    /// If you need better control on the initial solution or the execution,
480
    /// you have to call one of the \ref init() functions first, then
472 481
    /// the \ref start() function.
473 482

	
474 483
    ///@{
475 484

	
476 485
    /// Initializes the internal data structures.
477 486

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

	
485 494
      createStructures();
486 495

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

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

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

	
508 517
    /// Initializes the internal data structures using a greedy approach.
509 518

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

	
517 526
      createStructures();
518 527

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

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

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

	
549 558
    ///Executes the algorithm
550 559

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

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

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

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

	
637 646
    /// Runs the algorithm.
638 647

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

	
654 663
    /// @}
655 664

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

	
662 671
    ///@{
663 672

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

	
19
#ifndef LEMON_CONCEPTS_HEAP_H
20
#define LEMON_CONCEPTS_HEAP_H
21

	
19 22
///\ingroup concept
20 23
///\file
21 24
///\brief The concept of heaps.
22 25

	
23
#ifndef LEMON_CONCEPTS_HEAP_H
24
#define LEMON_CONCEPTS_HEAP_H
25

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

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// \brief The heap concept.
37 37
    ///
38
    /// Concept class describing the main interface of heaps. A \e heap
39
    /// is a data structure for storing items with specified values called
40
    /// \e priorities in such a way that finding the item with minimum
41
    /// priority is efficient. In a heap one can change the priority of an
42
    /// item, add or erase an item, etc.
38
    /// This concept class describes the main interface of heaps.
39
    /// The various \ref heaps "heap structures" are efficient
40
    /// implementations of the abstract data type \e priority \e queue.
41
    /// They store items with specified values called \e priorities
42
    /// in such a way that finding and removing the item with minimum
43
    /// priority are efficient. The basic operations are adding and
44
    /// erasing items, changing the priority of an item, etc.
43 45
    ///
44
    /// \tparam PR Type of the priority of the items.
45
    /// \tparam IM A read and writable item map with int values, used
46
    /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
47
    /// Any class that conforms to this concept can be used easily in such
48
    /// algorithms.
49
    ///
50
    /// \tparam PR Type of the priorities of the items.
51
    /// \tparam IM A read-writable item map with \c int values, used
46 52
    /// internally to handle the cross references.
47
    /// \tparam Comp A functor class for the ordering of the priorities.
53
    /// \tparam CMP A functor class for comparing the priorities.
48 54
    /// The default is \c std::less<PR>.
49 55
#ifdef DOXYGEN
50
    template <typename PR, typename IM, typename Comp = std::less<PR> >
56
    template <typename PR, typename IM, typename CMP>
51 57
#else
52
    template <typename PR, typename IM>
58
    template <typename PR, typename IM, typename CMP = std::less<PR> >
53 59
#endif
54 60
    class Heap {
55 61
    public:
56 62

	
57 63
      /// Type of the item-int map.
58 64
      typedef IM ItemIntMap;
59 65
      /// Type of the priorities.
60 66
      typedef PR Prio;
61 67
      /// Type of the items stored in the heap.
62 68
      typedef typename ItemIntMap::Key Item;
63 69

	
64 70
      /// \brief Type to represent the states of the items.
65 71
      ///
66 72
      /// Each item has a state associated to it. It can be "in heap",
67
      /// "pre heap" or "post heap". The later two are indifferent
68
      /// from the point of view of the heap, but may be useful for
69
      /// the user.
73
      /// "pre-heap" or "post-heap". The latter two are indifferent from the
74
      /// heap's point of view, but may be useful to the user.
70 75
      ///
71 76
      /// The item-int map must be initialized in such way that it assigns
72 77
      /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
73 78
      enum State {
74 79
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< = -1. The "pre heap" state constant.
76
        POST_HEAP = -2  ///< = -2. The "post heap" state constant.
80
        PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
81
        POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
77 82
      };
78 83

	
79
      /// \brief The constructor.
84
      /// \brief Constructor.
80 85
      ///
81
      /// The constructor.
86
      /// Constructor.
82 87
      /// \param map A map that assigns \c int values to keys of type
83 88
      /// \c Item. It is used internally by the heap implementations to
84 89
      /// handle the cross references. The assigned value must be
85
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
86 91
      explicit Heap(ItemIntMap &map) {}
87 92

	
93
      /// \brief Constructor.
94
      ///
95
      /// Constructor.
96
      /// \param map A map that assigns \c int values to keys of type
97
      /// \c Item. It is used internally by the heap implementations to
98
      /// handle the cross references. The assigned value must be
99
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
100
      /// \param comp The function object used for comparing the priorities.
101
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
102

	
88 103
      /// \brief The number of items stored in the heap.
89 104
      ///
90
      /// Returns the number of items stored in the heap.
105
      /// This function returns the number of items stored in the heap.
91 106
      int size() const { return 0; }
92 107

	
93
      /// \brief Checks if the heap is empty.
108
      /// \brief Check if the heap is empty.
94 109
      ///
95
      /// Returns \c true if the heap is empty.
110
      /// This function returns \c true if the heap is empty.
96 111
      bool empty() const { return false; }
97 112

	
98
      /// \brief Makes the heap empty.
113
      /// \brief Make the heap empty.
99 114
      ///
100
      /// Makes the heap empty.
101
      void clear();
115
      /// This functon makes the heap empty.
116
      /// It does not change the cross reference map. If you want to reuse
117
      /// a heap that is not surely empty, you should first clear it and
118
      /// then you should set the cross reference map to \c PRE_HEAP
119
      /// for each item.
120
      void clear() {}
102 121

	
103
      /// \brief Inserts an item into the heap with the given priority.
122
      /// \brief Insert an item into the heap with the given priority.
104 123
      ///
105
      /// Inserts the given item into the heap with the given priority.
124
      /// This function inserts the given item into the heap with the
125
      /// given priority.
106 126
      /// \param i The item to insert.
107 127
      /// \param p The priority of the item.
128
      /// \pre \e i must not be stored in the heap.
108 129
      void push(const Item &i, const Prio &p) {}
109 130

	
110
      /// \brief Returns the item having minimum priority.
131
      /// \brief Return the item having minimum priority.
111 132
      ///
112
      /// Returns the item having minimum priority.
133
      /// This function returns the item having minimum priority.
113 134
      /// \pre The heap must be non-empty.
114 135
      Item top() const {}
115 136

	
116 137
      /// \brief The minimum priority.
117 138
      ///
118
      /// Returns the minimum priority.
139
      /// This function returns the minimum priority.
119 140
      /// \pre The heap must be non-empty.
120 141
      Prio prio() const {}
121 142

	
122
      /// \brief Removes the item having minimum priority.
143
      /// \brief Remove the item having minimum priority.
123 144
      ///
124
      /// Removes the item having minimum priority.
145
      /// This function removes the item having minimum priority.
125 146
      /// \pre The heap must be non-empty.
126 147
      void pop() {}
127 148

	
128
      /// \brief Removes an item from the heap.
149
      /// \brief Remove the given item from the heap.
129 150
      ///
130
      /// Removes the given item from the heap if it is already stored.
151
      /// This function removes the given item from the heap if it is
152
      /// already stored.
131 153
      /// \param i The item to delete.
154
      /// \pre \e i must be in the heap.
132 155
      void erase(const Item &i) {}
133 156

	
134
      /// \brief The priority of an item.
157
      /// \brief The priority of the given item.
135 158
      ///
136
      /// Returns the priority of the given item.
159
      /// This function returns the priority of the given item.
137 160
      /// \param i The item.
138
      /// \pre \c i must be in the heap.
161
      /// \pre \e i must be in the heap.
139 162
      Prio operator[](const Item &i) const {}
140 163

	
141
      /// \brief Sets the priority of an item or inserts it, if it is
164
      /// \brief Set the priority of an item or insert it, if it is
142 165
      /// not stored in the heap.
143 166
      ///
144 167
      /// This method sets the priority of the given item if it is
145
      /// already stored in the heap.
146
      /// Otherwise it inserts the given item with the given priority.
168
      /// already stored in the heap. Otherwise it inserts the given
169
      /// item into the heap with the given priority.
147 170
      ///
148 171
      /// \param i The item.
149 172
      /// \param p The priority.
150 173
      void set(const Item &i, const Prio &p) {}
151 174

	
152
      /// \brief Decreases the priority of an item to the given value.
175
      /// \brief Decrease the priority of an item to the given value.
153 176
      ///
154
      /// Decreases the priority of an item to the given value.
177
      /// This function decreases the priority of an item to the given value.
155 178
      /// \param i The item.
156 179
      /// \param p The priority.
157
      /// \pre \c i must be stored in the heap with priority at least \c p.
180
      /// \pre \e i must be stored in the heap with priority at least \e p.
158 181
      void decrease(const Item &i, const Prio &p) {}
159 182

	
160
      /// \brief Increases the priority of an item to the given value.
183
      /// \brief Increase the priority of an item to the given value.
161 184
      ///
162
      /// Increases the priority of an item to the given value.
185
      /// This function increases the priority of an item to the given value.
163 186
      /// \param i The item.
164 187
      /// \param p The priority.
165
      /// \pre \c i must be stored in the heap with priority at most \c p.
188
      /// \pre \e i must be stored in the heap with priority at most \e p.
166 189
      void increase(const Item &i, const Prio &p) {}
167 190

	
168
      /// \brief Returns if an item is in, has already been in, or has
169
      /// never been in the heap.
191
      /// \brief Return the state of an item.
170 192
      ///
171 193
      /// This method returns \c PRE_HEAP if the given item has never
172 194
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
173 195
      /// and \c POST_HEAP otherwise.
174 196
      /// In the latter case it is possible that the item will get back
175 197
      /// to the heap again.
176 198
      /// \param i The item.
177 199
      State state(const Item &i) const {}
178 200

	
179
      /// \brief Sets the state of an item in the heap.
201
      /// \brief Set the state of an item in the heap.
180 202
      ///
181
      /// Sets the state of the given item in the heap. It can be used
182
      /// to manually clear the heap when it is important to achive the
183
      /// better time complexity.
203
      /// This function sets the state of the given item in the heap.
204
      /// It can be used to manually clear the heap when it is important
205
      /// to achive better time complexity.
184 206
      /// \param i The item.
185 207
      /// \param st The state. It should not be \c IN_HEAP.
186 208
      void state(const Item& i, State st) {}
187 209

	
188 210

	
189 211
      template <typename _Heap>
190 212
      struct Constraints {
191 213
      public:
192 214
        void constraints() {
193 215
          typedef typename _Heap::Item OwnItem;
194 216
          typedef typename _Heap::Prio OwnPrio;
195 217
          typedef typename _Heap::State OwnState;
196 218

	
197 219
          Item item;
198 220
          Prio prio;
199 221
          item=Item();
200 222
          prio=Prio();
201 223
          ignore_unused_variable_warning(item);
202 224
          ignore_unused_variable_warning(prio);
203 225

	
204 226
          OwnItem own_item;
205 227
          OwnPrio own_prio;
206 228
          OwnState own_state;
207 229
          own_item=Item();
208 230
          own_prio=Prio();
209 231
          ignore_unused_variable_warning(own_item);
210 232
          ignore_unused_variable_warning(own_prio);
211 233
          ignore_unused_variable_warning(own_state);
212 234

	
213 235
          _Heap heap1(map);
214 236
          _Heap heap2 = heap1;
215 237
          ignore_unused_variable_warning(heap1);
216 238
          ignore_unused_variable_warning(heap2);
217 239

	
218 240
          int s = heap.size();
219 241
          ignore_unused_variable_warning(s);
220 242
          bool e = heap.empty();
221 243
          ignore_unused_variable_warning(e);
222 244

	
223 245
          prio = heap.prio();
224 246
          item = heap.top();
225 247
          prio = heap[item];
226 248
          own_prio = heap.prio();
227 249
          own_item = heap.top();
228 250
          own_prio = heap[own_item];
229 251

	
230 252
          heap.push(item, prio);
231 253
          heap.push(own_item, own_prio);
232 254
          heap.pop();
233 255

	
234 256
          heap.set(item, prio);
235 257
          heap.decrease(item, prio);
236 258
          heap.increase(item, prio);
237 259
          heap.set(own_item, own_prio);
238 260
          heap.decrease(own_item, own_prio);
239 261
          heap.increase(own_item, own_prio);
240 262

	
241 263
          heap.erase(item);
242 264
          heap.erase(own_item);
243 265
          heap.clear();
244 266

	
245 267
          own_state = heap.state(own_item);
246 268
          heap.state(own_item, own_state);
247 269

	
248 270
          own_state = _Heap::PRE_HEAP;
249 271
          own_state = _Heap::IN_HEAP;
250 272
          own_state = _Heap::POST_HEAP;
251 273
        }
252 274

	
253 275
        _Heap& heap;
254 276
        ItemIntMap& map;
255 277
      };
256 278
    };
257 279

	
258 280
    /// @}
259 281
  } // namespace lemon
260 282
}
261 283
#endif
Ignore white space 6 line context
... ...
@@ -223,386 +223,386 @@
223 223
    ///\brief \ref named-templ-param "Named parameter" for setting
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 conform to the \ref concepts::WriteMap "WriteMap" concept.
229 229
    template <class T>
230 230
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
231 231
      typedef Dfs<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 conform to the \ref concepts::WriteMap "WriteMap" concept.
249 249
    template <class T>
250 250
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
251 251
      typedef Dfs<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 conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 269
    template <class T>
270 270
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
271 271
      typedef Dfs< 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 conform to the \ref concepts::WriteMap "WriteMap" concept.
289 289
    template <class T>
290 290
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
291 291
      typedef Dfs< 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
      }
300 300
    };
301 301
    ///\brief \ref named-templ-param "Named parameter" for setting
302 302
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
303 303
    ///
304 304
    ///\ref named-templ-param "Named parameter" for setting
305 305
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
306 306
    ///If you don't set it explicitly, it will be automatically allocated.
307 307
    struct SetStandardProcessedMap :
308 308
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
309 309
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
310 310
    };
311 311

	
312 312
    ///@}
313 313

	
314 314
  public:
315 315

	
316 316
    ///Constructor.
317 317

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

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

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

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

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

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

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

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

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

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

	
410 410
  public:
411 411

	
412 412
    ///\name Execution Control
413 413
    ///The simplest way to execute the DFS algorithm is to use one of the
414 414
    ///member functions called \ref run(Node) "run()".\n
415
    ///If you need more control on the execution, first you have to call
416
    ///\ref init(), then you can add a source node with \ref addSource()
415
    ///If you need better control on the execution, you have to call
416
    ///\ref init() first, then you can add a source node with \ref addSource()
417 417
    ///and perform the actual computation with \ref start().
418 418
    ///This procedure can be repeated if there are nodes that have not
419 419
    ///been reached.
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
      _stack.resize(countNodes(*G));
430 430
      _stack_head=-1;
431 431
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
432 432
        _pred->set(u,INVALID);
433 433
        _reached->set(u,false);
434 434
        _processed->set(u,false);
435 435
      }
436 436
    }
437 437

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

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

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

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

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

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

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

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

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

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

	
521 521
    ///Executes the algorithm.
522 522

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

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

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

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

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

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

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

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

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

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

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

	
1218 1218
  };
1219 1219

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

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

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

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

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

	
1271 1271
  private:
1272 1272

	
1273 1273
    typedef typename Digraph::Node Node;
1274 1274
    typedef typename Digraph::NodeIt NodeIt;
1275 1275
    typedef typename Digraph::Arc Arc;
1276 1276
    typedef typename Digraph::OutArcIt OutArcIt;
1277 1277

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

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

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

	
1298 1298
  protected:
1299 1299

	
1300 1300
    DfsVisit() {}
1301 1301

	
1302 1302
  public:
1303 1303

	
1304 1304
    typedef DfsVisit Create;
1305 1305

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

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

	
1328 1328
  public:
1329 1329

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

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

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

	
1362 1362
  public:
1363 1363

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

	
1373 1373
    /// @{
1374 1374

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

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

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

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

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

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

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

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

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

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

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

	
1559 1559
    /// This method runs the %DFS algorithm from node \c s
1560 1560
    /// in order to compute the DFS path to node \c t
Ignore white space 6 line context
... ...
@@ -400,386 +400,386 @@
400 400
    ///or \ref init().
401 401
    ///\sa SetStandardHeap
402 402
    template <class H, class CR = typename Digraph::template NodeMap<int> >
403 403
    struct SetHeap
404 404
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
405 405
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
406 406
    };
407 407

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

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

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

	
458 458
    ///@}
459 459

	
460 460
  protected:
461 461

	
462 462
    Dijkstra() {}
463 463

	
464 464
  public:
465 465

	
466 466
    ///Constructor.
467 467

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

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

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

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

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

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

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

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

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

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

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

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

	
579 579
  private:
580 580

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

	
587 587
  public:
588 588

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

	
597 597
    ///@{
598 598

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

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

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

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

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

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

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

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

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

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

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

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

	
689 689
    ///Executes the algorithm.
690 690

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

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

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

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

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

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

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

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

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

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

	
22 22
#include <iostream>
23 23

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

	
35 28
namespace lemon {
36 29

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

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

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

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

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

	
53 46
    public:
54 47

	
55 48
      typedef T Value;
56 49

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

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

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

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

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

	
74 67
      ///Subscripting operator
75 68

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

	
80 73
      ///Const subscripting operator
81 74

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

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

	
89 82
      ///Give back the square of the norm of the vector
90 83
      T normSquare() const {
91 84
        return x*x+y*y;
92 85
      }
93 86

	
94 87
      ///Increment the left hand side by \c u
95 88
      Point<T>& operator +=(const Point<T>& u) {
96 89
        x += u.x;
97 90
        y += u.y;
98 91
        return *this;
99 92
      }
100 93

	
101 94
      ///Decrement the left hand side by \c u
102 95
      Point<T>& operator -=(const Point<T>& u) {
103 96
        x -= u.x;
104 97
        y -= u.y;
105 98
        return *this;
106 99
      }
107 100

	
108 101
      ///Multiply the left hand side with a scalar
109 102
      Point<T>& operator *=(const T &u) {
110 103
        x *= u;
111 104
        y *= u;
112 105
        return *this;
113 106
      }
114 107

	
115 108
      ///Divide the left hand side by a scalar
116 109
      Point<T>& operator /=(const T &u) {
117 110
        x /= u;
118 111
        y /= u;
119 112
        return *this;
120 113
      }
121 114

	
122 115
      ///Return the scalar product of two vectors
123 116
      T operator *(const Point<T>& u) const {
124 117
        return x*u.x+y*u.y;
125 118
      }
126 119

	
127 120
      ///Return the sum of two vectors
128 121
      Point<T> operator+(const Point<T> &u) const {
129 122
        Point<T> b=*this;
130 123
        return b+=u;
131 124
      }
132 125

	
133 126
      ///Return the negative of the vector
134 127
      Point<T> operator-() const {
135 128
        Point<T> b=*this;
136 129
        b.x=-b.x; b.y=-b.y;
137 130
        return b;
138 131
      }
139 132

	
140 133
      ///Return the difference of two vectors
141 134
      Point<T> operator-(const Point<T> &u) const {
142 135
        Point<T> b=*this;
143 136
        return b-=u;
144 137
      }
145 138

	
146 139
      ///Return a vector multiplied by a scalar
147 140
      Point<T> operator*(const T &u) const {
148 141
        Point<T> b=*this;
149 142
        return b*=u;
150 143
      }
151 144

	
152 145
      ///Return a vector divided by a scalar
153 146
      Point<T> operator/(const T &u) const {
154 147
        Point<T> b=*this;
155 148
        return b/=u;
156 149
      }
157 150

	
158 151
      ///Test equality
159 152
      bool operator==(const Point<T> &u) const {
160 153
        return (x==u.x) && (y==u.y);
161 154
      }
162 155

	
163 156
      ///Test inequality
164 157
      bool operator!=(Point u) const {
165 158
        return  (x!=u.x) || (y!=u.y);
166 159
      }
167 160

	
168 161
    };
169 162

	
170 163
  ///Return a Point
171 164

	
172 165
  ///Return a Point.
173 166
  ///\relates Point
174 167
  template <typename T>
175 168
  inline Point<T> makePoint(const T& x, const T& y) {
176 169
    return Point<T>(x, y);
177 170
  }
178 171

	
179 172
  ///Return a vector multiplied by a scalar
180 173

	
181 174
  ///Return a vector multiplied by a scalar.
182 175
  ///\relates Point
183 176
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
184 177
    return x*u;
185 178
  }
186 179

	
187 180
  ///Read a plain vector from a stream
188 181

	
189 182
  ///Read a plain vector from a stream.
190 183
  ///\relates Point
191 184
  ///
192 185
  template<typename T>
193 186
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
194 187
    char c;
195 188
    if (is >> c) {
196 189
      if (c != '(') is.putback(c);
197 190
    } else {
198 191
      is.clear();
199 192
    }
200 193
    if (!(is >> z.x)) return is;
201 194
    if (is >> c) {
202 195
      if (c != ',') is.putback(c);
203 196
    } else {
204 197
      is.clear();
205 198
    }
206 199
    if (!(is >> z.y)) return is;
207 200
    if (is >> c) {
208 201
      if (c != ')') is.putback(c);
209 202
    } else {
210 203
      is.clear();
211 204
    }
212 205
    return is;
213 206
  }
214 207

	
215 208
  ///Write a plain vector to a stream
216 209

	
217 210
  ///Write a plain vector to a stream.
218 211
  ///\relates Point
219 212
  ///
220 213
  template<typename T>
221 214
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
222 215
  {
223 216
    os << "(" << z.x << "," << z.y << ")";
224 217
    return os;
225 218
  }
226 219

	
227 220
  ///Rotate by 90 degrees
228 221

	
229 222
  ///Returns the parameter rotated by 90 degrees in positive direction.
230 223
  ///\relates Point
231 224
  ///
232 225
  template<typename T>
233 226
  inline Point<T> rot90(const Point<T> &z)
234 227
  {
235 228
    return Point<T>(-z.y,z.x);
Ignore white space 6 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 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25
#include <map>
25 26

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

	
28 29
///\file
29 30
///\ingroup maps
30 31
///\brief Miscellaneous property maps
31 32

	
32
#include <map>
33

	
34 33
namespace lemon {
35 34

	
36 35
  /// \addtogroup maps
37 36
  /// @{
38 37

	
39 38
  /// Base class of maps.
40 39

	
41 40
  /// Base class of maps. It provides the necessary type definitions
42 41
  /// required by the map %concepts.
43 42
  template<typename K, typename V>
44 43
  class MapBase {
45 44
  public:
46 45
    /// \brief The key type of the map.
47 46
    typedef K Key;
48 47
    /// \brief The value type of the map.
49 48
    /// (The type of objects associated with the keys).
50 49
    typedef V Value;
51 50
  };
52 51

	
53 52

	
54 53
  /// Null map. (a.k.a. DoNothingMap)
55 54

	
56 55
  /// This map can be used if you have to provide a map only for
57 56
  /// its type definitions, or if you have to provide a writable map,
58 57
  /// but data written to it is not required (i.e. it will be sent to
59 58
  /// <tt>/dev/null</tt>).
60 59
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 60
  ///
62 61
  /// \sa ConstMap
63 62
  template<typename K, typename V>
64 63
  class NullMap : public MapBase<K, V> {
65 64
  public:
66 65
    ///\e
67 66
    typedef K Key;
68 67
    ///\e
69 68
    typedef V Value;
70 69

	
71 70
    /// Gives back a default constructed element.
72 71
    Value operator[](const Key&) const { return Value(); }
73 72
    /// Absorbs the value.
74 73
    void set(const Key&, const Value&) {}
75 74
  };
76 75

	
77 76
  /// Returns a \c NullMap class
78 77

	
79 78
  /// This function just returns a \c NullMap class.
80 79
  /// \relates NullMap
81 80
  template <typename K, typename V>
82 81
  NullMap<K, V> nullMap() {
83 82
    return NullMap<K, V>();
84 83
  }
85 84

	
86 85

	
87 86
  /// Constant map.
88 87

	
89 88
  /// This \ref concepts::ReadMap "readable map" assigns a specified
90 89
  /// value to each key.
91 90
  ///
92 91
  /// In other aspects it is equivalent to \c NullMap.
93 92
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
94 93
  /// concept, but it absorbs the data written to it.
95 94
  ///
96 95
  /// The simplest way of using this map is through the constMap()
97 96
  /// function.
98 97
  ///
99 98
  /// \sa NullMap
100 99
  /// \sa IdentityMap
101 100
  template<typename K, typename V>
102 101
  class ConstMap : public MapBase<K, V> {
103 102
  private:
104 103
    V _value;
105 104
  public:
106 105
    ///\e
107 106
    typedef K Key;
108 107
    ///\e
109 108
    typedef V Value;
110 109

	
111 110
    /// Default constructor
112 111

	
113 112
    /// Default constructor.
114 113
    /// The value of the map will be default constructed.
115 114
    ConstMap() {}
116 115

	
117 116
    /// Constructor with specified initial value
118 117

	
119 118
    /// Constructor with specified initial value.
120 119
    /// \param v The initial value of the map.
121 120
    ConstMap(const Value &v) : _value(v) {}
122 121

	
123 122
    /// Gives back the specified value.
124 123
    Value operator[](const Key&) const { return _value; }
125 124

	
126 125
    /// Absorbs the value.
127 126
    void set(const Key&, const Value&) {}
128 127

	
129 128
    /// Sets the value that is assigned to each key.
130 129
    void setAll(const Value &v) {
131 130
      _value = v;
132 131
    }
133 132

	
134 133
    template<typename V1>
135 134
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
136 135
  };
137 136

	
138 137
  /// Returns a \c ConstMap class
139 138

	
140 139
  /// This function just returns a \c ConstMap class.
141 140
  /// \relates ConstMap
142 141
  template<typename K, typename V>
143 142
  inline ConstMap<K, V> constMap(const V &v) {
144 143
    return ConstMap<K, V>(v);
145 144
  }
146 145

	
147 146
  template<typename K, typename V>
148 147
  inline ConstMap<K, V> constMap() {
149 148
    return ConstMap<K, V>();
150 149
  }
151 150

	
152 151

	
153 152
  template<typename T, T v>
154 153
  struct Const {};
155 154

	
156 155
  /// Constant map with inlined constant value.
157 156

	
158 157
  /// This \ref concepts::ReadMap "readable map" assigns a specified
159 158
  /// value to each key.
160 159
  ///
161 160
  /// In other aspects it is equivalent to \c NullMap.
162 161
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
163 162
  /// concept, but it absorbs the data written to it.
164 163
  ///
165 164
  /// The simplest way of using this map is through the constMap()
166 165
  /// function.
167 166
  ///
168 167
  /// \sa NullMap
169 168
  /// \sa IdentityMap
170 169
  template<typename K, typename V, V v>
171 170
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
172 171
  public:
173 172
    ///\e
174 173
    typedef K Key;
175 174
    ///\e
176 175
    typedef V Value;
177 176

	
178 177
    /// Constructor.
179 178
    ConstMap() {}
180 179

	
181 180
    /// Gives back the specified value.
182 181
    Value operator[](const Key&) const { return v; }
183 182

	
184 183
    /// Absorbs the value.
185 184
    void set(const Key&, const Value&) {}
186 185
  };
187 186

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

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

	
198 197

	
199 198
  /// Identity map.
200 199

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

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

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

	
221 220
  /// This function just returns an \c IdentityMap class.
222 221
  /// \relates IdentityMap
223 222
  template<typename T>
224 223
  inline IdentityMap<T> identityMap() {
225 224
    return IdentityMap<T>();
... ...
@@ -1629,1159 +1628,2075 @@
1629 1628
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1630 1629
    ///\e
1631 1630
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1632 1631
  };
1633 1632

	
1634 1633
  /// Returns an \c EqualMap class
1635 1634

	
1636 1635
  /// This function just returns an \c EqualMap class.
1637 1636
  ///
1638 1637
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1639 1638
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1640 1639
  /// <tt>m1[x]==m2[x]</tt>.
1641 1640
  ///
1642 1641
  /// \relates EqualMap
1643 1642
  template<typename M1, typename M2>
1644 1643
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1645 1644
    return EqualMap<M1, M2>(m1,m2);
1646 1645
  }
1647 1646

	
1648 1647

	
1649 1648
  /// Combination of two maps using the \c < operator
1650 1649

	
1651 1650
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1652 1651
  /// the keys for which the corresponding value of the first map is
1653 1652
  /// less then the value of the second map.
1654 1653
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1655 1654
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1656 1655
  ///
1657 1656
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1658 1657
  /// \code
1659 1658
  ///   LessMap<M1,M2> lm(m1,m2);
1660 1659
  /// \endcode
1661 1660
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1662 1661
  ///
1663 1662
  /// The simplest way of using this map is through the lessMap()
1664 1663
  /// function.
1665 1664
  ///
1666 1665
  /// \sa EqualMap
1667 1666
  template<typename M1, typename M2>
1668 1667
  class LessMap : public MapBase<typename M1::Key, bool> {
1669 1668
    const M1 &_m1;
1670 1669
    const M2 &_m2;
1671 1670
  public:
1672 1671
    ///\e
1673 1672
    typedef typename M1::Key Key;
1674 1673
    ///\e
1675 1674
    typedef bool Value;
1676 1675

	
1677 1676
    /// Constructor
1678 1677
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1679 1678
    ///\e
1680 1679
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1681 1680
  };
1682 1681

	
1683 1682
  /// Returns an \c LessMap class
1684 1683

	
1685 1684
  /// This function just returns an \c LessMap class.
1686 1685
  ///
1687 1686
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1688 1687
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1689 1688
  /// <tt>m1[x]<m2[x]</tt>.
1690 1689
  ///
1691 1690
  /// \relates LessMap
1692 1691
  template<typename M1, typename M2>
1693 1692
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1694 1693
    return LessMap<M1, M2>(m1,m2);
1695 1694
  }
1696 1695

	
1697 1696
  namespace _maps_bits {
1698 1697

	
1699 1698
    template <typename _Iterator, typename Enable = void>
1700 1699
    struct IteratorTraits {
1701 1700
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1702 1701
    };
1703 1702

	
1704 1703
    template <typename _Iterator>
1705 1704
    struct IteratorTraits<_Iterator,
1706 1705
      typename exists<typename _Iterator::container_type>::type>
1707 1706
    {
1708 1707
      typedef typename _Iterator::container_type::value_type Value;
1709 1708
    };
1710 1709

	
1711 1710
  }
1712 1711

	
1713 1712
  /// @}
1714 1713

	
1715 1714
  /// \addtogroup maps
1716 1715
  /// @{
1717 1716

	
1718 1717
  /// \brief Writable bool map for logging each \c true assigned element
1719 1718
  ///
1720 1719
  /// A \ref concepts::WriteMap "writable" bool map for logging
1721 1720
  /// each \c true assigned element, i.e it copies subsequently each
1722 1721
  /// keys set to \c true to the given iterator.
1723 1722
  /// The most important usage of it is storing certain nodes or arcs
1724 1723
  /// that were marked \c true by an algorithm.
1725 1724
  ///
1726 1725
  /// There are several algorithms that provide solutions through bool
1727 1726
  /// maps and most of them assign \c true at most once for each key.
1728 1727
  /// In these cases it is a natural request to store each \c true
1729 1728
  /// assigned elements (in order of the assignment), which can be
1730 1729
  /// easily done with LoggerBoolMap.
1731 1730
  ///
1732 1731
  /// The simplest way of using this map is through the loggerBoolMap()
1733 1732
  /// function.
1734 1733
  ///
1735 1734
  /// \tparam IT The type of the iterator.
1736 1735
  /// \tparam KEY The key type of the map. The default value set
1737 1736
  /// according to the iterator type should work in most cases.
1738 1737
  ///
1739 1738
  /// \note The container of the iterator must contain enough space
1740 1739
  /// for the elements or the iterator should be an inserter iterator.
1741 1740
#ifdef DOXYGEN
1742 1741
  template <typename IT, typename KEY>
1743 1742
#else
1744 1743
  template <typename IT,
1745 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1746 1745
#endif
1747 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1748 1747
  public:
1749 1748

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

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

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

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

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

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

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

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

	
1813 1812
  /// @}
1814 1813

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

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

	
1849 1848
    /// \brief Constructor.
1850 1849
    ///
1851 1850
    /// Constructor of the map.
1852 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1853 1852

	
1854 1853
    /// \brief Gives back the \e id of the item.
1855 1854
    ///
1856 1855
    /// Gives back the immutable and unique \e id of the item.
1857 1856
    int operator[](const Item& item) const { return _graph->id(item);}
1858 1857

	
1859 1858
    /// \brief Gives back the \e item by its id.
1860 1859
    ///
1861 1860
    /// Gives back the \e item by its id.
1862 1861
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1863 1862

	
1864 1863
  private:
1865 1864
    const Graph* _graph;
1866 1865

	
1867 1866
  public:
1868 1867

	
1869 1868
    /// \brief This class represents the inverse of its owner (IdMap).
1870 1869
    ///
1871 1870
    /// This class represents the inverse of its owner (IdMap).
1872 1871
    /// \see inverse()
1873 1872
    class InverseMap {
1874 1873
    public:
1875 1874

	
1876 1875
      /// \brief Constructor.
1877 1876
      ///
1878 1877
      /// Constructor for creating an id-to-item map.
1879 1878
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1880 1879

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

	
1886 1885
      /// \brief Gives back the given item from its id.
1887 1886
      ///
1888 1887
      /// Gives back the given item from its id.
1889 1888
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1889

	
1891 1890
    private:
1892 1891
      const Graph* _graph;
1893 1892
    };
1894 1893

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

	
1901 1900

	
1902 1901
  /// \brief General cross reference graph map type.
1903 1902

	
1904 1903
  /// This class provides simple invertable graph maps.
1905
  /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
1906
  /// and if a key is set to a new value then store it
1907
  /// in the inverse map.
1908
  ///
1904
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1905
  /// and if a key is set to a new value, then stores it in the inverse map.
1909 1906
  /// The values of the map can be accessed
1910 1907
  /// with stl compatible forward iterator.
1911 1908
  ///
1909
  /// This type is not reference map, so it cannot be modified with
1910
  /// the subscript operator.
1911
  ///
1912 1912
  /// \tparam GR The graph type.
1913 1913
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1914 1914
  /// \c GR::Edge).
1915 1915
  /// \tparam V The value type of the map.
1916 1916
  ///
1917 1917
  /// \see IterableValueMap
1918 1918
  template <typename GR, typename K, typename V>
1919 1919
  class CrossRefMap
1920 1920
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1921 1921
  private:
1922 1922

	
1923 1923
    typedef typename ItemSetTraits<GR, K>::
1924 1924
      template Map<V>::Type Map;
1925 1925

	
1926
    typedef std::map<V, K> Container;
1926
    typedef std::multimap<V, K> Container;
1927 1927
    Container _inv_map;
1928 1928

	
1929 1929
  public:
1930 1930

	
1931 1931
    /// The graph type of CrossRefMap.
1932 1932
    typedef GR Graph;
1933 1933
    typedef GR Digraph;
1934 1934
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1935
    typedef K Item;
1936 1936
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1937
    typedef K Key;
1938 1938
    /// The value type of CrossRefMap.
1939 1939
    typedef V Value;
1940 1940

	
1941 1941
    /// \brief Constructor.
1942 1942
    ///
1943 1943
    /// Construct a new CrossRefMap for the given graph.
1944 1944
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1945 1945

	
1946 1946
    /// \brief Forward iterator for values.
1947 1947
    ///
1948 1948
    /// This iterator is an stl compatible forward
1949 1949
    /// iterator on the values of the map. The values can
1950 1950
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1951
    /// They are considered with multiplicity, so each value is
1952
    /// traversed for each item it is assigned to.
1951 1953
    class ValueIterator
1952 1954
      : public std::iterator<std::forward_iterator_tag, Value> {
1953 1955
      friend class CrossRefMap;
1954 1956
    private:
1955 1957
      ValueIterator(typename Container::const_iterator _it)
1956 1958
        : it(_it) {}
1957 1959
    public:
1958 1960

	
1959 1961
      ValueIterator() {}
1960 1962

	
1961 1963
      ValueIterator& operator++() { ++it; return *this; }
1962 1964
      ValueIterator operator++(int) {
1963 1965
        ValueIterator tmp(*this);
1964 1966
        operator++();
1965 1967
        return tmp;
1966 1968
      }
1967 1969

	
1968 1970
      const Value& operator*() const { return it->first; }
1969 1971
      const Value* operator->() const { return &(it->first); }
1970 1972

	
1971 1973
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1972 1974
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1973 1975

	
1974 1976
    private:
1975 1977
      typename Container::const_iterator it;
1976 1978
    };
1977 1979

	
1978 1980
    /// \brief Returns an iterator to the first value.
1979 1981
    ///
1980 1982
    /// Returns an stl compatible iterator to the
1981 1983
    /// first value of the map. The values of the
1982 1984
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1983 1985
    /// range.
1984 1986
    ValueIterator beginValue() const {
1985 1987
      return ValueIterator(_inv_map.begin());
1986 1988
    }
1987 1989

	
1988 1990
    /// \brief Returns an iterator after the last value.
1989 1991
    ///
1990 1992
    /// Returns an stl compatible iterator after the
1991 1993
    /// last value of the map. The values of the
1992 1994
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1993 1995
    /// range.
1994 1996
    ValueIterator endValue() const {
1995 1997
      return ValueIterator(_inv_map.end());
1996 1998
    }
1997 1999

	
1998 2000
    /// \brief Sets the value associated with the given key.
1999 2001
    ///
2000 2002
    /// Sets the value associated with the given key.
2001 2003
    void set(const Key& key, const Value& val) {
2002 2004
      Value oldval = Map::operator[](key);
2003
      typename Container::iterator it = _inv_map.find(oldval);
2004
      if (it != _inv_map.end() && it->second == key) {
2005
        _inv_map.erase(it);
2005
      typename Container::iterator it;
2006
      for (it = _inv_map.equal_range(oldval).first;
2007
           it != _inv_map.equal_range(oldval).second; ++it) {
2008
        if (it->second == key) {
2009
          _inv_map.erase(it);
2010
          break;
2011
        }
2006 2012
      }
2007
      _inv_map.insert(make_pair(val, key));
2013
      _inv_map.insert(std::make_pair(val, key));
2008 2014
      Map::set(key, val);
2009 2015
    }
2010 2016

	
2011 2017
    /// \brief Returns the value associated with the given key.
2012 2018
    ///
2013 2019
    /// Returns the value associated with the given key.
2014 2020
    typename MapTraits<Map>::ConstReturnValue
2015 2021
    operator[](const Key& key) const {
2016 2022
      return Map::operator[](key);
2017 2023
    }
2018 2024

	
2019
    /// \brief Gives back the item by its value.
2025
    /// \brief Gives back an item by its value.
2020 2026
    ///
2021
    /// Gives back the item by its value.
2022
    Key operator()(const Value& key) const {
2023
      typename Container::const_iterator it = _inv_map.find(key);
2027
    /// This function gives back an item that is assigned to
2028
    /// the given value or \c INVALID if no such item exists.
2029
    /// If there are more items with the same associated value,
2030
    /// only one of them is returned.
2031
    Key operator()(const Value& val) const {
2032
      typename Container::const_iterator it = _inv_map.find(val);
2024 2033
      return it != _inv_map.end() ? it->second : INVALID;
2025 2034
    }
2026 2035

	
2027 2036
  protected:
2028 2037

	
2029 2038
    /// \brief Erase the key from the map and the inverse map.
2030 2039
    ///
2031 2040
    /// Erase the key from the map and the inverse map. It is called by the
2032 2041
    /// \c AlterationNotifier.
2033 2042
    virtual void erase(const Key& key) {
2034 2043
      Value val = Map::operator[](key);
2035
      typename Container::iterator it = _inv_map.find(val);
2036
      if (it != _inv_map.end() && it->second == key) {
2037
        _inv_map.erase(it);
2044
      typename Container::iterator it;
2045
      for (it = _inv_map.equal_range(val).first;
2046
           it != _inv_map.equal_range(val).second; ++it) {
2047
        if (it->second == key) {
2048
          _inv_map.erase(it);
2049
          break;
2050
        }
2038 2051
      }
2039 2052
      Map::erase(key);
2040 2053
    }
2041 2054

	
2042 2055
    /// \brief Erase more keys from the map and the inverse map.
2043 2056
    ///
2044 2057
    /// Erase more keys from the map and the inverse map. It is called by the
2045 2058
    /// \c AlterationNotifier.
2046 2059
    virtual void erase(const std::vector<Key>& keys) {
2047 2060
      for (int i = 0; i < int(keys.size()); ++i) {
2048 2061
        Value val = Map::operator[](keys[i]);
2049
        typename Container::iterator it = _inv_map.find(val);
2050
        if (it != _inv_map.end() && it->second == keys[i]) {
2051
          _inv_map.erase(it);
2062
        typename Container::iterator it;
2063
        for (it = _inv_map.equal_range(val).first;
2064
             it != _inv_map.equal_range(val).second; ++it) {
2065
          if (it->second == keys[i]) {
2066
            _inv_map.erase(it);
2067
            break;
2068
          }
2052 2069
        }
2053 2070
      }
2054 2071
      Map::erase(keys);
2055 2072
    }
2056 2073

	
2057 2074
    /// \brief Clear the keys from the map and the inverse map.
2058 2075
    ///
2059 2076
    /// Clear the keys from the map and the inverse map. It is called by the
2060 2077
    /// \c AlterationNotifier.
2061 2078
    virtual void clear() {
2062 2079
      _inv_map.clear();
2063 2080
      Map::clear();
2064 2081
    }
2065 2082

	
2066 2083
  public:
2067 2084

	
2068 2085
    /// \brief The inverse map type.
2069 2086
    ///
2070 2087
    /// The inverse of this map. The subscript operator of the map
2071 2088
    /// gives back the item that was last assigned to the value.
2072 2089
    class InverseMap {
2073 2090
    public:
2074 2091
      /// \brief Constructor
2075 2092
      ///
2076 2093
      /// Constructor of the InverseMap.
2077 2094
      explicit InverseMap(const CrossRefMap& inverted)
2078 2095
        : _inverted(inverted) {}
2079 2096

	
2080 2097
      /// The value type of the InverseMap.
2081 2098
      typedef typename CrossRefMap::Key Value;
2082 2099
      /// The key type of the InverseMap.
2083 2100
      typedef typename CrossRefMap::Value Key;
2084 2101

	
2085 2102
      /// \brief Subscript operator.
2086 2103
      ///
2087
      /// Subscript operator. It gives back the item
2088
      /// that was last assigned to the given value.
2104
      /// Subscript operator. It gives back an item
2105
      /// that is assigned to the given value or \c INVALID
2106
      /// if no such item exists.
2089 2107
      Value operator[](const Key& key) const {
2090 2108
        return _inverted(key);
2091 2109
      }
2092 2110

	
2093 2111
    private:
2094 2112
      const CrossRefMap& _inverted;
2095 2113
    };
2096 2114

	
2097 2115
    /// \brief It gives back the read-only inverse map.
2098 2116
    ///
2099 2117
    /// It gives back the read-only inverse map.
2100 2118
    InverseMap inverse() const {
2101 2119
      return InverseMap(*this);
2102 2120
    }
2103 2121

	
2104 2122
  };
2105 2123

	
2106 2124
  /// \brief Provides continuous and unique ID for the
2107 2125
  /// items of a graph.
2108 2126
  ///
2109 2127
  /// RangeIdMap provides a unique and continuous
2110 2128
  /// ID for each item of a given type (\c Node, \c Arc or
2111 2129
  /// \c Edge) in a graph. This id is
2112 2130
  ///  - \b unique: different items get different ids,
2113 2131
  ///  - \b continuous: the range of the ids is the set of integers
2114 2132
  ///    between 0 and \c n-1, where \c n is the number of the items of
2115 2133
  ///    this type (\c Node, \c Arc or \c Edge).
2116 2134
  ///  - So, the ids can change when deleting an item of the same type.
2117 2135
  ///
2118 2136
  /// Thus this id is not (necessarily) the same as what can get using
2119 2137
  /// the \c id() function of the graph or \ref IdMap.
2120 2138
  /// This map can be inverted with its member class \c InverseMap,
2121 2139
  /// or with the \c operator() member.
2122 2140
  ///
2123 2141
  /// \tparam GR The graph type.
2124 2142
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2125 2143
  /// \c GR::Edge).
2126 2144
  ///
2127 2145
  /// \see IdMap
2128 2146
  template <typename GR, typename K>
2129 2147
  class RangeIdMap
2130 2148
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2131 2149

	
2132 2150
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2133 2151

	
2134 2152
  public:
2135 2153
    /// The graph type of RangeIdMap.
2136 2154
    typedef GR Graph;
2137 2155
    typedef GR Digraph;
2138 2156
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2139 2157
    typedef K Item;
2140 2158
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2141 2159
    typedef K Key;
2142 2160
    /// The value type of RangeIdMap.
2143 2161
    typedef int Value;
2144 2162

	
2145 2163
    /// \brief Constructor.
2146 2164
    ///
2147 2165
    /// Constructor.
2148 2166
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2149 2167
      Item it;
2150 2168
      const typename Map::Notifier* nf = Map::notifier();
2151 2169
      for (nf->first(it); it != INVALID; nf->next(it)) {
2152 2170
        Map::set(it, _inv_map.size());
2153 2171
        _inv_map.push_back(it);
2154 2172
      }
2155 2173
    }
2156 2174

	
2157 2175
  protected:
2158 2176

	
2159 2177
    /// \brief Adds a new key to the map.
2160 2178
    ///
2161 2179
    /// Add a new key to the map. It is called by the
2162 2180
    /// \c AlterationNotifier.
2163 2181
    virtual void add(const Item& item) {
2164 2182
      Map::add(item);
2165 2183
      Map::set(item, _inv_map.size());
2166 2184
      _inv_map.push_back(item);
2167 2185
    }
2168 2186

	
2169 2187
    /// \brief Add more new keys to the map.
2170 2188
    ///
2171 2189
    /// Add more new keys to the map. It is called by the
2172 2190
    /// \c AlterationNotifier.
2173 2191
    virtual void add(const std::vector<Item>& items) {
2174 2192
      Map::add(items);
2175 2193
      for (int i = 0; i < int(items.size()); ++i) {
2176 2194
        Map::set(items[i], _inv_map.size());
2177 2195
        _inv_map.push_back(items[i]);
2178 2196
      }
2179 2197
    }
2180 2198

	
2181 2199
    /// \brief Erase the key from the map.
2182 2200
    ///
2183 2201
    /// Erase the key from the map. It is called by the
2184 2202
    /// \c AlterationNotifier.
2185 2203
    virtual void erase(const Item& item) {
2186 2204
      Map::set(_inv_map.back(), Map::operator[](item));
2187 2205
      _inv_map[Map::operator[](item)] = _inv_map.back();
2188 2206
      _inv_map.pop_back();
2189 2207
      Map::erase(item);
2190 2208
    }
2191 2209

	
2192 2210
    /// \brief Erase more keys from the map.
2193 2211
    ///
2194 2212
    /// Erase more keys from the map. It is called by the
2195 2213
    /// \c AlterationNotifier.
2196 2214
    virtual void erase(const std::vector<Item>& items) {
2197 2215
      for (int i = 0; i < int(items.size()); ++i) {
2198 2216
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2199 2217
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2200 2218
        _inv_map.pop_back();
2201 2219
      }
2202 2220
      Map::erase(items);
2203 2221
    }
2204 2222

	
2205 2223
    /// \brief Build the unique map.
2206 2224
    ///
2207 2225
    /// Build the unique map. It is called by the
2208 2226
    /// \c AlterationNotifier.
2209 2227
    virtual void build() {
2210 2228
      Map::build();
2211 2229
      Item it;
2212 2230
      const typename Map::Notifier* nf = Map::notifier();
2213 2231
      for (nf->first(it); it != INVALID; nf->next(it)) {
2214 2232
        Map::set(it, _inv_map.size());
2215 2233
        _inv_map.push_back(it);
2216 2234
      }
2217 2235
    }
2218 2236

	
2219 2237
    /// \brief Clear the keys from the map.
2220 2238
    ///
2221 2239
    /// Clear the keys from the map. It is called by the
2222 2240
    /// \c AlterationNotifier.
2223 2241
    virtual void clear() {
2224 2242
      _inv_map.clear();
2225 2243
      Map::clear();
2226 2244
    }
2227 2245

	
2228 2246
  public:
2229 2247

	
2230 2248
    /// \brief Returns the maximal value plus one.
2231 2249
    ///
2232 2250
    /// Returns the maximal value plus one in the map.
2233 2251
    unsigned int size() const {
2234 2252
      return _inv_map.size();
2235 2253
    }
2236 2254

	
2237 2255
    /// \brief Swaps the position of the two items in the map.
2238 2256
    ///
2239 2257
    /// Swaps the position of the two items in the map.
2240 2258
    void swap(const Item& p, const Item& q) {
2241 2259
      int pi = Map::operator[](p);
2242 2260
      int qi = Map::operator[](q);
2243 2261
      Map::set(p, qi);
2244 2262
      _inv_map[qi] = p;
2245 2263
      Map::set(q, pi);
2246 2264
      _inv_map[pi] = q;
2247 2265
    }
2248 2266

	
2249 2267
    /// \brief Gives back the \e RangeId of the item
2250 2268
    ///
2251 2269
    /// Gives back the \e RangeId of the item.
2252 2270
    int operator[](const Item& item) const {
2253 2271
      return Map::operator[](item);
2254 2272
    }
2255 2273

	
2256 2274
    /// \brief Gives back the item belonging to a \e RangeId
2257
    /// 
2275
    ///
2258 2276
    /// Gives back the item belonging to a \e RangeId.
2259 2277
    Item operator()(int id) const {
2260 2278
      return _inv_map[id];
2261 2279
    }
2262 2280

	
2263 2281
  private:
2264 2282

	
2265 2283
    typedef std::vector<Item> Container;
2266 2284
    Container _inv_map;
2267 2285

	
2268 2286
  public:
2269 2287

	
2270 2288
    /// \brief The inverse map type of RangeIdMap.
2271 2289
    ///
2272 2290
    /// The inverse map type of RangeIdMap.
2273 2291
    class InverseMap {
2274 2292
    public:
2275 2293
      /// \brief Constructor
2276 2294
      ///
2277 2295
      /// Constructor of the InverseMap.
2278 2296
      explicit InverseMap(const RangeIdMap& inverted)
2279 2297
        : _inverted(inverted) {}
2280 2298

	
2281 2299

	
2282 2300
      /// The value type of the InverseMap.
2283 2301
      typedef typename RangeIdMap::Key Value;
2284 2302
      /// The key type of the InverseMap.
2285 2303
      typedef typename RangeIdMap::Value Key;
2286 2304

	
2287 2305
      /// \brief Subscript operator.
2288 2306
      ///
2289 2307
      /// Subscript operator. It gives back the item
2290 2308
      /// that the descriptor currently belongs to.
2291 2309
      Value operator[](const Key& key) const {
2292 2310
        return _inverted(key);
2293 2311
      }
2294 2312

	
2295 2313
      /// \brief Size of the map.
2296 2314
      ///
2297 2315
      /// Returns the size of the map.
2298 2316
      unsigned int size() const {
2299 2317
        return _inverted.size();
2300 2318
      }
2301 2319

	
2302 2320
    private:
2303 2321
      const RangeIdMap& _inverted;
2304 2322
    };
2305 2323

	
2306 2324
    /// \brief Gives back the inverse of the map.
2307 2325
    ///
2308 2326
    /// Gives back the inverse of the map.
2309 2327
    const InverseMap inverse() const {
2310 2328
      return InverseMap(*this);
2311 2329
    }
2312 2330
  };
2313 2331

	
2332
  /// \brief Dynamic iterable \c bool map.
2333
  ///
2334
  /// This class provides a special graph map type which can store a
2335
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2336
  /// For both \c true and \c false values it is possible to iterate on
2337
  /// the keys.
2338
  ///
2339
  /// This type is a reference map, so it can be modified with the
2340
  /// subscript operator.
2341
  ///
2342
  /// \tparam GR The graph type.
2343
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2344
  /// \c GR::Edge).
2345
  ///
2346
  /// \see IterableIntMap, IterableValueMap
2347
  /// \see CrossRefMap
2348
  template <typename GR, typename K>
2349
  class IterableBoolMap
2350
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2351
  private:
2352
    typedef GR Graph;
2353

	
2354
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2355
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2356

	
2357
    std::vector<K> _array;
2358
    int _sep;
2359

	
2360
  public:
2361

	
2362
    /// Indicates that the map is reference map.
2363
    typedef True ReferenceMapTag;
2364

	
2365
    /// The key type
2366
    typedef K Key;
2367
    /// The value type
2368
    typedef bool Value;
2369
    /// The const reference type.
2370
    typedef const Value& ConstReference;
2371

	
2372
  private:
2373

	
2374
    int position(const Key& key) const {
2375
      return Parent::operator[](key);
2376
    }
2377

	
2378
  public:
2379

	
2380
    /// \brief Reference to the value of the map.
2381
    ///
2382
    /// This class is similar to the \c bool type. It can be converted to
2383
    /// \c bool and it provides the same operators.
2384
    class Reference {
2385
      friend class IterableBoolMap;
2386
    private:
2387
      Reference(IterableBoolMap& map, const Key& key)
2388
        : _key(key), _map(map) {}
2389
    public:
2390

	
2391
      Reference& operator=(const Reference& value) {
2392
        _map.set(_key, static_cast<bool>(value));
2393
         return *this;
2394
      }
2395

	
2396
      operator bool() const {
2397
        return static_cast<const IterableBoolMap&>(_map)[_key];
2398
      }
2399

	
2400
      Reference& operator=(bool value) {
2401
        _map.set(_key, value);
2402
        return *this;
2403
      }
2404
      Reference& operator&=(bool value) {
2405
        _map.set(_key, _map[_key] & value);
2406
        return *this;
2407
      }
2408
      Reference& operator|=(bool value) {
2409
        _map.set(_key, _map[_key] | value);
2410
        return *this;
2411
      }
2412
      Reference& operator^=(bool value) {
2413
        _map.set(_key, _map[_key] ^ value);
2414
        return *this;
2415
      }
2416
    private:
2417
      Key _key;
2418
      IterableBoolMap& _map;
2419
    };
2420

	
2421
    /// \brief Constructor of the map with a default value.
2422
    ///
2423
    /// Constructor of the map with a default value.
2424
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2425
      : Parent(graph) {
2426
      typename Parent::Notifier* nf = Parent::notifier();
2427
      Key it;
2428
      for (nf->first(it); it != INVALID; nf->next(it)) {
2429
        Parent::set(it, _array.size());
2430
        _array.push_back(it);
2431
      }
2432
      _sep = (def ? _array.size() : 0);
2433
    }
2434

	
2435
    /// \brief Const subscript operator of the map.
2436
    ///
2437
    /// Const subscript operator of the map.
2438
    bool operator[](const Key& key) const {
2439
      return position(key) < _sep;
2440
    }
2441

	
2442
    /// \brief Subscript operator of the map.
2443
    ///
2444
    /// Subscript operator of the map.
2445
    Reference operator[](const Key& key) {
2446
      return Reference(*this, key);
2447
    }
2448

	
2449
    /// \brief Set operation of the map.
2450
    ///
2451
    /// Set operation of the map.
2452
    void set(const Key& key, bool value) {
2453
      int pos = position(key);
2454
      if (value) {
2455
        if (pos < _sep) return;
2456
        Key tmp = _array[_sep];
2457
        _array[_sep] = key;
2458
        Parent::set(key, _sep);
2459
        _array[pos] = tmp;
2460
        Parent::set(tmp, pos);
2461
        ++_sep;
2462
      } else {
2463
        if (pos >= _sep) return;
2464
        --_sep;
2465
        Key tmp = _array[_sep];
2466
        _array[_sep] = key;
2467
        Parent::set(key, _sep);
2468
        _array[pos] = tmp;
2469
        Parent::set(tmp, pos);
2470
      }
2471
    }
2472

	
2473
    /// \brief Set all items.
2474
    ///
2475
    /// Set all items in the map.
2476
    /// \note Constant time operation.
2477
    void setAll(bool value) {
2478
      _sep = (value ? _array.size() : 0);
2479
    }
2480

	
2481
    /// \brief Returns the number of the keys mapped to \c true.
2482
    ///
2483
    /// Returns the number of the keys mapped to \c true.
2484
    int trueNum() const {
2485
      return _sep;
2486
    }
2487

	
2488
    /// \brief Returns the number of the keys mapped to \c false.
2489
    ///
2490
    /// Returns the number of the keys mapped to \c false.
2491
    int falseNum() const {
2492
      return _array.size() - _sep;
2493
    }
2494

	
2495
    /// \brief Iterator for the keys mapped to \c true.
2496
    ///
2497
    /// Iterator for the keys mapped to \c true. It works
2498
    /// like a graph item iterator, it can be converted to
2499
    /// the key type of the map, incremented with \c ++ operator, and
2500
    /// if the iterator leaves the last valid key, it will be equal to
2501
    /// \c INVALID.
2502
    class TrueIt : public Key {
2503
    public:
2504
      typedef Key Parent;
2505

	
2506
      /// \brief Creates an iterator.
2507
      ///
2508
      /// Creates an iterator. It iterates on the
2509
      /// keys mapped to \c true.
2510
      /// \param map The IterableBoolMap.
2511
      explicit TrueIt(const IterableBoolMap& map)
2512
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2513
          _map(&map) {}
2514

	
2515
      /// \brief Invalid constructor \& conversion.
2516
      ///
2517
      /// This constructor initializes the iterator to be invalid.
2518
      /// \sa Invalid for more details.
2519
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2520

	
2521
      /// \brief Increment operator.
2522
      ///
2523
      /// Increment operator.
2524
      TrueIt& operator++() {
2525
        int pos = _map->position(*this);
2526
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2527
        return *this;
2528
      }
2529

	
2530
    private:
2531
      const IterableBoolMap* _map;
2532
    };
2533

	
2534
    /// \brief Iterator for the keys mapped to \c false.
2535
    ///
2536
    /// Iterator for the keys mapped to \c false. It works
2537
    /// like a graph item iterator, it can be converted to
2538
    /// the key type of the map, incremented with \c ++ operator, and
2539
    /// if the iterator leaves the last valid key, it will be equal to
2540
    /// \c INVALID.
2541
    class FalseIt : public Key {
2542
    public:
2543
      typedef Key Parent;
2544

	
2545
      /// \brief Creates an iterator.
2546
      ///
2547
      /// Creates an iterator. It iterates on the
2548
      /// keys mapped to \c false.
2549
      /// \param map The IterableBoolMap.
2550
      explicit FalseIt(const IterableBoolMap& map)
2551
        : Parent(map._sep < int(map._array.size()) ?
2552
                 map._array.back() : INVALID), _map(&map) {}
2553

	
2554
      /// \brief Invalid constructor \& conversion.
2555
      ///
2556
      /// This constructor initializes the iterator to be invalid.
2557
      /// \sa Invalid for more details.
2558
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2559

	
2560
      /// \brief Increment operator.
2561
      ///
2562
      /// Increment operator.
2563
      FalseIt& operator++() {
2564
        int pos = _map->position(*this);
2565
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2566
        return *this;
2567
      }
2568

	
2569
    private:
2570
      const IterableBoolMap* _map;
2571
    };
2572

	
2573
    /// \brief Iterator for the keys mapped to a given value.
2574
    ///
2575
    /// Iterator for the keys mapped to a given value. It works
2576
    /// like a graph item iterator, it can be converted to
2577
    /// the key type of the map, incremented with \c ++ operator, and
2578
    /// if the iterator leaves the last valid key, it will be equal to
2579
    /// \c INVALID.
2580
    class ItemIt : public Key {
2581
    public:
2582
      typedef Key Parent;
2583

	
2584
      /// \brief Creates an iterator with a value.
2585
      ///
2586
      /// Creates an iterator with a value. It iterates on the
2587
      /// keys mapped to the given value.
2588
      /// \param map The IterableBoolMap.
2589
      /// \param value The value.
2590
      ItemIt(const IterableBoolMap& map, bool value)
2591
        : Parent(value ? 
2592
                 (map._sep > 0 ?
2593
                  map._array[map._sep - 1] : INVALID) :
2594
                 (map._sep < int(map._array.size()) ?
2595
                  map._array.back() : INVALID)), _map(&map) {}
2596

	
2597
      /// \brief Invalid constructor \& conversion.
2598
      ///
2599
      /// This constructor initializes the iterator to be invalid.
2600
      /// \sa Invalid for more details.
2601
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2602

	
2603
      /// \brief Increment operator.
2604
      ///
2605
      /// Increment operator.
2606
      ItemIt& operator++() {
2607
        int pos = _map->position(*this);
2608
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2609
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2610
        return *this;
2611
      }
2612

	
2613
    private:
2614
      const IterableBoolMap* _map;
2615
    };
2616

	
2617
  protected:
2618

	
2619
    virtual void add(const Key& key) {
2620
      Parent::add(key);
2621
      Parent::set(key, _array.size());
2622
      _array.push_back(key);
2623
    }
2624

	
2625
    virtual void add(const std::vector<Key>& keys) {
2626
      Parent::add(keys);
2627
      for (int i = 0; i < int(keys.size()); ++i) {
2628
        Parent::set(keys[i], _array.size());
2629
        _array.push_back(keys[i]);
2630
      }
2631
    }
2632

	
2633
    virtual void erase(const Key& key) {
2634
      int pos = position(key);
2635
      if (pos < _sep) {
2636
        --_sep;
2637
        Parent::set(_array[_sep], pos);
2638
        _array[pos] = _array[_sep];
2639
        Parent::set(_array.back(), _sep);
2640
        _array[_sep] = _array.back();
2641
        _array.pop_back();
2642
      } else {
2643
        Parent::set(_array.back(), pos);
2644
        _array[pos] = _array.back();
2645
        _array.pop_back();
2646
      }
2647
      Parent::erase(key);
2648
    }
2649

	
2650
    virtual void erase(const std::vector<Key>& keys) {
2651
      for (int i = 0; i < int(keys.size()); ++i) {
2652
        int pos = position(keys[i]);
2653
        if (pos < _sep) {
2654
          --_sep;
2655
          Parent::set(_array[_sep], pos);
2656
          _array[pos] = _array[_sep];
2657
          Parent::set(_array.back(), _sep);
2658
          _array[_sep] = _array.back();
2659
          _array.pop_back();
2660
        } else {
2661
          Parent::set(_array.back(), pos);
2662
          _array[pos] = _array.back();
2663
          _array.pop_back();
2664
        }
2665
      }
2666
      Parent::erase(keys);
2667
    }
2668

	
2669
    virtual void build() {
2670
      Parent::build();
2671
      typename Parent::Notifier* nf = Parent::notifier();
2672
      Key it;
2673
      for (nf->first(it); it != INVALID; nf->next(it)) {
2674
        Parent::set(it, _array.size());
2675
        _array.push_back(it);
2676
      }
2677
      _sep = 0;
2678
    }
2679

	
2680
    virtual void clear() {
2681
      _array.clear();
2682
      _sep = 0;
2683
      Parent::clear();
2684
    }
2685

	
2686
  };
2687

	
2688

	
2689
  namespace _maps_bits {
2690
    template <typename Item>
2691
    struct IterableIntMapNode {
2692
      IterableIntMapNode() : value(-1) {}
2693
      IterableIntMapNode(int _value) : value(_value) {}
2694
      Item prev, next;
2695
      int value;
2696
    };
2697
  }
2698

	
2699
  /// \brief Dynamic iterable integer map.
2700
  ///
2701
  /// This class provides a special graph map type which can store an
2702
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2703
  /// For each non-negative value it is possible to iterate on the keys
2704
  /// mapped to the value.
2705
  ///
2706
  /// This type is a reference map, so it can be modified with the
2707
  /// subscript operator.
2708
  ///
2709
  /// \note The size of the data structure depends on the largest
2710
  /// value in the map.
2711
  ///
2712
  /// \tparam GR The graph type.
2713
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2714
  /// \c GR::Edge).
2715
  ///
2716
  /// \see IterableBoolMap, IterableValueMap
2717
  /// \see CrossRefMap
2718
  template <typename GR, typename K>
2719
  class IterableIntMap
2720
    : protected ItemSetTraits<GR, K>::
2721
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2722
  public:
2723
    typedef typename ItemSetTraits<GR, K>::
2724
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2725

	
2726
    /// The key type
2727
    typedef K Key;
2728
    /// The value type
2729
    typedef int Value;
2730
    /// The graph type
2731
    typedef GR Graph;
2732

	
2733
    /// \brief Constructor of the map.
2734
    ///
2735
    /// Constructor of the map. It sets all values to -1.
2736
    explicit IterableIntMap(const Graph& graph)
2737
      : Parent(graph) {}
2738

	
2739
    /// \brief Constructor of the map with a given value.
2740
    ///
2741
    /// Constructor of the map with a given value.
2742
    explicit IterableIntMap(const Graph& graph, int value)
2743
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2744
      if (value >= 0) {
2745
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2746
          lace(it);
2747
        }
2748
      }
2749
    }
2750

	
2751
  private:
2752

	
2753
    void unlace(const Key& key) {
2754
      typename Parent::Value& node = Parent::operator[](key);
2755
      if (node.value < 0) return;
2756
      if (node.prev != INVALID) {
2757
        Parent::operator[](node.prev).next = node.next;
2758
      } else {
2759
        _first[node.value] = node.next;
2760
      }
2761
      if (node.next != INVALID) {
2762
        Parent::operator[](node.next).prev = node.prev;
2763
      }
2764
      while (!_first.empty() && _first.back() == INVALID) {
2765
        _first.pop_back();
2766
      }
2767
    }
2768

	
2769
    void lace(const Key& key) {
2770
      typename Parent::Value& node = Parent::operator[](key);
2771
      if (node.value < 0) return;
2772
      if (node.value >= int(_first.size())) {
2773
        _first.resize(node.value + 1, INVALID);
2774
      }
2775
      node.prev = INVALID;
2776
      node.next = _first[node.value];
2777
      if (node.next != INVALID) {
2778
        Parent::operator[](node.next).prev = key;
2779
      }
2780
      _first[node.value] = key;
2781
    }
2782

	
2783
  public:
2784

	
2785
    /// Indicates that the map is reference map.
2786
    typedef True ReferenceMapTag;
2787

	
2788
    /// \brief Reference to the value of the map.
2789
    ///
2790
    /// This class is similar to the \c int type. It can
2791
    /// be converted to \c int and it has the same operators.
2792
    class Reference {
2793
      friend class IterableIntMap;
2794
    private:
2795
      Reference(IterableIntMap& map, const Key& key)
2796
        : _key(key), _map(map) {}
2797
    public:
2798

	
2799
      Reference& operator=(const Reference& value) {
2800
        _map.set(_key, static_cast<const int&>(value));
2801
         return *this;
2802
      }
2803

	
2804
      operator const int&() const {
2805
        return static_cast<const IterableIntMap&>(_map)[_key];
2806
      }
2807

	
2808
      Reference& operator=(int value) {
2809
        _map.set(_key, value);
2810
        return *this;
2811
      }
2812
      Reference& operator++() {
2813
        _map.set(_key, _map[_key] + 1);
2814
        return *this;
2815
      }
2816
      int operator++(int) {
2817
        int value = _map[_key];
2818
        _map.set(_key, value + 1);
2819
        return value;
2820
      }
2821
      Reference& operator--() {
2822
        _map.set(_key, _map[_key] - 1);
2823
        return *this;
2824
      }
2825
      int operator--(int) {
2826
        int value = _map[_key];
2827
        _map.set(_key, value - 1);
2828
        return value;
2829
      }
2830
      Reference& operator+=(int value) {
2831
        _map.set(_key, _map[_key] + value);
2832
        return *this;
2833
      }
2834
      Reference& operator-=(int value) {
2835
        _map.set(_key, _map[_key] - value);
2836
        return *this;
2837
      }
2838
      Reference& operator*=(int value) {
2839
        _map.set(_key, _map[_key] * value);
2840
        return *this;
2841
      }
2842
      Reference& operator/=(int value) {
2843
        _map.set(_key, _map[_key] / value);
2844
        return *this;
2845
      }
2846
      Reference& operator%=(int value) {
2847
        _map.set(_key, _map[_key] % value);
2848
        return *this;
2849
      }
2850
      Reference& operator&=(int value) {
2851
        _map.set(_key, _map[_key] & value);
2852
        return *this;
2853
      }
2854
      Reference& operator|=(int value) {
2855
        _map.set(_key, _map[_key] | value);
2856
        return *this;
2857
      }
2858
      Reference& operator^=(int value) {
2859
        _map.set(_key, _map[_key] ^ value);
2860
        return *this;
2861
      }
2862
      Reference& operator<<=(int value) {
2863
        _map.set(_key, _map[_key] << value);
2864
        return *this;
2865
      }
2866
      Reference& operator>>=(int value) {
2867
        _map.set(_key, _map[_key] >> value);
2868
        return *this;
2869
      }
2870

	
2871
    private:
2872
      Key _key;
2873
      IterableIntMap& _map;
2874
    };
2875

	
2876
    /// The const reference type.
2877
    typedef const Value& ConstReference;
2878

	
2879
    /// \brief Gives back the maximal value plus one.
2880
    ///
2881
    /// Gives back the maximal value plus one.
2882
    int size() const {
2883
      return _first.size();
2884
    }
2885

	
2886
    /// \brief Set operation of the map.
2887
    ///
2888
    /// Set operation of the map.
2889
    void set(const Key& key, const Value& value) {
2890
      unlace(key);
2891
      Parent::operator[](key).value = value;
2892
      lace(key);
2893
    }
2894

	
2895
    /// \brief Const subscript operator of the map.
2896
    ///
2897
    /// Const subscript operator of the map.
2898
    const Value& operator[](const Key& key) const {
2899
      return Parent::operator[](key).value;
2900
    }
2901

	
2902
    /// \brief Subscript operator of the map.
2903
    ///
2904
    /// Subscript operator of the map.
2905
    Reference operator[](const Key& key) {
2906
      return Reference(*this, key);
2907
    }
2908

	
2909
    /// \brief Iterator for the keys with the same value.
2910
    ///
2911
    /// Iterator for the keys with the same value. It works
2912
    /// like a graph item iterator, it can be converted to
2913
    /// the item type of the map, incremented with \c ++ operator, and
2914
    /// if the iterator leaves the last valid item, it will be equal to
2915
    /// \c INVALID.
2916
    class ItemIt : public Key {
2917
    public:
2918
      typedef Key Parent;
2919

	
2920
      /// \brief Invalid constructor \& conversion.
2921
      ///
2922
      /// This constructor initializes the iterator to be invalid.
2923
      /// \sa Invalid for more details.
2924
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2925

	
2926
      /// \brief Creates an iterator with a value.
2927
      ///
2928
      /// Creates an iterator with a value. It iterates on the
2929
      /// keys mapped to the given value.
2930
      /// \param map The IterableIntMap.
2931
      /// \param value The value.
2932
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2933
        if (value < 0 || value >= int(_map->_first.size())) {
2934
          Parent::operator=(INVALID);
2935
        } else {
2936
          Parent::operator=(_map->_first[value]);
2937
        }
2938
      }
2939

	
2940
      /// \brief Increment operator.
2941
      ///
2942
      /// Increment operator.
2943
      ItemIt& operator++() {
2944
        Parent::operator=(_map->IterableIntMap::Parent::
2945
                          operator[](static_cast<Parent&>(*this)).next);
2946
        return *this;
2947
      }
2948

	
2949
    private:
2950
      const IterableIntMap* _map;
2951
    };
2952

	
2953
  protected:
2954

	
2955
    virtual void erase(const Key& key) {
2956
      unlace(key);
2957
      Parent::erase(key);
2958
    }
2959

	
2960
    virtual void erase(const std::vector<Key>& keys) {
2961
      for (int i = 0; i < int(keys.size()); ++i) {
2962
        unlace(keys[i]);
2963
      }
2964
      Parent::erase(keys);
2965
    }
2966

	
2967
    virtual void clear() {
2968
      _first.clear();
2969
      Parent::clear();
2970
    }
2971

	
2972
  private:
2973
    std::vector<Key> _first;
2974
  };
2975

	
2976
  namespace _maps_bits {
2977
    template <typename Item, typename Value>
2978
    struct IterableValueMapNode {
2979
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
2980
      Item prev, next;
2981
      Value value;
2982
    };
2983
  }
2984

	
2985
  /// \brief Dynamic iterable map for comparable values.
2986
  ///
2987
  /// This class provides a special graph map type which can store an
2988
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
2989
  /// For each value it is possible to iterate on the keys mapped to
2990
  /// the value.
2991
  ///
2992
  /// The map stores for each value a linked list with
2993
  /// the items which mapped to the value, and the values are stored
2994
  /// in balanced binary tree. The values of the map can be accessed
2995
  /// with stl compatible forward iterator.
2996
  ///
2997
  /// This type is not reference map, so it cannot be modified with
2998
  /// the subscript operator.
2999
  ///
3000
  /// \tparam GR The graph type.
3001
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3002
  /// \c GR::Edge).
3003
  /// \tparam V The value type of the map. It can be any comparable
3004
  /// value type.
3005
  ///
3006
  /// \see IterableBoolMap, IterableIntMap
3007
  /// \see CrossRefMap
3008
  template <typename GR, typename K, typename V>
3009
  class IterableValueMap
3010
    : protected ItemSetTraits<GR, K>::
3011
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3012
  public:
3013
    typedef typename ItemSetTraits<GR, K>::
3014
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3015

	
3016
    /// The key type
3017
    typedef K Key;
3018
    /// The value type
3019
    typedef V Value;
3020
    /// The graph type
3021
    typedef GR Graph;
3022

	
3023
  public:
3024

	
3025
    /// \brief Constructor of the map with a given value.
3026
    ///
3027
    /// Constructor of the map with a given value.
3028
    explicit IterableValueMap(const Graph& graph,
3029
                              const Value& value = Value())
3030
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3031
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3032
        lace(it);
3033
      }
3034
    }
3035

	
3036
  protected:
3037

	
3038
    void unlace(const Key& key) {
3039
      typename Parent::Value& node = Parent::operator[](key);
3040
      if (node.prev != INVALID) {
3041
        Parent::operator[](node.prev).next = node.next;
3042
      } else {
3043
        if (node.next != INVALID) {
3044
          _first[node.value] = node.next;
3045
        } else {
3046
          _first.erase(node.value);
3047
        }
3048
      }
3049
      if (node.next != INVALID) {
3050
        Parent::operator[](node.next).prev = node.prev;
3051
      }
3052
    }
3053

	
3054
    void lace(const Key& key) {
3055
      typename Parent::Value& node = Parent::operator[](key);
3056
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3057
      if (it == _first.end()) {
3058
        node.prev = node.next = INVALID;
3059
        _first.insert(std::make_pair(node.value, key));
3060
      } else {
3061
        node.prev = INVALID;
3062
        node.next = it->second;
3063
        if (node.next != INVALID) {
3064
          Parent::operator[](node.next).prev = key;
3065
        }
3066
        it->second = key;
3067
      }
3068
    }
3069

	
3070
  public:
3071

	
3072
    /// \brief Forward iterator for values.
3073
    ///
3074
    /// This iterator is an stl compatible forward
3075
    /// iterator on the values of the map. The values can
3076
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3077
    class ValueIterator
3078
      : public std::iterator<std::forward_iterator_tag, Value> {
3079
      friend class IterableValueMap;
3080
    private:
3081
      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
3082
        : it(_it) {}
3083
    public:
3084

	
3085
      ValueIterator() {}
3086

	
3087
      ValueIterator& operator++() { ++it; return *this; }
3088
      ValueIterator operator++(int) {
3089
        ValueIterator tmp(*this);
3090
        operator++();
3091
        return tmp;
3092
      }
3093

	
3094
      const Value& operator*() const { return it->first; }
3095
      const Value* operator->() const { return &(it->first); }
3096

	
3097
      bool operator==(ValueIterator jt) const { return it == jt.it; }
3098
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
3099

	
3100
    private:
3101
      typename std::map<Value, Key>::const_iterator it;
3102
    };
3103

	
3104
    /// \brief Returns an iterator to the first value.
3105
    ///
3106
    /// Returns an stl compatible iterator to the
3107
    /// first value of the map. The values of the
3108
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3109
    /// range.
3110
    ValueIterator beginValue() const {
3111
      return ValueIterator(_first.begin());
3112
    }
3113

	
3114
    /// \brief Returns an iterator after the last value.
3115
    ///
3116
    /// Returns an stl compatible iterator after the
3117
    /// last value of the map. The values of the
3118
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3119
    /// range.
3120
    ValueIterator endValue() const {
3121
      return ValueIterator(_first.end());
3122
    }
3123

	
3124
    /// \brief Set operation of the map.
3125
    ///
3126
    /// Set operation of the map.
3127
    void set(const Key& key, const Value& value) {
3128
      unlace(key);
3129
      Parent::operator[](key).value = value;
3130
      lace(key);
3131
    }
3132

	
3133
    /// \brief Const subscript operator of the map.
3134
    ///
3135
    /// Const subscript operator of the map.
3136
    const Value& operator[](const Key& key) const {
3137
      return Parent::operator[](key).value;
3138
    }
3139

	
3140
    /// \brief Iterator for the keys with the same value.
3141
    ///
3142
    /// Iterator for the keys with the same value. It works
3143
    /// like a graph item iterator, it can be converted to
3144
    /// the item type of the map, incremented with \c ++ operator, and
3145
    /// if the iterator leaves the last valid item, it will be equal to
3146
    /// \c INVALID.
3147
    class ItemIt : public Key {
3148
    public:
3149
      typedef Key Parent;
3150

	
3151
      /// \brief Invalid constructor \& conversion.
3152
      ///
3153
      /// This constructor initializes the iterator to be invalid.
3154
      /// \sa Invalid for more details.
3155
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3156

	
3157
      /// \brief Creates an iterator with a value.
3158
      ///
3159
      /// Creates an iterator with a value. It iterates on the
3160
      /// keys which have the given value.
3161
      /// \param map The IterableValueMap
3162
      /// \param value The value
3163
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3164
        typename std::map<Value, Key>::const_iterator it =
3165
          map._first.find(value);
3166
        if (it == map._first.end()) {
3167
          Parent::operator=(INVALID);
3168
        } else {
3169
          Parent::operator=(it->second);
3170
        }
3171
      }
3172

	
3173
      /// \brief Increment operator.
3174
      ///
3175
      /// Increment Operator.
3176
      ItemIt& operator++() {
3177
        Parent::operator=(_map->IterableValueMap::Parent::
3178
                          operator[](static_cast<Parent&>(*this)).next);
3179
        return *this;
3180
      }
3181

	
3182

	
3183
    private:
3184
      const IterableValueMap* _map;
3185
    };
3186

	
3187
  protected:
3188

	
3189
    virtual void add(const Key& key) {
3190
      Parent::add(key);
3191
      unlace(key);
3192
    }
3193

	
3194
    virtual void add(const std::vector<Key>& keys) {
3195
      Parent::add(keys);
3196
      for (int i = 0; i < int(keys.size()); ++i) {
3197
        lace(keys[i]);
3198
      }
3199
    }
3200

	
3201
    virtual void erase(const Key& key) {
3202
      unlace(key);
3203
      Parent::erase(key);
3204
    }
3205

	
3206
    virtual void erase(const std::vector<Key>& keys) {
3207
      for (int i = 0; i < int(keys.size()); ++i) {
3208
        unlace(keys[i]);
3209
      }
3210
      Parent::erase(keys);
3211
    }
3212

	
3213
    virtual void build() {
3214
      Parent::build();
3215
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3216
        lace(it);
3217
      }
3218
    }
3219

	
3220
    virtual void clear() {
3221
      _first.clear();
3222
      Parent::clear();
3223
    }
3224

	
3225
  private:
3226
    std::map<Value, Key> _first;
3227
  };
3228

	
2314 3229
  /// \brief Map of the source nodes of arcs in a digraph.
2315 3230
  ///
2316 3231
  /// SourceMap provides access for the source node of each arc in a digraph,
2317 3232
  /// which is returned by the \c source() function of the digraph.
2318 3233
  /// \tparam GR The digraph type.
2319 3234
  /// \see TargetMap
2320 3235
  template <typename GR>
2321 3236
  class SourceMap {
2322 3237
  public:
2323 3238

	
2324 3239
    ///\e
2325 3240
    typedef typename GR::Arc Key;
2326 3241
    ///\e
2327 3242
    typedef typename GR::Node Value;
2328 3243

	
2329 3244
    /// \brief Constructor
2330 3245
    ///
2331 3246
    /// Constructor.
2332 3247
    /// \param digraph The digraph that the map belongs to.
2333 3248
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
2334 3249

	
2335 3250
    /// \brief Returns the source node of the given arc.
2336 3251
    ///
2337 3252
    /// Returns the source node of the given arc.
2338 3253
    Value operator[](const Key& arc) const {
2339 3254
      return _graph.source(arc);
2340 3255
    }
2341 3256

	
2342 3257
  private:
2343 3258
    const GR& _graph;
2344 3259
  };
2345 3260

	
2346 3261
  /// \brief Returns a \c SourceMap class.
2347 3262
  ///
2348 3263
  /// This function just returns an \c SourceMap class.
2349 3264
  /// \relates SourceMap
2350 3265
  template <typename GR>
2351 3266
  inline SourceMap<GR> sourceMap(const GR& graph) {
2352 3267
    return SourceMap<GR>(graph);
2353 3268
  }
2354 3269

	
2355 3270
  /// \brief Map of the target nodes of arcs in a digraph.
2356 3271
  ///
2357 3272
  /// TargetMap provides access for the target node of each arc in a digraph,
2358 3273
  /// which is returned by the \c target() function of the digraph.
2359 3274
  /// \tparam GR The digraph type.
2360 3275
  /// \see SourceMap
2361 3276
  template <typename GR>
2362 3277
  class TargetMap {
2363 3278
  public:
2364 3279

	
2365 3280
    ///\e
2366 3281
    typedef typename GR::Arc Key;
2367 3282
    ///\e
2368 3283
    typedef typename GR::Node Value;
2369 3284

	
2370 3285
    /// \brief Constructor
2371 3286
    ///
2372 3287
    /// Constructor.
2373 3288
    /// \param digraph The digraph that the map belongs to.
2374 3289
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
2375 3290

	
2376 3291
    /// \brief Returns the target node of the given arc.
2377 3292
    ///
2378 3293
    /// Returns the target node of the given arc.
2379 3294
    Value operator[](const Key& e) const {
2380 3295
      return _graph.target(e);
2381 3296
    }
2382 3297

	
2383 3298
  private:
2384 3299
    const GR& _graph;
2385 3300
  };
2386 3301

	
2387 3302
  /// \brief Returns a \c TargetMap class.
2388 3303
  ///
2389 3304
  /// This function just returns a \c TargetMap class.
2390 3305
  /// \relates TargetMap
2391 3306
  template <typename GR>
2392 3307
  inline TargetMap<GR> targetMap(const GR& graph) {
2393 3308
    return TargetMap<GR>(graph);
2394 3309
  }
2395 3310

	
2396 3311
  /// \brief Map of the "forward" directed arc view of edges in a graph.
2397 3312
  ///
2398 3313
  /// ForwardMap provides access for the "forward" directed arc view of
2399 3314
  /// each edge in a graph, which is returned by the \c direct() function
2400 3315
  /// of the graph with \c true parameter.
2401 3316
  /// \tparam GR The graph type.
2402 3317
  /// \see BackwardMap
2403 3318
  template <typename GR>
2404 3319
  class ForwardMap {
2405 3320
  public:
2406 3321

	
2407 3322
    typedef typename GR::Arc Value;
2408 3323
    typedef typename GR::Edge Key;
2409 3324

	
2410 3325
    /// \brief Constructor
2411 3326
    ///
2412 3327
    /// Constructor.
2413 3328
    /// \param graph The graph that the map belongs to.
2414 3329
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
2415 3330

	
2416 3331
    /// \brief Returns the "forward" directed arc view of the given edge.
2417 3332
    ///
2418 3333
    /// Returns the "forward" directed arc view of the given edge.
2419 3334
    Value operator[](const Key& key) const {
2420 3335
      return _graph.direct(key, true);
2421 3336
    }
2422 3337

	
2423 3338
  private:
2424 3339
    const GR& _graph;
2425 3340
  };
2426 3341

	
2427 3342
  /// \brief Returns a \c ForwardMap class.
2428 3343
  ///
2429 3344
  /// This function just returns an \c ForwardMap class.
2430 3345
  /// \relates ForwardMap
2431 3346
  template <typename GR>
2432 3347
  inline ForwardMap<GR> forwardMap(const GR& graph) {
2433 3348
    return ForwardMap<GR>(graph);
2434 3349
  }
2435 3350

	
2436 3351
  /// \brief Map of the "backward" directed arc view of edges in a graph.
2437 3352
  ///
2438 3353
  /// BackwardMap provides access for the "backward" directed arc view of
2439 3354
  /// each edge in a graph, which is returned by the \c direct() function
2440 3355
  /// of the graph with \c false parameter.
2441 3356
  /// \tparam GR The graph type.
2442 3357
  /// \see ForwardMap
2443 3358
  template <typename GR>
2444 3359
  class BackwardMap {
2445 3360
  public:
2446 3361

	
2447 3362
    typedef typename GR::Arc Value;
2448 3363
    typedef typename GR::Edge Key;
2449 3364

	
2450 3365
    /// \brief Constructor
2451 3366
    ///
2452 3367
    /// Constructor.
2453 3368
    /// \param graph The graph that the map belongs to.
2454 3369
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
2455 3370

	
2456 3371
    /// \brief Returns the "backward" directed arc view of the given edge.
2457 3372
    ///
2458 3373
    /// Returns the "backward" directed arc view of the given edge.
2459 3374
    Value operator[](const Key& key) const {
2460 3375
      return _graph.direct(key, false);
2461 3376
    }
2462 3377

	
2463 3378
  private:
2464 3379
    const GR& _graph;
2465 3380
  };
2466 3381

	
2467 3382
  /// \brief Returns a \c BackwardMap class
2468 3383

	
2469 3384
  /// This function just returns a \c BackwardMap class.
2470 3385
  /// \relates BackwardMap
2471 3386
  template <typename GR>
2472 3387
  inline BackwardMap<GR> backwardMap(const GR& graph) {
2473 3388
    return BackwardMap<GR>(graph);
2474 3389
  }
2475 3390

	
2476 3391
  /// \brief Map of the in-degrees of nodes in a digraph.
2477 3392
  ///
2478 3393
  /// This map returns the in-degree of a node. Once it is constructed,
2479 3394
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2480 3395
  /// in constant time. On the other hand, the values are updated automatically
2481 3396
  /// whenever the digraph changes.
2482 3397
  ///
2483
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3398
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2484 3399
  /// may provide alternative ways to modify the digraph.
2485 3400
  /// The correct behavior of InDegMap is not guarantied if these additional
2486 3401
  /// features are used. For example the functions
2487 3402
  /// \ref ListDigraph::changeSource() "changeSource()",
2488 3403
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2489 3404
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2490 3405
  /// of \ref ListDigraph will \e not update the degree values correctly.
2491 3406
  ///
2492 3407
  /// \sa OutDegMap
2493 3408
  template <typename GR>
2494 3409
  class InDegMap
2495 3410
    : protected ItemSetTraits<GR, typename GR::Arc>
2496 3411
      ::ItemNotifier::ObserverBase {
2497 3412

	
2498 3413
  public:
2499
    
3414

	
2500 3415
    /// The graph type of InDegMap
2501 3416
    typedef GR Graph;
2502 3417
    typedef GR Digraph;
2503 3418
    /// The key type
2504 3419
    typedef typename Digraph::Node Key;
2505 3420
    /// The value type
2506 3421
    typedef int Value;
2507 3422

	
2508 3423
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2509 3424
    ::ItemNotifier::ObserverBase Parent;
2510 3425

	
2511 3426
  private:
2512 3427

	
2513 3428
    class AutoNodeMap
2514 3429
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2515 3430
    public:
2516 3431

	
2517 3432
      typedef typename ItemSetTraits<Digraph, Key>::
2518 3433
      template Map<int>::Type Parent;
2519 3434

	
2520 3435
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2521 3436

	
2522 3437
      virtual void add(const Key& key) {
2523 3438
        Parent::add(key);
2524 3439
        Parent::set(key, 0);
2525 3440
      }
2526 3441

	
2527 3442
      virtual void add(const std::vector<Key>& keys) {
2528 3443
        Parent::add(keys);
2529 3444
        for (int i = 0; i < int(keys.size()); ++i) {
2530 3445
          Parent::set(keys[i], 0);
2531 3446
        }
2532 3447
      }
2533 3448

	
2534 3449
      virtual void build() {
2535 3450
        Parent::build();
2536 3451
        Key it;
2537 3452
        typename Parent::Notifier* nf = Parent::notifier();
2538 3453
        for (nf->first(it); it != INVALID; nf->next(it)) {
2539 3454
          Parent::set(it, 0);
2540 3455
        }
2541 3456
      }
2542 3457
    };
2543 3458

	
2544 3459
  public:
2545 3460

	
2546 3461
    /// \brief Constructor.
2547 3462
    ///
2548 3463
    /// Constructor for creating an in-degree map.
2549 3464
    explicit InDegMap(const Digraph& graph)
2550 3465
      : _digraph(graph), _deg(graph) {
2551 3466
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2552 3467

	
2553 3468
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2554 3469
        _deg[it] = countInArcs(_digraph, it);
2555 3470
      }
2556 3471
    }
2557 3472

	
2558 3473
    /// \brief Gives back the in-degree of a Node.
2559 3474
    ///
2560 3475
    /// Gives back the in-degree of a Node.
2561 3476
    int operator[](const Key& key) const {
2562 3477
      return _deg[key];
2563 3478
    }
2564 3479

	
2565 3480
  protected:
2566 3481

	
2567 3482
    typedef typename Digraph::Arc Arc;
2568 3483

	
2569 3484
    virtual void add(const Arc& arc) {
2570 3485
      ++_deg[_digraph.target(arc)];
2571 3486
    }
2572 3487

	
2573 3488
    virtual void add(const std::vector<Arc>& arcs) {
2574 3489
      for (int i = 0; i < int(arcs.size()); ++i) {
2575 3490
        ++_deg[_digraph.target(arcs[i])];
2576 3491
      }
2577 3492
    }
2578 3493

	
2579 3494
    virtual void erase(const Arc& arc) {
2580 3495
      --_deg[_digraph.target(arc)];
2581 3496
    }
2582 3497

	
2583 3498
    virtual void erase(const std::vector<Arc>& arcs) {
2584 3499
      for (int i = 0; i < int(arcs.size()); ++i) {
2585 3500
        --_deg[_digraph.target(arcs[i])];
2586 3501
      }
2587 3502
    }
2588 3503

	
2589 3504
    virtual void build() {
2590 3505
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2591 3506
        _deg[it] = countInArcs(_digraph, it);
2592 3507
      }
2593 3508
    }
2594 3509

	
2595 3510
    virtual void clear() {
2596 3511
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2597 3512
        _deg[it] = 0;
2598 3513
      }
2599 3514
    }
2600 3515
  private:
2601 3516

	
2602 3517
    const Digraph& _digraph;
2603 3518
    AutoNodeMap _deg;
2604 3519
  };
2605 3520

	
2606 3521
  /// \brief Map of the out-degrees of nodes in a digraph.
2607 3522
  ///
2608 3523
  /// This map returns the out-degree of a node. Once it is constructed,
2609 3524
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2610 3525
  /// in constant time. On the other hand, the values are updated automatically
2611 3526
  /// whenever the digraph changes.
2612 3527
  ///
2613
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3528
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2614 3529
  /// may provide alternative ways to modify the digraph.
2615 3530
  /// The correct behavior of OutDegMap is not guarantied if these additional
2616 3531
  /// features are used. For example the functions
2617 3532
  /// \ref ListDigraph::changeSource() "changeSource()",
2618 3533
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2619 3534
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2620 3535
  /// of \ref ListDigraph will \e not update the degree values correctly.
2621 3536
  ///
2622 3537
  /// \sa InDegMap
2623 3538
  template <typename GR>
2624 3539
  class OutDegMap
2625 3540
    : protected ItemSetTraits<GR, typename GR::Arc>
2626 3541
      ::ItemNotifier::ObserverBase {
2627 3542

	
2628 3543
  public:
2629 3544

	
2630 3545
    /// The graph type of OutDegMap
2631 3546
    typedef GR Graph;
2632 3547
    typedef GR Digraph;
2633 3548
    /// The key type
2634 3549
    typedef typename Digraph::Node Key;
2635 3550
    /// The value type
2636 3551
    typedef int Value;
2637 3552

	
2638 3553
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2639 3554
    ::ItemNotifier::ObserverBase Parent;
2640 3555

	
2641 3556
  private:
2642 3557

	
2643 3558
    class AutoNodeMap
2644 3559
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2645 3560
    public:
2646 3561

	
2647 3562
      typedef typename ItemSetTraits<Digraph, Key>::
2648 3563
      template Map<int>::Type Parent;
2649 3564

	
2650 3565
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2651 3566

	
2652 3567
      virtual void add(const Key& key) {
2653 3568
        Parent::add(key);
2654 3569
        Parent::set(key, 0);
2655 3570
      }
2656 3571
      virtual void add(const std::vector<Key>& keys) {
2657 3572
        Parent::add(keys);
2658 3573
        for (int i = 0; i < int(keys.size()); ++i) {
2659 3574
          Parent::set(keys[i], 0);
2660 3575
        }
2661 3576
      }
2662 3577
      virtual void build() {
2663 3578
        Parent::build();
2664 3579
        Key it;
2665 3580
        typename Parent::Notifier* nf = Parent::notifier();
2666 3581
        for (nf->first(it); it != INVALID; nf->next(it)) {
2667 3582
          Parent::set(it, 0);
2668 3583
        }
2669 3584
      }
2670 3585
    };
2671 3586

	
2672 3587
  public:
2673 3588

	
2674 3589
    /// \brief Constructor.
2675 3590
    ///
2676 3591
    /// Constructor for creating an out-degree map.
2677 3592
    explicit OutDegMap(const Digraph& graph)
2678 3593
      : _digraph(graph), _deg(graph) {
2679 3594
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2680 3595

	
2681 3596
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2682 3597
        _deg[it] = countOutArcs(_digraph, it);
2683 3598
      }
2684 3599
    }
2685 3600

	
2686 3601
    /// \brief Gives back the out-degree of a Node.
2687 3602
    ///
2688 3603
    /// Gives back the out-degree of a Node.
2689 3604
    int operator[](const Key& key) const {
2690 3605
      return _deg[key];
2691 3606
    }
2692 3607

	
2693 3608
  protected:
2694 3609

	
2695 3610
    typedef typename Digraph::Arc Arc;
2696 3611

	
2697 3612
    virtual void add(const Arc& arc) {
2698 3613
      ++_deg[_digraph.source(arc)];
2699 3614
    }
2700 3615

	
2701 3616
    virtual void add(const std::vector<Arc>& arcs) {
2702 3617
      for (int i = 0; i < int(arcs.size()); ++i) {
2703 3618
        ++_deg[_digraph.source(arcs[i])];
2704 3619
      }
2705 3620
    }
2706 3621

	
2707 3622
    virtual void erase(const Arc& arc) {
2708 3623
      --_deg[_digraph.source(arc)];
2709 3624
    }
2710 3625

	
2711 3626
    virtual void erase(const std::vector<Arc>& arcs) {
2712 3627
      for (int i = 0; i < int(arcs.size()); ++i) {
2713 3628
        --_deg[_digraph.source(arcs[i])];
2714 3629
      }
2715 3630
    }
2716 3631

	
2717 3632
    virtual void build() {
2718 3633
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2719 3634
        _deg[it] = countOutArcs(_digraph, it);
2720 3635
      }
2721 3636
    }
2722 3637

	
2723 3638
    virtual void clear() {
2724 3639
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2725 3640
        _deg[it] = 0;
2726 3641
      }
2727 3642
    }
2728 3643
  private:
2729 3644

	
2730 3645
    const Digraph& _digraph;
2731 3646
    AutoNodeMap _deg;
2732 3647
  };
2733 3648

	
2734 3649
  /// \brief Potential difference map
2735 3650
  ///
2736 3651
  /// PotentialDifferenceMap returns the difference between the potentials of
2737 3652
  /// the source and target nodes of each arc in a digraph, i.e. it returns
2738 3653
  /// \code
2739 3654
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2740 3655
  /// \endcode
2741 3656
  /// \tparam GR The digraph type.
2742 3657
  /// \tparam POT A node map storing the potentials.
2743 3658
  template <typename GR, typename POT>
2744 3659
  class PotentialDifferenceMap {
2745 3660
  public:
2746 3661
    /// Key type
2747 3662
    typedef typename GR::Arc Key;
2748 3663
    /// Value type
2749 3664
    typedef typename POT::Value Value;
2750 3665

	
2751 3666
    /// \brief Constructor
2752 3667
    ///
2753 3668
    /// Contructor of the map.
2754 3669
    explicit PotentialDifferenceMap(const GR& gr,
2755 3670
                                    const POT& potential)
2756 3671
      : _digraph(gr), _potential(potential) {}
2757 3672

	
2758 3673
    /// \brief Returns the potential difference for the given arc.
2759 3674
    ///
2760 3675
    /// Returns the potential difference for the given arc, i.e.
2761 3676
    /// \code
2762 3677
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2763 3678
    /// \endcode
2764 3679
    Value operator[](const Key& arc) const {
2765 3680
      return _potential[_digraph.target(arc)] -
2766 3681
        _potential[_digraph.source(arc)];
2767 3682
    }
2768 3683

	
2769 3684
  private:
2770 3685
    const GR& _digraph;
2771 3686
    const POT& _potential;
2772 3687
  };
2773 3688

	
2774 3689
  /// \brief Returns a PotentialDifferenceMap.
2775 3690
  ///
2776 3691
  /// This function just returns a PotentialDifferenceMap.
2777 3692
  /// \relates PotentialDifferenceMap
2778 3693
  template <typename GR, typename POT>
2779 3694
  PotentialDifferenceMap<GR, POT>
2780 3695
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2781 3696
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2782 3697
  }
2783 3698

	
2784 3699
  /// @}
2785 3700
}
2786 3701

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

	
19 19
#ifndef LEMON_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
  /// flow algorithms. The current implementation use a mixture of the
107
  /// flow algorithms. The current implementation uses a mixture of the
101 108
  /// \e "highest label" and the \e "bound decrease" heuristics.
102 109
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
103 110
  ///
104 111
  /// The algorithm consists of two phases. After the first phase
105 112
  /// the maximum flow value and the minimum cut is obtained. The
106 113
  /// second phase constructs a feasible maximum flow on each arc.
107 114
  ///
108 115
  /// \tparam GR The type of the digraph the algorithm runs on.
109 116
  /// \tparam CAP The type of the capacity map. The default map
110 117
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
111 118
#ifdef DOXYGEN
112 119
  template <typename GR, typename CAP, typename TR>
113 120
#else
114 121
  template <typename GR,
115 122
            typename CAP = typename GR::template ArcMap<int>,
116 123
            typename TR = PreflowDefaultTraits<GR, CAP> >
117 124
#endif
118 125
  class Preflow {
119 126
  public:
120 127

	
121 128
    ///The \ref PreflowDefaultTraits "traits class" of the algorithm.
122 129
    typedef TR Traits;
123 130
    ///The type of the digraph the algorithm runs on.
124 131
    typedef typename Traits::Digraph Digraph;
125 132
    ///The type of the capacity map.
126 133
    typedef typename Traits::CapacityMap CapacityMap;
127 134
    ///The type of the flow values.
128 135
    typedef typename Traits::Value Value;
129 136

	
130 137
    ///The type of the flow map.
131 138
    typedef typename Traits::FlowMap FlowMap;
132 139
    ///The type of the elevator.
133 140
    typedef typename Traits::Elevator Elevator;
134 141
    ///The type of the tolerance.
135 142
    typedef typename Traits::Tolerance Tolerance;
136 143

	
137 144
  private:
138 145

	
139 146
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
140 147

	
141 148
    const Digraph& _graph;
142 149
    const CapacityMap* _capacity;
143 150

	
144 151
    int _node_num;
145 152

	
146 153
    Node _source, _target;
147 154

	
148 155
    FlowMap* _flow;
149 156
    bool _local_flow;
150 157

	
151 158
    Elevator* _level;
152 159
    bool _local_level;
153 160

	
154 161
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
155 162
    ExcessMap* _excess;
156 163

	
157 164
    Tolerance _tolerance;
158 165

	
159 166
    bool _phase;
160 167

	
161 168

	
162 169
    void createStructures() {
163 170
      _node_num = countNodes(_graph);
164 171

	
165 172
      if (!_flow) {
166 173
        _flow = Traits::createFlowMap(_graph);
167 174
        _local_flow = true;
168 175
      }
169 176
      if (!_level) {
170 177
        _level = Traits::createElevator(_graph, _node_num);
171 178
        _local_level = true;
172 179
      }
173 180
      if (!_excess) {
174 181
        _excess = new ExcessMap(_graph);
175 182
      }
176 183
    }
177 184

	
178 185
    void destroyStructures() {
179 186
      if (_local_flow) {
180 187
        delete _flow;
181 188
      }
182 189
      if (_local_level) {
183 190
        delete _level;
184 191
      }
185 192
      if (_excess) {
186 193
        delete _excess;
187 194
      }
188 195
    }
189 196

	
190 197
  public:
191 198

	
192 199
    typedef Preflow Create;
193 200

	
194 201
    ///\name Named Template Parameters
195 202

	
196 203
    ///@{
197 204

	
198 205
    template <typename T>
199 206
    struct SetFlowMapTraits : public Traits {
200 207
      typedef T FlowMap;
201 208
      static FlowMap *createFlowMap(const Digraph&) {
202 209
        LEMON_ASSERT(false, "FlowMap is not initialized");
203 210
        return 0; // ignore warnings
204 211
      }
205 212
    };
206 213

	
207 214
    /// \brief \ref named-templ-param "Named parameter" for setting
208 215
    /// FlowMap type
209 216
    ///
210 217
    /// \ref named-templ-param "Named parameter" for setting FlowMap
211 218
    /// type.
212 219
    template <typename T>
213 220
    struct SetFlowMap
214 221
      : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
215 222
      typedef Preflow<Digraph, CapacityMap,
216 223
                      SetFlowMapTraits<T> > Create;
217 224
    };
218 225

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

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

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

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

	
272 279
    /// @}
273 280

	
274 281
  protected:
275 282

	
276 283
    Preflow() {}
277 284

	
278 285
  public:
279 286

	
280 287

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

	
296 303
    /// \brief Destructor.
297 304
    ///
298 305
    /// Destructor.
299 306
    ~Preflow() {
300 307
      destroyStructures();
301 308
    }
302 309

	
303 310
    /// \brief Sets the capacity map.
304 311
    ///
305 312
    /// Sets the capacity map.
306 313
    /// \return <tt>(*this)</tt>
307 314
    Preflow& capacityMap(const CapacityMap& map) {
308 315
      _capacity = &map;
309 316
      return *this;
310 317
    }
311 318

	
312 319
    /// \brief Sets the flow map.
313 320
    ///
314 321
    /// Sets the flow map.
315 322
    /// If you don't use this function before calling \ref run() or
316 323
    /// \ref init(), an instance will be allocated automatically.
317 324
    /// The destructor deallocates this automatically allocated map,
318 325
    /// of course.
319 326
    /// \return <tt>(*this)</tt>
320 327
    Preflow& flowMap(FlowMap& map) {
321 328
      if (_local_flow) {
322 329
        delete _flow;
323 330
        _local_flow = false;
324 331
      }
325 332
      _flow = &map;
326 333
      return *this;
327 334
    }
328 335

	
329 336
    /// \brief Sets the source node.
330 337
    ///
331 338
    /// Sets the source node.
332 339
    /// \return <tt>(*this)</tt>
333 340
    Preflow& source(const Node& node) {
334 341
      _source = node;
335 342
      return *this;
336 343
    }
337 344

	
338 345
    /// \brief Sets the target node.
339 346
    ///
340 347
    /// Sets the target node.
341 348
    /// \return <tt>(*this)</tt>
342 349
    Preflow& target(const Node& node) {
343 350
      _target = node;
344 351
      return *this;
345 352
    }
346 353

	
347 354
    /// \brief Sets the elevator used by algorithm.
348 355
    ///
349 356
    /// Sets the elevator used by algorithm.
350 357
    /// If you don't use this function before calling \ref run() or
351 358
    /// \ref init(), an instance will be allocated automatically.
352 359
    /// The destructor deallocates this automatically allocated elevator,
353 360
    /// of course.
354 361
    /// \return <tt>(*this)</tt>
355 362
    Preflow& elevator(Elevator& elevator) {
356 363
      if (_local_level) {
357 364
        delete _level;
358 365
        _local_level = false;
359 366
      }
360 367
      _level = &elevator;
361 368
      return *this;
362 369
    }
363 370

	
364 371
    /// \brief Returns a const reference to the elevator.
365 372
    ///
366 373
    /// Returns a const reference to the elevator.
367 374
    ///
368 375
    /// \pre Either \ref run() or \ref init() must be called before
369 376
    /// using this function.
370 377
    const Elevator& elevator() const {
371 378
      return *_level;
372 379
    }
373 380

	
374
    /// \brief Sets the tolerance used by algorithm.
381
    /// \brief Sets the tolerance used by the algorithm.
375 382
    ///
376
    /// Sets the tolerance used by algorithm.
377
    Preflow& tolerance(const Tolerance& tolerance) const {
383
    /// Sets the tolerance object used by the algorithm.
384
    /// \return <tt>(*this)</tt>
385
    Preflow& tolerance(const Tolerance& tolerance) {
378 386
      _tolerance = tolerance;
379 387
      return *this;
380 388
    }
381 389

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

	
389 398
    /// \name Execution Control
390 399
    /// The simplest way to execute the preflow algorithm is to use
391 400
    /// \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
401
    /// If you need better control on the initial solution or the execution,
402
    /// you have to call one of the \ref init() functions first, then
394 403
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
395 404

	
396 405
    ///@{
397 406

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

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

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

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

	
416 425
      _level->initStart();
417 426
      _level->initAddItem(_target);
418 427

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

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

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

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

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

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

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

	
486 495
      _level->initStart();
487 496
      _level->initAddItem(_target);
488 497

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

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

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

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

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

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

	
570 579
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
571 580
            Value rem = (*_capacity)[e] - (*_flow)[e];
572 581
            if (!_tolerance.positive(rem)) continue;
573 582
            Node v = _graph.target(e);
574 583
            if ((*_level)[v] < level) {
575 584
              if (!_level->active(v) && v != _target) {
576 585
                _level->activate(v);
577 586
              }
578 587
              if (!_tolerance.less(rem, excess)) {
579 588
                _flow->set(e, (*_flow)[e] + excess);
580 589
                (*_excess)[v] += excess;
581 590
                excess = 0;
582 591
                goto no_more_push_1;
583 592
              } else {
584 593
                excess -= rem;
585 594
                (*_excess)[v] += rem;
Ignore white space 6 line context
1 1
INCLUDE_DIRECTORIES(
2 2
  ${PROJECT_SOURCE_DIR}
3 3
  ${PROJECT_BINARY_DIR}
4 4
)
5 5

	
6 6
LINK_DIRECTORIES(
7 7
  ${PROJECT_BINARY_DIR}/lemon
8 8
)
9 9

	
10 10
SET(TESTS
11 11
  adaptors_test
12
  bellman_ford_test
12 13
  bfs_test
13 14
  circulation_test
14 15
  connectivity_test
15 16
  counter_test
16 17
  dfs_test
17 18
  digraph_test
18 19
  dijkstra_test
19 20
  dim_test
20 21
  edge_set_test
21 22
  error_test
22 23
  euler_test
23 24
  gomory_hu_test
24 25
  graph_copy_test
25 26
  graph_test
26 27
  graph_utils_test
27 28
  hao_orlin_test
28 29
  heap_test
29 30
  kruskal_test
30 31
  maps_test
31 32
  matching_test
32 33
  min_cost_arborescence_test
33 34
  min_cost_flow_test
34 35
  path_test
35 36
  preflow_test
36 37
  radix_sort_test
37 38
  random_test
38 39
  suurballe_test
39 40
  time_measure_test
40 41
  unionfind_test
41 42
)
42 43

	
43 44
IF(LEMON_HAVE_LP)
44 45
  ADD_EXECUTABLE(lp_test lp_test.cc)
45 46
  SET(LP_TEST_LIBS lemon)
46 47

	
47 48
  IF(LEMON_HAVE_GLPK)
48 49
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${GLPK_LIBRARIES})
49 50
  ENDIF()
50 51
  IF(LEMON_HAVE_CPLEX)
51 52
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${CPLEX_LIBRARIES})
52 53
  ENDIF()
53 54
  IF(LEMON_HAVE_CLP)
54 55
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${COIN_CLP_LIBRARIES})
55 56
  ENDIF()
56 57

	
57 58
  TARGET_LINK_LIBRARIES(lp_test ${LP_TEST_LIBS})
58 59
  ADD_TEST(lp_test lp_test)
59 60

	
60 61
  IF(WIN32 AND LEMON_HAVE_GLPK)
61 62
    GET_TARGET_PROPERTY(TARGET_LOC lp_test LOCATION)
62 63
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
63 64
    ADD_CUSTOM_COMMAND(TARGET lp_test POST_BUILD
64 65
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/glpk.dll ${TARGET_PATH}
65 66
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/libltdl3.dll ${TARGET_PATH}
66 67
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/zlib1.dll ${TARGET_PATH}
67 68
    )
68 69
  ENDIF()
69 70

	
70 71
  IF(WIN32 AND LEMON_HAVE_CPLEX)
71 72
    GET_TARGET_PROPERTY(TARGET_LOC lp_test LOCATION)
72 73
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
73 74
    ADD_CUSTOM_COMMAND(TARGET lp_test POST_BUILD
74 75
      COMMAND ${CMAKE_COMMAND} -E copy ${CPLEX_BIN_DIR}/cplex91.dll ${TARGET_PATH}
75 76
    )
76 77
  ENDIF()
77 78
ENDIF()
78 79

	
79 80
IF(LEMON_HAVE_MIP)
80 81
  ADD_EXECUTABLE(mip_test mip_test.cc)
81 82
  SET(MIP_TEST_LIBS lemon)
82 83

	
83 84
  IF(LEMON_HAVE_GLPK)
84 85
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${GLPK_LIBRARIES})
85 86
  ENDIF()
86 87
  IF(LEMON_HAVE_CPLEX)
87 88
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${CPLEX_LIBRARIES})
88 89
  ENDIF()
89 90
  IF(LEMON_HAVE_CBC)
90 91
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${COIN_CBC_LIBRARIES})
91 92
  ENDIF()
92 93

	
93 94
  TARGET_LINK_LIBRARIES(mip_test ${MIP_TEST_LIBS})
94 95
  ADD_TEST(mip_test mip_test)
95 96

	
96 97
  IF(WIN32 AND LEMON_HAVE_GLPK)
97 98
    GET_TARGET_PROPERTY(TARGET_LOC mip_test LOCATION)
98 99
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
99 100
    ADD_CUSTOM_COMMAND(TARGET mip_test POST_BUILD
100 101
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/glpk.dll ${TARGET_PATH}
101 102
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/libltdl3.dll ${TARGET_PATH}
102 103
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/zlib1.dll ${TARGET_PATH}
103 104
    )
104 105
  ENDIF()
105 106

	
106 107
  IF(WIN32 AND LEMON_HAVE_CPLEX)
107 108
    GET_TARGET_PROPERTY(TARGET_LOC mip_test LOCATION)
108 109
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
109 110
    ADD_CUSTOM_COMMAND(TARGET mip_test POST_BUILD
110 111
      COMMAND ${CMAKE_COMMAND} -E copy ${CPLEX_BIN_DIR}/cplex91.dll ${TARGET_PATH}
111 112
    )
112 113
  ENDIF()
113 114
ENDIF()
114 115

	
115 116
FOREACH(TEST_NAME ${TESTS})
116 117
  ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc)
117 118
  TARGET_LINK_LIBRARIES(${TEST_NAME} lemon)
118 119
  ADD_TEST(${TEST_NAME} ${TEST_NAME})
119 120
ENDFOREACH()
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	test/CMakeLists.txt
3 3

	
4 4
noinst_HEADERS += \
5 5
	test/graph_test.h \
6 6
	test/test_tools.h
7 7

	
8 8
check_PROGRAMS += \
9 9
	test/adaptors_test \
10
	test/bellman_ford_test \
10 11
	test/bfs_test \
11 12
	test/circulation_test \
12 13
	test/connectivity_test \
13 14
	test/counter_test \
14 15
	test/dfs_test \
15 16
	test/digraph_test \
16 17
	test/dijkstra_test \
17 18
	test/dim_test \
18 19
	test/edge_set_test \
19 20
	test/error_test \
20 21
	test/euler_test \
21 22
	test/gomory_hu_test \
22 23
	test/graph_copy_test \
23 24
	test/graph_test \
24 25
	test/graph_utils_test \
25 26
	test/hao_orlin_test \
26 27
	test/heap_test \
27 28
	test/kruskal_test \
28 29
	test/maps_test \
29 30
	test/matching_test \
30 31
	test/min_cost_arborescence_test \
31 32
	test/min_cost_flow_test \
32 33
	test/path_test \
33 34
	test/preflow_test \
34 35
	test/radix_sort_test \
35 36
	test/random_test \
36 37
	test/suurballe_test \
37 38
	test/test_tools_fail \
38 39
	test/test_tools_pass \
39 40
	test/time_measure_test \
40 41
	test/unionfind_test
41 42

	
42 43
test_test_tools_pass_DEPENDENCIES = demo
43 44

	
44 45
if HAVE_LP
45 46
check_PROGRAMS += test/lp_test
46 47
endif HAVE_LP
47 48
if HAVE_MIP
48 49
check_PROGRAMS += test/mip_test
49 50
endif HAVE_MIP
50 51

	
51 52
TESTS += $(check_PROGRAMS)
52 53
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
53 54

	
54 55
test_adaptors_test_SOURCES = test/adaptors_test.cc
56
test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
55 57
test_bfs_test_SOURCES = test/bfs_test.cc
56 58
test_circulation_test_SOURCES = test/circulation_test.cc
57 59
test_counter_test_SOURCES = test/counter_test.cc
58 60
test_connectivity_test_SOURCES = test/connectivity_test.cc
59 61
test_dfs_test_SOURCES = test/dfs_test.cc
60 62
test_digraph_test_SOURCES = test/digraph_test.cc
61 63
test_dijkstra_test_SOURCES = test/dijkstra_test.cc
62 64
test_dim_test_SOURCES = test/dim_test.cc
63 65
test_edge_set_test_SOURCES = test/edge_set_test.cc
64 66
test_error_test_SOURCES = test/error_test.cc
65 67
test_euler_test_SOURCES = test/euler_test.cc
66 68
test_gomory_hu_test_SOURCES = test/gomory_hu_test.cc
67 69
test_graph_copy_test_SOURCES = test/graph_copy_test.cc
68 70
test_graph_test_SOURCES = test/graph_test.cc
69 71
test_graph_utils_test_SOURCES = test/graph_utils_test.cc
70 72
test_heap_test_SOURCES = test/heap_test.cc
71 73
test_kruskal_test_SOURCES = test/kruskal_test.cc
72 74
test_hao_orlin_test_SOURCES = test/hao_orlin_test.cc
73 75
test_lp_test_SOURCES = test/lp_test.cc
74 76
test_maps_test_SOURCES = test/maps_test.cc
75 77
test_mip_test_SOURCES = test/mip_test.cc
76 78
test_matching_test_SOURCES = test/matching_test.cc
77 79
test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
78 80
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
79 81
test_path_test_SOURCES = test/path_test.cc
80 82
test_preflow_test_SOURCES = test/preflow_test.cc
81 83
test_radix_sort_test_SOURCES = test/radix_sort_test.cc
82 84
test_suurballe_test_SOURCES = test/suurballe_test.cc
83 85
test_random_test_SOURCES = test/random_test.cc
84 86
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
85 87
test_test_tools_pass_SOURCES = test/test_tools_pass.cc
86 88
test_time_measure_test_SOURCES = test/time_measure_test.cc
87 89
test_unionfind_test_SOURCES = test/unionfind_test.cc
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/list_graph.h>
23 23
#include <lemon/circulation.h>
24 24
#include <lemon/lgf_reader.h>
25 25
#include <lemon/concepts/digraph.h>
26 26
#include <lemon/concepts/maps.h>
27 27

	
28 28
using namespace lemon;
29 29

	
30 30
char test_lgf[] =
31 31
  "@nodes\n"
32 32
  "label\n"
33 33
  "0\n"
34 34
  "1\n"
35 35
  "2\n"
36 36
  "3\n"
37 37
  "4\n"
38 38
  "5\n"
39 39
  "@arcs\n"
40 40
  "     lcap  ucap\n"
41 41
  "0 1  2  10\n"
42 42
  "0 2  2  6\n"
43 43
  "1 3  4  7\n"
44 44
  "1 4  0  5\n"
45 45
  "2 4  1  3\n"
46 46
  "3 5  3  8\n"
47 47
  "4 5  3  7\n"
48 48
  "@attributes\n"
49 49
  "source 0\n"
50 50
  "sink   5\n";
51 51

	
52 52
void checkCirculationCompile()
53 53
{
54 54
  typedef int VType;
55 55
  typedef concepts::Digraph Digraph;
56 56

	
57 57
  typedef Digraph::Node Node;
58 58
  typedef Digraph::Arc Arc;
59 59
  typedef concepts::ReadMap<Arc,VType> CapMap;
60 60
  typedef concepts::ReadMap<Node,VType> SupplyMap;
61 61
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
62 62
  typedef concepts::WriteMap<Node,bool> BarrierMap;
63 63

	
64 64
  typedef Elevator<Digraph, Digraph::Node> Elev;
65 65
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
66 66

	
67 67
  Digraph g;
68 68
  Node n;
69 69
  Arc a;
70 70
  CapMap lcap, ucap;
71 71
  SupplyMap supply;
72 72
  FlowMap flow;
73 73
  BarrierMap bar;
74 74
  VType v;
75 75
  bool b;
76 76

	
77 77
  typedef Circulation<Digraph, CapMap, CapMap, SupplyMap>
78 78
            ::SetFlowMap<FlowMap>
79 79
            ::SetElevator<Elev>
80 80
            ::SetStandardElevator<LinkedElev>
81 81
            ::Create CirculationType;
82 82
  CirculationType circ_test(g, lcap, ucap, supply);
83 83
  const CirculationType& const_circ_test = circ_test;
84 84
   
85 85
  circ_test
86 86
    .lowerMap(lcap)
87 87
    .upperMap(ucap)
88 88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90
  
91
  const CirculationType::Elevator& elev = const_circ_test.elevator();
92
  circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93
  CirculationType::Tolerance tol = const_circ_test.tolerance();
94
  circ_test.tolerance(tol);
90 95

	
91 96
  circ_test.init();
92 97
  circ_test.greedyInit();
93 98
  circ_test.start();
94 99
  circ_test.run();
95 100

	
96 101
  v = const_circ_test.flow(a);
97 102
  const FlowMap& fm = const_circ_test.flowMap();
98 103
  b = const_circ_test.barrier(n);
99 104
  const_circ_test.barrierMap(bar);
100 105
  
101 106
  ignore_unused_variable_warning(fm);
102 107
}
103 108

	
104 109
template <class G, class LM, class UM, class DM>
105 110
void checkCirculation(const G& g, const LM& lm, const UM& um,
106 111
                      const DM& dm, bool find)
107 112
{
108 113
  Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
109 114
  bool ret = circ.run();
110 115
  if (find) {
111 116
    check(ret, "A feasible solution should have been found.");
112 117
    check(circ.checkFlow(), "The found flow is corrupt.");
113 118
    check(!circ.checkBarrier(), "A barrier should not have been found.");
114 119
  } else {
115 120
    check(!ret, "A feasible solution should not have been found.");
116 121
    check(circ.checkBarrier(), "The found barrier is corrupt.");
117 122
  }
118 123
}
119 124

	
120 125
int main (int, char*[])
121 126
{
122 127
  typedef ListDigraph Digraph;
123 128
  DIGRAPH_TYPEDEFS(Digraph);
124 129

	
125 130
  Digraph g;
126 131
  IntArcMap lo(g), up(g);
127 132
  IntNodeMap delta(g, 0);
128 133
  Node s, t;
129 134

	
130 135
  std::istringstream input(test_lgf);
131 136
  DigraphReader<Digraph>(g,input).
132 137
    arcMap("lcap", lo).
133 138
    arcMap("ucap", up).
134 139
    node("source",s).
135 140
    node("sink",t).
136 141
    run();
137 142

	
138 143
  delta[s] = 7; delta[t] = -7;
139 144
  checkCirculation(g, lo, up, delta, true);
140 145

	
141 146
  delta[s] = 13; delta[t] = -13;
142 147
  checkCirculation(g, lo, up, delta, true);
143 148

	
144 149
  delta[s] = 6; delta[t] = -6;
145 150
  checkCirculation(g, lo, up, delta, false);
146 151

	
147 152
  delta[s] = 14; delta[t] = -14;
148 153
  checkCirculation(g, lo, up, delta, false);
149 154

	
150 155
  delta[s] = 7; delta[t] = -13;
151 156
  checkCirculation(g, lo, up, delta, true);
152 157

	
153 158
  delta[s] = 5; delta[t] = -15;
154 159
  checkCirculation(g, lo, up, delta, true);
155 160

	
156 161
  delta[s] = 10; delta[t] = -11;
157 162
  checkCirculation(g, lo, up, delta, true);
158 163

	
159 164
  delta[s] = 11; delta[t] = -10;
160 165
  checkCirculation(g, lo, up, delta, false);
161 166

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

	
19 19
#include <iostream>
20 20
#include <fstream>
21 21
#include <string>
22 22
#include <vector>
23 23

	
24 24
#include <lemon/concept_check.h>
25 25
#include <lemon/concepts/heap.h>
26 26

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

	
29 28
#include <lemon/lgf_reader.h>
30 29
#include <lemon/dijkstra.h>
31 30
#include <lemon/maps.h>
32 31

	
33 32
#include <lemon/bin_heap.h>
33
#include <lemon/fourary_heap.h>
34
#include <lemon/kary_heap.h>
35
#include <lemon/fib_heap.h>
36
#include <lemon/pairing_heap.h>
37
#include <lemon/radix_heap.h>
38
#include <lemon/binom_heap.h>
39
#include <lemon/bucket_heap.h>
34 40

	
35 41
#include "test_tools.h"
36 42

	
37 43
using namespace lemon;
38 44
using namespace lemon::concepts;
39 45

	
40 46
typedef ListDigraph Digraph;
41 47
DIGRAPH_TYPEDEFS(Digraph);
42 48

	
43 49
char test_lgf[] =
44 50
  "@nodes\n"
45 51
  "label\n"
46 52
  "0\n"
47 53
  "1\n"
48 54
  "2\n"
49 55
  "3\n"
50 56
  "4\n"
51 57
  "5\n"
52 58
  "6\n"
53 59
  "7\n"
54 60
  "8\n"
55 61
  "9\n"
56 62
  "@arcs\n"
57 63
  "                label   capacity\n"
58 64
  "0       5       0       94\n"
59 65
  "3       9       1       11\n"
60 66
  "8       7       2       83\n"
61 67
  "1       2       3       94\n"
62 68
  "5       7       4       35\n"
63 69
  "7       4       5       84\n"
64 70
  "9       5       6       38\n"
65 71
  "0       4       7       96\n"
66 72
  "6       7       8       6\n"
67 73
  "3       1       9       27\n"
68 74
  "5       2       10      77\n"
69 75
  "5       6       11      69\n"
70 76
  "6       5       12      41\n"
71 77
  "4       6       13      70\n"
72 78
  "3       2       14      45\n"
73 79
  "7       9       15      93\n"
74 80
  "5       9       16      50\n"
75 81
  "9       0       17      94\n"
76 82
  "9       6       18      67\n"
77 83
  "0       9       19      86\n"
78 84
  "@attributes\n"
79 85
  "source 3\n";
80 86

	
81 87
int test_seq[] = { 2, 28, 19, 27, 33, 25, 13, 41, 10, 26,  1,  9,  4, 34};
82 88
int test_inc[] = {20, 28, 34, 16,  0, 46, 44,  0, 42, 32, 14,  8,  6, 37};
83 89

	
84 90
int test_len = sizeof(test_seq) / sizeof(test_seq[0]);
85 91

	
86 92
template <typename Heap>
87 93
void heapSortTest() {
88 94
  RangeMap<int> map(test_len, -1);
89

	
90 95
  Heap heap(map);
91 96

	
92 97
  std::vector<int> v(test_len);
93

	
94 98
  for (int i = 0; i < test_len; ++i) {
95 99
    v[i] = test_seq[i];
96 100
    heap.push(i, v[i]);
97 101
  }
98 102
  std::sort(v.begin(), v.end());
99 103
  for (int i = 0; i < test_len; ++i) {
100
    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
104
    check(v[i] == heap.prio(), "Wrong order in heap sort.");
101 105
    heap.pop();
102 106
  }
103 107
}
104 108

	
105 109
template <typename Heap>
106 110
void heapIncreaseTest() {
107 111
  RangeMap<int> map(test_len, -1);
108 112

	
109 113
  Heap heap(map);
110 114

	
111 115
  std::vector<int> v(test_len);
112

	
113 116
  for (int i = 0; i < test_len; ++i) {
114 117
    v[i] = test_seq[i];
115 118
    heap.push(i, v[i]);
116 119
  }
117 120
  for (int i = 0; i < test_len; ++i) {
118 121
    v[i] += test_inc[i];
119 122
    heap.increase(i, v[i]);
120 123
  }
121 124
  std::sort(v.begin(), v.end());
122 125
  for (int i = 0; i < test_len; ++i) {
123
    check(v[i] == heap.prio() ,"Wrong order in heap increase test.");
126
    check(v[i] == heap.prio(), "Wrong order in heap increase test.");
124 127
    heap.pop();
125 128
  }
126 129
}
127 130

	
128

	
129

	
130 131
template <typename Heap>
131 132
void dijkstraHeapTest(const Digraph& digraph, const IntArcMap& length,
132 133
                      Node source) {
133 134

	
134 135
  typename Dijkstra<Digraph, IntArcMap>::template SetStandardHeap<Heap>::
135 136
    Create dijkstra(digraph, length);
136 137

	
137 138
  dijkstra.run(source);
138 139

	
139 140
  for(ArcIt a(digraph); a != INVALID; ++a) {
140 141
    Node s = digraph.source(a);
141 142
    Node t = digraph.target(a);
142 143
    if (dijkstra.reached(s)) {
143 144
      check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a],
144
             "Error in a shortest path tree!");
145
             "Error in shortest path tree.");
145 146
    }
146 147
  }
147 148

	
148 149
  for(NodeIt n(digraph); n != INVALID; ++n) {
149 150
    if ( dijkstra.reached(n) && dijkstra.predArc(n) != INVALID ) {
150 151
      Arc a = dijkstra.predArc(n);
151 152
      Node s = digraph.source(a);
152 153
      check( dijkstra.dist(n) - dijkstra.dist(s) == length[a],
153
             "Error in a shortest path tree!");
154
             "Error in shortest path tree.");
154 155
    }
155 156
  }
156 157

	
157 158
}
158 159

	
159 160
int main() {
160 161

	
161 162
  typedef int Item;
162 163
  typedef int Prio;
163 164
  typedef RangeMap<int> ItemIntMap;
164 165

	
165 166
  Digraph digraph;
166 167
  IntArcMap length(digraph);
167 168
  Node source;
168 169

	
169 170
  std::istringstream input(test_lgf);
170 171
  digraphReader(digraph, input).
171 172
    arcMap("capacity", length).
172 173
    node("source", source).
173 174
    run();
174 175

	
176
  // BinHeap
175 177
  {
176 178
    typedef BinHeap<Prio, ItemIntMap> IntHeap;
177 179
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
178 180
    heapSortTest<IntHeap>();
179 181
    heapIncreaseTest<IntHeap>();
180 182

	
181 183
    typedef BinHeap<Prio, IntNodeMap > NodeHeap;
182 184
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
183 185
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
184 186
  }
185 187

	
188
  // FouraryHeap
189
  {
190
    typedef FouraryHeap<Prio, ItemIntMap> IntHeap;
191
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192
    heapSortTest<IntHeap>();
193
    heapIncreaseTest<IntHeap>();
194

	
195
    typedef FouraryHeap<Prio, IntNodeMap > NodeHeap;
196
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
197
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
198
  }
199

	
200
  // KaryHeap
201
  {
202
    typedef KaryHeap<Prio, ItemIntMap> IntHeap;
203
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
204
    heapSortTest<IntHeap>();
205
    heapIncreaseTest<IntHeap>();
206

	
207
    typedef KaryHeap<Prio, IntNodeMap > NodeHeap;
208
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
209
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
210
  }
211

	
212
  // FibHeap
213
  {
214
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
215
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
216
    heapSortTest<IntHeap>();
217
    heapIncreaseTest<IntHeap>();
218

	
219
    typedef FibHeap<Prio, IntNodeMap > NodeHeap;
220
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
221
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
222
  }
223

	
224
  // PairingHeap
225
  {
226
    typedef PairingHeap<Prio, ItemIntMap> IntHeap;
227
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
228
    heapSortTest<IntHeap>();
229
    heapIncreaseTest<IntHeap>();
230

	
231
    typedef PairingHeap<Prio, IntNodeMap > NodeHeap;
232
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
233
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
234
  }
235

	
236
  // RadixHeap
237
  {
238
    typedef RadixHeap<ItemIntMap> IntHeap;
239
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
240
    heapSortTest<IntHeap>();
241
    heapIncreaseTest<IntHeap>();
242

	
243
    typedef RadixHeap<IntNodeMap > NodeHeap;
244
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
245
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
246
  }
247

	
248
  // BinomHeap
249
  {
250
    typedef BinomHeap<Prio, ItemIntMap> IntHeap;
251
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
252
    heapSortTest<IntHeap>();
253
    heapIncreaseTest<IntHeap>();
254

	
255
    typedef BinomHeap<Prio, IntNodeMap > NodeHeap;
256
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
257
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
258
  }
259

	
260
  // BucketHeap, SimpleBucketHeap
261
  {
262
    typedef BucketHeap<ItemIntMap> IntHeap;
263
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
264
    heapSortTest<IntHeap>();
265
    heapIncreaseTest<IntHeap>();
266

	
267
    typedef BucketHeap<IntNodeMap > NodeHeap;
268
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
269
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
270

	
271
    typedef SimpleBucketHeap<ItemIntMap> SimpleIntHeap;
272
    heapSortTest<SimpleIntHeap>();
273
  }
274

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

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/smart_graph.h>
25 26

	
26 27
#include "test_tools.h"
27 28

	
28 29
using namespace lemon;
29 30
using namespace lemon::concepts;
30 31

	
31 32
struct A {};
32 33
inline bool operator<(A, A) { return true; }
33 34
struct B {};
34 35

	
35 36
class C {
36 37
  int x;
37 38
public:
38 39
  C(int _x) : x(_x) {}
39 40
};
40 41

	
41 42
class F {
42 43
public:
43 44
  typedef A argument_type;
44 45
  typedef B result_type;
45 46

	
46 47
  B operator()(const A&) const { return B(); }
47 48
private:
48 49
  F& operator=(const F&);
49 50
};
50 51

	
51 52
int func(A) { return 3; }
52 53

	
53 54
int binc(int a, B) { return a+1; }
54 55

	
55 56
typedef ReadMap<A, double> DoubleMap;
56 57
typedef ReadWriteMap<A, double> DoubleWriteMap;
57 58
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
58 59

	
59 60
typedef ReadMap<A, bool> BoolMap;
60 61
typedef ReadWriteMap<A, bool> BoolWriteMap;
61 62
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
62 63

	
63 64
int main()
64 65
{
65 66
  // Map concepts
66 67
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
67 68
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
68 69
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
69 70
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
70 71
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
71 72
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
72 73
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
73 74
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
74 75

	
75 76
  // NullMap
76 77
  {
77 78
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
78 79
    NullMap<A,B> map1;
79 80
    NullMap<A,B> map2 = map1;
80 81
    map1 = nullMap<A,B>();
81 82
  }
82 83

	
83 84
  // ConstMap
84 85
  {
85 86
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
86 87
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
87 88
    ConstMap<A,B> map1;
88 89
    ConstMap<A,B> map2 = B();
89 90
    ConstMap<A,B> map3 = map1;
90 91
    map1 = constMap<A>(B());
91 92
    map1 = constMap<A,B>();
92 93
    map1.setAll(B());
93 94
    ConstMap<A,C> map4(C(1));
94 95
    ConstMap<A,C> map5 = map4;
95 96
    map4 = constMap<A>(C(2));
96 97
    map4.setAll(C(3));
97 98

	
98 99
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
99 100
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
100 101

	
101 102
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
102 103
    ConstMap<A,Const<int,10> > map6;
103 104
    ConstMap<A,Const<int,10> > map7 = map6;
104 105
    map6 = constMap<A,int,10>();
105 106
    map7 = constMap<A,Const<int,10> >();
106 107
    check(map6[A()] == 10 && map7[A()] == 10,
107 108
          "Something is wrong with ConstMap");
108 109
  }
109 110

	
110 111
  // IdentityMap
111 112
  {
112 113
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
113 114
    IdentityMap<A> map1;
114 115
    IdentityMap<A> map2 = map1;
115 116
    map1 = identityMap<A>();
116 117

	
117 118
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
118 119
    check(identityMap<double>()[1.0] == 1.0 &&
119 120
          identityMap<double>()[3.14] == 3.14,
120 121
          "Something is wrong with IdentityMap");
121 122
  }
122 123

	
123 124
  // RangeMap
124 125
  {
125 126
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
126 127
    RangeMap<B> map1;
127 128
    RangeMap<B> map2(10);
128 129
    RangeMap<B> map3(10,B());
129 130
    RangeMap<B> map4 = map1;
130 131
    RangeMap<B> map5 = rangeMap<B>();
131 132
    RangeMap<B> map6 = rangeMap<B>(10);
132 133
    RangeMap<B> map7 = rangeMap(10,B());
133 134

	
134 135
    checkConcept< ReferenceMap<int, double, double&, const double&>,
135 136
                  RangeMap<double> >();
136 137
    std::vector<double> v(10, 0);
137 138
    v[5] = 100;
138 139
    RangeMap<double> map8(v);
139 140
    RangeMap<double> map9 = rangeMap(v);
140 141
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
141 142
          "Something is wrong with RangeMap");
142 143
  }
143 144

	
144 145
  // SparseMap
145 146
  {
146 147
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
147 148
    SparseMap<A,B> map1;
148 149
    SparseMap<A,B> map2 = B();
149 150
    SparseMap<A,B> map3 = sparseMap<A,B>();
150 151
    SparseMap<A,B> map4 = sparseMap<A>(B());
151 152

	
152 153
    checkConcept< ReferenceMap<double, int, int&, const int&>,
153 154
                  SparseMap<double, int> >();
154 155
    std::map<double, int> m;
155 156
    SparseMap<double, int> map5(m);
156 157
    SparseMap<double, int> map6(m,10);
157 158
    SparseMap<double, int> map7 = sparseMap(m);
158 159
    SparseMap<double, int> map8 = sparseMap(m,10);
159 160

	
160 161
    check(map5[1.0] == 0 && map5[3.14] == 0 &&
161 162
          map6[1.0] == 10 && map6[3.14] == 10,
162 163
          "Something is wrong with SparseMap");
163 164
    map5[1.0] = map6[3.14] = 100;
164 165
    check(map5[1.0] == 100 && map5[3.14] == 0 &&
165 166
          map6[1.0] == 10 && map6[3.14] == 100,
166 167
          "Something is wrong with SparseMap");
167 168
  }
168 169

	
169 170
  // ComposeMap
170 171
  {
171 172
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
172 173
    checkConcept<ReadMap<B,double>, CompMap>();
173 174
    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
174 175
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
175 176

	
176 177
    SparseMap<double, bool> m1(false); m1[3.14] = true;
177 178
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
178 179
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1],
179 180
          "Something is wrong with ComposeMap")
180 181
  }
181 182

	
182 183
  // CombineMap
183 184
  {
184 185
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
185 186
    checkConcept<ReadMap<A,double>, CombMap>();
186 187
    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
187 188
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
188 189

	
189 190
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
190 191
          "Something is wrong with CombineMap");
191 192
  }
192 193

	
193 194
  // FunctorToMap, MapToFunctor
194 195
  {
195 196
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
196 197
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
197 198
    FunctorToMap<F> map1;
198 199
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
199 200
    B b = functorToMap(F())[A()];
200 201

	
201 202
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
202 203
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
203 204

	
204 205
    check(functorToMap(&func)[A()] == 3,
205 206
          "Something is wrong with FunctorToMap");
206 207
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
207 208
          "Something is wrong with MapToFunctor");
208 209
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
209 210
          mapToFunctor(functorToMap(&func))[A()] == 3,
210 211
          "Something is wrong with FunctorToMap or MapToFunctor");
211 212
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
212 213
          "Something is wrong with FunctorToMap or MapToFunctor");
213 214
  }
214 215

	
215 216
  // ConvertMap
216 217
  {
217 218
    checkConcept<ReadMap<double,double>,
218 219
      ConvertMap<ReadMap<double, int>, double> >();
219 220
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
220 221
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
221 222
  }
222 223

	
223 224
  // ForkMap
224 225
  {
225 226
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
226 227

	
227 228
    typedef RangeMap<double> RM;
228 229
    typedef SparseMap<int, double> SM;
229 230
    RM m1(10, -1);
230 231
    SM m2(-1);
231 232
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
232 233
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
233 234
    ForkMap<RM, SM> map1(m1,m2);
234 235
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
235 236
    map2.set(5, 10);
236 237
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 &&
237 238
          m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
238 239
          "Something is wrong with ForkMap");
239 240
  }
240 241

	
241 242
  // Arithmetic maps:
242 243
  // - AddMap, SubMap, MulMap, DivMap
243 244
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
244 245
  // - NegMap, NegWriteMap, AbsMap
245 246
  {
246 247
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
247 248
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
248 249
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
249 250
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
250 251

	
251 252
    ConstMap<int, double> c1(1.0), c2(3.14);
252 253
    IdentityMap<int> im;
253 254
    ConvertMap<IdentityMap<int>, double> id(im);
254 255
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0,
255 256
          "Something is wrong with AddMap");
256 257
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,
257 258
          "Something is wrong with SubMap");
258 259
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28,
259 260
          "Something is wrong with MulMap");
260 261
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57,
261 262
          "Something is wrong with DivMap");
262 263

	
263 264
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
264 265
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
265 266
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
266 267
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
267 268
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
268 269
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
269 270
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
270 271

	
271 272
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
272 273
          "Something is wrong with ShiftMap");
273 274
    check(shiftWriteMap(id, 2.0)[1] == 3.0 &&
274 275
          shiftWriteMap(id, 2.0)[10] == 12.0,
275 276
          "Something is wrong with ShiftWriteMap");
276 277
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
277 278
          "Something is wrong with ScaleMap");
278 279
    check(scaleWriteMap(id, 2.0)[1] == 2.0 &&
279 280
          scaleWriteMap(id, 2.0)[10] == 20.0,
280 281
          "Something is wrong with ScaleWriteMap");
281 282
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
282 283
          "Something is wrong with NegMap");
283 284
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
284 285
          "Something is wrong with NegWriteMap");
285 286
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
286 287
          "Something is wrong with AbsMap");
287 288
  }
288 289

	
289 290
  // Logical maps:
290 291
  // - TrueMap, FalseMap
291 292
  // - AndMap, OrMap
292 293
  // - NotMap, NotWriteMap
293 294
  // - EqualMap, LessMap
294 295
  {
295 296
    checkConcept<BoolMap, TrueMap<A> >();
296 297
    checkConcept<BoolMap, FalseMap<A> >();
297 298
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
298 299
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
299 300
    checkConcept<BoolMap, NotMap<BoolMap> >();
300 301
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
301 302
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
302 303
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
303 304

	
304 305
    TrueMap<int> tm;
305 306
    FalseMap<int> fm;
306 307
    RangeMap<bool> rm(2);
307 308
    rm[0] = true; rm[1] = false;
308 309
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
309 310
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
310 311
          "Something is wrong with AndMap");
311 312
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
312 313
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
313 314
          "Something is wrong with OrMap");
314 315
    check(!notMap(rm)[0] && notMap(rm)[1],
315 316
          "Something is wrong with NotMap");
316 317
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
317 318
          "Something is wrong with NotWriteMap");
318 319

	
319 320
    ConstMap<int, double> cm(2.0);
320 321
    IdentityMap<int> im;
321 322
    ConvertMap<IdentityMap<int>, double> id(im);
322 323
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
323 324
          "Something is wrong with LessMap");
324 325
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
325 326
          "Something is wrong with EqualMap");
326 327
  }
327 328

	
328 329
  // LoggerBoolMap
329 330
  {
330 331
    typedef std::vector<int> vec;
331 332
    vec v1;
332 333
    vec v2(10);
333 334
    LoggerBoolMap<std::back_insert_iterator<vec> >
334 335
      map1(std::back_inserter(v1));
335 336
    LoggerBoolMap<vec::iterator> map2(v2.begin());
336 337
    map1.set(10, false);
337 338
    map1.set(20, true);   map2.set(20, true);
338 339
    map1.set(30, false);  map2.set(40, false);
339 340
    map1.set(50, true);   map2.set(50, true);
340 341
    map1.set(60, true);   map2.set(60, true);
341 342
    check(v1.size() == 3 && v2.size() == 10 &&
342 343
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
343 344
          v2[0]==20 && v2[1]==50 && v2[2]==60,
344 345
          "Something is wrong with LoggerBoolMap");
345 346

	
346 347
    int i = 0;
347 348
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
348 349
          it != map2.end(); ++it )
349 350
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
350 351
  }
351 352

	
353
  // CrossRefMap
354
  {
355
    typedef SmartDigraph Graph;
356
    DIGRAPH_TYPEDEFS(Graph);
357

	
358
    checkConcept<ReadWriteMap<Node, int>,
359
                 CrossRefMap<Graph, Node, int> >();
360
    
361
    Graph gr;
362
    typedef CrossRefMap<Graph, Node, char> CRMap;
363
    typedef CRMap::ValueIterator ValueIt;
364
    CRMap map(gr);
365
    
366
    Node n0 = gr.addNode();
367
    Node n1 = gr.addNode();
368
    Node n2 = gr.addNode();
369
    
370
    map.set(n0, 'A');
371
    map.set(n1, 'B');
372
    map.set(n2, 'C');
373
    map.set(n2, 'A');
374
    map.set(n0, 'C');
375

	
376
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
377
          "Wrong CrossRefMap");
378
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
379
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
380
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
381

	
382
    ValueIt it = map.beginValue();
383
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384
          it == map.endValue(), "Wrong value iterator");
385
  }
386
  
387
  // Iterable bool map
388
  {
389
    typedef SmartGraph Graph;
390
    typedef SmartGraph::Node Item;
391

	
392
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
393
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
394

	
395
    const int num = 10;
396
    Graph g;
397
    std::vector<Item> items;
398
    for (int i = 0; i < num; ++i) {
399
      items.push_back(g.addNode());
400
    }
401

	
402
    Ibm map1(g, true);
403
    int n = 0;
404
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
405
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
406
      ++n;
407
    }
408
    check(n == num, "Wrong number");
409

	
410
    n = 0;
411
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
412
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
413
        ++n;
414
    }
415
    check(n == num, "Wrong number");
416
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
417
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
418

	
419
    map1[items[5]] = true;
420

	
421
    n = 0;
422
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
423
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
424
        ++n;
425
    }
426
    check(n == num, "Wrong number");
427

	
428
    map1[items[num / 2]] = false;
429
    check(map1[items[num / 2]] == false, "Wrong map value");
430

	
431
    n = 0;
432
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
433
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
434
        ++n;
435
    }
436
    check(n == num - 1, "Wrong number");
437

	
438
    n = 0;
439
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
440
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
441
        ++n;
442
    }
443
    check(n == 1, "Wrong number");
444

	
445
    map1[items[0]] = false;
446
    check(map1[items[0]] == false, "Wrong map value");
447

	
448
    map1[items[num - 1]] = false;
449
    check(map1[items[num - 1]] == false, "Wrong map value");
450

	
451
    n = 0;
452
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
453
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
454
        ++n;
455
    }
456
    check(n == num - 3, "Wrong number");
457
    check(map1.trueNum() == num - 3, "Wrong number");
458

	
459
    n = 0;
460
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
461
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
462
        ++n;
463
    }
464
    check(n == 3, "Wrong number");
465
    check(map1.falseNum() == 3, "Wrong number");
466
  }
467

	
468
  // Iterable int map
469
  {
470
    typedef SmartGraph Graph;
471
    typedef SmartGraph::Node Item;
472
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
473

	
474
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
475

	
476
    const int num = 10;
477
    Graph g;
478
    std::vector<Item> items;
479
    for (int i = 0; i < num; ++i) {
480
      items.push_back(g.addNode());
481
    }
482

	
483
    Iim map1(g);
484
    check(map1.size() == 0, "Wrong size");
485

	
486
    for (int i = 0; i < num; ++i) {
487
      map1[items[i]] = i;
488
    }
489
    check(map1.size() == num, "Wrong size");
490

	
491
    for (int i = 0; i < num; ++i) {
492
      Iim::ItemIt it(map1, i);
493
      check(static_cast<Item>(it) == items[i], "Wrong value");
494
      ++it;
495
      check(static_cast<Item>(it) == INVALID, "Wrong value");
496
    }
497

	
498
    for (int i = 0; i < num; ++i) {
499
      map1[items[i]] = i % 2;
500
    }
501
    check(map1.size() == 2, "Wrong size");
502

	
503
    int n = 0;
504
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
505
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
506
      ++n;
507
    }
508
    check(n == (num + 1) / 2, "Wrong number");
509

	
510
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
511
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
512
      ++n;
513
    }
514
    check(n == num, "Wrong number");
515

	
516
  }
517

	
518
  // Iterable value map
519
  {
520
    typedef SmartGraph Graph;
521
    typedef SmartGraph::Node Item;
522
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
523

	
524
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
525

	
526
    const int num = 10;
527
    Graph g;
528
    std::vector<Item> items;
529
    for (int i = 0; i < num; ++i) {
530
      items.push_back(g.addNode());
531
    }
532

	
533
    Ivm map1(g, 0.0);
534
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
535
    check(*map1.beginValue() == 0.0, "Wrong value");
536

	
537
    for (int i = 0; i < num; ++i) {
538
      map1.set(items[i], static_cast<double>(i));
539
    }
540
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
541

	
542
    for (int i = 0; i < num; ++i) {
543
      Ivm::ItemIt it(map1, static_cast<double>(i));
544
      check(static_cast<Item>(it) == items[i], "Wrong value");
545
      ++it;
546
      check(static_cast<Item>(it) == INVALID, "Wrong value");
547
    }
548

	
549
    for (Ivm::ValueIterator vit = map1.beginValue();
550
         vit != map1.endValue(); ++vit) {
551
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
552
            "Wrong ValueIterator");
553
    }
554

	
555
    for (int i = 0; i < num; ++i) {
556
      map1.set(items[i], static_cast<double>(i % 2));
557
    }
558
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
559

	
560
    int n = 0;
561
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
562
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
563
      ++n;
564
    }
565
    check(n == (num + 1) / 2, "Wrong number");
566

	
567
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
568
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
569
      ++n;
570
    }
571
    check(n == num, "Wrong number");
572

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

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/smart_graph.h>
23 23
#include <lemon/preflow.h>
24 24
#include <lemon/concepts/digraph.h>
25 25
#include <lemon/concepts/maps.h>
26 26
#include <lemon/lgf_reader.h>
27 27
#include <lemon/elevator.h>
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "6\n"
41 41
  "7\n"
42 42
  "8\n"
43 43
  "9\n"
44 44
  "@arcs\n"
45 45
  "    label capacity\n"
46 46
  "0 1 0     20\n"
47 47
  "0 2 1     0\n"
48 48
  "1 1 2     3\n"
49 49
  "1 2 3     8\n"
50 50
  "1 3 4     8\n"
51 51
  "2 5 5     5\n"
52 52
  "3 2 6     5\n"
53 53
  "3 5 7     5\n"
54 54
  "3 6 8     5\n"
55 55
  "4 3 9     3\n"
56 56
  "5 7 10    3\n"
57 57
  "5 6 11    10\n"
58 58
  "5 8 12    10\n"
59 59
  "6 8 13    8\n"
60 60
  "8 9 14    20\n"
61 61
  "8 1 15    5\n"
62 62
  "9 5 16    5\n"
63 63
  "@attributes\n"
64 64
  "source 1\n"
65 65
  "target 8\n";
66 66

	
67 67
void checkPreflowCompile()
68 68
{
69 69
  typedef int VType;
70 70
  typedef concepts::Digraph Digraph;
71 71

	
72 72
  typedef Digraph::Node Node;
73 73
  typedef Digraph::Arc Arc;
74 74
  typedef concepts::ReadMap<Arc,VType> CapMap;
75 75
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
76 76
  typedef concepts::WriteMap<Node,bool> CutMap;
77 77

	
78 78
  typedef Elevator<Digraph, Digraph::Node> Elev;
79 79
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
80 80

	
81 81
  Digraph g;
82 82
  Node n;
83 83
  Arc e;
84 84
  CapMap cap;
85 85
  FlowMap flow;
86 86
  CutMap cut;
87 87
  VType v;
88 88
  bool b;
89 89

	
90 90
  typedef Preflow<Digraph, CapMap>
91 91
            ::SetFlowMap<FlowMap>
92 92
            ::SetElevator<Elev>
93 93
            ::SetStandardElevator<LinkedElev>
94 94
            ::Create PreflowType;
95 95
  PreflowType preflow_test(g, cap, n, n);
96 96
  const PreflowType& const_preflow_test = preflow_test;
97
  
98
  const PreflowType::Elevator& elev = const_preflow_test.elevator();
99
  preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
100
  PreflowType::Tolerance tol = const_preflow_test.tolerance();
101
  preflow_test.tolerance(tol);
97 102

	
98 103
  preflow_test
99 104
    .capacityMap(cap)
100 105
    .flowMap(flow)
101 106
    .source(n)
102 107
    .target(n);
103 108

	
104 109
  preflow_test.init();
105 110
  preflow_test.init(cap);
106 111
  preflow_test.startFirstPhase();
107 112
  preflow_test.startSecondPhase();
108 113
  preflow_test.run();
109 114
  preflow_test.runMinCut();
110 115

	
111 116
  v = const_preflow_test.flowValue();
112 117
  v = const_preflow_test.flow(e);
113 118
  const FlowMap& fm = const_preflow_test.flowMap();
114 119
  b = const_preflow_test.minCut(n);
115 120
  const_preflow_test.minCutMap(cut);
116 121
  
117 122
  ignore_unused_variable_warning(fm);
118 123
}
119 124

	
120 125
int cutValue (const SmartDigraph& g,
121 126
              const SmartDigraph::NodeMap<bool>& cut,
122 127
              const SmartDigraph::ArcMap<int>& cap) {
123 128

	
124 129
  int c=0;
125 130
  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
126 131
    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
127 132
  }
128 133
  return c;
129 134
}
130 135

	
131 136
bool checkFlow(const SmartDigraph& g,
132 137
               const SmartDigraph::ArcMap<int>& flow,
133 138
               const SmartDigraph::ArcMap<int>& cap,
134 139
               SmartDigraph::Node s, SmartDigraph::Node t) {
135 140

	
136 141
  for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
137 142
    if (flow[e] < 0 || flow[e] > cap[e]) return false;
138 143
  }
139 144

	
140 145
  for (SmartDigraph::NodeIt n(g); n != INVALID; ++n) {
141 146
    if (n == s || n == t) continue;
142 147
    int sum = 0;
143 148
    for (SmartDigraph::OutArcIt e(g, n); e != INVALID; ++e) {
144 149
      sum += flow[e];
145 150
    }
146 151
    for (SmartDigraph::InArcIt e(g, n); e != INVALID; ++e) {
147 152
      sum -= flow[e];
148 153
    }
149 154
    if (sum != 0) return false;
150 155
  }
151 156
  return true;
152 157
}
153 158

	
154 159
int main() {
155 160

	
156 161
  typedef SmartDigraph Digraph;
157 162

	
158 163
  typedef Digraph::Node Node;
159 164
  typedef Digraph::NodeIt NodeIt;
160 165
  typedef Digraph::ArcIt ArcIt;
161 166
  typedef Digraph::ArcMap<int> CapMap;
162 167
  typedef Digraph::ArcMap<int> FlowMap;
163 168
  typedef Digraph::NodeMap<bool> CutMap;
164 169

	
165 170
  typedef Preflow<Digraph, CapMap> PType;
166 171

	
167 172
  Digraph g;
168 173
  Node s, t;
169 174
  CapMap cap(g);
170 175
  std::istringstream input(test_lgf);
171 176
  DigraphReader<Digraph>(g,input).
172 177
    arcMap("capacity", cap).
173 178
    node("source",s).
174 179
    node("target",t).
175 180
    run();
176 181

	
177 182
  PType preflow_test(g, cap, s, t);
178 183
  preflow_test.run();
179 184

	
180 185
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
181 186
        "The flow is not feasible.");
182 187

	
183 188
  CutMap min_cut(g);
184 189
  preflow_test.minCutMap(min_cut);
185 190
  int min_cut_value=cutValue(g,min_cut,cap);
186 191

	
187 192
  check(preflow_test.flowValue() == min_cut_value,
188 193
        "The max flow value is not equal to the three min cut values.");
189 194

	
190 195
  FlowMap flow(g);
191 196
  for(ArcIt e(g); e!=INVALID; ++e) flow[e] = preflow_test.flowMap()[e];
192 197

	
193 198
  int flow_value=preflow_test.flowValue();
194 199

	
195 200
  for(ArcIt e(g); e!=INVALID; ++e) cap[e]=2*cap[e];
196 201
  preflow_test.init(flow);
197 202
  preflow_test.startFirstPhase();
198 203

	
199 204
  CutMap min_cut1(g);
200 205
  preflow_test.minCutMap(min_cut1);
201 206
  min_cut_value=cutValue(g,min_cut1,cap);
202 207

	
203 208
  check(preflow_test.flowValue() == min_cut_value &&
204 209
        min_cut_value == 2*flow_value,
205 210
        "The max flow value or the min cut value is wrong.");
206 211

	
207 212
  preflow_test.startSecondPhase();
208 213

	
209 214
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
210 215
        "The flow is not feasible.");
211 216

	
212 217
  CutMap min_cut2(g);
213 218
  preflow_test.minCutMap(min_cut2);
214 219
  min_cut_value=cutValue(g,min_cut2,cap);
215 220

	
216 221
  check(preflow_test.flowValue() == min_cut_value &&
217 222
        min_cut_value == 2*flow_value,
218 223
        "The max flow value or the three min cut values were not doubled");
219 224

	
220 225

	
221 226
  preflow_test.flowMap(flow);
222 227

	
223 228
  NodeIt tmp1(g,s);
224 229
  ++tmp1;
225 230
  if ( tmp1 != INVALID ) s=tmp1;
226 231

	
227 232
  NodeIt tmp2(g,t);
228 233
  ++tmp2;
229 234
  if ( tmp2 != INVALID ) t=tmp2;
230 235

	
231 236
  preflow_test.source(s);
232 237
  preflow_test.target(t);
233 238

	
234 239
  preflow_test.run();
235 240

	
236 241
  CutMap min_cut3(g);
237 242
  preflow_test.minCutMap(min_cut3);
238 243
  min_cut_value=cutValue(g,min_cut3,cap);
239 244

	
240 245

	
241 246
  check(preflow_test.flowValue() == min_cut_value,
242 247
        "The max flow value or the three min cut values are incorrect.");
243 248

	
244 249
  return 0;
245 250
}
Ignore white space 6 line context
1 1
#!/bin/bash
2 2

	
3 3
set -e
4 4

	
5 5
if [ $# -eq 0 -o x$1 = "x-h" -o x$1 = "x-help" -o x$1 = "x--help" ]; then
6 6
    echo "Usage:"
7 7
    echo "  $0 source-file(s)"
8 8
    exit
9 9
fi
10 10

	
11 11
for i in $@
12 12
do
13 13
    echo Update $i...
14 14
    TMP=`mktemp`
15 15
    sed -e "s/\<undirected graph\>/_gr_aph_label_/g"\
16 16
        -e "s/\<undirected graphs\>/_gr_aph_label_s/g"\
17 17
        -e "s/\<undirected edge\>/_ed_ge_label_/g"\
18 18
        -e "s/\<undirected edges\>/_ed_ge_label_s/g"\
19 19
        -e "s/\<directed graph\>/_digr_aph_label_/g"\
20 20
        -e "s/\<directed graphs\>/_digr_aph_label_s/g"\
21 21
        -e "s/\<directed edge\>/_ar_c_label_/g"\
22 22
        -e "s/\<directed edges\>/_ar_c_label_s/g"\
23 23
        -e "s/UGraph/_Gr_aph_label_/g"\
24 24
        -e "s/u[Gg]raph/_gr_aph_label_/g"\
25 25
        -e "s/Graph\>/_Digr_aph_label_/g"\
26 26
        -e "s/\<graph\>/_digr_aph_label_/g"\
27 27
        -e "s/Graphs\>/_Digr_aph_label_s/g"\
28 28
        -e "s/\<graphs\>/_digr_aph_label_s/g"\
29 29
        -e "s/\([Gg]\)raph\([a-z]\)/_\1r_aph_label_\2/g"\
30 30
        -e "s/\([a-z_]\)graph/\1_gr_aph_label_/g"\
31 31
        -e "s/Graph/_Digr_aph_label_/g"\
32 32
        -e "s/graph/_digr_aph_label_/g"\
33 33
        -e "s/UEdge/_Ed_ge_label_/g"\
34 34
        -e "s/u[Ee]dge/_ed_ge_label_/g"\
35 35
        -e "s/IncEdgeIt/_In_cEd_geIt_label_/g"\
36 36
        -e "s/Edge\>/_Ar_c_label_/g"\
37 37
        -e "s/\<edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/__ar_c_label_/g"\
39 39
        -e "s/Edges\>/_Ar_c_label_s/g"\
40 40
        -e "s/\<edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/__ar_c_label_s/g"\
42 42
        -e "s/\([Ee]\)dge\([a-z]\)/_\1d_ge_label_\2/g"\
43 43
        -e "s/\([a-z]\)edge/\1_ed_ge_label_/g"\
44 44
        -e "s/Edge/_Ar_c_label_/g"\
45 45
        -e "s/edge/_ar_c_label_/g"\
46 46
        -e "s/A[Nn]ode/_Re_d_label_/g"\
47 47
        -e "s/B[Nn]ode/_Blu_e_label_/g"\
48 48
        -e "s/A-[Nn]ode/_Re_d_label_/g"\
49 49
        -e "s/B-[Nn]ode/_Blu_e_label_/g"\
50 50
        -e "s/a[Nn]ode/_re_d_label_/g"\
51 51
        -e "s/b[Nn]ode/_blu_e_label_/g"\
52 52
        -e "s/\<UGRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__GR_APH_TY_PEDE_FS_label_\1/g"\
53 53
        -e "s/\<GRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__DIGR_APH_TY_PEDE_FS_label_\1/g"\
54 54
        -e "s/\<UGRAPH_TYPEDEFS\>/_GR_APH_TY_PEDE_FS_label_/g"\
55 55
        -e "s/\<GRAPH_TYPEDEFS\>/_DIGR_APH_TY_PEDE_FS_label_/g"\
56 56
        -e "s/_Digr_aph_label_/Digraph/g"\
57 57
        -e "s/_digr_aph_label_/digraph/g"\
58 58
        -e "s/_Gr_aph_label_/Graph/g"\
59 59
        -e "s/_gr_aph_label_/graph/g"\
60 60
        -e "s/_Ar_c_label_/Arc/g"\
61 61
        -e "s/_ar_c_label_/arc/g"\
62 62
        -e "s/_Ed_ge_label_/Edge/g"\
63 63
        -e "s/_ed_ge_label_/edge/g"\
64 64
        -e "s/_In_cEd_geIt_label_/IncEdgeIt/g"\
65 65
        -e "s/_Re_d_label_/Red/g"\
66 66
        -e "s/_Blu_e_label_/Blue/g"\
67 67
        -e "s/_re_d_label_/red/g"\
68 68
        -e "s/_blu_e_label_/blue/g"\
69 69
        -e "s/_GR_APH_TY_PEDE_FS_label_/GRAPH_TYPEDEFS/g"\
70 70
        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
71
        -e "s/\<digraph_adaptor\.h\>/adaptors.h/g"\
72
        -e "s/\<digraph_utils\.h\>/core.h/g"\
73
        -e "s/\<digraph_reader\.h\>/lgf_reader.h/g"\
74
        -e "s/\<digraph_writer\.h\>/lgf_writer.h/g"\
75
        -e "s/\<topology\.h\>/connectivity.h/g"\
71 76
        -e "s/DigraphToEps/GraphToEps/g"\
72 77
        -e "s/digraphToEps/graphToEps/g"\
73 78
        -e "s/\<DefPredMap\>/SetPredMap/g"\
74 79
        -e "s/\<DefDistMap\>/SetDistMap/g"\
75 80
        -e "s/\<DefReachedMap\>/SetReachedMap/g"\
76 81
        -e "s/\<DefProcessedMap\>/SetProcessedMap/g"\
77 82
        -e "s/\<DefHeap\>/SetHeap/g"\
78 83
        -e "s/\<DefStandardHeap\>/SetStandradHeap/g"\
79 84
        -e "s/\<DefOperationTraits\>/SetOperationTraits/g"\
80 85
        -e "s/\<DefProcessedMapToBeDefaultMap\>/SetStandardProcessedMap/g"\
81 86
        -e "s/\<copyGraph\>/graphCopy/g"\
82 87
        -e "s/\<copyDigraph\>/digraphCopy/g"\
83 88
        -e "s/\<HyperCubeDigraph\>/HypercubeGraph/g"\
84 89
        -e "s/\<IntegerMap\>/RangeMap/g"\
85 90
        -e "s/\<integerMap\>/rangeMap/g"\
86 91
        -e "s/\<\([sS]\)tdMap\>/\1parseMap/g"\
87 92
        -e "s/\<\([Ff]\)unctorMap\>/\1unctorToMap/g"\
88 93
        -e "s/\<\([Mm]\)apFunctor\>/\1apToFunctor/g"\
89 94
        -e "s/\<\([Ff]\)orkWriteMap\>/\1orkMap/g"\
90 95
        -e "s/\<StoreBoolMap\>/LoggerBoolMap/g"\
91 96
        -e "s/\<storeBoolMap\>/loggerBoolMap/g"\
92 97
        -e "s/\<InvertableMap\>/CrossRefMap/g"\
93 98
        -e "s/\<invertableMap\>/crossRefMap/g"\
94 99
        -e "s/\<DescriptorMap\>/RangeIdMap/g"\
95 100
        -e "s/\<descriptorMap\>/rangeIdMap/g"\
96 101
        -e "s/\<BoundingBox\>/Box/g"\
97 102
        -e "s/\<readNauty\>/readNautyGraph/g"\
98 103
        -e "s/\<RevDigraphAdaptor\>/ReverseDigraph/g"\
99 104
        -e "s/\<revDigraphAdaptor\>/reverseDigraph/g"\
100 105
        -e "s/\<SubDigraphAdaptor\>/SubDigraph/g"\
101 106
        -e "s/\<subDigraphAdaptor\>/subDigraph/g"\
102 107
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
103 108
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
104 109
        -e "s/\<NodeSubDigraphAdaptor\>/FilterNodes/g"\
105 110
        -e "s/\<nodeSubDigraphAdaptor\>/filterNodes/g"\
106 111
        -e "s/\<ArcSubDigraphAdaptor\>/FilterArcs/g"\
107 112
        -e "s/\<arcSubDigraphAdaptor\>/filterArcs/g"\
108 113
        -e "s/\<UndirDigraphAdaptor\>/Undirector/g"\
109 114
        -e "s/\<undirDigraphAdaptor\>/undirector/g"\
110 115
        -e "s/\<ResDigraphAdaptor\>/ResidualDigraph/g"\
111 116
        -e "s/\<resDigraphAdaptor\>/residualDigraph/g"\
112 117
        -e "s/\<SplitDigraphAdaptor\>/SplitNodes/g"\
113 118
        -e "s/\<splitDigraphAdaptor\>/splitNodes/g"\
114 119
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
115 120
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
116 121
        -e "s/\<NodeSubGraphAdaptor\>/FilterNodes/g"\
117 122
        -e "s/\<nodeSubGraphAdaptor\>/filterNodes/g"\
118 123
        -e "s/\<ArcSubGraphAdaptor\>/FilterEdges/g"\
119 124
        -e "s/\<arcSubGraphAdaptor\>/filterEdges/g"\
120 125
        -e "s/\<DirGraphAdaptor\>/Orienter/g"\
121 126
        -e "s/\<dirGraphAdaptor\>/orienter/g"\
122 127
        -e "s/\<LpCplex\>/CplexLp/g"\
123 128
        -e "s/\<MipCplex\>/CplexMip/g"\
124 129
        -e "s/\<LpGlpk\>/GlpkLp/g"\
125 130
        -e "s/\<MipGlpk\>/GlpkMip/g"\
126 131
        -e "s/\<LpSoplex\>/SoplexLp/g"\
127 132
    <$i > $TMP
128 133
    mv $TMP $i
129 134
done
0 comments (0 inline)