↑ 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
... ...
@@ -225,16 +225,8 @@
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

	
... ...
@@ -245,9 +237,38 @@
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
... ...
@@ -258,8 +279,30 @@
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

	
... ...
@@ -297,8 +340,17 @@
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

	
... ...
@@ -374,9 +426,9 @@
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
... ...
@@ -390,32 +442,8 @@
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

	
... ...
@@ -454,14 +482,38 @@
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
... ...
@@ -472,17 +524,8 @@
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

	
... ...
@@ -586,9 +629,9 @@
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.
... ...
@@ -648,8 +691,17 @@
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

	
... ...
@@ -659,14 +711,5 @@
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
... ...
@@ -56,10 +56,13 @@
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 \
... ...
@@ -75,31 +78,35 @@
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 \
Ignore white space 6 line context
... ...
@@ -413,10 +413,10 @@
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
    ///@{
... ...
@@ -1421,10 +1421,10 @@
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
    /// @{
Ignore white space 6 line context
... ...
@@ -18,57 +18,53 @@
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.
... ...
@@ -83,57 +79,58 @@
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;
... ...
@@ -142,19 +139,19 @@
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);
... ...
@@ -170,148 +167,150 @@
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) {
... ...
@@ -326,14 +325,15 @@
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);
Ignore white space 6 line context
... ...
@@ -536,9 +536,9 @@
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

	
... ...
@@ -560,9 +560,9 @@
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) {}
Ignore white space 6 line context
... ...
@@ -603,9 +603,9 @@
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

	
... ...
@@ -627,9 +627,9 @@
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

	
... ...
@@ -651,9 +651,9 @@
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) {}
Ignore white space 6 line context
... ...
@@ -71,9 +71,13 @@
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.
... ...
@@ -86,11 +90,14 @@
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.
... ...
@@ -449,27 +456,29 @@
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

	
Ignore white space 6 line context
... ...
@@ -15,15 +15,15 @@
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 {
... ...
@@ -34,23 +34,29 @@
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

	
... ...
@@ -63,111 +69,127 @@
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.
... ...
@@ -175,13 +197,13 @@
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

	
Ignore white space 6 line context
... ...
@@ -411,10 +411,10 @@
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

	
... ...
@@ -1363,10 +1363,10 @@
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

	
Ignore white space 6 line context
... ...
@@ -588,10 +588,10 @@
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
    ///@{
Ignore white space 8 line context
... ...
@@ -20,18 +20,11 @@
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
... ...
@@ -39,9 +32,9 @@
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

	
Ignore white space 6 line context
... ...
@@ -358,12 +358,12 @@
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;
... ...
@@ -455,12 +455,12 @@
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)".
Ignore white space 6 line context
... ...
@@ -21,17 +21,16 @@
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
  /// @{
... ...
@@ -1817,9 +1816,9 @@
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
  ///
... ...
@@ -1901,15 +1900,16 @@
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.
... ...
@@ -1922,9 +1922,9 @@
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

	
... ...
@@ -1947,8 +1947,10 @@
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:
... ...
@@ -1999,13 +2001,17 @@
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.
... ...
@@ -2015,13 +2021,16 @@
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:
... ...
@@ -2031,11 +2040,15 @@
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

	
... ...
@@ -2045,11 +2058,15 @@
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
    }
... ...
@@ -2083,10 +2100,11 @@
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

	
... ...
@@ -2253,9 +2271,9 @@
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
    }
... ...
@@ -2310,8 +2328,905 @@
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.
... ...
@@ -2479,9 +3394,9 @@
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()",
... ...
@@ -2495,9 +3410,9 @@
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
... ...
@@ -2609,9 +3524,9 @@
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()",
Ignore white space 6 line context
... ...
@@ -487,10 +487,10 @@
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

	
Ignore white space 6 line context
... ...
@@ -51,9 +51,13 @@
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.
... ...
@@ -66,11 +70,14 @@
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.
... ...
@@ -96,9 +103,9 @@
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
... ...
@@ -370,28 +377,30 @@
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

	
Ignore white space 6 line context
... ...
@@ -8,8 +8,9 @@
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
Ignore white space 6 line context
... ...
@@ -6,8 +6,9 @@
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 \
... ...
@@ -51,8 +52,9 @@
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
Ignore white space 6 line context
... ...
@@ -86,8 +86,13 @@
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();
Ignore white space 6 line context
... ...
@@ -24,14 +24,20 @@
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;
... ...
@@ -85,20 +91,18 @@
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

	
... ...
@@ -108,9 +112,8 @@
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
  }
... ...
@@ -119,15 +122,13 @@
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

	
... ...
@@ -140,18 +141,18 @@
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
}
... ...
@@ -171,8 +172,9 @@
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>();
... ...
@@ -182,6 +184,93 @@
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
... ...
@@ -21,8 +21,9 @@
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;
... ...
@@ -348,6 +349,227 @@
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
... ...
@@ -93,8 +93,13 @@
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)
Ignore white space 6 line context
... ...
@@ -34,12 +34,12 @@
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"\
... ...
@@ -67,8 +67,13 @@
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"\
0 comments (0 inline)