# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1228069071 -3600
# Node ID b4c9a696fc33132a3f28e3a5909e77e442288d2e
# Parent 0c5dd7ceda033c6e2292d1c220c15b38291476fd
Doc improvements for Bfs, Dfs, Dijkstra
- More precise references to overloaded member functions.
- Hide the doc of the traits class parameters.
- Better doc for named groups.
- More precise doc for the case of multiple sources in Dfs.
diff --git a/lemon/bfs.h b/lemon/bfs.h
|
a
|
b
|
|
| 51 | 51 | typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
| 52 | 52 | ///Instantiates a PredMap. |
| 53 | 53 | |
| 54 | | ///This function instantiates a PredMap. |
| | 54 | ///This function instantiates a PredMap. |
| 55 | 55 | ///\param g is the digraph, to which we would like to define the |
| 56 | 56 | ///PredMap. |
| 57 | 57 | static PredMap *createPredMap(const Digraph &g) |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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> |
| … |
… |
|
| 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: |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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(); |
| … |
… |
|
| 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. |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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. |
| … |
… |
|
| 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 |
| … |
… |
|
| 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> |
| … |
… |
|
| 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) { |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
diff --git a/lemon/dfs.h b/lemon/dfs.h
|
a
|
b
|
|
| 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> |
| … |
… |
|
| 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: |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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; |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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 | { |
| … |
… |
|
| 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(); |
| … |
… |
|
| 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."); |
| … |
… |
|
| 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. |
| … |
… |
|
| 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 |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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 | |
| … |
… |
|
| 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. |
| … |
… |
|
| 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 |
| … |
… |
|
| 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> |
| … |
… |
|
| 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) { |
| … |
… |
|
| 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 | |
| … |
… |
|
| 1391 | 1389 | } |
| 1392 | 1390 | } |
| 1393 | 1391 | |
| 1394 | | ///Adds a new source node. |
| 1395 | | |
| 1396 | | ///Adds a new source node to the set of nodes to be processed. |
| | 1392 | /// \brief Adds a new source node. |
| 1397 | 1393 | /// |
| 1398 | | ///\pre The stack must be empty. (Otherwise the algorithm gives |
| 1399 | | ///false results.) |
| | 1394 | /// Adds a new source node to the set of nodes to be processed. |
| 1400 | 1395 | /// |
| 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."); |
| … |
… |
|
| 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 |
| … |
… |
|
| 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 | |
diff --git a/lemon/dijkstra.h b/lemon/dijkstra.h
|
a
|
b
|
|
| 202 | 202 | ///it can be used easier. |
| 203 | 203 | /// |
| 204 | 204 | ///\tparam GR The type of the digraph the algorithm runs on. |
| 205 | | ///The default value is \ref ListDigraph. |
| 206 | | ///The value of GR is not used directly by \ref Dijkstra, it is only |
| 207 | | ///passed to \ref DijkstraDefaultTraits. |
| 208 | | ///\tparam LM A readable arc map that determines the lengths of the |
| 209 | | ///arcs. It is read once for each arc, so the map may involve in |
| | 205 | ///The default type is \ref ListDigraph. |
| | 206 | ///\tparam LM A \ref concepts::ReadMap "readable" arc map that specifies |
| | 207 | ///the lengths of the arcs. |
| | 208 | ///It is read once for each arc, so the map may involve in |
| 210 | 209 | ///relatively time consuming process to compute the arc lengths if |
| 211 | 210 | ///it is necessary. The default map type is \ref |
| 212 | | ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>". |
| 213 | | ///The value of LM is not used directly by \ref Dijkstra, it is only |
| 214 | | ///passed to \ref DijkstraDefaultTraits. |
| 215 | | ///\tparam TR Traits class to set various data types used by the algorithm. |
| 216 | | ///The default traits class is \ref DijkstraDefaultTraits |
| 217 | | ///"DijkstraDefaultTraits<GR,LM>". See \ref DijkstraDefaultTraits |
| 218 | | ///for the documentation of a Dijkstra traits class. |
| | 211 | ///concepts::Digraph::ArcMap "GR::ArcMap<int>". |
| 219 | 212 | #ifdef DOXYGEN |
| 220 | 213 | template <typename GR, typename LM, typename TR> |
| 221 | 214 | #else |
| … |
… |
|
| 249 | 242 | ///The operation traits class. |
| 250 | 243 | typedef typename TR::OperationTraits OperationTraits; |
| 251 | 244 | |
| 252 | | ///The traits class. |
| | 245 | ///The \ref DijkstraDefaultTraits "traits class" of the algorithm. |
| 253 | 246 | typedef TR Traits; |
| 254 | 247 | |
| 255 | 248 | private: |
| … |
… |
|
| 331 | 324 | /// |
| 332 | 325 | ///\ref named-templ-param "Named parameter" for setting |
| 333 | 326 | ///PredMap type. |
| | 327 | ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
| 334 | 328 | template <class T> |
| 335 | 329 | struct SetPredMap |
| 336 | 330 | : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > { |
| … |
… |
|
| 351 | 345 | /// |
| 352 | 346 | ///\ref named-templ-param "Named parameter" for setting |
| 353 | 347 | ///DistMap type. |
| | 348 | ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
| 354 | 349 | template <class T> |
| 355 | 350 | struct SetDistMap |
| 356 | 351 | : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > { |
| … |
… |
|
| 371 | 366 | /// |
| 372 | 367 | ///\ref named-templ-param "Named parameter" for setting |
| 373 | 368 | ///ProcessedMap type. |
| | 369 | ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
| 374 | 370 | template <class T> |
| 375 | 371 | struct SetProcessedMap |
| 376 | 372 | : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > { |
| … |
… |
|
| 411 | 407 | } |
| 412 | 408 | }; |
| 413 | 409 | ///\brief \ref named-templ-param "Named parameter" for setting |
| 414 | | ///heap and cross reference type |
| | 410 | ///heap and cross reference types |
| 415 | 411 | /// |
| 416 | 412 | ///\ref named-templ-param "Named parameter" for setting heap and cross |
| 417 | | ///reference type. |
| | 413 | ///reference types. If this named parameter is used, then external |
| | 414 | ///heap and cross reference objects must be passed to the algorithm |
| | 415 | ///using the \ref heap() function before calling \ref run(Node) "run()" |
| | 416 | ///or \ref init(). |
| | 417 | ///\sa SetStandardHeap |
| 418 | 418 | template <class H, class CR = typename Digraph::template NodeMap<int> > |
| 419 | 419 | struct SetHeap |
| 420 | 420 | : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > { |
| … |
… |
|
| 434 | 434 | } |
| 435 | 435 | }; |
| 436 | 436 | ///\brief \ref named-templ-param "Named parameter" for setting |
| 437 | | ///heap and cross reference type with automatic allocation |
| | 437 | ///heap and cross reference types with automatic allocation |
| 438 | 438 | /// |
| 439 | 439 | ///\ref named-templ-param "Named parameter" for setting heap and cross |
| 440 | | ///reference type. It can allocate the heap and the cross reference |
| 441 | | ///object if the cross reference's constructor waits for the digraph as |
| 442 | | ///parameter and the heap's constructor waits for the cross reference. |
| | 440 | ///reference types with automatic allocation. |
| | 441 | ///They should have standard constructor interfaces to be able to |
| | 442 | ///automatically created by the algorithm (i.e. the digraph should be |
| | 443 | ///passed to the constructor of the cross reference and the cross |
| | 444 | ///reference should be passed to the constructor of the heap). |
| | 445 | ///However external heap and cross reference objects could also be |
| | 446 | ///passed to the algorithm using the \ref heap() function before |
| | 447 | ///calling \ref run(Node) "run()" or \ref init(). |
| | 448 | ///\sa SetHeap |
| 443 | 449 | template <class H, class CR = typename Digraph::template NodeMap<int> > |
| 444 | 450 | struct SetStandardHeap |
| 445 | 451 | : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > { |
| … |
… |
|
| 509 | 515 | ///Sets the map that stores the predecessor arcs. |
| 510 | 516 | |
| 511 | 517 | ///Sets the map that stores the predecessor arcs. |
| 512 | | ///If you don't use this function before calling \ref run(), |
| 513 | | ///it will allocate one. The destructor deallocates this |
| 514 | | ///automatically allocated map, of course. |
| | 518 | ///If you don't use this function before calling \ref run(Node) "run()" |
| | 519 | ///or \ref init(), an instance will be allocated automatically. |
| | 520 | ///The destructor deallocates this automatically allocated map, |
| | 521 | ///of course. |
| 515 | 522 | ///\return <tt> (*this) </tt> |
| 516 | 523 | Dijkstra &predMap(PredMap &m) |
| 517 | 524 | { |
| … |
… |
|
| 526 | 533 | ///Sets the map that indicates which nodes are processed. |
| 527 | 534 | |
| 528 | 535 | ///Sets the map that indicates which nodes are processed. |
| 529 | | ///If you don't use this function before calling \ref run(), |
| 530 | | ///it will allocate one. The destructor deallocates this |
| 531 | | ///automatically allocated map, of course. |
| | 536 | ///If you don't use this function before calling \ref run(Node) "run()" |
| | 537 | ///or \ref init(), an instance will be allocated automatically. |
| | 538 | ///The destructor deallocates this automatically allocated map, |
| | 539 | ///of course. |
| 532 | 540 | ///\return <tt> (*this) </tt> |
| 533 | 541 | Dijkstra &processedMap(ProcessedMap &m) |
| 534 | 542 | { |
| … |
… |
|
| 544 | 552 | |
| 545 | 553 | ///Sets the map that stores the distances of the nodes calculated by the |
| 546 | 554 | ///algorithm. |
| 547 | | ///If you don't use this function before calling \ref run(), |
| 548 | | ///it will allocate one. The destructor deallocates this |
| 549 | | ///automatically allocated map, of course. |
| | 555 | ///If you don't use this function before calling \ref run(Node) "run()" |
| | 556 | ///or \ref init(), an instance will be allocated automatically. |
| | 557 | ///The destructor deallocates this automatically allocated map, |
| | 558 | ///of course. |
| 550 | 559 | ///\return <tt> (*this) </tt> |
| 551 | 560 | Dijkstra &distMap(DistMap &m) |
| 552 | 561 | { |
| … |
… |
|
| 561 | 570 | ///Sets the heap and the cross reference used by algorithm. |
| 562 | 571 | |
| 563 | 572 | ///Sets the heap and the cross reference used by algorithm. |
| 564 | | ///If you don't use this function before calling \ref run(), |
| 565 | | ///it will allocate one. The destructor deallocates this |
| 566 | | ///automatically allocated heap and cross reference, of course. |
| | 573 | ///If you don't use this function before calling \ref run(Node) "run()" |
| | 574 | ///or \ref init(), heap and cross reference instances will be |
| | 575 | ///allocated automatically. |
| | 576 | ///The destructor deallocates these automatically allocated objects, |
| | 577 | ///of course. |
| 567 | 578 | ///\return <tt> (*this) </tt> |
| 568 | 579 | Dijkstra &heap(Heap& hp, HeapCrossRef &cr) |
| 569 | 580 | { |
| … |
… |
|
| 590 | 601 | |
| 591 | 602 | public: |
| 592 | 603 | |
| 593 | | ///\name Execution control |
| 594 | | ///The simplest way to execute the algorithm is to use one of the |
| 595 | | ///member functions called \ref lemon::Dijkstra::run() "run()". |
| 596 | | ///\n |
| 597 | | ///If you need more control on the execution, first you must call |
| 598 | | ///\ref lemon::Dijkstra::init() "init()", then you can add several |
| 599 | | ///source nodes with \ref lemon::Dijkstra::addSource() "addSource()". |
| 600 | | ///Finally \ref lemon::Dijkstra::start() "start()" will perform the |
| 601 | | ///actual path computation. |
| | 604 | ///\name Execution Control |
| | 605 | ///The simplest way to execute the %Dijkstra algorithm is to use |
| | 606 | ///one of the member functions called \ref run(Node) "run()".\n |
| | 607 | ///If you need more control on the execution, first you have to call |
| | 608 | ///\ref init(), then you can add several source nodes with |
| | 609 | ///\ref addSource(). Finally the actual path computation can be |
| | 610 | ///performed with one of the \ref start() functions. |
| 602 | 611 | |
| 603 | 612 | ///@{ |
| 604 | 613 | |
| | 614 | ///\brief Initializes the internal data structures. |
| | 615 | /// |
| 605 | 616 | ///Initializes the internal data structures. |
| 606 | | |
| 607 | | ///Initializes the internal data structures. |
| 608 | | /// |
| 609 | 617 | void init() |
| 610 | 618 | { |
| 611 | 619 | create_maps(); |
| … |
… |
|
| 681 | 689 | return !_heap->empty()?_heap->top():INVALID; |
| 682 | 690 | } |
| 683 | 691 | |
| 684 | | ///\brief Returns \c false if there are nodes |
| 685 | | ///to be processed. |
| 686 | | /// |
| 687 | | ///Returns \c false if there are nodes |
| 688 | | ///to be processed in the priority heap. |
| | 692 | ///Returns \c false if there are nodes to be processed. |
| | 693 | |
| | 694 | ///Returns \c false if there are nodes to be processed |
| | 695 | ///in the priority heap. |
| 689 | 696 | bool emptyQueue() const { return _heap->empty(); } |
| 690 | 697 | |
| 691 | | ///Returns the number of the nodes to be processed in the priority heap |
| | 698 | ///Returns the number of the nodes to be processed. |
| 692 | 699 | |
| 693 | | ///Returns the number of the nodes to be processed in the priority heap. |
| 694 | | /// |
| | 700 | ///Returns the number of the nodes to be processed |
| | 701 | ///in the priority heap. |
| 695 | 702 | int queueSize() const { return _heap->size(); } |
| 696 | 703 | |
| 697 | 704 | ///Executes the algorithm. |
| … |
… |
|
| 812 | 819 | ///@} |
| 813 | 820 | |
| 814 | 821 | ///\name Query Functions |
| 815 | | ///The result of the %Dijkstra algorithm can be obtained using these |
| | 822 | ///The results of the %Dijkstra algorithm can be obtained using these |
| 816 | 823 | ///functions.\n |
| 817 | | ///Either \ref lemon::Dijkstra::run() "run()" or |
| 818 | | ///\ref lemon::Dijkstra::start() "start()" must be called before |
| 819 | | ///using them. |
| | 824 | ///Either \ref run(Node) "run()" or \ref start() should be called |
| | 825 | ///before using them. |
| 820 | 826 | |
| 821 | 827 | ///@{ |
| 822 | 828 | |
| … |
… |
|
| 824 | 830 | |
| 825 | 831 | ///Returns the shortest path to a node. |
| 826 | 832 | /// |
| 827 | | ///\warning \c t should be reachable from the root(s). |
| | 833 | ///\warning \c t should be reached from the root(s). |
| 828 | 834 | /// |
| 829 | | ///\pre Either \ref run() or \ref start() must be called before |
| 830 | | ///using this function. |
| | 835 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| | 836 | ///must be called before using this function. |
| 831 | 837 | Path path(Node t) const { return Path(*G, *_pred, t); } |
| 832 | 838 | |
| 833 | 839 | ///The distance of a node from the root(s). |
| 834 | 840 | |
| 835 | 841 | ///Returns the distance of a node from the root(s). |
| 836 | 842 | /// |
| 837 | | ///\warning If node \c v is not reachable from the root(s), then |
| | 843 | ///\warning If node \c v is not reached from the root(s), then |
| 838 | 844 | ///the return value of this function is undefined. |
| 839 | 845 | /// |
| 840 | | ///\pre Either \ref run() or \ref start() must be called before |
| 841 | | ///using this function. |
| | 846 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| | 847 | ///must be called before using this function. |
| 842 | 848 | Value dist(Node v) const { return (*_dist)[v]; } |
| 843 | 849 | |
| 844 | 850 | ///Returns the 'previous arc' of the shortest path tree for a node. |
| 845 | 851 | |
| 846 | 852 | ///This function returns the 'previous arc' of the shortest path |
| 847 | 853 | ///tree for the node \c v, i.e. it returns the last arc of a |
| 848 | | ///shortest path from the root(s) to \c v. It is \c INVALID if \c v |
| 849 | | ///is not reachable from the root(s) or if \c v is a root. |
| | 854 | ///shortest path from a root to \c v. It is \c INVALID if \c v |
| | 855 | ///is not reached from the root(s) or if \c v is a root. |
| 850 | 856 | /// |
| 851 | 857 | ///The shortest path tree used here is equal to the shortest path |
| 852 | 858 | ///tree used in \ref predNode(). |
| 853 | 859 | /// |
| 854 | | ///\pre Either \ref run() or \ref start() must be called before |
| 855 | | ///using this function. |
| | 860 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| | 861 | ///must be called before using this function. |
| 856 | 862 | Arc predArc(Node v) const { return (*_pred)[v]; } |
| 857 | 863 | |
| 858 | 864 | ///Returns the 'previous node' of the shortest path tree for a node. |
| 859 | 865 | |
| 860 | 866 | ///This function returns the 'previous node' of the shortest path |
| 861 | 867 | ///tree for the node \c v, i.e. it returns the last but one node |
| 862 | | ///from a shortest path from the root(s) to \c v. It is \c INVALID |
| 863 | | ///if \c v is not reachable from the root(s) or if \c v is a root. |
| | 868 | ///from a shortest path from a root to \c v. It is \c INVALID |
| | 869 | ///if \c v is not reached from the root(s) or if \c v is a root. |
| 864 | 870 | /// |
| 865 | 871 | ///The shortest path tree used here is equal to the shortest path |
| 866 | 872 | ///tree used in \ref predArc(). |
| 867 | 873 | /// |
| 868 | | ///\pre Either \ref run() or \ref start() must be called before |
| 869 | | ///using this function. |
| | 874 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| | 875 | ///must be called before using this function. |
| 870 | 876 | Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID: |
| 871 | 877 | G->source((*_pred)[v]); } |
| 872 | 878 | |
| … |
… |
|
| 876 | 882 | ///Returns a const reference to the node map that stores the distances |
| 877 | 883 | ///of the nodes calculated by the algorithm. |
| 878 | 884 | /// |
| 879 | | ///\pre Either \ref run() or \ref init() |
| | 885 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| 880 | 886 | ///must be called before using this function. |
| 881 | 887 | const DistMap &distMap() const { return *_dist;} |
| 882 | 888 | |
| … |
… |
|
| 886 | 892 | ///Returns a const reference to the node map that stores the predecessor |
| 887 | 893 | ///arcs, which form the shortest path tree. |
| 888 | 894 | /// |
| 889 | | ///\pre Either \ref run() or \ref init() |
| | 895 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| 890 | 896 | ///must be called before using this function. |
| 891 | 897 | const PredMap &predMap() const { return *_pred;} |
| 892 | 898 | |
| 893 | | ///Checks if a node is reachable from the root(s). |
| | 899 | ///Checks if a node is reached from the root(s). |
| 894 | 900 | |
| 895 | | ///Returns \c true if \c v is reachable from the root(s). |
| 896 | | ///\pre Either \ref run() or \ref start() |
| | 901 | ///Returns \c true if \c v is reached from the root(s). |
| | 902 | /// |
| | 903 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| 897 | 904 | ///must be called before using this function. |
| 898 | 905 | bool reached(Node v) const { return (*_heap_cross_ref)[v] != |
| 899 | 906 | Heap::PRE_HEAP; } |
| … |
… |
|
| 902 | 909 | |
| 903 | 910 | ///Returns \c true if \c v is processed, i.e. the shortest |
| 904 | 911 | ///path to \c v has already found. |
| 905 | | ///\pre Either \ref run() or \ref init() |
| | 912 | /// |
| | 913 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| 906 | 914 | ///must be called before using this function. |
| 907 | 915 | bool processed(Node v) const { return (*_heap_cross_ref)[v] == |
| 908 | 916 | Heap::POST_HEAP; } |
| … |
… |
|
| 911 | 919 | |
| 912 | 920 | ///Returns the current distance of a node from the root(s). |
| 913 | 921 | ///It may be decreased in the following processes. |
| 914 | | ///\pre Either \ref run() or \ref init() |
| | 922 | /// |
| | 923 | ///\pre Either \ref run(Node) "run()" or \ref init() |
| 915 | 924 | ///must be called before using this function and |
| 916 | 925 | ///node \c v must be reached but not necessarily processed. |
| 917 | 926 | Value currentDist(Node v) const { |
| … |
… |
|
| 1094 | 1103 | |
| 1095 | 1104 | /// This auxiliary class is created to implement the |
| 1096 | 1105 | /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm. |
| 1097 | | /// It does not have own \ref run() method, it uses the functions |
| 1098 | | /// and features of the plain \ref Dijkstra. |
| | 1106 | /// It does not have own \ref run(Node) "run()" method, it uses the |
| | 1107 | /// functions and features of the plain \ref Dijkstra. |
| 1099 | 1108 | /// |
| 1100 | 1109 | /// This class should only be used through the \ref dijkstra() function, |
| 1101 | 1110 | /// which makes it easier to use the algorithm. |
| … |
… |
|
| 1290 | 1299 | /// // Compute shortest path from s to t |
| 1291 | 1300 | /// bool reached = dijkstra(g,length).path(p).dist(d).run(s,t); |
| 1292 | 1301 | ///\endcode |
| 1293 | | ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()" |
| | 1302 | ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()" |
| 1294 | 1303 | ///to the end of the parameter list. |
| 1295 | 1304 | ///\sa DijkstraWizard |
| 1296 | 1305 | ///\sa Dijkstra |