47 /// |
47 /// |
48 ///The type of the map that stores the predecessor |
48 ///The type of the map that stores the predecessor |
49 ///arcs of the %DFS paths. |
49 ///arcs of the %DFS paths. |
50 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
50 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; |
52 ///Instantiates a PredMap. |
52 ///Instantiates a \c PredMap. |
53 |
53 |
54 ///This function instantiates a PredMap. |
54 ///This function instantiates a \ref PredMap. |
55 ///\param g is the digraph, to which we would like to define the |
55 ///\param g is the digraph, to which we would like to define the |
56 ///PredMap. |
56 ///\ref PredMap. |
57 static PredMap *createPredMap(const Digraph &g) |
57 static PredMap *createPredMap(const Digraph &g) |
58 { |
58 { |
59 return new PredMap(g); |
59 return new PredMap(g); |
60 } |
60 } |
61 |
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 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
66 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; |
67 ///Instantiates a ProcessedMap. |
67 ///Instantiates a \c ProcessedMap. |
68 |
68 |
69 ///This function instantiates a ProcessedMap. |
69 ///This function instantiates a \ref ProcessedMap. |
70 ///\param g is the digraph, to which |
70 ///\param g is the digraph, to which |
71 ///we would like to define the ProcessedMap |
71 ///we would like to define the \ref ProcessedMap. |
72 #ifdef DOXYGEN |
72 #ifdef DOXYGEN |
73 static ProcessedMap *createProcessedMap(const Digraph &g) |
73 static ProcessedMap *createProcessedMap(const Digraph &g) |
74 #else |
74 #else |
75 static ProcessedMap *createProcessedMap(const Digraph &) |
75 static ProcessedMap *createProcessedMap(const Digraph &) |
76 #endif |
76 #endif |
81 ///The type of the map that indicates which nodes are reached. |
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. |
83 ///The type of the map that indicates which nodes are reached. |
84 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
84 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
85 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
85 typedef typename Digraph::template NodeMap<bool> ReachedMap; |
86 ///Instantiates a ReachedMap. |
86 ///Instantiates a \c ReachedMap. |
87 |
87 |
88 ///This function instantiates a ReachedMap. |
88 ///This function instantiates a \ref ReachedMap. |
89 ///\param g is the digraph, to which |
89 ///\param g is the digraph, to which |
90 ///we would like to define the ReachedMap. |
90 ///we would like to define the \ref ReachedMap. |
91 static ReachedMap *createReachedMap(const Digraph &g) |
91 static ReachedMap *createReachedMap(const Digraph &g) |
92 { |
92 { |
93 return new ReachedMap(g); |
93 return new ReachedMap(g); |
94 } |
94 } |
95 |
95 |
96 ///The type of the map that stores the distances of the nodes. |
96 ///The type of the map that stores the distances of the nodes. |
97 |
97 |
98 ///The type of the map that stores the distances of the nodes. |
98 ///The type of the map that stores the distances of the nodes. |
99 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
99 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
100 typedef typename Digraph::template NodeMap<int> DistMap; |
100 typedef typename Digraph::template NodeMap<int> DistMap; |
101 ///Instantiates a DistMap. |
101 ///Instantiates a \c DistMap. |
102 |
102 |
103 ///This function instantiates a DistMap. |
103 ///This function instantiates a \ref DistMap. |
104 ///\param g is the digraph, to which we would like to define the |
104 ///\param g is the digraph, to which we would like to define the |
105 ///DistMap. |
105 ///\ref DistMap. |
106 static DistMap *createDistMap(const Digraph &g) |
106 static DistMap *createDistMap(const Digraph &g) |
107 { |
107 { |
108 return new DistMap(g); |
108 return new DistMap(g); |
109 } |
109 } |
110 }; |
110 }; |
218 LEMON_ASSERT(false, "PredMap is not initialized"); |
218 LEMON_ASSERT(false, "PredMap is not initialized"); |
219 return 0; // ignore warnings |
219 return 0; // ignore warnings |
220 } |
220 } |
221 }; |
221 }; |
222 ///\brief \ref named-templ-param "Named parameter" for setting |
222 ///\brief \ref named-templ-param "Named parameter" for setting |
223 ///PredMap type. |
223 ///\c PredMap type. |
224 /// |
224 /// |
225 ///\ref named-templ-param "Named parameter" for setting |
225 ///\ref named-templ-param "Named parameter" for setting |
226 ///PredMap type. |
226 ///\c PredMap type. |
227 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
227 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
228 template <class T> |
228 template <class T> |
229 struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > { |
229 struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > { |
230 typedef Dfs<Digraph, SetPredMapTraits<T> > Create; |
230 typedef Dfs<Digraph, SetPredMapTraits<T> > Create; |
231 }; |
231 }; |
238 LEMON_ASSERT(false, "DistMap is not initialized"); |
238 LEMON_ASSERT(false, "DistMap is not initialized"); |
239 return 0; // ignore warnings |
239 return 0; // ignore warnings |
240 } |
240 } |
241 }; |
241 }; |
242 ///\brief \ref named-templ-param "Named parameter" for setting |
242 ///\brief \ref named-templ-param "Named parameter" for setting |
243 ///DistMap type. |
243 ///\c DistMap type. |
244 /// |
244 /// |
245 ///\ref named-templ-param "Named parameter" for setting |
245 ///\ref named-templ-param "Named parameter" for setting |
246 ///DistMap type. |
246 ///\c DistMap type. |
247 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
247 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
248 template <class T> |
248 template <class T> |
249 struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > { |
249 struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > { |
250 typedef Dfs<Digraph, SetDistMapTraits<T> > Create; |
250 typedef Dfs<Digraph, SetDistMapTraits<T> > Create; |
251 }; |
251 }; |
258 LEMON_ASSERT(false, "ReachedMap is not initialized"); |
258 LEMON_ASSERT(false, "ReachedMap is not initialized"); |
259 return 0; // ignore warnings |
259 return 0; // ignore warnings |
260 } |
260 } |
261 }; |
261 }; |
262 ///\brief \ref named-templ-param "Named parameter" for setting |
262 ///\brief \ref named-templ-param "Named parameter" for setting |
263 ///ReachedMap type. |
263 ///\c ReachedMap type. |
264 /// |
264 /// |
265 ///\ref named-templ-param "Named parameter" for setting |
265 ///\ref named-templ-param "Named parameter" for setting |
266 ///ReachedMap type. |
266 ///\c ReachedMap type. |
267 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
267 ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
268 template <class T> |
268 template <class T> |
269 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > { |
269 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > { |
270 typedef Dfs< Digraph, SetReachedMapTraits<T> > Create; |
270 typedef Dfs< Digraph, SetReachedMapTraits<T> > Create; |
271 }; |
271 }; |
278 LEMON_ASSERT(false, "ProcessedMap is not initialized"); |
278 LEMON_ASSERT(false, "ProcessedMap is not initialized"); |
279 return 0; // ignore warnings |
279 return 0; // ignore warnings |
280 } |
280 } |
281 }; |
281 }; |
282 ///\brief \ref named-templ-param "Named parameter" for setting |
282 ///\brief \ref named-templ-param "Named parameter" for setting |
283 ///ProcessedMap type. |
283 ///\c ProcessedMap type. |
284 /// |
284 /// |
285 ///\ref named-templ-param "Named parameter" for setting |
285 ///\ref named-templ-param "Named parameter" for setting |
286 ///ProcessedMap type. |
286 ///\c ProcessedMap type. |
287 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
287 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. |
288 template <class T> |
288 template <class T> |
289 struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > { |
289 struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > { |
290 typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create; |
290 typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create; |
291 }; |
291 }; |
296 { |
296 { |
297 return new ProcessedMap(g); |
297 return new ProcessedMap(g); |
298 } |
298 } |
299 }; |
299 }; |
300 ///\brief \ref named-templ-param "Named parameter" for setting |
300 ///\brief \ref named-templ-param "Named parameter" for setting |
301 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
301 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
302 /// |
302 /// |
303 ///\ref named-templ-param "Named parameter" for setting |
303 ///\ref named-templ-param "Named parameter" for setting |
304 ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
304 ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>. |
305 ///If you don't set it explicitly, it will be automatically allocated. |
305 ///If you don't set it explicitly, it will be automatically allocated. |
306 struct SetStandardProcessedMap : |
306 struct SetStandardProcessedMap : |
307 public Dfs< Digraph, SetStandardProcessedMapTraits > { |
307 public Dfs< Digraph, SetStandardProcessedMapTraits > { |
308 typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create; |
308 typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create; |
309 }; |
309 }; |
1124 #ifdef DOXYGEN |
1124 #ifdef DOXYGEN |
1125 /// \brief Visitor class for DFS. |
1125 /// \brief Visitor class for DFS. |
1126 /// |
1126 /// |
1127 /// This class defines the interface of the DfsVisit events, and |
1127 /// This class defines the interface of the DfsVisit events, and |
1128 /// it could be the base of a real visitor class. |
1128 /// it could be the base of a real visitor class. |
1129 template <typename _Digraph> |
1129 template <typename GR> |
1130 struct DfsVisitor { |
1130 struct DfsVisitor { |
1131 typedef _Digraph Digraph; |
1131 typedef GR Digraph; |
1132 typedef typename Digraph::Arc Arc; |
1132 typedef typename Digraph::Arc Arc; |
1133 typedef typename Digraph::Node Node; |
1133 typedef typename Digraph::Node Node; |
1134 /// \brief Called for the source node of the DFS. |
1134 /// \brief Called for the source node of the DFS. |
1135 /// |
1135 /// |
1136 /// This function is called for the source node of the DFS. |
1136 /// This function is called for the source node of the DFS. |
1162 /// |
1162 /// |
1163 /// This function is called when the DFS steps back on an arc. |
1163 /// This function is called when the DFS steps back on an arc. |
1164 void backtrack(const Arc& arc) {} |
1164 void backtrack(const Arc& arc) {} |
1165 }; |
1165 }; |
1166 #else |
1166 #else |
1167 template <typename _Digraph> |
1167 template <typename GR> |
1168 struct DfsVisitor { |
1168 struct DfsVisitor { |
1169 typedef _Digraph Digraph; |
1169 typedef GR Digraph; |
1170 typedef typename Digraph::Arc Arc; |
1170 typedef typename Digraph::Arc Arc; |
1171 typedef typename Digraph::Node Node; |
1171 typedef typename Digraph::Node Node; |
1172 void start(const Node&) {} |
1172 void start(const Node&) {} |
1173 void stop(const Node&) {} |
1173 void stop(const Node&) {} |
1174 void reach(const Node&) {} |
1174 void reach(const Node&) {} |
1197 |
1197 |
1198 /// \brief Default traits class of DfsVisit class. |
1198 /// \brief Default traits class of DfsVisit class. |
1199 /// |
1199 /// |
1200 /// Default traits class of DfsVisit class. |
1200 /// Default traits class of DfsVisit class. |
1201 /// \tparam _Digraph The type of the digraph the algorithm runs on. |
1201 /// \tparam _Digraph The type of the digraph the algorithm runs on. |
1202 template<class _Digraph> |
1202 template<class GR> |
1203 struct DfsVisitDefaultTraits { |
1203 struct DfsVisitDefaultTraits { |
1204 |
1204 |
1205 /// \brief The type of the digraph the algorithm runs on. |
1205 /// \brief The type of the digraph the algorithm runs on. |
1206 typedef _Digraph Digraph; |
1206 typedef GR Digraph; |
1207 |
1207 |
1208 /// \brief The type of the map that indicates which nodes are reached. |
1208 /// \brief The type of the map that indicates which nodes are reached. |
1209 /// |
1209 /// |
1210 /// The type of the map that indicates which nodes are reached. |
1210 /// The type of the map that indicates which nodes are reached. |
1211 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
1211 /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
1222 |
1222 |
1223 }; |
1223 }; |
1224 |
1224 |
1225 /// \ingroup search |
1225 /// \ingroup search |
1226 /// |
1226 /// |
1227 /// \brief %DFS algorithm class with visitor interface. |
1227 /// \brief DFS algorithm class with visitor interface. |
1228 /// |
1228 /// |
1229 /// This class provides an efficient implementation of the %DFS algorithm |
1229 /// This class provides an efficient implementation of the DFS algorithm |
1230 /// with visitor interface. |
1230 /// with visitor interface. |
1231 /// |
1231 /// |
1232 /// The %DfsVisit class provides an alternative interface to the Dfs |
1232 /// The DfsVisit class provides an alternative interface to the Dfs |
1233 /// class. It works with callback mechanism, the DfsVisit object calls |
1233 /// class. It works with callback mechanism, the DfsVisit object calls |
1234 /// the member functions of the \c Visitor class on every DFS event. |
1234 /// the member functions of the \c Visitor class on every DFS event. |
1235 /// |
1235 /// |
1236 /// This interface of the DFS algorithm should be used in special cases |
1236 /// This interface of the DFS algorithm should be used in special cases |
1237 /// when extra actions have to be performed in connection with certain |
1237 /// when extra actions have to be performed in connection with certain |
1238 /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs() |
1238 /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs() |
1239 /// instead. |
1239 /// instead. |
1240 /// |
1240 /// |
1241 /// \tparam _Digraph The type of the digraph the algorithm runs on. |
1241 /// \tparam GR The type of the digraph the algorithm runs on. |
1242 /// The default value is |
1242 /// The default type is \ref ListDigraph. |
1243 /// \ref ListDigraph. The value of _Digraph is not used directly by |
1243 /// The value of GR is not used directly by \ref DfsVisit, |
1244 /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits. |
1244 /// it is only passed to \ref DfsVisitDefaultTraits. |
1245 /// \tparam _Visitor The Visitor type that is used by the algorithm. |
1245 /// \tparam VS The Visitor type that is used by the algorithm. |
1246 /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which |
1246 /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which |
1247 /// does not observe the DFS events. If you want to observe the DFS |
1247 /// does not observe the DFS events. If you want to observe the DFS |
1248 /// events, you should implement your own visitor class. |
1248 /// events, you should implement your own visitor class. |
1249 /// \tparam _Traits Traits class to set various data types used by the |
1249 /// \tparam TR Traits class to set various data types used by the |
1250 /// algorithm. The default traits class is |
1250 /// algorithm. The default traits class is |
1251 /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>". |
1251 /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>". |
1252 /// See \ref DfsVisitDefaultTraits for the documentation of |
1252 /// See \ref DfsVisitDefaultTraits for the documentation of |
1253 /// a DFS visit traits class. |
1253 /// a DFS visit traits class. |
1254 #ifdef DOXYGEN |
1254 #ifdef DOXYGEN |
1255 template <typename _Digraph, typename _Visitor, typename _Traits> |
1255 template <typename GR, typename VS, typename TR> |
1256 #else |
1256 #else |
1257 template <typename _Digraph = ListDigraph, |
1257 template <typename GR = ListDigraph, |
1258 typename _Visitor = DfsVisitor<_Digraph>, |
1258 typename VS = DfsVisitor<GR>, |
1259 typename _Traits = DfsVisitDefaultTraits<_Digraph> > |
1259 typename TR = DfsVisitDefaultTraits<GR> > |
1260 #endif |
1260 #endif |
1261 class DfsVisit { |
1261 class DfsVisit { |
1262 public: |
1262 public: |
1263 |
1263 |
1264 ///The traits class. |
1264 ///The traits class. |
1265 typedef _Traits Traits; |
1265 typedef TR Traits; |
1266 |
1266 |
1267 ///The type of the digraph the algorithm runs on. |
1267 ///The type of the digraph the algorithm runs on. |
1268 typedef typename Traits::Digraph Digraph; |
1268 typedef typename Traits::Digraph Digraph; |
1269 |
1269 |
1270 ///The visitor type used by the algorithm. |
1270 ///The visitor type used by the algorithm. |
1271 typedef _Visitor Visitor; |
1271 typedef VS Visitor; |
1272 |
1272 |
1273 ///The type of the map that indicates which nodes are reached. |
1273 ///The type of the map that indicates which nodes are reached. |
1274 typedef typename Traits::ReachedMap ReachedMap; |
1274 typedef typename Traits::ReachedMap ReachedMap; |
1275 |
1275 |
1276 private: |
1276 private: |