gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 3 0
merge default
1 file changed with 276 insertions and 269 deletions:
↑ Collapse diff ↑
Show white space 32 line context
... ...
@@ -67,33 +67,34 @@
67 67
    ///Instantiates a ProcessedMap.
68 68

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

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

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

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

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

	
97 98
    ///The type of the map that stores the distances of the nodes.
98 99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
99 100
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -105,65 +106,59 @@
105 106
    static DistMap *createDistMap(const Digraph &g)
106 107
    {
107 108
      return new DistMap(g);
108 109
    }
109 110
  };
110 111

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

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

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

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

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

	
156 151
  private:
157 152

	
158 153
    typedef typename Digraph::Node Node;
159 154
    typedef typename Digraph::NodeIt NodeIt;
160 155
    typedef typename Digraph::Arc Arc;
161 156
    typedef typename Digraph::OutArcIt OutArcIt;
162 157

	
163 158
    //Pointer to the underlying digraph.
164 159
    const Digraph *G;
165 160
    //Pointer to the map of predecessor arcs.
166 161
    PredMap *_pred;
167 162
    //Indicates if _pred is locally allocated (true) or not.
168 163
    bool local_pred;
169 164
    //Pointer to the map of distances.
... ...
@@ -199,107 +194,111 @@
199 194
        _reached = Traits::createReachedMap(*G);
200 195
      }
201 196
      if(!_processed) {
202 197
        local_processed = true;
203 198
        _processed = Traits::createProcessedMap(*G);
204 199
      }
205 200
    }
206 201

	
207 202
  protected:
208 203

	
209 204
    Bfs() {}
210 205

	
211 206
  public:
212 207

	
213 208
    typedef Bfs Create;
214 209

	
215
    ///\name Named template parameters
210
    ///\name Named Template Parameters
216 211

	
217 212
    ///@{
218 213

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

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

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

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

	
295 294
    struct SetStandardProcessedMapTraits : public Traits {
296 295
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
297 296
      static ProcessedMap *createProcessedMap(const Digraph &g)
298 297
      {
299 298
        return new ProcessedMap(g);
300 299
        return 0; // ignore warnings
301 300
      }
302 301
    };
303 302
    ///\brief \ref named-templ-param "Named parameter" for setting
304 303
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 304
    ///
... ...
@@ -326,116 +325,117 @@
326 325
      _reached(NULL), local_reached(false),
327 326
      _processed(NULL), local_processed(false)
328 327
    { }
329 328

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

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

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

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

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

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

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

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

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

	
408 411
  public:
409 412

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

	
420 421
    ///@{
421 422

	
423
    ///\brief Initializes the internal data structures.
424
    ///
422 425
    ///Initializes the internal data structures.
423

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

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

	
441 441
    ///Adds a new source node to the set of nodes to be processed.
... ...
@@ -543,42 +543,42 @@
543 543
          _pred->set(m,e);
544 544
          _dist->set(m,_curr_dist);
545 545
          if (nm[m] && rnode == INVALID) rnode = m;
546 546
        }
547 547
      return n;
548 548
    }
549 549

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

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

	
559
    ///\brief Returns \c false if there are nodes
560
    ///to be processed.
561
    ///
562
    ///Returns \c false if there are nodes
563
    ///to be processed in the queue.
559
    ///Returns \c false if there are nodes to be processed.
560

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

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

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

	
571 571
    ///Executes the algorithm.
572 572

	
573 573
    ///Executes the algorithm.
574 574
    ///
575 575
    ///This method runs the %BFS algorithm from the root node(s)
576 576
    ///in order to compute the shortest path to each node.
577 577
    ///
578 578
    ///The algorithm computes
579 579
    ///- the shortest path tree (forest),
580 580
    ///- the distance of each node from the root(s).
581 581
    ///
582 582
    ///\pre init() must be called and at least one root node should be
583 583
    ///added with addSource() before using this function.
584 584
    ///
... ...
@@ -717,113 +717,114 @@
717 717
    ///    }
718 718
    ///  }
719 719
    ///\endcode
720 720
    void run() {
721 721
      init();
722 722
      for (NodeIt n(*G); n != INVALID; ++n) {
723 723
        if (!reached(n)) {
724 724
          addSource(n);
725 725
          start();
726 726
        }
727 727
      }
728 728
    }
729 729

	
730 730
    ///@}
731 731

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

	
738 738
    ///@{
739 739

	
740 740
    ///The shortest path to a node.
741 741

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

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

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

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

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

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

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

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

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

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

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

	
817 818
    ///@}
818 819
  };
819 820

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

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

	
... ...
@@ -943,34 +944,34 @@
943 944

	
944 945
    /// Constructor.
945 946

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

	
953 954
  };
954 955

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

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

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

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

	
... ...
@@ -1164,33 +1165,33 @@
1164 1165

	
1165 1166
  ///Function-type interface for BFS algorithm.
1166 1167

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

	
1191 1192
#ifdef DOXYGEN
1192 1193
  /// \brief Visitor class for BFS.
1193 1194
  ///
1194 1195
  /// This class defines the interface of the BfsVisit events, and
1195 1196
  /// it could be the base of a real visitor class.
1196 1197
  template <typename _Digraph>
... ...
@@ -1350,33 +1351,33 @@
1350 1351
    //Creates the maps if necessary.
1351 1352
    void create_maps() {
1352 1353
      if(!_reached) {
1353 1354
        local_reached = true;
1354 1355
        _reached = Traits::createReachedMap(*_digraph);
1355 1356
      }
1356 1357
    }
1357 1358

	
1358 1359
  protected:
1359 1360

	
1360 1361
    BfsVisit() {}
1361 1362

	
1362 1363
  public:
1363 1364

	
1364 1365
    typedef BfsVisit Create;
1365 1366

	
1366
    /// \name Named template parameters
1367
    /// \name Named Template Parameters
1367 1368

	
1368 1369
    ///@{
1369 1370
    template <class T>
1370 1371
    struct SetReachedMapTraits : public Traits {
1371 1372
      typedef T ReachedMap;
1372 1373
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1373 1374
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1374 1375
        return 0; // ignore warnings
1375 1376
      }
1376 1377
    };
1377 1378
    /// \brief \ref named-templ-param "Named parameter" for setting
1378 1379
    /// ReachedMap type.
1379 1380
    ///
1380 1381
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1381 1382
    template <class T>
1382 1383
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
... ...
@@ -1392,57 +1393,55 @@
1392 1393
    /// Constructor.
1393 1394
    ///
1394 1395
    /// \param digraph The digraph the algorithm runs on.
1395 1396
    /// \param visitor The visitor object of the algorithm.
1396 1397
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1397 1398
      : _digraph(&digraph), _visitor(&visitor),
1398 1399
        _reached(0), local_reached(false) {}
1399 1400

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

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

	
1421 1423
  public:
1422 1424

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

	
1434 1433
    /// @{
1435 1434

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

	
1448 1447
    /// \brief Adds a new source node.
... ...
@@ -1716,37 +1715,38 @@
1716 1715
    ///    }
1717 1716
    ///  }
1718 1717
    ///\endcode
1719 1718
    void run() {
1720 1719
      init();
1721 1720
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1722 1721
        if (!reached(it)) {
1723 1722
          addSource(it);
1724 1723
          start();
1725 1724
        }
1726 1725
      }
1727 1726
    }
1728 1727

	
1729 1728
    ///@}
1730 1729

	
1731 1730
    /// \name Query Functions
1732
    /// The result of the %BFS algorithm can be obtained using these
1731
    /// The results of the BFS algorithm can be obtained using these
1733 1732
    /// functions.\n
1734
    /// Either \ref lemon::BfsVisit::run() "run()" or
1735
    /// \ref lemon::BfsVisit::start() "start()" must be called before
1736
    /// using them.
1733
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734
    /// before using them.
1735

	
1737 1736
    ///@{
1738 1737

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

	
1746 1746
    ///@}
1747 1747

	
1748 1748
  };
1749 1749

	
1750 1750
} //END OF NAMESPACE LEMON
1751 1751

	
1752 1752
#endif
Show white space 32 line context
... ...
@@ -106,65 +106,59 @@
106 106
    static DistMap *createDistMap(const Digraph &g)
107 107
    {
108 108
      return new DistMap(g);
109 109
    }
110 110
  };
111 111

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

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

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

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

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

	
157 151
  private:
158 152

	
159 153
    typedef typename Digraph::Node Node;
160 154
    typedef typename Digraph::NodeIt NodeIt;
161 155
    typedef typename Digraph::Arc Arc;
162 156
    typedef typename Digraph::OutArcIt OutArcIt;
163 157

	
164 158
    //Pointer to the underlying digraph.
165 159
    const Digraph *G;
166 160
    //Pointer to the map of predecessor arcs.
167 161
    PredMap *_pred;
168 162
    //Indicates if _pred is locally allocated (true) or not.
169 163
    bool local_pred;
170 164
    //Pointer to the map of distances.
... ...
@@ -217,89 +211,93 @@
217 211
    ///@{
218 212

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

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

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

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

	
295 293
    struct SetStandardProcessedMapTraits : public Traits {
296 294
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
297 295
      static ProcessedMap *createProcessedMap(const Digraph &g)
298 296
      {
299 297
        return new ProcessedMap(g);
300 298
      }
301 299
    };
302 300
    ///\brief \ref named-templ-param "Named parameter" for setting
303 301
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 302
    ///
305 303
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -325,137 +323,138 @@
325 323
      _reached(NULL), local_reached(false),
326 324
      _processed(NULL), local_processed(false)
327 325
    { }
328 326

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

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

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

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

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

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

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

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

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

	
407 409
  public:
408 410

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

	
419 420
    ///@{
420 421

	
422
    ///\brief Initializes the internal data structures.
423
    ///
421 424
    ///Initializes the internal data structures.
422

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

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

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

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

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

	
509
    ///\brief Returns \c false if there are nodes
510
    ///to be processed.
511
    ///
512
    ///Returns \c false if there are nodes
513
    ///to be processed in the queue (stack).
508
    ///Returns \c false if there are nodes to be processed.
509

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

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

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

	
521 520
    ///Executes the algorithm.
522 521

	
523 522
    ///Executes the algorithm.
524 523
    ///
525 524
    ///This method runs the %DFS algorithm from the root node
526 525
    ///in order to compute the DFS path to each node.
527 526
    ///
528 527
    /// The algorithm computes
529 528
    ///- the %DFS tree,
530 529
    ///- the distance of each node from the root in the %DFS tree.
531 530
    ///
532 531
    ///\pre init() must be called and a root node should be
533 532
    ///added with addSource() before using this function.
534 533
    ///
... ...
@@ -624,139 +623,140 @@
624 623
    ///  d.addSource(s);
625 624
    ///  d.start(t);
626 625
    ///\endcode
627 626
    bool run(Node s,Node t) {
628 627
      init();
629 628
      addSource(s);
630 629
      start(t);
631 630
      return reached(t);
632 631
    }
633 632

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

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

	
663 662
    ///@}
664 663

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

	
671 670
    ///@{
672 671

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
... ...
@@ -876,34 +876,34 @@
876 876

	
877 877
    /// Constructor.
878 878

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

	
886 886
  };
887 887

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

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

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

	
905 905
    typedef typename Digraph::Node Node;
906 906
    typedef typename Digraph::NodeIt NodeIt;
907 907
    typedef typename Digraph::Arc Arc;
908 908
    typedef typename Digraph::OutArcIt OutArcIt;
909 909

	
... ...
@@ -1097,34 +1097,33 @@
1097 1097

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

	
1100 1100
  ///\ingroup search
1101 1101
  ///Function-type interface for DFS algorithm.
1102 1102
  ///
1103 1103
  ///This function also has several \ref named-func-param "named parameters",
1104 1104
  ///they are declared as the members of class \ref DfsWizard.
1105 1105
  ///The following examples show how to use these parameters.
1106 1106
  ///\code
1107 1107
  ///  // Compute the DFS tree
1108 1108
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1109 1109
  ///
1110 1110
  ///  // Compute the DFS path from s to t
1111 1111
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1112 1112
  ///\endcode
1113

	
1114
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1113
  ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1115 1114
  ///to the end of the parameter list.
1116 1115
  ///\sa DfsWizard
1117 1116
  ///\sa Dfs
1118 1117
  template<class GR>
1119 1118
  DfsWizard<DfsWizardBase<GR> >
1120 1119
  dfs(const GR &digraph)
1121 1120
  {
1122 1121
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1123 1122
  }
1124 1123

	
1125 1124
#ifdef DOXYGEN
1126 1125
  /// \brief Visitor class for DFS.
1127 1126
  ///
1128 1127
  /// This class defines the interface of the DfsVisit events, and
1129 1128
  /// it could be the base of a real visitor class.
1130 1129
  template <typename _Digraph>
... ...
@@ -1296,33 +1295,33 @@
1296 1295
    //Creates the maps if necessary.
1297 1296
    void create_maps() {
1298 1297
      if(!_reached) {
1299 1298
        local_reached = true;
1300 1299
        _reached = Traits::createReachedMap(*_digraph);
1301 1300
      }
1302 1301
    }
1303 1302

	
1304 1303
  protected:
1305 1304

	
1306 1305
    DfsVisit() {}
1307 1306

	
1308 1307
  public:
1309 1308

	
1310 1309
    typedef DfsVisit Create;
1311 1310

	
1312
    /// \name Named template parameters
1311
    /// \name Named Template Parameters
1313 1312

	
1314 1313
    ///@{
1315 1314
    template <class T>
1316 1315
    struct SetReachedMapTraits : public Traits {
1317 1316
      typedef T ReachedMap;
1318 1317
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1319 1318
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1320 1319
        return 0; // ignore warnings
1321 1320
      }
1322 1321
    };
1323 1322
    /// \brief \ref named-templ-param "Named parameter" for setting
1324 1323
    /// ReachedMap type.
1325 1324
    ///
1326 1325
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1327 1326
    template <class T>
1328 1327
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
... ...
@@ -1338,81 +1337,79 @@
1338 1337
    /// Constructor.
1339 1338
    ///
1340 1339
    /// \param digraph The digraph the algorithm runs on.
1341 1340
    /// \param visitor The visitor object of the algorithm.
1342 1341
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1343 1342
      : _digraph(&digraph), _visitor(&visitor),
1344 1343
        _reached(0), local_reached(false) {}
1345 1344

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

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

	
1367 1367
  public:
1368 1368

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

	
1380 1378
    /// @{
1381 1379

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

	
1394
    ///Adds a new source node.
1395

	
1392
    /// \brief Adds a new source node.
1393
    ///
1396 1394
    ///Adds a new source node to the set of nodes to be processed.
1397 1395
    ///
1398
    ///\pre The stack must be empty. (Otherwise the algorithm gives
1399
    ///false results.)
1400
    ///
1401
    ///\warning Distances will be wrong (or at least strange) in case of
1402
    ///multiple sources.
1396
    /// \pre The stack must be empty. Otherwise the algorithm gives
1397
    /// wrong results. (One of the outgoing arcs of all the source nodes
1398
    /// except for the last one will not be visited and distances will
1399
    /// also be wrong.)
1403 1400
    void addSource(Node s)
1404 1401
    {
1405 1402
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1406 1403
      if(!(*_reached)[s]) {
1407 1404
          _reached->set(s,true);
1408 1405
          _visitor->start(s);
1409 1406
          _visitor->reach(s);
1410 1407
          Arc e;
1411 1408
          _digraph->firstOut(e, s);
1412 1409
          if (e != INVALID) {
1413 1410
            _stack[++_stack_head] = e;
1414 1411
          } else {
1415 1412
            _visitor->leave(s);
1416 1413
          }
1417 1414
        }
1418 1415
    }
... ...
@@ -1576,63 +1573,64 @@
1576 1573
    ///   d.addSource(s);
1577 1574
    ///   d.start(t);
1578 1575
    ///\endcode
1579 1576
    bool run(Node s,Node t) {
1580 1577
      init();
1581 1578
      addSource(s);
1582 1579
      start(t);
1583 1580
      return reached(t);
1584 1581
    }
1585 1582

	
1586 1583
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1587 1584

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

	
1615 1612
    ///@}
1616 1613

	
1617 1614
    /// \name Query Functions
1618
    /// The result of the %DFS algorithm can be obtained using these
1615
    /// The results of the DFS algorithm can be obtained using these
1619 1616
    /// functions.\n
1620
    /// Either \ref lemon::DfsVisit::run() "run()" or
1621
    /// \ref lemon::DfsVisit::start() "start()" must be called before
1622
    /// using them.
1617
    /// Either \ref run(Node) "run()" or \ref start() should be called
1618
    /// before using them.
1619

	
1623 1620
    ///@{
1624 1621

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

	
1632 1630
    ///@}
1633 1631

	
1634 1632
  };
1635 1633

	
1636 1634
} //END OF NAMESPACE LEMON
1637 1635

	
1638 1636
#endif
Show white space 32 line context
... ...
@@ -166,46 +166,39 @@
166 166

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

	
206 199
    ///The type of the digraph the algorithm runs on.
207 200
    typedef typename TR::Digraph Digraph;
208 201

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

	
229
    ///The traits class.
222
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
230 223
    typedef TR Traits;
231 224

	
232 225
  private:
233 226

	
234 227
    typedef typename Digraph::Node Node;
235 228
    typedef typename Digraph::NodeIt NodeIt;
236 229
    typedef typename Digraph::Arc Arc;
237 230
    typedef typename Digraph::OutArcIt OutArcIt;
238 231

	
239 232
    //Pointer to the underlying digraph.
240 233
    const Digraph *G;
241 234
    //Pointer to the length map.
242 235
    const LengthMap *length;
243 236
    //Pointer to the map of predecessors arcs.
244 237
    PredMap *_pred;
245 238
    //Indicates if _pred is locally allocated (true) or not.
... ...
@@ -295,72 +288,75 @@
295 288
    ///@{
296 289

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

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

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

	
357 353
    struct SetStandardProcessedMapTraits : public Traits {
358 354
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
359 355
      static ProcessedMap *createProcessedMap(const Digraph &g)
360 356
      {
361 357
        return new ProcessedMap(g);
362 358
      }
363 359
    };
364 360
    ///\brief \ref named-templ-param "Named parameter" for setting
365 361
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
366 362
    ///
... ...
@@ -375,61 +371,71 @@
375 371

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

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

	
427 433
    template <class T>
428 434
    struct SetOperationTraitsTraits : public Traits {
429 435
      typedef T OperationTraits;
430 436
    };
431 437

	
432 438
    /// \brief \ref named-templ-param "Named parameter" for setting
433 439
    ///\c OperationTraits type
434 440
    ///
435 441
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -473,129 +479,131 @@
473 479
      if(local_heap) delete _heap;
474 480
    }
475 481

	
476 482
    ///Sets the length map.
477 483

	
478 484
    ///Sets the length map.
479 485
    ///\return <tt> (*this) </tt>
480 486
    Dijkstra &lengthMap(const LengthMap &m)
481 487
    {
482 488
      length = &m;
483 489
      return *this;
484 490
    }
485 491

	
486 492
    ///Sets the map that stores the predecessor arcs.
487 493

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

	
503 510
    ///Sets the map that indicates which nodes are processed.
504 511

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

	
520 528
    ///Sets the map that stores the distances of the nodes.
521 529

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

	
538 547
    ///Sets the heap and the cross reference used by algorithm.
539 548

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

	
560 571
  private:
561 572

	
562 573
    void finalizeNodeData(Node v,Value dst)
563 574
    {
564 575
      _processed->set(v,true);
565 576
      _dist->set(v, dst);
566 577
    }
567 578

	
568 579
  public:
569 580

	
570
    ///\name Execution control
571
    ///The simplest way to execute the algorithm is to use one of the
572
    ///member functions called \ref lemon::Dijkstra::run() "run()".
573
    ///\n
574
    ///If you need more control on the execution, first you must call
575
    ///\ref lemon::Dijkstra::init() "init()", then you can add several
576
    ///source nodes with \ref lemon::Dijkstra::addSource() "addSource()".
577
    ///Finally \ref lemon::Dijkstra::start() "start()" will perform the
578
    ///actual path computation.
581
    ///\name Execution Control
582
    ///The simplest way to execute the %Dijkstra algorithm is to use
583
    ///one of the member functions called \ref run(Node) "run()".\n
584
    ///If you need more control on the execution, first you have to call
585
    ///\ref init(), then you can add several source nodes with
586
    ///\ref addSource(). Finally the actual path computation can be
587
    ///performed with one of the \ref start() functions.
579 588

	
580 589
    ///@{
581 590

	
591
    ///\brief Initializes the internal data structures.
592
    ///
582 593
    ///Initializes the internal data structures.
583

	
584
    ///Initializes the internal data structures.
585
    ///
586 594
    void init()
587 595
    {
588 596
      create_maps();
589 597
      _heap->clear();
590 598
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
591 599
        _pred->set(u,INVALID);
592 600
        _processed->set(u,false);
593 601
        _heap_cross_ref->set(u,Heap::PRE_HEAP);
594 602
      }
595 603
    }
596 604

	
597 605
    ///Adds a new source node.
598 606

	
599 607
    ///Adds a new source node to the priority heap.
600 608
    ///The optional second parameter is the initial distance of the node.
601 609
    ///
... ...
@@ -645,43 +653,42 @@
645 653
        case Heap::POST_HEAP:
646 654
          break;
647 655
        }
648 656
      }
649 657
      return v;
650 658
    }
651 659

	
652 660
    ///The next node to be processed.
653 661

	
654 662
    ///Returns the next node to be processed or \c INVALID if the
655 663
    ///priority heap is empty.
656 664
    Node nextNode() const
657 665
    {
658 666
      return !_heap->empty()?_heap->top():INVALID;
659 667
    }
660 668

	
661
    ///\brief Returns \c false if there are nodes
662
    ///to be processed.
663
    ///
664
    ///Returns \c false if there are nodes
665
    ///to be processed in the priority heap.
669
    ///Returns \c false if there are nodes to be processed.
670

	
671
    ///Returns \c false if there are nodes to be processed
672
    ///in the priority heap.
666 673
    bool emptyQueue() const { return _heap->empty(); }
667 674

	
668
    ///Returns the number of the nodes to be processed in the priority heap
675
    ///Returns the number of the nodes to be processed.
669 676

	
670
    ///Returns the number of the nodes to be processed in the priority heap.
671
    ///
677
    ///Returns the number of the nodes to be processed
678
    ///in the priority heap.
672 679
    int queueSize() const { return _heap->size(); }
673 680

	
674 681
    ///Executes the algorithm.
675 682

	
676 683
    ///Executes the algorithm.
677 684
    ///
678 685
    ///This method runs the %Dijkstra algorithm from the root node(s)
679 686
    ///in order to compute the shortest path to each node.
680 687
    ///
681 688
    ///The algorithm computes
682 689
    ///- the shortest path tree (forest),
683 690
    ///- the distance of each node from the root(s).
684 691
    ///
685 692
    ///\pre init() must be called and at least one root node should be
686 693
    ///added with addSource() before using this function.
687 694
    ///
... ...
@@ -776,132 +783,134 @@
776 783
    ///shortcut of the following code.
777 784
    ///\code
778 785
    ///  d.init();
779 786
    ///  d.addSource(s);
780 787
    ///  d.start(t);
781 788
    ///\endcode
782 789
    bool run(Node s,Node t) {
783 790
      init();
784 791
      addSource(s);
785 792
      start(t);
786 793
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
787 794
    }
788 795

	
789 796
    ///@}
790 797

	
791 798
    ///\name Query Functions
792
    ///The result of the %Dijkstra algorithm can be obtained using these
799
    ///The results of the %Dijkstra algorithm can be obtained using these
793 800
    ///functions.\n
794
    ///Either \ref lemon::Dijkstra::run() "run()" or
795
    ///\ref lemon::Dijkstra::start() "start()" must be called before
796
    ///using them.
801
    ///Either \ref run(Node) "run()" or \ref start() should be called
802
    ///before using them.
797 803

	
798 804
    ///@{
799 805

	
800 806
    ///The shortest path to a node.
801 807

	
802 808
    ///Returns the shortest path to a node.
803 809
    ///
804
    ///\warning \c t should be reachable from the root(s).
810
    ///\warning \c t should be reached from the root(s).
805 811
    ///
806
    ///\pre Either \ref run() or \ref start() must be called before
807
    ///using this function.
812
    ///\pre Either \ref run(Node) "run()" or \ref init()
813
    ///must be called before using this function.
808 814
    Path path(Node t) const { return Path(*G, *_pred, t); }
809 815

	
810 816
    ///The distance of a node from the root(s).
811 817

	
812 818
    ///Returns the distance of a node from the root(s).
813 819
    ///
814
    ///\warning If node \c v is not reachable from the root(s), then
820
    ///\warning If node \c v is not reached from the root(s), then
815 821
    ///the return value of this function is undefined.
816 822
    ///
817
    ///\pre Either \ref run() or \ref start() must be called before
818
    ///using this function.
823
    ///\pre Either \ref run(Node) "run()" or \ref init()
824
    ///must be called before using this function.
819 825
    Value dist(Node v) const { return (*_dist)[v]; }
820 826

	
821 827
    ///Returns the 'previous arc' of the shortest path tree for a node.
822 828

	
823 829
    ///This function returns the 'previous arc' of the shortest path
824 830
    ///tree for the node \c v, i.e. it returns the last arc of a
825
    ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
826
    ///is not reachable from the root(s) or if \c v is a root.
831
    ///shortest path from a root to \c v. It is \c INVALID if \c v
832
    ///is not reached from the root(s) or if \c v is a root.
827 833
    ///
828 834
    ///The shortest path tree used here is equal to the shortest path
829 835
    ///tree used in \ref predNode().
830 836
    ///
831
    ///\pre Either \ref run() or \ref start() must be called before
832
    ///using this function.
837
    ///\pre Either \ref run(Node) "run()" or \ref init()
838
    ///must be called before using this function.
833 839
    Arc predArc(Node v) const { return (*_pred)[v]; }
834 840

	
835 841
    ///Returns the 'previous node' of the shortest path tree for a node.
836 842

	
837 843
    ///This function returns the 'previous node' of the shortest path
838 844
    ///tree for the node \c v, i.e. it returns the last but one node
839
    ///from a shortest path from the root(s) to \c v. It is \c INVALID
840
    ///if \c v is not reachable from the root(s) or if \c v is a root.
845
    ///from a shortest path from a root to \c v. It is \c INVALID
846
    ///if \c v is not reached from the root(s) or if \c v is a root.
841 847
    ///
842 848
    ///The shortest path tree used here is equal to the shortest path
843 849
    ///tree used in \ref predArc().
844 850
    ///
845
    ///\pre Either \ref run() or \ref start() must be called before
846
    ///using this function.
851
    ///\pre Either \ref run(Node) "run()" or \ref init()
852
    ///must be called before using this function.
847 853
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
848 854
                                  G->source((*_pred)[v]); }
849 855

	
850 856
    ///\brief Returns a const reference to the node map that stores the
851 857
    ///distances of the nodes.
852 858
    ///
853 859
    ///Returns a const reference to the node map that stores the distances
854 860
    ///of the nodes calculated by the algorithm.
855 861
    ///
856
    ///\pre Either \ref run() or \ref init()
862
    ///\pre Either \ref run(Node) "run()" or \ref init()
857 863
    ///must be called before using this function.
858 864
    const DistMap &distMap() const { return *_dist;}
859 865

	
860 866
    ///\brief Returns a const reference to the node map that stores the
861 867
    ///predecessor arcs.
862 868
    ///
863 869
    ///Returns a const reference to the node map that stores the predecessor
864 870
    ///arcs, which form the shortest path tree.
865 871
    ///
866
    ///\pre Either \ref run() or \ref init()
872
    ///\pre Either \ref run(Node) "run()" or \ref init()
867 873
    ///must be called before using this function.
868 874
    const PredMap &predMap() const { return *_pred;}
869 875

	
870
    ///Checks if a node is reachable from the root(s).
876
    ///Checks if a node is reached from the root(s).
871 877

	
872
    ///Returns \c true if \c v is reachable from the root(s).
873
    ///\pre Either \ref run() or \ref start()
878
    ///Returns \c true if \c v is reached from the root(s).
879
    ///
880
    ///\pre Either \ref run(Node) "run()" or \ref init()
874 881
    ///must be called before using this function.
875 882
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
876 883
                                        Heap::PRE_HEAP; }
877 884

	
878 885
    ///Checks if a node is processed.
879 886

	
880 887
    ///Returns \c true if \c v is processed, i.e. the shortest
881 888
    ///path to \c v has already found.
882
    ///\pre Either \ref run() or \ref init()
889
    ///
890
    ///\pre Either \ref run(Node) "run()" or \ref init()
883 891
    ///must be called before using this function.
884 892
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
885 893
                                          Heap::POST_HEAP; }
886 894

	
887 895
    ///The current distance of a node from the root(s).
888 896

	
889 897
    ///Returns the current distance of a node from the root(s).
890 898
    ///It may be decreased in the following processes.
891
    ///\pre Either \ref run() or \ref init()
899
    ///
900
    ///\pre Either \ref run(Node) "run()" or \ref init()
892 901
    ///must be called before using this function and
893 902
    ///node \c v must be reached but not necessarily processed.
894 903
    Value currentDist(Node v) const {
895 904
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
896 905
    }
897 906

	
898 907
    ///@}
899 908
  };
900 909

	
901 910

	
902 911
  ///Default traits class of dijkstra() function.
903 912

	
904 913
  ///Default traits class of dijkstra() function.
905 914
  ///\tparam GR The type of the digraph.
906 915
  ///\tparam LM The type of the length map.
907 916
  template<class GR, class LM>
... ...
@@ -1058,34 +1067,34 @@
1058 1067

	
1059 1068
    /// This constructor requires two parameters,
1060 1069
    /// others are initiated to \c 0.
1061 1070
    /// \param g The digraph the algorithm runs on.
1062 1071
    /// \param l The length map.
1063 1072
    DijkstraWizardBase(const GR &g,const LM &l) :
1064 1073
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1065 1074
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1066 1075
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1067 1076

	
1068 1077
  };
1069 1078

	
1070 1079
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1071 1080

	
1072 1081
  /// This auxiliary class is created to implement the
1073 1082
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1074
  /// It does not have own \ref run() method, it uses the functions
1075
  /// and features of the plain \ref Dijkstra.
1083
  /// It does not have own \ref run(Node) "run()" method, it uses the
1084
  /// functions and features of the plain \ref Dijkstra.
1076 1085
  ///
1077 1086
  /// This class should only be used through the \ref dijkstra() function,
1078 1087
  /// which makes it easier to use the algorithm.
1079 1088
  template<class TR>
1080 1089
  class DijkstraWizard : public TR
1081 1090
  {
1082 1091
    typedef TR Base;
1083 1092

	
1084 1093
    ///The type of the digraph the algorithm runs on.
1085 1094
    typedef typename TR::Digraph Digraph;
1086 1095

	
1087 1096
    typedef typename Digraph::Node Node;
1088 1097
    typedef typename Digraph::NodeIt NodeIt;
1089 1098
    typedef typename Digraph::Arc Arc;
1090 1099
    typedef typename Digraph::OutArcIt OutArcIt;
1091 1100

	
... ...
@@ -1254,30 +1263,30 @@
1254 1263

	
1255 1264
  ///Function-type interface for Dijkstra algorithm.
1256 1265

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

	
1281 1290
} //END OF NAMESPACE LEMON
1282 1291

	
1283 1292
#endif
0 comments (0 inline)