1 /* -*- C++ -*- |
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 * |
2 * |
3 * This file is a part of LEMON, a generic C++ optimization library |
3 * This file is a part of LEMON, a generic C++ optimization library. |
4 * |
4 * |
5 * Copyright (C) 2003-2008 |
5 * Copyright (C) 2003-2008 |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 * |
8 * |
44 /// |
44 /// |
45 /// \sa concept |
45 /// \sa concept |
46 class Digraph { |
46 class Digraph { |
47 private: |
47 private: |
48 ///Digraphs are \e not copy constructible. Use DigraphCopy() instead. |
48 ///Digraphs are \e not copy constructible. Use DigraphCopy() instead. |
49 |
49 |
50 ///Digraphs are \e not copy constructible. Use DigraphCopy() instead. |
50 ///Digraphs are \e not copy constructible. Use DigraphCopy() instead. |
51 /// |
51 /// |
52 Digraph(const Digraph &) {}; |
52 Digraph(const Digraph &) {}; |
53 ///\brief Assignment of \ref Digraph "Digraph"s to another ones are |
53 ///\brief Assignment of \ref Digraph "Digraph"s to another ones are |
54 ///\e not allowed. Use DigraphCopy() instead. |
54 ///\e not allowed. Use DigraphCopy() instead. |
55 |
55 |
56 ///Assignment of \ref Digraph "Digraph"s to another ones are |
56 ///Assignment of \ref Digraph "Digraph"s to another ones are |
57 ///\e not allowed. Use DigraphCopy() instead. |
57 ///\e not allowed. Use DigraphCopy() instead. |
58 |
58 |
59 void operator=(const Digraph &) {} |
59 void operator=(const Digraph &) {} |
60 public: |
60 public: |
93 /// Two iterators are equal if and only if they point to the |
93 /// Two iterators are equal if and only if they point to the |
94 /// same object or both are invalid. |
94 /// same object or both are invalid. |
95 bool operator==(Node) const { return true; } |
95 bool operator==(Node) const { return true; } |
96 |
96 |
97 /// Inequality operator |
97 /// Inequality operator |
98 |
98 |
99 /// \sa operator==(Node n) |
99 /// \sa operator==(Node n) |
100 /// |
100 /// |
101 bool operator!=(Node) const { return true; } |
101 bool operator!=(Node) const { return true; } |
102 |
102 |
103 /// Artificial ordering operator. |
103 /// Artificial ordering operator. |
104 |
104 |
105 /// To allow the use of digraph descriptors as key type in std::map or |
105 /// To allow the use of digraph descriptors as key type in std::map or |
106 /// similar associative container we require this. |
106 /// similar associative container we require this. |
107 /// |
107 /// |
108 /// \note This operator only have to define some strict ordering of |
108 /// \note This operator only have to define some strict ordering of |
109 /// the items; this order has nothing to do with the iteration |
109 /// the items; this order has nothing to do with the iteration |
110 /// ordering of the items. |
110 /// ordering of the items. |
111 bool operator<(Node) const { return false; } |
111 bool operator<(Node) const { return false; } |
112 |
112 |
113 }; |
113 }; |
114 |
114 |
115 /// This iterator goes through each node. |
115 /// This iterator goes through each node. |
116 |
116 |
117 /// This iterator goes through each node. |
117 /// This iterator goes through each node. |
118 /// Its usage is quite simple, for example you can count the number |
118 /// Its usage is quite simple, for example you can count the number |
119 /// of nodes in digraph \c g of type \c Digraph like this: |
119 /// of nodes in digraph \c g of type \c Digraph like this: |
127 |
127 |
128 /// @warning The default constructor sets the iterator |
128 /// @warning The default constructor sets the iterator |
129 /// to an undefined value. |
129 /// to an undefined value. |
130 NodeIt() { } |
130 NodeIt() { } |
131 /// Copy constructor. |
131 /// Copy constructor. |
132 |
132 |
133 /// Copy constructor. |
133 /// Copy constructor. |
134 /// |
134 /// |
135 NodeIt(const NodeIt& n) : Node(n) { } |
135 NodeIt(const NodeIt& n) : Node(n) { } |
136 /// Invalid constructor \& conversion. |
136 /// Invalid constructor \& conversion. |
137 |
137 |
143 /// Sets the iterator to the first node of \c g. |
143 /// Sets the iterator to the first node of \c g. |
144 /// |
144 /// |
145 NodeIt(const Digraph&) { } |
145 NodeIt(const Digraph&) { } |
146 /// Node -> NodeIt conversion. |
146 /// Node -> NodeIt conversion. |
147 |
147 |
148 /// Sets the iterator to the node of \c the digraph pointed by |
148 /// Sets the iterator to the node of \c the digraph pointed by |
149 /// the trivial iterator. |
149 /// the trivial iterator. |
150 /// This feature necessitates that each time we |
150 /// This feature necessitates that each time we |
151 /// iterate the arc-set, the iteration order is the same. |
151 /// iterate the arc-set, the iteration order is the same. |
152 NodeIt(const Digraph&, const Node&) { } |
152 NodeIt(const Digraph&, const Node&) { } |
153 /// Next node. |
153 /// Next node. |
154 |
154 |
155 /// Assign the iterator to the next node. |
155 /// Assign the iterator to the next node. |
156 /// |
156 /// |
157 NodeIt& operator++() { return *this; } |
157 NodeIt& operator++() { return *this; } |
158 }; |
158 }; |
159 |
159 |
160 |
160 |
161 /// Class for identifying an arc of the digraph |
161 /// Class for identifying an arc of the digraph |
162 |
162 |
163 /// This class identifies an arc of the digraph. It also serves |
163 /// This class identifies an arc of the digraph. It also serves |
164 /// as a base class of the arc iterators, |
164 /// as a base class of the arc iterators, |
165 /// thus they will convert to this type. |
165 /// thus they will convert to this type. |
189 |
189 |
190 /// \sa operator==(Arc n) |
190 /// \sa operator==(Arc n) |
191 /// |
191 /// |
192 bool operator!=(Arc) const { return true; } |
192 bool operator!=(Arc) const { return true; } |
193 |
193 |
194 /// Artificial ordering operator. |
194 /// Artificial ordering operator. |
195 |
195 |
196 /// To allow the use of digraph descriptors as key type in std::map or |
196 /// To allow the use of digraph descriptors as key type in std::map or |
197 /// similar associative container we require this. |
197 /// similar associative container we require this. |
198 /// |
198 /// |
199 /// \note This operator only have to define some strict ordering of |
199 /// \note This operator only have to define some strict ordering of |
200 /// the items; this order has nothing to do with the iteration |
200 /// the items; this order has nothing to do with the iteration |
201 /// ordering of the items. |
201 /// ordering of the items. |
202 bool operator<(Arc) const { return false; } |
202 bool operator<(Arc) const { return false; } |
203 }; |
203 }; |
204 |
204 |
205 /// This iterator goes trough the outgoing arcs of a node. |
205 /// This iterator goes trough the outgoing arcs of a node. |
206 |
206 |
207 /// This iterator goes trough the \e outgoing arcs of a certain node |
207 /// This iterator goes trough the \e outgoing arcs of a certain node |
208 /// of a digraph. |
208 /// of a digraph. |
209 /// Its usage is quite simple, for example you can count the number |
209 /// Its usage is quite simple, for example you can count the number |
211 /// in digraph \c g of type \c Digraph as follows. |
211 /// in digraph \c g of type \c Digraph as follows. |
212 ///\code |
212 ///\code |
213 /// int count=0; |
213 /// int count=0; |
214 /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count; |
214 /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count; |
215 ///\endcode |
215 ///\endcode |
216 |
216 |
217 class OutArcIt : public Arc { |
217 class OutArcIt : public Arc { |
218 public: |
218 public: |
219 /// Default constructor |
219 /// Default constructor |
220 |
220 |
221 /// @warning The default constructor sets the iterator |
221 /// @warning The default constructor sets the iterator |
230 |
230 |
231 /// Initialize the iterator to be invalid. |
231 /// Initialize the iterator to be invalid. |
232 /// |
232 /// |
233 OutArcIt(Invalid) { } |
233 OutArcIt(Invalid) { } |
234 /// This constructor sets the iterator to the first outgoing arc. |
234 /// This constructor sets the iterator to the first outgoing arc. |
235 |
235 |
236 /// This constructor sets the iterator to the first outgoing arc of |
236 /// This constructor sets the iterator to the first outgoing arc of |
237 /// the node. |
237 /// the node. |
238 OutArcIt(const Digraph&, const Node&) { } |
238 OutArcIt(const Digraph&, const Node&) { } |
239 /// Arc -> OutArcIt conversion |
239 /// Arc -> OutArcIt conversion |
240 |
240 |
241 /// Sets the iterator to the value of the trivial iterator. |
241 /// Sets the iterator to the value of the trivial iterator. |
242 /// This feature necessitates that each time we |
242 /// This feature necessitates that each time we |
243 /// iterate the arc-set, the iteration order is the same. |
243 /// iterate the arc-set, the iteration order is the same. |
244 OutArcIt(const Digraph&, const Arc&) { } |
244 OutArcIt(const Digraph&, const Arc&) { } |
245 ///Next outgoing arc |
245 ///Next outgoing arc |
246 |
246 |
247 /// Assign the iterator to the next |
247 /// Assign the iterator to the next |
248 /// outgoing arc of the corresponding node. |
248 /// outgoing arc of the corresponding node. |
249 OutArcIt& operator++() { return *this; } |
249 OutArcIt& operator++() { return *this; } |
250 }; |
250 }; |
251 |
251 |
252 /// This iterator goes trough the incoming arcs of a node. |
252 /// This iterator goes trough the incoming arcs of a node. |
277 |
277 |
278 /// Initialize the iterator to be invalid. |
278 /// Initialize the iterator to be invalid. |
279 /// |
279 /// |
280 InArcIt(Invalid) { } |
280 InArcIt(Invalid) { } |
281 /// This constructor sets the iterator to first incoming arc. |
281 /// This constructor sets the iterator to first incoming arc. |
282 |
282 |
283 /// This constructor set the iterator to the first incoming arc of |
283 /// This constructor set the iterator to the first incoming arc of |
284 /// the node. |
284 /// the node. |
285 InArcIt(const Digraph&, const Node&) { } |
285 InArcIt(const Digraph&, const Node&) { } |
286 /// Arc -> InArcIt conversion |
286 /// Arc -> InArcIt conversion |
287 |
287 |
288 /// Sets the iterator to the value of the trivial iterator \c e. |
288 /// Sets the iterator to the value of the trivial iterator \c e. |
289 /// This feature necessitates that each time we |
289 /// This feature necessitates that each time we |
290 /// iterate the arc-set, the iteration order is the same. |
290 /// iterate the arc-set, the iteration order is the same. |
291 InArcIt(const Digraph&, const Arc&) { } |
291 InArcIt(const Digraph&, const Arc&) { } |
292 /// Next incoming arc |
292 /// Next incoming arc |
293 |
293 |
294 /// Assign the iterator to the next inarc of the corresponding node. |
294 /// Assign the iterator to the next inarc of the corresponding node. |
320 |
320 |
321 /// Initialize the iterator to be invalid. |
321 /// Initialize the iterator to be invalid. |
322 /// |
322 /// |
323 ArcIt(Invalid) { } |
323 ArcIt(Invalid) { } |
324 /// This constructor sets the iterator to the first arc. |
324 /// This constructor sets the iterator to the first arc. |
325 |
325 |
326 /// This constructor sets the iterator to the first arc of \c g. |
326 /// This constructor sets the iterator to the first arc of \c g. |
327 ///@param g the digraph |
327 ///@param g the digraph |
328 ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); } |
328 ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); } |
329 /// Arc -> ArcIt conversion |
329 /// Arc -> ArcIt conversion |
330 |
330 |
331 /// Sets the iterator to the value of the trivial iterator \c e. |
331 /// Sets the iterator to the value of the trivial iterator \c e. |
332 /// This feature necessitates that each time we |
332 /// This feature necessitates that each time we |
333 /// iterate the arc-set, the iteration order is the same. |
333 /// iterate the arc-set, the iteration order is the same. |
334 ArcIt(const Digraph&, const Arc&) { } |
334 ArcIt(const Digraph&, const Arc&) { } |
335 ///Next arc |
335 ///Next arc |
336 |
336 |
337 /// Assign the iterator to the next arc. |
337 /// Assign the iterator to the next arc. |
338 ArcIt& operator++() { return *this; } |
338 ArcIt& operator++() { return *this; } |
339 }; |
339 }; |
340 ///Gives back the target node of an arc. |
340 ///Gives back the target node of an arc. |
341 |
341 |
347 ///Gives back the source node of an arc. |
347 ///Gives back the source node of an arc. |
348 /// |
348 /// |
349 Node source(Arc) const { return INVALID; } |
349 Node source(Arc) const { return INVALID; } |
350 |
350 |
351 /// \brief Returns the ID of the node. |
351 /// \brief Returns the ID of the node. |
352 int id(Node) const { return -1; } |
352 int id(Node) const { return -1; } |
353 |
353 |
354 /// \brief Returns the ID of the arc. |
354 /// \brief Returns the ID of the arc. |
355 int id(Arc) const { return -1; } |
355 int id(Arc) const { return -1; } |
356 |
356 |
357 /// \brief Returns the node with the given ID. |
357 /// \brief Returns the node with the given ID. |
358 /// |
358 /// |
359 /// \pre The argument should be a valid node ID in the graph. |
359 /// \pre The argument should be a valid node ID in the graph. |
360 Node nodeFromId(int) const { return INVALID; } |
360 Node nodeFromId(int) const { return INVALID; } |
361 |
361 |
362 /// \brief Returns the arc with the given ID. |
362 /// \brief Returns the arc with the given ID. |
363 /// |
363 /// |
364 /// \pre The argument should be a valid arc ID in the graph. |
364 /// \pre The argument should be a valid arc ID in the graph. |
365 Arc arcFromId(int) const { return INVALID; } |
365 Arc arcFromId(int) const { return INVALID; } |
366 |
366 |
367 /// \brief Returns an upper bound on the node IDs. |
367 /// \brief Returns an upper bound on the node IDs. |
368 int maxNodeId() const { return -1; } |
368 int maxNodeId() const { return -1; } |
369 |
369 |
370 /// \brief Returns an upper bound on the arc IDs. |
370 /// \brief Returns an upper bound on the arc IDs. |
371 int maxArcId() const { return -1; } |
371 int maxArcId() const { return -1; } |
372 |
372 |
373 void first(Node&) const {} |
373 void first(Node&) const {} |
374 void next(Node&) const {} |
374 void next(Node&) const {} |
375 |
375 |
376 void first(Arc&) const {} |
376 void first(Arc&) const {} |
387 Node fromId(int, Node) const { return INVALID; } |
387 Node fromId(int, Node) const { return INVALID; } |
388 // The second parameter is dummy. |
388 // The second parameter is dummy. |
389 Arc fromId(int, Arc) const { return INVALID; } |
389 Arc fromId(int, Arc) const { return INVALID; } |
390 |
390 |
391 // Dummy parameter. |
391 // Dummy parameter. |
392 int maxId(Node) const { return -1; } |
392 int maxId(Node) const { return -1; } |
393 // Dummy parameter. |
393 // Dummy parameter. |
394 int maxId(Arc) const { return -1; } |
394 int maxId(Arc) const { return -1; } |
395 |
395 |
396 /// \brief The base node of the iterator. |
396 /// \brief The base node of the iterator. |
397 /// |
397 /// |
398 /// Gives back the base node of the iterator. |
398 /// Gives back the base node of the iterator. |
399 /// It is always the target of the pointed arc. |
399 /// It is always the target of the pointed arc. |
421 /// |
421 /// |
422 /// Gives back the opposite node on the given arc. |
422 /// Gives back the opposite node on the given arc. |
423 Node oppositeNode(const Node&, const Arc&) const { return INVALID; } |
423 Node oppositeNode(const Node&, const Arc&) const { return INVALID; } |
424 |
424 |
425 /// \brief Read write map of the nodes to type \c T. |
425 /// \brief Read write map of the nodes to type \c T. |
426 /// |
426 /// |
427 /// ReadWrite map of the nodes to type \c T. |
427 /// ReadWrite map of the nodes to type \c T. |
428 /// \sa Reference |
428 /// \sa Reference |
429 template<class T> |
429 template<class T> |
430 class NodeMap : public ReadWriteMap< Node, T > { |
430 class NodeMap : public ReadWriteMap< Node, T > { |
431 public: |
431 public: |
432 |
432 |
433 ///\e |
433 ///\e |
434 NodeMap(const Digraph&) { } |
434 NodeMap(const Digraph&) { } |
437 |
437 |
438 ///Copy constructor |
438 ///Copy constructor |
439 NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { } |
439 NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { } |
440 ///Assignment operator |
440 ///Assignment operator |
441 template <typename CMap> |
441 template <typename CMap> |
442 NodeMap& operator=(const CMap&) { |
442 NodeMap& operator=(const CMap&) { |
443 checkConcept<ReadMap<Node, T>, CMap>(); |
443 checkConcept<ReadMap<Node, T>, CMap>(); |
444 return *this; |
444 return *this; |
445 } |
445 } |
446 }; |
446 }; |
447 |
447 |
448 /// \brief Read write map of the arcs to type \c T. |
448 /// \brief Read write map of the arcs to type \c T. |
449 /// |
449 /// |
450 /// Reference map of the arcs to type \c T. |
450 /// Reference map of the arcs to type \c T. |
451 /// \sa Reference |
451 /// \sa Reference |
452 template<class T> |
452 template<class T> |
453 class ArcMap : public ReadWriteMap<Arc,T> { |
453 class ArcMap : public ReadWriteMap<Arc,T> { |
454 public: |
454 public: |
455 |
455 |
456 ///\e |
456 ///\e |
457 ArcMap(const Digraph&) { } |
457 ArcMap(const Digraph&) { } |
459 ArcMap(const Digraph&, T) { } |
459 ArcMap(const Digraph&, T) { } |
460 ///Copy constructor |
460 ///Copy constructor |
461 ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { } |
461 ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { } |
462 ///Assignment operator |
462 ///Assignment operator |
463 template <typename CMap> |
463 template <typename CMap> |
464 ArcMap& operator=(const CMap&) { |
464 ArcMap& operator=(const CMap&) { |
465 checkConcept<ReadMap<Arc, T>, CMap>(); |
465 checkConcept<ReadMap<Arc, T>, CMap>(); |
466 return *this; |
466 return *this; |
467 } |
467 } |
468 }; |
468 }; |
469 |
469 |
470 template <typename _Digraph> |
470 template <typename _Digraph> |
471 struct Constraints { |
471 struct Constraints { |
472 void constraints() { |
472 void constraints() { |
473 checkConcept<IterableDigraphComponent<>, _Digraph>(); |
473 checkConcept<IterableDigraphComponent<>, _Digraph>(); |
474 checkConcept<IDableDigraphComponent<>, _Digraph>(); |
474 checkConcept<IDableDigraphComponent<>, _Digraph>(); |
475 checkConcept<MappableDigraphComponent<>, _Digraph>(); |
475 checkConcept<MappableDigraphComponent<>, _Digraph>(); |
476 } |
476 } |
477 }; |
477 }; |
478 |
478 |
479 }; |
479 }; |
480 |
480 |
481 } //namespace concepts |
481 } //namespace concepts |
482 } //namespace lemon |
482 } //namespace lemon |
483 |
483 |
484 |
484 |
485 |
485 |
486 #endif // LEMON_CONCEPT_DIGRAPH_H |
486 #endif // LEMON_CONCEPT_DIGRAPH_H |