19 #ifndef LEMON_BFS_H |
19 #ifndef LEMON_BFS_H |
20 #define LEMON_BFS_H |
20 #define LEMON_BFS_H |
21 |
21 |
22 ///\ingroup search |
22 ///\ingroup search |
23 ///\file |
23 ///\file |
24 ///\brief Bfs algorithm. |
24 ///\brief BFS algorithm. |
25 |
25 |
26 #include <lemon/list_graph.h> |
26 #include <lemon/list_graph.h> |
27 #include <lemon/bits/path_dump.h> |
27 #include <lemon/bits/path_dump.h> |
28 #include <lemon/core.h> |
28 #include <lemon/core.h> |
29 #include <lemon/error.h> |
29 #include <lemon/error.h> |
30 #include <lemon/maps.h> |
30 #include <lemon/maps.h> |
31 |
31 |
32 namespace lemon { |
32 namespace lemon { |
33 |
33 |
34 |
|
35 |
|
36 ///Default traits class of Bfs class. |
34 ///Default traits class of Bfs class. |
37 |
35 |
38 ///Default traits class of Bfs class. |
36 ///Default traits class of Bfs class. |
39 ///\tparam GR Digraph type. |
37 ///\tparam GR Digraph type. |
40 template<class GR> |
38 template<class GR> |
41 struct BfsDefaultTraits |
39 struct BfsDefaultTraits |
42 { |
40 { |
43 ///The digraph type the algorithm runs on. |
41 ///The type of the digraph the algorithm runs on. |
44 typedef GR Digraph; |
42 typedef GR Digraph; |
45 ///\brief The type of the map that stores the last |
43 |
|
44 ///\brief The type of the map that stores the predecessor |
46 ///arcs of the shortest paths. |
45 ///arcs of the shortest paths. |
47 /// |
46 /// |
48 ///The type of the map that stores the last |
47 ///The type of the map that stores the predecessor |
49 ///arcs of the shortest paths. |
48 ///arcs of the shortest paths. |
50 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
49 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
51 /// |
50 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
52 typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap; |
51 ///Instantiates a \ref PredMap. |
53 ///Instantiates a PredMap. |
|
54 |
52 |
55 ///This function instantiates a \ref PredMap. |
53 ///This function instantiates a \ref PredMap. |
56 ///\param G is the digraph, to which we would like to define the PredMap. |
54 ///\param g is the digraph, to which we would like to define the |
|
55 ///\ref PredMap. |
57 ///\todo The digraph alone may be insufficient to initialize |
56 ///\todo The digraph alone may be insufficient to initialize |
58 static PredMap *createPredMap(const GR &G) |
57 static PredMap *createPredMap(const Digraph &g) |
59 { |
58 { |
60 return new PredMap(G); |
59 return new PredMap(g); |
61 } |
60 } |
|
61 |
62 ///The type of the map that indicates which nodes are processed. |
62 ///The type of the map that indicates which nodes are processed. |
63 |
63 |
64 ///The type of the map that indicates which nodes are processed. |
64 ///The type of the map that indicates which nodes are processed. |
65 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
65 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
66 ///\todo named parameter to set this type, function to read and write. |
66 ///By default it is a NullMap. |
67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
68 ///Instantiates a ProcessedMap. |
68 ///Instantiates a \ref ProcessedMap. |
69 |
69 |
70 ///This function instantiates a \ref ProcessedMap. |
70 ///This function instantiates a \ref ProcessedMap. |
71 ///\param g is the digraph, to which |
71 ///\param g is the digraph, to which |
72 ///we would like to define the \ref ProcessedMap |
72 ///we would like to define the \ref ProcessedMap |
73 #ifdef DOXYGEN |
73 #ifdef DOXYGEN |
74 static ProcessedMap *createProcessedMap(const GR &g) |
74 static ProcessedMap *createProcessedMap(const Digraph &g) |
75 #else |
75 #else |
76 static ProcessedMap *createProcessedMap(const GR &) |
76 static ProcessedMap *createProcessedMap(const Digraph &) |
77 #endif |
77 #endif |
78 { |
78 { |
79 return new ProcessedMap(); |
79 return new ProcessedMap(); |
80 } |
80 } |
|
81 |
81 ///The type of the map that indicates which nodes are reached. |
82 ///The type of the map that indicates which nodes are reached. |
82 |
83 |
83 ///The type of the map that indicates which nodes are reached. |
84 ///The type of the map that indicates which nodes are reached. |
|
85 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
|
86 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
|
87 ///Instantiates a \ref ReachedMap. |
|
88 |
|
89 ///This function instantiates a \ref ReachedMap. |
|
90 ///\param g is the digraph, to which |
|
91 ///we would like to define the \ref ReachedMap. |
|
92 static ReachedMap *createReachedMap(const Digraph &g) |
|
93 { |
|
94 return new ReachedMap(g); |
|
95 } |
|
96 |
|
97 ///The type of the map that stores the distances of the nodes. |
|
98 |
|
99 ///The type of the map that stores the distances of the nodes. |
84 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
100 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
85 ///\todo named parameter to set this type, function to read and write. |
|
86 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
|
87 ///Instantiates a ReachedMap. |
|
88 |
|
89 ///This function instantiates a \ref ReachedMap. |
|
90 ///\param G is the digraph, to which |
|
91 ///we would like to define the \ref ReachedMap. |
|
92 static ReachedMap *createReachedMap(const GR &G) |
|
93 { |
|
94 return new ReachedMap(G); |
|
95 } |
|
96 ///The type of the map that stores the dists of the nodes. |
|
97 |
|
98 ///The type of the map that stores the dists of the nodes. |
|
99 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
|
100 /// |
|
101 typedef typename Digraph::template NodeMap<int> DistMap; |
101 typedef typename Digraph::template NodeMap<int> DistMap; |
102 ///Instantiates a DistMap. |
102 ///Instantiates a \ref DistMap. |
103 |
103 |
104 ///This function instantiates a \ref DistMap. |
104 ///This function instantiates a \ref DistMap. |
105 ///\param G is the digraph, to which we would like to define |
105 ///\param g is the digraph, to which we would like to define the |
106 ///the \ref DistMap |
106 ///\ref DistMap. |
107 static DistMap *createDistMap(const GR &G) |
107 static DistMap *createDistMap(const Digraph &g) |
108 { |
108 { |
109 return new DistMap(G); |
109 return new DistMap(g); |
110 } |
110 } |
111 }; |
111 }; |
112 |
112 |
113 ///%BFS algorithm class. |
113 ///%BFS algorithm class. |
114 |
114 |
115 ///\ingroup search |
115 ///\ingroup search |
116 ///This class provides an efficient implementation of the %BFS algorithm. |
116 ///This class provides an efficient implementation of the %BFS algorithm. |
117 /// |
117 /// |
118 ///\tparam GR The digraph type the algorithm runs on. The default value is |
118 ///There is also a \ref bfs() "function type interface" for the BFS |
119 ///\ref ListDigraph. The value of GR is not used directly by Bfs, it |
119 ///algorithm, which is convenient in the simplier cases and it can be |
120 ///is only passed to \ref BfsDefaultTraits. |
120 ///used easier. |
|
121 /// |
|
122 ///\tparam GR The type of the digraph the algorithm runs on. |
|
123 ///The default value is \ref ListDigraph. The value of GR is not used |
|
124 ///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits. |
121 ///\tparam TR Traits class to set various data types used by the algorithm. |
125 ///\tparam TR Traits class to set various data types used by the algorithm. |
122 ///The default traits class is |
126 ///The default traits class is |
123 ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>". |
127 ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>". |
124 ///See \ref BfsDefaultTraits for the documentation of |
128 ///See \ref BfsDefaultTraits for the documentation of |
125 ///a Bfs traits class. |
129 ///a Bfs traits class. |
126 |
|
127 #ifdef DOXYGEN |
130 #ifdef DOXYGEN |
128 template <typename GR, |
131 template <typename GR, |
129 typename TR> |
132 typename TR> |
130 #else |
133 #else |
131 template <typename GR=ListDigraph, |
134 template <typename GR=ListDigraph, |
132 typename TR=BfsDefaultTraits<GR> > |
135 typename TR=BfsDefaultTraits<GR> > |
133 #endif |
136 #endif |
134 class Bfs { |
137 class Bfs { |
135 public: |
138 public: |
136 /** |
139 ///\ref Exception for uninitialized parameters. |
137 * \brief \ref Exception for uninitialized parameters. |
140 |
138 * |
141 ///This error represents problems in the initialization of the |
139 * This error represents problems in the initialization |
142 ///parameters of the algorithm. |
140 * of the parameters of the algorithms. |
|
141 */ |
|
142 class UninitializedParameter : public lemon::UninitializedParameter { |
143 class UninitializedParameter : public lemon::UninitializedParameter { |
143 public: |
144 public: |
144 virtual const char* what() const throw() { |
145 virtual const char* what() const throw() { |
145 return "lemon::Bfs::UninitializedParameter"; |
146 return "lemon::Bfs::UninitializedParameter"; |
146 } |
147 } |
147 }; |
148 }; |
148 |
149 |
|
150 ///The type of the digraph the algorithm runs on. |
|
151 typedef typename TR::Digraph Digraph; |
|
152 |
|
153 ///\brief The type of the map that stores the predecessor arcs of the |
|
154 ///shortest paths. |
|
155 typedef typename TR::PredMap PredMap; |
|
156 ///The type of the map that stores the distances of the nodes. |
|
157 typedef typename TR::DistMap DistMap; |
|
158 ///The type of the map that indicates which nodes are reached. |
|
159 typedef typename TR::ReachedMap ReachedMap; |
|
160 ///The type of the map that indicates which nodes are processed. |
|
161 typedef typename TR::ProcessedMap ProcessedMap; |
|
162 ///The type of the paths. |
|
163 typedef PredMapPath<Digraph, PredMap> Path; |
|
164 |
|
165 ///The traits class. |
149 typedef TR Traits; |
166 typedef TR Traits; |
150 ///The type of the underlying digraph. |
167 |
151 typedef typename TR::Digraph Digraph; |
|
152 |
|
153 ///\brief The type of the map that stores the last |
|
154 ///arcs of the shortest paths. |
|
155 typedef typename TR::PredMap PredMap; |
|
156 ///The type of the map indicating which nodes are reached. |
|
157 typedef typename TR::ReachedMap ReachedMap; |
|
158 ///The type of the map indicating which nodes are processed. |
|
159 typedef typename TR::ProcessedMap ProcessedMap; |
|
160 ///The type of the map that stores the dists of the nodes. |
|
161 typedef typename TR::DistMap DistMap; |
|
162 private: |
168 private: |
163 |
169 |
164 typedef typename Digraph::Node Node; |
170 typedef typename Digraph::Node Node; |
165 typedef typename Digraph::NodeIt NodeIt; |
171 typedef typename Digraph::NodeIt NodeIt; |
166 typedef typename Digraph::Arc Arc; |
172 typedef typename Digraph::Arc Arc; |
167 typedef typename Digraph::OutArcIt OutArcIt; |
173 typedef typename Digraph::OutArcIt OutArcIt; |
168 |
174 |
169 /// Pointer to the underlying digraph. |
175 //Pointer to the underlying digraph. |
170 const Digraph *G; |
176 const Digraph *G; |
171 ///Pointer to the map of predecessors arcs. |
177 //Pointer to the map of predecessor arcs. |
172 PredMap *_pred; |
178 PredMap *_pred; |
173 ///Indicates if \ref _pred is locally allocated (\c true) or not. |
179 //Indicates if _pred is locally allocated (true) or not. |
174 bool local_pred; |
180 bool local_pred; |
175 ///Pointer to the map of distances. |
181 //Pointer to the map of distances. |
176 DistMap *_dist; |
182 DistMap *_dist; |
177 ///Indicates if \ref _dist is locally allocated (\c true) or not. |
183 //Indicates if _dist is locally allocated (true) or not. |
178 bool local_dist; |
184 bool local_dist; |
179 ///Pointer to the map of reached status of the nodes. |
185 //Pointer to the map of reached status of the nodes. |
180 ReachedMap *_reached; |
186 ReachedMap *_reached; |
181 ///Indicates if \ref _reached is locally allocated (\c true) or not. |
187 //Indicates if _reached is locally allocated (true) or not. |
182 bool local_reached; |
188 bool local_reached; |
183 ///Pointer to the map of processed status of the nodes. |
189 //Pointer to the map of processed status of the nodes. |
184 ProcessedMap *_processed; |
190 ProcessedMap *_processed; |
185 ///Indicates if \ref _processed is locally allocated (\c true) or not. |
191 //Indicates if _processed is locally allocated (true) or not. |
186 bool local_processed; |
192 bool local_processed; |
187 |
193 |
188 std::vector<typename Digraph::Node> _queue; |
194 std::vector<typename Digraph::Node> _queue; |
189 int _queue_head,_queue_tail,_queue_next_dist; |
195 int _queue_head,_queue_tail,_queue_next_dist; |
190 int _curr_dist; |
196 int _curr_dist; |
191 |
197 |
192 ///Creates the maps if necessary. |
198 ///Creates the maps if necessary. |
193 |
|
194 ///\todo Better memory allocation (instead of new). |
199 ///\todo Better memory allocation (instead of new). |
195 void create_maps() |
200 void create_maps() |
196 { |
201 { |
197 if(!_pred) { |
202 if(!_pred) { |
198 local_pred = true; |
203 local_pred = true; |
543 if (nm[m] && rnode == INVALID) rnode = m; |
554 if (nm[m] && rnode == INVALID) rnode = m; |
544 } |
555 } |
545 return n; |
556 return n; |
546 } |
557 } |
547 |
558 |
548 ///Next node to be processed. |
559 ///The next node to be processed. |
549 |
560 |
550 ///Next node to be processed. |
561 ///Returns the next node to be processed or \c INVALID if the queue |
551 /// |
562 ///is empty. |
552 ///\return The next node to be processed or INVALID if the queue is |
563 Node nextNode() const |
553 /// empty. |
|
554 Node nextNode() |
|
555 { |
564 { |
556 return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID; |
565 return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID; |
557 } |
566 } |
558 |
567 |
559 ///\brief Returns \c false if there are nodes |
568 ///\brief Returns \c false if there are nodes |
560 ///to be processed in the queue |
569 ///to be processed. |
561 /// |
570 /// |
562 ///Returns \c false if there are nodes |
571 ///Returns \c false if there are nodes |
563 ///to be processed in the queue |
572 ///to be processed in the queue. |
564 bool emptyQueue() { return _queue_tail==_queue_head; } |
573 bool emptyQueue() const { return _queue_tail==_queue_head; } |
|
574 |
565 ///Returns the number of the nodes to be processed. |
575 ///Returns the number of the nodes to be processed. |
566 |
576 |
567 ///Returns the number of the nodes to be processed in the queue. |
577 ///Returns the number of the nodes to be processed in the queue. |
568 int queueSize() { return _queue_head-_queue_tail; } |
578 int queueSize() const { return _queue_head-_queue_tail; } |
569 |
579 |
570 ///Executes the algorithm. |
580 ///Executes the algorithm. |
571 |
581 |
572 ///Executes the algorithm. |
582 ///Executes the algorithm. |
573 /// |
583 /// |
574 ///\pre init() must be called and at least one node should be added |
|
575 ///with addSource() before using this function. |
|
576 /// |
|
577 ///This method runs the %BFS algorithm from the root node(s) |
584 ///This method runs the %BFS algorithm from the root node(s) |
578 ///in order to |
585 ///in order to compute the shortest path to each node. |
579 ///compute the |
586 /// |
580 ///shortest path to each node. The algorithm computes |
587 ///The algorithm computes |
581 ///- The shortest path tree. |
588 ///- the shortest path tree (forest), |
582 ///- The distance of each node from the root(s). |
589 ///- the distance of each node from the root(s). |
|
590 /// |
|
591 ///\pre init() must be called and at least one root node should be |
|
592 ///added with addSource() before using this function. |
|
593 /// |
|
594 ///\note <tt>b.start()</tt> is just a shortcut of the following code. |
|
595 ///\code |
|
596 /// while ( !b.emptyQueue() ) { |
|
597 /// b.processNextNode(); |
|
598 /// } |
|
599 ///\endcode |
583 void start() |
600 void start() |
584 { |
601 { |
585 while ( !emptyQueue() ) processNextNode(); |
602 while ( !emptyQueue() ) processNextNode(); |
586 } |
603 } |
587 |
604 |
588 ///Executes the algorithm until \c dest is reached. |
605 ///Executes the algorithm until the given target node is reached. |
589 |
606 |
590 ///Executes the algorithm until \c dest is reached. |
607 ///Executes the algorithm until the given target node is reached. |
591 /// |
|
592 ///\pre init() must be called and at least one node should be added |
|
593 ///with addSource() before using this function. |
|
594 /// |
608 /// |
595 ///This method runs the %BFS algorithm from the root node(s) |
609 ///This method runs the %BFS algorithm from the root node(s) |
596 ///in order to compute the shortest path to \c dest. |
610 ///in order to compute the shortest path to \c dest. |
|
611 /// |
597 ///The algorithm computes |
612 ///The algorithm computes |
598 ///- The shortest path to \c dest. |
613 ///- the shortest path to \c dest, |
599 ///- The distance of \c dest from the root(s). |
614 ///- the distance of \c dest from the root(s). |
|
615 /// |
|
616 ///\pre init() must be called and at least one root node should be |
|
617 ///added with addSource() before using this function. |
|
618 /// |
|
619 ///\note <tt>b.start(t)</tt> is just a shortcut of the following code. |
|
620 ///\code |
|
621 /// bool reach = false; |
|
622 /// while ( !b.emptyQueue() && !reach ) { |
|
623 /// b.processNextNode(t, reach); |
|
624 /// } |
|
625 ///\endcode |
600 void start(Node dest) |
626 void start(Node dest) |
601 { |
627 { |
602 bool reach = false; |
628 bool reach = false; |
603 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); |
629 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); |
604 } |
630 } |
605 |
631 |
606 ///Executes the algorithm until a condition is met. |
632 ///Executes the algorithm until a condition is met. |
607 |
633 |
608 ///Executes the algorithm until a condition is met. |
634 ///Executes the algorithm until a condition is met. |
609 /// |
635 /// |
610 ///\pre init() must be called and at least one node should be added |
636 ///This method runs the %BFS algorithm from the root node(s) in |
611 ///with addSource() before using this function. |
637 ///order to compute the shortest path to a node \c v with |
612 /// |
638 /// <tt>nm[v]</tt> true, if such a node can be found. |
613 ///\param nm must be a bool (or convertible) node map. The |
639 /// |
614 ///algorithm will stop when it reaches a node \c v with |
640 ///\param nm A \c bool (or convertible) node map. The algorithm |
615 /// <tt>nm[v]</tt> true. |
641 ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true. |
616 /// |
642 /// |
617 ///\return The reached node \c v with <tt>nm[v]</tt> true or |
643 ///\return The reached node \c v with <tt>nm[v]</tt> true or |
618 ///\c INVALID if no such node was found. |
644 ///\c INVALID if no such node was found. |
619 template<class NM> |
645 /// |
620 Node start(const NM &nm) |
646 ///\pre init() must be called and at least one root node should be |
|
647 ///added with addSource() before using this function. |
|
648 /// |
|
649 ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code. |
|
650 ///\code |
|
651 /// Node rnode = INVALID; |
|
652 /// while ( !b.emptyQueue() && rnode == INVALID ) { |
|
653 /// b.processNextNode(nm, rnode); |
|
654 /// } |
|
655 /// return rnode; |
|
656 ///\endcode |
|
657 template<class NodeBoolMap> |
|
658 Node start(const NodeBoolMap &nm) |
621 { |
659 { |
622 Node rnode = INVALID; |
660 Node rnode = INVALID; |
623 while ( !emptyQueue() && rnode == INVALID ) { |
661 while ( !emptyQueue() && rnode == INVALID ) { |
624 processNextNode(nm, rnode); |
662 processNextNode(nm, rnode); |
625 } |
663 } |
626 return rnode; |
664 return rnode; |
627 } |
665 } |
628 |
666 |
629 ///Runs %BFS algorithm from node \c s. |
667 ///Runs the algorithm from the given node. |
630 |
668 |
631 ///This method runs the %BFS algorithm from a root node \c s |
669 ///This method runs the %BFS algorithm from node \c s |
632 ///in order to |
670 ///in order to compute the shortest path to each node. |
633 ///compute the |
671 /// |
634 ///shortest path to each node. The algorithm computes |
672 ///The algorithm computes |
635 ///- The shortest path tree. |
673 ///- the shortest path tree, |
636 ///- The distance of each node from the root. |
674 ///- the distance of each node from the root. |
637 /// |
675 /// |
638 ///\note b.run(s) is just a shortcut of the following code. |
676 ///\note <tt>b.run(s)</tt> is just a shortcut of the following code. |
639 ///\code |
677 ///\code |
640 /// b.init(); |
678 /// b.init(); |
641 /// b.addSource(s); |
679 /// b.addSource(s); |
642 /// b.start(); |
680 /// b.start(); |
643 ///\endcode |
681 ///\endcode |
665 addSource(s); |
705 addSource(s); |
666 start(t); |
706 start(t); |
667 return reached(t) ? _curr_dist : 0; |
707 return reached(t) ? _curr_dist : 0; |
668 } |
708 } |
669 |
709 |
|
710 ///Runs the algorithm to visit all nodes in the digraph. |
|
711 |
|
712 ///This method runs the %BFS algorithm in order to |
|
713 ///compute the shortest path to each node. |
|
714 /// |
|
715 ///The algorithm computes |
|
716 ///- the shortest path tree (forest), |
|
717 ///- the distance of each node from the root(s). |
|
718 /// |
|
719 ///\note <tt>b.run(s)</tt> is just a shortcut of the following code. |
|
720 ///\code |
|
721 /// b.init(); |
|
722 /// for (NodeIt n(gr); n != INVALID; ++n) { |
|
723 /// if (!b.reached(n)) { |
|
724 /// b.addSource(n); |
|
725 /// b.start(); |
|
726 /// } |
|
727 /// } |
|
728 ///\endcode |
|
729 void run() { |
|
730 init(); |
|
731 for (NodeIt n(*G); n != INVALID; ++n) { |
|
732 if (!reached(n)) { |
|
733 addSource(n); |
|
734 start(); |
|
735 } |
|
736 } |
|
737 } |
|
738 |
670 ///@} |
739 ///@} |
671 |
740 |
672 ///\name Query Functions |
741 ///\name Query Functions |
673 ///The result of the %BFS algorithm can be obtained using these |
742 ///The result of the %BFS algorithm can be obtained using these |
674 ///functions.\n |
743 ///functions.\n |
675 ///Before the use of these functions, |
744 ///Either \ref lemon::Bfs::run() "run()" or \ref lemon::Bfs::start() |
676 ///either run() or start() must be calleb. |
745 ///"start()" must be called before using them. |
677 |
746 |
678 ///@{ |
747 ///@{ |
679 |
748 |
680 typedef PredMapPath<Digraph, PredMap> Path; |
749 ///The shortest path to a node. |
681 |
750 |
682 ///Gives back the shortest path. |
751 ///Returns the shortest path to a node. |
683 |
752 /// |
684 ///Gives back the shortest path. |
753 ///\warning \c t should be reachable from the root(s). |
685 ///\pre The \c t should be reachable from the source. |
754 /// |
686 Path path(Node t) |
755 ///\pre Either \ref run() or \ref start() must be called before |
687 { |
756 ///using this function. |
688 return Path(*G, *_pred, t); |
757 Path path(Node t) const { return Path(*G, *_pred, t); } |
689 } |
|
690 |
758 |
691 ///The distance of a node from the root(s). |
759 ///The distance of a node from the root(s). |
692 |
760 |
693 ///Returns the distance of a node from the root(s). |
761 ///Returns the distance of a node from the root(s). |
694 ///\pre \ref run() must be called before using this function. |
762 /// |
695 ///\warning If node \c v in unreachable from the root(s) the return value |
763 ///\warning If node \c v is not reachable from the root(s), then |
696 ///of this function is undefined. |
764 ///the return value of this function is undefined. |
|
765 /// |
|
766 ///\pre Either \ref run() or \ref start() must be called before |
|
767 ///using this function. |
697 int dist(Node v) const { return (*_dist)[v]; } |
768 int dist(Node v) const { return (*_dist)[v]; } |
698 |
769 |
699 ///Returns the 'previous arc' of the shortest path tree. |
770 ///Returns the 'previous arc' of the shortest path tree for a node. |
700 |
771 |
701 ///For a node \c v it returns the 'previous arc' |
772 ///This function returns the 'previous arc' of the shortest path |
702 ///of the shortest path tree, |
773 ///tree for the node \c v, i.e. it returns the last arc of a |
703 ///i.e. it returns the last arc of a shortest path from the root(s) to \c |
774 ///shortest path from the root(s) to \c v. It is \c INVALID if \c v |
704 ///v. It is \ref INVALID |
775 ///is not reachable from the root(s) or if \c v is a root. |
705 ///if \c v is unreachable from the root(s) or \c v is a root. The |
776 /// |
706 ///shortest path tree used here is equal to the shortest path tree used in |
777 ///The shortest path tree used here is equal to the shortest path |
707 ///\ref predNode(). |
778 ///tree used in \ref predNode(). |
708 ///\pre Either \ref run() or \ref start() must be called before using |
779 /// |
709 ///this function. |
780 ///\pre Either \ref run() or \ref start() must be called before |
|
781 ///using this function. |
710 Arc predArc(Node v) const { return (*_pred)[v];} |
782 Arc predArc(Node v) const { return (*_pred)[v];} |
711 |
783 |
712 ///Returns the 'previous node' of the shortest path tree. |
784 ///Returns the 'previous node' of the shortest path tree for a node. |
713 |
785 |
714 ///For a node \c v it returns the 'previous node' |
786 ///This function returns the 'previous node' of the shortest path |
715 ///of the shortest path tree, |
787 ///tree for the node \c v, i.e. it returns the last but one node |
716 ///i.e. it returns the last but one node from a shortest path from the |
788 ///from a shortest path from the root(s) to \c v. It is \c INVALID |
717 ///root(a) to \c /v. |
789 ///if \c v is not reachable from the root(s) or if \c v is a root. |
718 ///It is INVALID if \c v is unreachable from the root(s) or |
790 /// |
719 ///if \c v itself a root. |
|
720 ///The shortest path tree used here is equal to the shortest path |
791 ///The shortest path tree used here is equal to the shortest path |
721 ///tree used in \ref predArc(). |
792 ///tree used in \ref predArc(). |
|
793 /// |
722 ///\pre Either \ref run() or \ref start() must be called before |
794 ///\pre Either \ref run() or \ref start() must be called before |
723 ///using this function. |
795 ///using this function. |
724 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID: |
796 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID: |
725 G->source((*_pred)[v]); } |
797 G->source((*_pred)[v]); } |
726 |
798 |
727 ///Returns a reference to the NodeMap of distances. |
799 ///\brief Returns a const reference to the node map that stores the |
728 |
800 /// distances of the nodes. |
729 ///Returns a reference to the NodeMap of distances. |
801 /// |
730 ///\pre Either \ref run() or \ref init() must |
802 ///Returns a const reference to the node map that stores the distances |
731 ///be called before using this function. |
803 ///of the nodes calculated by the algorithm. |
|
804 /// |
|
805 ///\pre Either \ref run() or \ref init() |
|
806 ///must be called before using this function. |
732 const DistMap &distMap() const { return *_dist;} |
807 const DistMap &distMap() const { return *_dist;} |
733 |
808 |
734 ///Returns a reference to the shortest path tree map. |
809 ///\brief Returns a const reference to the node map that stores the |
735 |
810 ///predecessor arcs. |
736 ///Returns a reference to the NodeMap of the arcs of the |
811 /// |
737 ///shortest path tree. |
812 ///Returns a const reference to the node map that stores the predecessor |
|
813 ///arcs, which form the shortest path tree. |
|
814 /// |
738 ///\pre Either \ref run() or \ref init() |
815 ///\pre Either \ref run() or \ref init() |
739 ///must be called before using this function. |
816 ///must be called before using this function. |
740 const PredMap &predMap() const { return *_pred;} |
817 const PredMap &predMap() const { return *_pred;} |
741 |
818 |
742 ///Checks if a node is reachable from the root. |
819 ///Checks if a node is reachable from the root(s). |
743 |
820 |
744 ///Returns \c true if \c v is reachable from the root. |
821 ///Returns \c true if \c v is reachable from the root(s). |
745 ///\warning The source nodes are indicated as unreached. |
|
746 ///\pre Either \ref run() or \ref start() |
822 ///\pre Either \ref run() or \ref start() |
747 ///must be called before using this function. |
823 ///must be called before using this function. |
748 /// |
824 bool reached(Node v) const { return (*_reached)[v]; } |
749 bool reached(Node v) { return (*_reached)[v]; } |
|
750 |
825 |
751 ///@} |
826 ///@} |
752 }; |
827 }; |
753 |
828 |
754 ///Default traits class of Bfs function. |
829 ///Default traits class of bfs() function. |
755 |
830 |
756 ///Default traits class of Bfs function. |
831 ///Default traits class of bfs() function. |
757 ///\tparam GR Digraph type. |
832 ///\tparam GR Digraph type. |
758 template<class GR> |
833 template<class GR> |
759 struct BfsWizardDefaultTraits |
834 struct BfsWizardDefaultTraits |
760 { |
835 { |
761 ///The digraph type the algorithm runs on. |
836 ///The type of the digraph the algorithm runs on. |
762 typedef GR Digraph; |
837 typedef GR Digraph; |
763 ///\brief The type of the map that stores the last |
838 |
|
839 ///\brief The type of the map that stores the predecessor |
764 ///arcs of the shortest paths. |
840 ///arcs of the shortest paths. |
765 /// |
841 /// |
766 ///The type of the map that stores the last |
842 ///The type of the map that stores the predecessor |
767 ///arcs of the shortest paths. |
843 ///arcs of the shortest paths. |
768 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
844 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
769 /// |
845 typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap; |
770 typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap; |
846 ///Instantiates a \ref PredMap. |
771 ///Instantiates a PredMap. |
|
772 |
847 |
773 ///This function instantiates a \ref PredMap. |
848 ///This function instantiates a \ref PredMap. |
774 ///\param g is the digraph, to which we would like to define the PredMap. |
849 ///\param g is the digraph, to which we would like to define the |
|
850 ///\ref PredMap. |
775 ///\todo The digraph alone may be insufficient to initialize |
851 ///\todo The digraph alone may be insufficient to initialize |
776 #ifdef DOXYGEN |
852 #ifdef DOXYGEN |
777 static PredMap *createPredMap(const GR &g) |
853 static PredMap *createPredMap(const Digraph &g) |
778 #else |
854 #else |
779 static PredMap *createPredMap(const GR &) |
855 static PredMap *createPredMap(const Digraph &) |
780 #endif |
856 #endif |
781 { |
857 { |
782 return new PredMap(); |
858 return new PredMap(); |
783 } |
859 } |
784 |
860 |
785 ///The type of the map that indicates which nodes are processed. |
861 ///The type of the map that indicates which nodes are processed. |
786 |
862 |
787 ///The type of the map that indicates which nodes are processed. |
863 ///The type of the map that indicates which nodes are processed. |
788 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
864 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
789 ///\todo named parameter to set this type, function to read and write. |
|
790 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
865 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
791 ///Instantiates a ProcessedMap. |
866 ///Instantiates a \ref ProcessedMap. |
792 |
867 |
793 ///This function instantiates a \ref ProcessedMap. |
868 ///This function instantiates a \ref ProcessedMap. |
794 ///\param g is the digraph, to which |
869 ///\param g is the digraph, to which |
795 ///we would like to define the \ref ProcessedMap |
870 ///we would like to define the \ref ProcessedMap. |
796 #ifdef DOXYGEN |
871 #ifdef DOXYGEN |
797 static ProcessedMap *createProcessedMap(const GR &g) |
872 static ProcessedMap *createProcessedMap(const Digraph &g) |
798 #else |
873 #else |
799 static ProcessedMap *createProcessedMap(const GR &) |
874 static ProcessedMap *createProcessedMap(const Digraph &) |
800 #endif |
875 #endif |
801 { |
876 { |
802 return new ProcessedMap(); |
877 return new ProcessedMap(); |
803 } |
878 } |
|
879 |
804 ///The type of the map that indicates which nodes are reached. |
880 ///The type of the map that indicates which nodes are reached. |
805 |
881 |
806 ///The type of the map that indicates which nodes are reached. |
882 ///The type of the map that indicates which nodes are reached. |
|
883 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
|
884 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
|
885 ///Instantiates a \ref ReachedMap. |
|
886 |
|
887 ///This function instantiates a \ref ReachedMap. |
|
888 ///\param g is the digraph, to which |
|
889 ///we would like to define the \ref ReachedMap. |
|
890 static ReachedMap *createReachedMap(const Digraph &g) |
|
891 { |
|
892 return new ReachedMap(g); |
|
893 } |
|
894 |
|
895 ///The type of the map that stores the distances of the nodes. |
|
896 |
|
897 ///The type of the map that stores the distances of the nodes. |
807 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
898 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
808 ///\todo named parameter to set this type, function to read and write. |
|
809 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
|
810 ///Instantiates a ReachedMap. |
|
811 |
|
812 ///This function instantiates a \ref ReachedMap. |
|
813 ///\param G is the digraph, to which |
|
814 ///we would like to define the \ref ReachedMap. |
|
815 static ReachedMap *createReachedMap(const GR &G) |
|
816 { |
|
817 return new ReachedMap(G); |
|
818 } |
|
819 ///The type of the map that stores the dists of the nodes. |
|
820 |
|
821 ///The type of the map that stores the dists of the nodes. |
|
822 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
|
823 /// |
899 /// |
824 typedef NullMap<typename Digraph::Node,int> DistMap; |
900 typedef NullMap<typename Digraph::Node,int> DistMap; |
825 ///Instantiates a DistMap. |
901 ///Instantiates a \ref DistMap. |
826 |
902 |
827 ///This function instantiates a \ref DistMap. |
903 ///This function instantiates a \ref DistMap. |
828 ///\param g is the digraph, to which we would like to define |
904 ///\param g is the digraph, to which we would like to define |
829 ///the \ref DistMap |
905 ///the \ref DistMap |
830 #ifdef DOXYGEN |
906 #ifdef DOXYGEN |
831 static DistMap *createDistMap(const GR &g) |
907 static DistMap *createDistMap(const Digraph &g) |
832 #else |
908 #else |
833 static DistMap *createDistMap(const GR &) |
909 static DistMap *createDistMap(const Digraph &) |
834 #endif |
910 #endif |
835 { |
911 { |
836 return new DistMap(); |
912 return new DistMap(); |
837 } |
913 } |
838 }; |
914 }; |
839 |
915 |
840 /// Default traits used by \ref BfsWizard |
916 /// Default traits class used by \ref BfsWizard |
841 |
917 |
842 /// To make it easier to use Bfs algorithm |
918 /// To make it easier to use Bfs algorithm |
843 ///we have created a wizard class. |
919 /// we have created a wizard class. |
844 /// This \ref BfsWizard class needs default traits, |
920 /// This \ref BfsWizard class needs default traits, |
845 ///as well as the \ref Bfs class. |
921 /// as well as the \ref Bfs class. |
846 /// The \ref BfsWizardBase is a class to be the default traits of the |
922 /// The \ref BfsWizardBase is a class to be the default traits of the |
847 /// \ref BfsWizard class. |
923 /// \ref BfsWizard class. |
848 template<class GR> |
924 template<class GR> |
849 class BfsWizardBase : public BfsWizardDefaultTraits<GR> |
925 class BfsWizardBase : public BfsWizardDefaultTraits<GR> |
850 { |
926 { |
851 |
927 |
852 typedef BfsWizardDefaultTraits<GR> Base; |
928 typedef BfsWizardDefaultTraits<GR> Base; |
853 protected: |
929 protected: |
854 /// Type of the nodes in the digraph. |
930 //The type of the nodes in the digraph. |
855 typedef typename Base::Digraph::Node Node; |
931 typedef typename Base::Digraph::Node Node; |
856 |
932 |
857 /// Pointer to the underlying digraph. |
933 //Pointer to the digraph the algorithm runs on. |
858 void *_g; |
934 void *_g; |
859 ///Pointer to the map of reached nodes. |
935 //Pointer to the map of reached nodes. |
860 void *_reached; |
936 void *_reached; |
861 ///Pointer to the map of processed nodes. |
937 //Pointer to the map of processed nodes. |
862 void *_processed; |
938 void *_processed; |
863 ///Pointer to the map of predecessors arcs. |
939 //Pointer to the map of predecessors arcs. |
864 void *_pred; |
940 void *_pred; |
865 ///Pointer to the map of distances. |
941 //Pointer to the map of distances. |
866 void *_dist; |
942 void *_dist; |
867 ///Pointer to the source node. |
943 //Pointer to the source node. |
868 Node _source; |
944 Node _source; |
869 |
945 |
870 public: |
946 public: |
871 /// Constructor. |
947 /// Constructor. |
872 |
948 |
873 /// This constructor does not require parameters, therefore it initiates |
949 /// This constructor does not require parameters, therefore it initiates |
874 /// all of the attributes to default values (0, INVALID). |
950 /// all of the attributes to default values (0, INVALID). |
875 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), |
951 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), |
876 _dist(0), _source(INVALID) {} |
952 _dist(0), _source(INVALID) {} |
877 |
953 |
878 /// Constructor. |
954 /// Constructor. |
879 |
955 |
880 /// This constructor requires some parameters, |
956 /// This constructor requires some parameters, |
881 /// listed in the parameters list. |
957 /// listed in the parameters list. |
882 /// Others are initiated to 0. |
958 /// Others are initiated to 0. |
883 /// \param g is the initial value of \ref _g |
959 /// \param g The digraph the algorithm runs on. |
884 /// \param s is the initial value of \ref _source |
960 /// \param s The source node. |
885 BfsWizardBase(const GR &g, Node s=INVALID) : |
961 BfsWizardBase(const GR &g, Node s=INVALID) : |
886 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), |
962 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), |
887 _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {} |
963 _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {} |
888 |
964 |
889 }; |
965 }; |
890 |
966 |
891 /// A class to make the usage of Bfs algorithm easier |
967 /// Auxiliary class for the function type interface of BFS algorithm. |
892 |
968 |
893 /// This class is created to make it easier to use Bfs algorithm. |
969 /// This auxiliary class is created to implement the function type |
894 /// It uses the functions and features of the plain \ref Bfs, |
970 /// interface of \ref Bfs algorithm. It uses the functions and features |
895 /// but it is much simpler to use it. |
971 /// of the plain \ref Bfs, but it is much simpler to use it. |
|
972 /// It should only be used through the \ref bfs() function, which makes |
|
973 /// it easier to use the algorithm. |
896 /// |
974 /// |
897 /// Simplicity means that the way to change the types defined |
975 /// Simplicity means that the way to change the types defined |
898 /// in the traits class is based on functions that returns the new class |
976 /// in the traits class is based on functions that returns the new class |
899 /// and not on templatable built-in classes. |
977 /// and not on templatable built-in classes. |
900 /// When using the plain \ref Bfs |
978 /// When using the plain \ref Bfs |
901 /// the new class with the modified type comes from |
979 /// the new class with the modified type comes from |
902 /// the original class by using the :: |
980 /// the original class by using the :: |
903 /// operator. In the case of \ref BfsWizard only |
981 /// operator. In the case of \ref BfsWizard only |
904 /// a function have to be called and it will |
982 /// a function have to be called, and it will |
905 /// return the needed class. |
983 /// return the needed class. |
906 /// |
984 /// |
907 /// It does not have own \ref run method. When its \ref run method is called |
985 /// It does not have own \ref run() method. When its \ref run() method |
908 /// it initiates a plain \ref Bfs class, and calls the \ref Bfs::run |
986 /// is called, it initiates a plain \ref Bfs object, and calls the |
909 /// method of it. |
987 /// \ref Bfs::run() method of it. |
910 template<class TR> |
988 template<class TR> |
911 class BfsWizard : public TR |
989 class BfsWizard : public TR |
912 { |
990 { |
913 typedef TR Base; |
991 typedef TR Base; |
914 |
992 |
915 ///The type of the underlying digraph. |
993 ///The type of the digraph the algorithm runs on. |
916 typedef typename TR::Digraph Digraph; |
994 typedef typename TR::Digraph Digraph; |
917 //\e |
995 |
918 typedef typename Digraph::Node Node; |
996 typedef typename Digraph::Node Node; |
919 //\e |
|
920 typedef typename Digraph::NodeIt NodeIt; |
997 typedef typename Digraph::NodeIt NodeIt; |
921 //\e |
|
922 typedef typename Digraph::Arc Arc; |
998 typedef typename Digraph::Arc Arc; |
923 //\e |
|
924 typedef typename Digraph::OutArcIt OutArcIt; |
999 typedef typename Digraph::OutArcIt OutArcIt; |
925 |
1000 |
926 ///\brief The type of the map that stores |
1001 ///\brief The type of the map that stores the predecessor |
927 ///the reached nodes |
|
928 typedef typename TR::ReachedMap ReachedMap; |
|
929 ///\brief The type of the map that stores |
|
930 ///the processed nodes |
|
931 typedef typename TR::ProcessedMap ProcessedMap; |
|
932 ///\brief The type of the map that stores the last |
|
933 ///arcs of the shortest paths. |
1002 ///arcs of the shortest paths. |
934 typedef typename TR::PredMap PredMap; |
1003 typedef typename TR::PredMap PredMap; |
935 ///The type of the map that stores the dists of the nodes. |
1004 ///\brief The type of the map that stores the distances of the nodes. |
936 typedef typename TR::DistMap DistMap; |
1005 typedef typename TR::DistMap DistMap; |
|
1006 ///\brief The type of the map that indicates which nodes are reached. |
|
1007 typedef typename TR::ReachedMap ReachedMap; |
|
1008 ///\brief The type of the map that indicates which nodes are processed. |
|
1009 typedef typename TR::ProcessedMap ProcessedMap; |
937 |
1010 |
938 public: |
1011 public: |
|
1012 |
939 /// Constructor. |
1013 /// Constructor. |
940 BfsWizard() : TR() {} |
1014 BfsWizard() : TR() {} |
941 |
1015 |
942 /// Constructor that requires parameters. |
1016 /// Constructor that requires parameters. |
943 |
1017 |
968 if(Base::_dist) |
1042 if(Base::_dist) |
969 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist)); |
1043 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist)); |
970 alg.run(Base::_source); |
1044 alg.run(Base::_source); |
971 } |
1045 } |
972 |
1046 |
973 ///Runs Bfs algorithm from the given node. |
1047 ///Runs BFS algorithm from the given node. |
974 |
1048 |
975 ///Runs Bfs algorithm from the given node. |
1049 ///Runs BFS algorithm from the given node. |
976 ///\param s is the given source. |
1050 ///\param s is the given source. |
977 void run(Node s) |
1051 void run(Node s) |
978 { |
1052 { |
979 Base::_source=s; |
1053 Base::_source=s; |
980 run(); |
1054 run(); |
|
1055 } |
|
1056 |
|
1057 /// Sets the source node, from which the Bfs algorithm runs. |
|
1058 |
|
1059 /// Sets the source node, from which the Bfs algorithm runs. |
|
1060 /// \param s is the source node. |
|
1061 BfsWizard<TR> &source(Node s) |
|
1062 { |
|
1063 Base::_source=s; |
|
1064 return *this; |
981 } |
1065 } |
982 |
1066 |
983 template<class T> |
1067 template<class T> |
984 struct DefPredMapBase : public Base { |
1068 struct DefPredMapBase : public Base { |
985 typedef T PredMap; |
1069 typedef T PredMap; |
986 static PredMap *createPredMap(const Digraph &) { return 0; }; |
1070 static PredMap *createPredMap(const Digraph &) { return 0; }; |
987 DefPredMapBase(const TR &b) : TR(b) {} |
1071 DefPredMapBase(const TR &b) : TR(b) {} |
988 }; |
1072 }; |
989 |
|
990 ///\brief \ref named-templ-param "Named parameter" |
1073 ///\brief \ref named-templ-param "Named parameter" |
991 ///function for setting PredMap |
1074 ///for setting \ref PredMap object. |
992 /// |
1075 /// |
993 /// \ref named-templ-param "Named parameter" |
1076 /// \ref named-templ-param "Named parameter" |
994 ///function for setting PredMap |
1077 ///for setting \ref PredMap object. |
995 /// |
|
996 template<class T> |
1078 template<class T> |
997 BfsWizard<DefPredMapBase<T> > predMap(const T &t) |
1079 BfsWizard<DefPredMapBase<T> > predMap(const T &t) |
998 { |
1080 { |
999 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1081 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1000 return BfsWizard<DefPredMapBase<T> >(*this); |
1082 return BfsWizard<DefPredMapBase<T> >(*this); |
1001 } |
1083 } |
1002 |
|
1003 |
1084 |
1004 template<class T> |
1085 template<class T> |
1005 struct DefReachedMapBase : public Base { |
1086 struct DefReachedMapBase : public Base { |
1006 typedef T ReachedMap; |
1087 typedef T ReachedMap; |
1007 static ReachedMap *createReachedMap(const Digraph &) { return 0; }; |
1088 static ReachedMap *createReachedMap(const Digraph &) { return 0; }; |
1008 DefReachedMapBase(const TR &b) : TR(b) {} |
1089 DefReachedMapBase(const TR &b) : TR(b) {} |
1009 }; |
1090 }; |
1010 |
|
1011 ///\brief \ref named-templ-param "Named parameter" |
1091 ///\brief \ref named-templ-param "Named parameter" |
1012 ///function for setting ReachedMap |
1092 ///for setting \ref ReachedMap object. |
1013 /// |
1093 /// |
1014 /// \ref named-templ-param "Named parameter" |
1094 /// \ref named-templ-param "Named parameter" |
1015 ///function for setting ReachedMap |
1095 ///for setting \ref ReachedMap object. |
1016 /// |
|
1017 template<class T> |
1096 template<class T> |
1018 BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) |
1097 BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) |
1019 { |
1098 { |
1020 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1099 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1021 return BfsWizard<DefReachedMapBase<T> >(*this); |
1100 return BfsWizard<DefReachedMapBase<T> >(*this); |
1022 } |
1101 } |
1023 |
|
1024 |
1102 |
1025 template<class T> |
1103 template<class T> |
1026 struct DefProcessedMapBase : public Base { |
1104 struct DefProcessedMapBase : public Base { |
1027 typedef T ProcessedMap; |
1105 typedef T ProcessedMap; |
1028 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; }; |
1106 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; }; |
1029 DefProcessedMapBase(const TR &b) : TR(b) {} |
1107 DefProcessedMapBase(const TR &b) : TR(b) {} |
1030 }; |
1108 }; |
1031 |
|
1032 ///\brief \ref named-templ-param "Named parameter" |
1109 ///\brief \ref named-templ-param "Named parameter" |
1033 ///function for setting ProcessedMap |
1110 ///for setting \ref ProcessedMap object. |
1034 /// |
1111 /// |
1035 /// \ref named-templ-param "Named parameter" |
1112 /// \ref named-templ-param "Named parameter" |
1036 ///function for setting ProcessedMap |
1113 ///for setting \ref ProcessedMap object. |
1037 /// |
|
1038 template<class T> |
1114 template<class T> |
1039 BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) |
1115 BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) |
1040 { |
1116 { |
1041 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1117 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1042 return BfsWizard<DefProcessedMapBase<T> >(*this); |
1118 return BfsWizard<DefProcessedMapBase<T> >(*this); |
1043 } |
1119 } |
1044 |
|
1045 |
1120 |
1046 template<class T> |
1121 template<class T> |
1047 struct DefDistMapBase : public Base { |
1122 struct DefDistMapBase : public Base { |
1048 typedef T DistMap; |
1123 typedef T DistMap; |
1049 static DistMap *createDistMap(const Digraph &) { return 0; }; |
1124 static DistMap *createDistMap(const Digraph &) { return 0; }; |
1050 DefDistMapBase(const TR &b) : TR(b) {} |
1125 DefDistMapBase(const TR &b) : TR(b) {} |
1051 }; |
1126 }; |
1052 |
|
1053 ///\brief \ref named-templ-param "Named parameter" |
1127 ///\brief \ref named-templ-param "Named parameter" |
1054 ///function for setting DistMap type |
1128 ///for setting \ref DistMap object. |
1055 /// |
1129 /// |
1056 /// \ref named-templ-param "Named parameter" |
1130 /// \ref named-templ-param "Named parameter" |
1057 ///function for setting DistMap type |
1131 ///for setting \ref DistMap object. |
1058 /// |
|
1059 template<class T> |
1132 template<class T> |
1060 BfsWizard<DefDistMapBase<T> > distMap(const T &t) |
1133 BfsWizard<DefDistMapBase<T> > distMap(const T &t) |
1061 { |
1134 { |
1062 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1135 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t)); |
1063 return BfsWizard<DefDistMapBase<T> >(*this); |
1136 return BfsWizard<DefDistMapBase<T> >(*this); |
1064 } |
|
1065 |
|
1066 /// Sets the source node, from which the Bfs algorithm runs. |
|
1067 |
|
1068 /// Sets the source node, from which the Bfs algorithm runs. |
|
1069 /// \param s is the source node. |
|
1070 BfsWizard<TR> &source(Node s) |
|
1071 { |
|
1072 Base::_source=s; |
|
1073 return *this; |
|
1074 } |
1137 } |
1075 |
1138 |
1076 }; |
1139 }; |
1077 |
1140 |
1078 ///Function type interface for Bfs algorithm. |
1141 ///Function type interface for Bfs algorithm. |
1098 { |
1161 { |
1099 return BfsWizard<BfsWizardBase<GR> >(g,s); |
1162 return BfsWizard<BfsWizardBase<GR> >(g,s); |
1100 } |
1163 } |
1101 |
1164 |
1102 #ifdef DOXYGEN |
1165 #ifdef DOXYGEN |
1103 /// \brief Visitor class for bfs. |
1166 /// \brief Visitor class for BFS. |
1104 /// |
1167 /// |
1105 /// This class defines the interface of the BfsVisit events, and |
1168 /// This class defines the interface of the BfsVisit events, and |
1106 /// it could be the base of a real Visitor class. |
1169 /// it could be the base of a real visitor class. |
1107 template <typename _Digraph> |
1170 template <typename _Digraph> |
1108 struct BfsVisitor { |
1171 struct BfsVisitor { |
1109 typedef _Digraph Digraph; |
1172 typedef _Digraph Digraph; |
1110 typedef typename Digraph::Arc Arc; |
1173 typedef typename Digraph::Arc Arc; |
1111 typedef typename Digraph::Node Node; |
1174 typedef typename Digraph::Node Node; |
1112 /// \brief Called when the arc reach a node. |
1175 /// \brief Called for the source node(s) of the BFS. |
1113 /// |
1176 /// |
1114 /// It is called when the bfs find an arc which target is not |
1177 /// This function is called for the source node(s) of the BFS. |
1115 /// reached yet. |
1178 void start(const Node& node) {} |
|
1179 /// \brief Called when a node is reached first time. |
|
1180 /// |
|
1181 /// This function is called when a node is reached first time. |
|
1182 void reach(const Node& node) {} |
|
1183 /// \brief Called when a node is processed. |
|
1184 /// |
|
1185 /// This function is called when a node is processed. |
|
1186 void process(const Node& node) {} |
|
1187 /// \brief Called when an arc reaches a new node. |
|
1188 /// |
|
1189 /// This function is called when the BFS finds an arc whose target node |
|
1190 /// is not reached yet. |
1116 void discover(const Arc& arc) {} |
1191 void discover(const Arc& arc) {} |
1117 /// \brief Called when the node reached first time. |
1192 /// \brief Called when an arc is examined but its target node is |
1118 /// |
|
1119 /// It is Called when the node reached first time. |
|
1120 void reach(const Node& node) {} |
|
1121 /// \brief Called when the arc examined but target of the arc |
|
1122 /// already discovered. |
1193 /// already discovered. |
1123 /// |
1194 /// |
1124 /// It called when the arc examined but the target of the arc |
1195 /// This function is called when an arc is examined but its target node is |
1125 /// already discovered. |
1196 /// already discovered. |
1126 void examine(const Arc& arc) {} |
1197 void examine(const Arc& arc) {} |
1127 /// \brief Called for the source node of the bfs. |
|
1128 /// |
|
1129 /// It is called for the source node of the bfs. |
|
1130 void start(const Node& node) {} |
|
1131 /// \brief Called when the node processed. |
|
1132 /// |
|
1133 /// It is Called when the node processed. |
|
1134 void process(const Node& node) {} |
|
1135 }; |
1198 }; |
1136 #else |
1199 #else |
1137 template <typename _Digraph> |
1200 template <typename _Digraph> |
1138 struct BfsVisitor { |
1201 struct BfsVisitor { |
1139 typedef _Digraph Digraph; |
1202 typedef _Digraph Digraph; |
1140 typedef typename Digraph::Arc Arc; |
1203 typedef typename Digraph::Arc Arc; |
1141 typedef typename Digraph::Node Node; |
1204 typedef typename Digraph::Node Node; |
|
1205 void start(const Node&) {} |
|
1206 void reach(const Node&) {} |
|
1207 void process(const Node&) {} |
1142 void discover(const Arc&) {} |
1208 void discover(const Arc&) {} |
1143 void reach(const Node&) {} |
|
1144 void examine(const Arc&) {} |
1209 void examine(const Arc&) {} |
1145 void start(const Node&) {} |
|
1146 void process(const Node&) {} |
|
1147 |
1210 |
1148 template <typename _Visitor> |
1211 template <typename _Visitor> |
1149 struct Constraints { |
1212 struct Constraints { |
1150 void constraints() { |
1213 void constraints() { |
1151 Arc arc; |
1214 Arc arc; |
1152 Node node; |
1215 Node node; |
|
1216 visitor.start(node); |
|
1217 visitor.reach(node); |
|
1218 visitor.process(node); |
1153 visitor.discover(arc); |
1219 visitor.discover(arc); |
1154 visitor.reach(node); |
|
1155 visitor.examine(arc); |
1220 visitor.examine(arc); |
1156 visitor.start(node); |
|
1157 visitor.process(node); |
|
1158 } |
1221 } |
1159 _Visitor& visitor; |
1222 _Visitor& visitor; |
1160 }; |
1223 }; |
1161 }; |
1224 }; |
1162 #endif |
1225 #endif |
1163 |
1226 |
1164 /// \brief Default traits class of BfsVisit class. |
1227 /// \brief Default traits class of BfsVisit class. |
1165 /// |
1228 /// |
1166 /// Default traits class of BfsVisit class. |
1229 /// Default traits class of BfsVisit class. |
1167 /// \tparam _Digraph Digraph type. |
1230 /// \tparam _Digraph The type of the digraph the algorithm runs on. |
1168 template<class _Digraph> |
1231 template<class _Digraph> |
1169 struct BfsVisitDefaultTraits { |
1232 struct BfsVisitDefaultTraits { |
1170 |
1233 |
1171 /// \brief The digraph type the algorithm runs on. |
1234 /// \brief The type of the digraph the algorithm runs on. |
1172 typedef _Digraph Digraph; |
1235 typedef _Digraph Digraph; |
1173 |
1236 |
1174 /// \brief The type of the map that indicates which nodes are reached. |
1237 /// \brief The type of the map that indicates which nodes are reached. |
1175 /// |
1238 /// |
1176 /// The type of the map that indicates which nodes are reached. |
1239 /// The type of the map that indicates which nodes are reached. |
1177 /// It must meet the \ref concepts::WriteMap "WriteMap" concept. |
1240 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
1178 /// \todo named parameter to set this type, function to read and write. |
|
1179 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
1241 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
1180 |
1242 |
1181 /// \brief Instantiates a ReachedMap. |
1243 /// \brief Instantiates a \ref ReachedMap. |
1182 /// |
1244 /// |
1183 /// This function instantiates a \ref ReachedMap. |
1245 /// This function instantiates a \ref ReachedMap. |
1184 /// \param digraph is the digraph, to which |
1246 /// \param digraph is the digraph, to which |
1185 /// we would like to define the \ref ReachedMap. |
1247 /// we would like to define the \ref ReachedMap. |
1186 static ReachedMap *createReachedMap(const Digraph &digraph) { |
1248 static ReachedMap *createReachedMap(const Digraph &digraph) { |
1461 } |
1528 } |
1462 } |
1529 } |
1463 return n; |
1530 return n; |
1464 } |
1531 } |
1465 |
1532 |
1466 /// \brief Next node to be processed. |
1533 /// \brief The next node to be processed. |
1467 /// |
1534 /// |
1468 /// Next node to be processed. |
1535 /// Returns the next node to be processed or \c INVALID if the queue |
1469 /// |
1536 /// is empty. |
1470 /// \return The next node to be processed or INVALID if the stack is |
1537 Node nextNode() const { |
1471 /// empty. |
|
1472 Node nextNode() { |
|
1473 return _list_front != _list_back ? _list[_list_front + 1] : INVALID; |
1538 return _list_front != _list_back ? _list[_list_front + 1] : INVALID; |
1474 } |
1539 } |
1475 |
1540 |
1476 /// \brief Returns \c false if there are nodes |
1541 /// \brief Returns \c false if there are nodes |
1477 /// to be processed in the queue |
1542 /// to be processed. |
1478 /// |
1543 /// |
1479 /// Returns \c false if there are nodes |
1544 /// Returns \c false if there are nodes |
1480 /// to be processed in the queue |
1545 /// to be processed in the queue. |
1481 bool emptyQueue() { return _list_front == _list_back; } |
1546 bool emptyQueue() const { return _list_front == _list_back; } |
1482 |
1547 |
1483 /// \brief Returns the number of the nodes to be processed. |
1548 /// \brief Returns the number of the nodes to be processed. |
1484 /// |
1549 /// |
1485 /// Returns the number of the nodes to be processed in the queue. |
1550 /// Returns the number of the nodes to be processed in the queue. |
1486 int queueSize() { return _list_back - _list_front; } |
1551 int queueSize() const { return _list_back - _list_front; } |
1487 |
1552 |
1488 /// \brief Executes the algorithm. |
1553 /// \brief Executes the algorithm. |
1489 /// |
1554 /// |
1490 /// Executes the algorithm. |
1555 /// Executes the algorithm. |
1491 /// |
1556 /// |
1492 /// \pre init() must be called and at least one node should be added |
1557 /// This method runs the %BFS algorithm from the root node(s) |
|
1558 /// in order to compute the shortest path to each node. |
|
1559 /// |
|
1560 /// The algorithm computes |
|
1561 /// - the shortest path tree (forest), |
|
1562 /// - the distance of each node from the root(s). |
|
1563 /// |
|
1564 /// \pre init() must be called and at least one root node should be added |
1493 /// with addSource() before using this function. |
1565 /// with addSource() before using this function. |
|
1566 /// |
|
1567 /// \note <tt>b.start()</tt> is just a shortcut of the following code. |
|
1568 /// \code |
|
1569 /// while ( !b.emptyQueue() ) { |
|
1570 /// b.processNextNode(); |
|
1571 /// } |
|
1572 /// \endcode |
1494 void start() { |
1573 void start() { |
1495 while ( !emptyQueue() ) processNextNode(); |
1574 while ( !emptyQueue() ) processNextNode(); |
1496 } |
1575 } |
1497 |
1576 |
1498 /// \brief Executes the algorithm until \c dest is reached. |
1577 /// \brief Executes the algorithm until the given target node is reached. |
1499 /// |
1578 /// |
1500 /// Executes the algorithm until \c dest is reached. |
1579 /// Executes the algorithm until the given target node is reached. |
1501 /// |
1580 /// |
1502 /// \pre init() must be called and at least one node should be added |
1581 /// This method runs the %BFS algorithm from the root node(s) |
1503 /// with addSource() before using this function. |
1582 /// in order to compute the shortest path to \c dest. |
|
1583 /// |
|
1584 /// The algorithm computes |
|
1585 /// - the shortest path to \c dest, |
|
1586 /// - the distance of \c dest from the root(s). |
|
1587 /// |
|
1588 /// \pre init() must be called and at least one root node should be |
|
1589 /// added with addSource() before using this function. |
|
1590 /// |
|
1591 /// \note <tt>b.start(t)</tt> is just a shortcut of the following code. |
|
1592 /// \code |
|
1593 /// bool reach = false; |
|
1594 /// while ( !b.emptyQueue() && !reach ) { |
|
1595 /// b.processNextNode(t, reach); |
|
1596 /// } |
|
1597 /// \endcode |
1504 void start(Node dest) { |
1598 void start(Node dest) { |
1505 bool reach = false; |
1599 bool reach = false; |
1506 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); |
1600 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); |
1507 } |
1601 } |
1508 |
1602 |
1509 /// \brief Executes the algorithm until a condition is met. |
1603 /// \brief Executes the algorithm until a condition is met. |
1510 /// |
1604 /// |
1511 /// Executes the algorithm until a condition is met. |
1605 /// Executes the algorithm until a condition is met. |
1512 /// |
1606 /// |
1513 /// \pre init() must be called and at least one node should be added |
1607 /// This method runs the %BFS algorithm from the root node(s) in |
1514 /// with addSource() before using this function. |
1608 /// order to compute the shortest path to a node \c v with |
1515 /// |
1609 /// <tt>nm[v]</tt> true, if such a node can be found. |
1516 ///\param nm must be a bool (or convertible) node map. The |
1610 /// |
1517 ///algorithm will stop when it reaches a node \c v with |
1611 /// \param nm must be a bool (or convertible) node map. The |
|
1612 /// algorithm will stop when it reaches a node \c v with |
1518 /// <tt>nm[v]</tt> true. |
1613 /// <tt>nm[v]</tt> true. |
1519 /// |
1614 /// |
1520 ///\return The reached node \c v with <tt>nm[v]</tt> true or |
1615 /// \return The reached node \c v with <tt>nm[v]</tt> true or |
1521 ///\c INVALID if no such node was found. |
1616 /// \c INVALID if no such node was found. |
|
1617 /// |
|
1618 /// \pre init() must be called and at least one root node should be |
|
1619 /// added with addSource() before using this function. |
|
1620 /// |
|
1621 /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code. |
|
1622 /// \code |
|
1623 /// Node rnode = INVALID; |
|
1624 /// while ( !b.emptyQueue() && rnode == INVALID ) { |
|
1625 /// b.processNextNode(nm, rnode); |
|
1626 /// } |
|
1627 /// return rnode; |
|
1628 /// \endcode |
1522 template <typename NM> |
1629 template <typename NM> |
1523 Node start(const NM &nm) { |
1630 Node start(const NM &nm) { |
1524 Node rnode = INVALID; |
1631 Node rnode = INVALID; |
1525 while ( !emptyQueue() && rnode == INVALID ) { |
1632 while ( !emptyQueue() && rnode == INVALID ) { |
1526 processNextNode(nm, rnode); |
1633 processNextNode(nm, rnode); |
1527 } |
1634 } |
1528 return rnode; |
1635 return rnode; |
1529 } |
1636 } |
1530 |
1637 |
1531 /// \brief Runs %BFSVisit algorithm from node \c s. |
1638 /// \brief Runs the algorithm from the given node. |
1532 /// |
1639 /// |
1533 /// This method runs the %BFS algorithm from a root node \c s. |
1640 /// This method runs the %BFS algorithm from node \c s |
1534 /// \note b.run(s) is just a shortcut of the following code. |
1641 /// in order to compute the shortest path to each node. |
|
1642 /// |
|
1643 /// The algorithm computes |
|
1644 /// - the shortest path tree, |
|
1645 /// - the distance of each node from the root. |
|
1646 /// |
|
1647 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code. |
1535 ///\code |
1648 ///\code |
1536 /// b.init(); |
1649 /// b.init(); |
1537 /// b.addSource(s); |
1650 /// b.addSource(s); |
1538 /// b.start(); |
1651 /// b.start(); |
1539 ///\endcode |
1652 ///\endcode |