Small changes in min. cost flow algorithms.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2007
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 /// \ingroup graph_concepts
21 /// \brief Undirected bipartite graphs and components of.
24 #ifndef LEMON_CONCEPT_BPUGRAPH_H
25 #define LEMON_CONCEPT_BPUGRAPH_H
27 #include <lemon/concepts/graph_components.h>
29 #include <lemon/concepts/graph.h>
30 #include <lemon/concepts/ugraph.h>
32 #include <lemon/bits/utility.h>
37 /// \addtogroup graph_concepts
41 /// \brief Class describing the concept of Bipartite Undirected Graphs.
43 /// This class describes the common interface of all
44 /// Undirected Bipartite Graphs.
46 /// As all concept describing classes it provides only interface
47 /// without any sensible implementation. So any algorithm for
48 /// bipartite undirected graph should compile with this class, but it
49 /// will not run properly, of course.
51 /// In LEMON bipartite undirected graphs also fulfill the concept of
52 /// the undirected graphs (\ref lemon::concepts::UGraph "UGraph Concept").
54 /// You can assume that all undirected bipartite graph can be handled
55 /// as an undirected graph and consequently as a static graph.
57 /// The bipartite graph stores two types of nodes which are named
58 /// ANode and BNode. The graph type contains two types ANode and
59 /// BNode which are inherited from Node type. Moreover they have
60 /// constructor which converts Node to either ANode or BNode when
61 /// it is possible. Therefor everywhere the Node type can be used
62 /// instead of ANode and BNode. So the usage of the ANode and
63 /// BNode is not suggested.
65 /// The iteration on the partition can be done with the ANodeIt and
66 /// BNodeIt classes. The node map can be used to map values to the nodes
67 /// and similarly we can use to map values for just the ANodes and
68 /// BNodes the ANodeMap and BNodeMap template classes.
72 /// \brief The undirected graph should be tagged by the
75 /// The undirected graph should be tagged by the UndirectedTag. This
76 /// tag helps the enable_if technics to make compile time
77 /// specializations for undirected graphs.
78 typedef True UndirectedTag;
80 /// \brief The base type of node iterators,
81 /// or in other words, the trivial node iterator.
83 /// This is the base type of each node iterator,
84 /// thus each kind of node iterator converts to this.
85 /// More precisely each kind of node iterator should be inherited
86 /// from the trivial node iterator. The Node class represents
87 /// both of two types of nodes.
90 /// Default constructor
92 /// @warning The default constructor sets the iterator
93 /// to an undefined value.
101 /// Invalid constructor \& conversion.
103 /// This constructor initializes the iterator to be invalid.
104 /// \sa Invalid for more details.
106 /// Equality operator
108 /// Two iterators are equal if and only if they point to the
109 /// same object or both are invalid.
110 bool operator==(Node) const { return true; }
112 /// Inequality operator
114 /// \sa operator==(Node n)
116 bool operator!=(Node) const { return true; }
118 /// Artificial ordering operator.
120 /// To allow the use of graph descriptors as key type in std::map or
121 /// similar associative container we require this.
123 /// \note This operator only have to define some strict ordering of
124 /// the items; this order has nothing to do with the iteration
125 /// ordering of the items.
126 bool operator<(Node) const { return false; }
130 /// \brief Helper class for ANodes.
132 /// This class is just a helper class for ANodes, it is not
133 /// suggested to use it directly. It can be converted easily to
134 /// node and vice versa. The usage of this class is limited
135 /// to use just as template parameters for special map types.
136 class ANode : public Node {
138 /// Default constructor
140 /// @warning The default constructor sets the iterator
141 /// to an undefined value.
143 /// Copy constructor.
145 /// Copy constructor.
147 ANode(const ANode&) : Node() { }
149 /// Construct the same node as ANode.
151 /// Construct the same node as ANode. It may throws assertion
152 /// when the given node is from the BNode set.
153 ANode(const Node&) : Node() { }
155 /// Assign node to A-node.
157 /// Besides the core graph item functionality each node should
158 /// be convertible to the represented A-node if it is it possible.
159 ANode& operator=(const Node&) { return *this; }
161 /// Invalid constructor \& conversion.
163 /// This constructor initializes the iterator to be invalid.
164 /// \sa Invalid for more details.
166 /// Equality operator
168 /// Two iterators are equal if and only if they point to the
169 /// same object or both are invalid.
170 bool operator==(ANode) const { return true; }
172 /// Inequality operator
174 /// \sa operator==(ANode n)
176 bool operator!=(ANode) const { return true; }
178 /// Artificial ordering operator.
180 /// To allow the use of graph descriptors as key type in std::map or
181 /// similar associative container we require this.
183 /// \note This operator only have to define some strict ordering of
184 /// the items; this order has nothing to do with the iteration
185 /// ordering of the items.
186 bool operator<(ANode) const { return false; }
190 /// \brief Helper class for BNodes.
192 /// This class is just a helper class for BNodes, it is not
193 /// suggested to use it directly. It can be converted easily to
194 /// node and vice versa. The usage of this class is limited
195 /// to use just as template parameters for special map types.
196 class BNode : public Node {
198 /// Default constructor
200 /// @warning The default constructor sets the iterator
201 /// to an undefined value.
203 /// Copy constructor.
205 /// Copy constructor.
207 BNode(const BNode&) : Node() { }
209 /// Construct the same node as BNode.
211 /// Construct the same node as BNode. It may throws assertion
212 /// when the given node is from the ANode set.
213 BNode(const Node&) : Node() { }
215 /// Assign node to B-node.
217 /// Besides the core graph item functionality each node should
218 /// be convertible to the represented B-node if it is it possible.
219 BNode& operator=(const Node&) { return *this; }
221 /// Invalid constructor \& conversion.
223 /// This constructor initializes the iterator to be invalid.
224 /// \sa Invalid for more details.
226 /// Equality operator
228 /// Two iterators are equal if and only if they point to the
229 /// same object or both are invalid.
230 bool operator==(BNode) const { return true; }
232 /// Inequality operator
234 /// \sa operator==(BNode n)
236 bool operator!=(BNode) const { return true; }
238 /// Artificial ordering operator.
240 /// To allow the use of graph descriptors as key type in std::map or
241 /// similar associative container we require this.
243 /// \note This operator only have to define some strict ordering of
244 /// the items; this order has nothing to do with the iteration
245 /// ordering of the items.
246 bool operator<(BNode) const { return false; }
250 /// This iterator goes through each node.
252 /// This iterator goes through each node.
253 /// Its usage is quite simple, for example you can count the number
254 /// of nodes in graph \c g of type \c Graph like this:
257 /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
259 class NodeIt : public Node {
261 /// Default constructor
263 /// @warning The default constructor sets the iterator
264 /// to an undefined value.
266 /// Copy constructor.
268 /// Copy constructor.
270 NodeIt(const NodeIt& n) : Node(n) { }
271 /// Invalid constructor \& conversion.
273 /// Initialize the iterator to be invalid.
274 /// \sa Invalid for more details.
276 /// Sets the iterator to the first node.
278 /// Sets the iterator to the first node of \c g.
280 NodeIt(const BpUGraph&) { }
281 /// Node -> NodeIt conversion.
283 /// Sets the iterator to the node of \c the graph pointed by
284 /// the trivial iterator.
285 /// This feature necessitates that each time we
286 /// iterate the edge-set, the iteration order is the same.
287 NodeIt(const BpUGraph&, const Node&) { }
290 /// Assign the iterator to the next node.
292 NodeIt& operator++() { return *this; }
295 /// This iterator goes through each ANode.
297 /// This iterator goes through each ANode.
298 /// Its usage is quite simple, for example you can count the number
299 /// of nodes in graph \c g of type \c Graph like this:
302 /// for (Graph::ANodeIt n(g); n!=INVALID; ++n) ++count;
304 class ANodeIt : public Node {
306 /// Default constructor
308 /// @warning The default constructor sets the iterator
309 /// to an undefined value.
311 /// Copy constructor.
313 /// Copy constructor.
315 ANodeIt(const ANodeIt& n) : Node(n) { }
316 /// Invalid constructor \& conversion.
318 /// Initialize the iterator to be invalid.
319 /// \sa Invalid for more details.
321 /// Sets the iterator to the first node.
323 /// Sets the iterator to the first node of \c g.
325 ANodeIt(const BpUGraph&) { }
326 /// Node -> ANodeIt conversion.
328 /// Sets the iterator to the node of \c the graph pointed by
329 /// the trivial iterator.
330 /// This feature necessitates that each time we
331 /// iterate the edge-set, the iteration order is the same.
332 ANodeIt(const BpUGraph&, const Node&) { }
335 /// Assign the iterator to the next node.
337 ANodeIt& operator++() { return *this; }
340 /// This iterator goes through each BNode.
342 /// This iterator goes through each BNode.
343 /// Its usage is quite simple, for example you can count the number
344 /// of nodes in graph \c g of type \c Graph like this:
347 /// for (Graph::BNodeIt n(g); n!=INVALID; ++n) ++count;
349 class BNodeIt : public Node {
351 /// Default constructor
353 /// @warning The default constructor sets the iterator
354 /// to an undefined value.
356 /// Copy constructor.
358 /// Copy constructor.
360 BNodeIt(const BNodeIt& n) : Node(n) { }
361 /// Invalid constructor \& conversion.
363 /// Initialize the iterator to be invalid.
364 /// \sa Invalid for more details.
366 /// Sets the iterator to the first node.
368 /// Sets the iterator to the first node of \c g.
370 BNodeIt(const BpUGraph&) { }
371 /// Node -> BNodeIt conversion.
373 /// Sets the iterator to the node of \c the graph pointed by
374 /// the trivial iterator.
375 /// This feature necessitates that each time we
376 /// iterate the edge-set, the iteration order is the same.
377 BNodeIt(const BpUGraph&, const Node&) { }
380 /// Assign the iterator to the next node.
382 BNodeIt& operator++() { return *this; }
386 /// The base type of the undirected edge iterators.
388 /// The base type of the undirected edge iterators.
392 /// Default constructor
394 /// @warning The default constructor sets the iterator
395 /// to an undefined value.
397 /// Copy constructor.
399 /// Copy constructor.
401 UEdge(const UEdge&) { }
402 /// Initialize the iterator to be invalid.
404 /// Initialize the iterator to be invalid.
407 /// Equality operator
409 /// Two iterators are equal if and only if they point to the
410 /// same object or both are invalid.
411 bool operator==(UEdge) const { return true; }
412 /// Inequality operator
414 /// \sa operator==(UEdge n)
416 bool operator!=(UEdge) const { return true; }
418 /// Artificial ordering operator.
420 /// To allow the use of graph descriptors as key type in std::map or
421 /// similar associative container we require this.
423 /// \note This operator only have to define some strict ordering of
424 /// the items; this order has nothing to do with the iteration
425 /// ordering of the items.
426 bool operator<(UEdge) const { return false; }
429 /// This iterator goes through each undirected edge.
431 /// This iterator goes through each undirected edge of a graph.
432 /// Its usage is quite simple, for example you can count the number
433 /// of undirected edges in a graph \c g of type \c Graph as follows:
436 /// for(Graph::UEdgeIt e(g); e!=INVALID; ++e) ++count;
438 class UEdgeIt : public UEdge {
440 /// Default constructor
442 /// @warning The default constructor sets the iterator
443 /// to an undefined value.
445 /// Copy constructor.
447 /// Copy constructor.
449 UEdgeIt(const UEdgeIt& e) : UEdge(e) { }
450 /// Initialize the iterator to be invalid.
452 /// Initialize the iterator to be invalid.
455 /// This constructor sets the iterator to the first undirected edge.
457 /// This constructor sets the iterator to the first undirected edge.
458 UEdgeIt(const BpUGraph&) { }
459 /// UEdge -> UEdgeIt conversion
461 /// Sets the iterator to the value of the trivial iterator.
462 /// This feature necessitates that each time we
463 /// iterate the undirected edge-set, the iteration order is the
465 UEdgeIt(const BpUGraph&, const UEdge&) { }
466 /// Next undirected edge
468 /// Assign the iterator to the next undirected edge.
469 UEdgeIt& operator++() { return *this; }
472 /// \brief This iterator goes trough the incident undirected
475 /// This iterator goes trough the incident undirected edges
476 /// of a certain node
478 /// Its usage is quite simple, for example you can compute the
479 /// degree (i.e. count the number
480 /// of incident edges of a node \c n
481 /// in graph \c g of type \c Graph as follows.
484 /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
486 class IncEdgeIt : public UEdge {
488 /// Default constructor
490 /// @warning The default constructor sets the iterator
491 /// to an undefined value.
493 /// Copy constructor.
495 /// Copy constructor.
497 IncEdgeIt(const IncEdgeIt& e) : UEdge(e) { }
498 /// Initialize the iterator to be invalid.
500 /// Initialize the iterator to be invalid.
502 IncEdgeIt(Invalid) { }
503 /// This constructor sets the iterator to first incident edge.
505 /// This constructor set the iterator to the first incident edge of
507 IncEdgeIt(const BpUGraph&, const Node&) { }
508 /// UEdge -> IncEdgeIt conversion
510 /// Sets the iterator to the value of the trivial iterator \c e.
511 /// This feature necessitates that each time we
512 /// iterate the edge-set, the iteration order is the same.
513 IncEdgeIt(const BpUGraph&, const UEdge&) { }
514 /// Next incident edge
516 /// Assign the iterator to the next incident edge
517 /// of the corresponding node.
518 IncEdgeIt& operator++() { return *this; }
521 /// The directed edge type.
523 /// The directed edge type. It can be converted to the
525 class Edge : public UEdge {
527 /// Default constructor
529 /// @warning The default constructor sets the iterator
530 /// to an undefined value.
532 /// Copy constructor.
534 /// Copy constructor.
536 Edge(const Edge& e) : UEdge(e) { }
537 /// Initialize the iterator to be invalid.
539 /// Initialize the iterator to be invalid.
542 /// Equality operator
544 /// Two iterators are equal if and only if they point to the
545 /// same object or both are invalid.
546 bool operator==(Edge) const { return true; }
547 /// Inequality operator
549 /// \sa operator==(Edge n)
551 bool operator!=(Edge) const { return true; }
553 /// Artificial ordering operator.
555 /// To allow the use of graph descriptors as key type in std::map or
556 /// similar associative container we require this.
558 /// \note This operator only have to define some strict ordering of
559 /// the items; this order has nothing to do with the iteration
560 /// ordering of the items.
561 bool operator<(Edge) const { return false; }
564 /// This iterator goes through each directed edge.
566 /// This iterator goes through each edge of a graph.
567 /// Its usage is quite simple, for example you can count the number
568 /// of edges in a graph \c g of type \c Graph as follows:
571 /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
573 class EdgeIt : public Edge {
575 /// Default constructor
577 /// @warning The default constructor sets the iterator
578 /// to an undefined value.
580 /// Copy constructor.
582 /// Copy constructor.
584 EdgeIt(const EdgeIt& e) : Edge(e) { }
585 /// Initialize the iterator to be invalid.
587 /// Initialize the iterator to be invalid.
590 /// This constructor sets the iterator to the first edge.
592 /// This constructor sets the iterator to the first edge of \c g.
593 ///@param g the graph
594 EdgeIt(const BpUGraph &g) { ignore_unused_variable_warning(g); }
595 /// Edge -> EdgeIt conversion
597 /// Sets the iterator to the value of the trivial iterator \c e.
598 /// This feature necessitates that each time we
599 /// iterate the edge-set, the iteration order is the same.
600 EdgeIt(const BpUGraph&, const Edge&) { }
603 /// Assign the iterator to the next edge.
604 EdgeIt& operator++() { return *this; }
607 /// This iterator goes trough the outgoing directed edges of a node.
609 /// This iterator goes trough the \e outgoing edges of a certain node
611 /// Its usage is quite simple, for example you can count the number
612 /// of outgoing edges of a node \c n
613 /// in graph \c g of type \c Graph as follows.
616 /// for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) ++count;
619 class OutEdgeIt : public Edge {
621 /// Default constructor
623 /// @warning The default constructor sets the iterator
624 /// to an undefined value.
626 /// Copy constructor.
628 /// Copy constructor.
630 OutEdgeIt(const OutEdgeIt& e) : Edge(e) { }
631 /// Initialize the iterator to be invalid.
633 /// Initialize the iterator to be invalid.
635 OutEdgeIt(Invalid) { }
636 /// This constructor sets the iterator to the first outgoing edge.
638 /// This constructor sets the iterator to the first outgoing edge of
641 ///@param g the graph
642 OutEdgeIt(const BpUGraph& n, const Node& g) {
643 ignore_unused_variable_warning(n);
644 ignore_unused_variable_warning(g);
646 /// Edge -> OutEdgeIt conversion
648 /// Sets the iterator to the value of the trivial iterator.
649 /// This feature necessitates that each time we
650 /// iterate the edge-set, the iteration order is the same.
651 OutEdgeIt(const BpUGraph&, const Edge&) { }
652 ///Next outgoing edge
654 /// Assign the iterator to the next
655 /// outgoing edge of the corresponding node.
656 OutEdgeIt& operator++() { return *this; }
659 /// This iterator goes trough the incoming directed edges of a node.
661 /// This iterator goes trough the \e incoming edges of a certain node
663 /// Its usage is quite simple, for example you can count the number
664 /// of outgoing edges of a node \c n
665 /// in graph \c g of type \c Graph as follows.
668 /// for(Graph::InEdgeIt e(g, n); e!=INVALID; ++e) ++count;
671 class InEdgeIt : public Edge {
673 /// Default constructor
675 /// @warning The default constructor sets the iterator
676 /// to an undefined value.
678 /// Copy constructor.
680 /// Copy constructor.
682 InEdgeIt(const InEdgeIt& e) : Edge(e) { }
683 /// Initialize the iterator to be invalid.
685 /// Initialize the iterator to be invalid.
687 InEdgeIt(Invalid) { }
688 /// This constructor sets the iterator to first incoming edge.
690 /// This constructor set the iterator to the first incoming edge of
693 ///@param g the graph
694 InEdgeIt(const BpUGraph& g, const Node& n) {
695 ignore_unused_variable_warning(n);
696 ignore_unused_variable_warning(g);
698 /// Edge -> InEdgeIt conversion
700 /// Sets the iterator to the value of the trivial iterator \c e.
701 /// This feature necessitates that each time we
702 /// iterate the edge-set, the iteration order is the same.
703 InEdgeIt(const BpUGraph&, const Edge&) { }
704 /// Next incoming edge
706 /// Assign the iterator to the next inedge of the corresponding node.
708 InEdgeIt& operator++() { return *this; }
711 /// \brief Read write map of the nodes to type \c T.
713 /// ReadWrite map of the nodes to type \c T.
715 /// \todo Wrong documentation
717 class NodeMap : public ReadWriteMap< Node, T >
722 NodeMap(const BpUGraph&) { }
724 NodeMap(const BpUGraph&, T) { }
727 NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
728 ///Assignment operator
729 NodeMap& operator=(const NodeMap&) { return *this; }
730 ///Assignment operator
731 template <typename CMap>
732 NodeMap& operator=(const CMap&) {
733 checkConcept<ReadMap<Node, T>, CMap>();
738 /// \brief Read write map of the ANodes to type \c T.
740 /// ReadWrite map of the ANodes to type \c T.
742 /// \todo Wrong documentation
744 class ANodeMap : public ReadWriteMap< Node, T >
749 ANodeMap(const BpUGraph&) { }
751 ANodeMap(const BpUGraph&, T) { }
754 ANodeMap(const ANodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
755 ///Assignment operator
756 ANodeMap& operator=(const ANodeMap&) { return *this; }
757 ///Assignment operator
758 template <typename CMap>
759 ANodeMap& operator=(const CMap&) {
760 checkConcept<ReadMap<Node, T>, CMap>();
765 /// \brief Read write map of the BNodes to type \c T.
767 /// ReadWrite map of the BNodes to type \c T.
769 /// \todo Wrong documentation
771 class BNodeMap : public ReadWriteMap< Node, T >
776 BNodeMap(const BpUGraph&) { }
778 BNodeMap(const BpUGraph&, T) { }
781 BNodeMap(const BNodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
782 ///Assignment operator
783 BNodeMap& operator=(const BNodeMap&) { return *this; }
784 ///Assignment operator
785 template <typename CMap>
786 BNodeMap& operator=(const CMap&) {
787 checkConcept<ReadMap<Node, T>, CMap>();
792 /// \brief Read write map of the directed edges to type \c T.
794 /// Reference map of the directed edges to type \c T.
796 /// \todo Wrong documentation
798 class EdgeMap : public ReadWriteMap<Edge,T>
803 EdgeMap(const BpUGraph&) { }
805 EdgeMap(const BpUGraph&, T) { }
807 EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) { }
808 ///Assignment operator
809 EdgeMap& operator=(const EdgeMap&) { return *this; }
810 ///Assignment operator
811 template <typename CMap>
812 EdgeMap& operator=(const CMap&) {
813 checkConcept<ReadMap<Edge, T>, CMap>();
818 /// Read write map of the undirected edges to type \c T.
820 /// Reference map of the edges to type \c T.
822 /// \todo Wrong documentation
824 class UEdgeMap : public ReadWriteMap<UEdge,T>
829 UEdgeMap(const BpUGraph&) { }
831 UEdgeMap(const BpUGraph&, T) { }
833 UEdgeMap(const UEdgeMap& em) : ReadWriteMap<UEdge,T>(em) {}
834 ///Assignment operator
835 UEdgeMap &operator=(const UEdgeMap&) { return *this; }
836 ///Assignment operator
837 template <typename CMap>
838 UEdgeMap& operator=(const CMap&) {
839 checkConcept<ReadMap<UEdge, T>, CMap>();
844 /// \brief Direct the given undirected edge.
846 /// Direct the given undirected edge. The returned edge source
847 /// will be the given node.
848 Edge direct(const UEdge&, const Node&) const {
852 /// \brief Direct the given undirected edge.
854 /// Direct the given undirected edge. The returned edge
855 /// represents the given undirected edge and the direction comes
856 /// from the given bool. The source of the undirected edge and
857 /// the directed edge is the same when the given bool is true.
858 Edge direct(const UEdge&, bool) const {
862 /// \brief Returns true when the given node is an ANode.
864 /// Returns true when the given node is an ANode.
865 bool aNode(Node) const { return true;}
867 /// \brief Returns true when the given node is an BNode.
869 /// Returns true when the given node is an BNode.
870 bool bNode(Node) const { return true;}
872 /// \brief Returns the edge's end node which is in the ANode set.
874 /// Returns the edge's end node which is in the ANode set.
875 Node aNode(UEdge) const { return INVALID;}
877 /// \brief Returns the edge's end node which is in the BNode set.
879 /// Returns the edge's end node which is in the BNode set.
880 Node bNode(UEdge) const { return INVALID;}
882 /// \brief Returns true if the edge has default orientation.
884 /// Returns whether the given directed edge is same orientation as
885 /// the corresponding undirected edge's default orientation.
886 bool direction(Edge) const { return true; }
888 /// \brief Returns the opposite directed edge.
890 /// Returns the opposite directed edge.
891 Edge oppositeEdge(Edge) const { return INVALID; }
893 /// \brief Opposite node on an edge
895 /// \return the opposite of the given Node on the given UEdge
896 Node oppositeNode(Node, UEdge) const { return INVALID; }
898 /// \brief First node of the undirected edge.
900 /// \return the first node of the given UEdge.
902 /// Naturally undirected edges don't have direction and thus
903 /// don't have source and target node. But we use these two methods
904 /// to query the two endnodes of the edge. The direction of the edge
905 /// which arises this way is called the inherent direction of the
906 /// undirected edge, and is used to define the "default" direction
907 /// of the directed versions of the edges.
909 Node source(UEdge) const { return INVALID; }
911 /// \brief Second node of the undirected edge.
912 Node target(UEdge) const { return INVALID; }
914 /// \brief Source node of the directed edge.
915 Node source(Edge) const { return INVALID; }
917 /// \brief Target node of the directed edge.
918 Node target(Edge) const { return INVALID; }
920 /// \brief Base node of the iterator
922 /// Returns the base node (the source in this case) of the iterator
923 Node baseNode(OutEdgeIt e) const {
927 /// \brief Running node of the iterator
929 /// Returns the running node (the target in this case) of the
931 Node runningNode(OutEdgeIt e) const {
935 /// \brief Base node of the iterator
937 /// Returns the base node (the target in this case) of the iterator
938 Node baseNode(InEdgeIt e) const {
941 /// \brief Running node of the iterator
943 /// Returns the running node (the source in this case) of the
945 Node runningNode(InEdgeIt e) const {
949 /// \brief Base node of the iterator
951 /// Returns the base node of the iterator
952 Node baseNode(IncEdgeIt) const {
956 /// \brief Running node of the iterator
958 /// Returns the running node of the iterator
959 Node runningNode(IncEdgeIt) const {
963 void first(Node&) const {}
964 void next(Node&) const {}
966 void first(Edge&) const {}
967 void next(Edge&) const {}
969 void first(UEdge&) const {}
970 void next(UEdge&) const {}
972 void firstANode(Node&) const {}
973 void nextANode(Node&) const {}
975 void firstBNode(Node&) const {}
976 void nextBNode(Node&) const {}
978 void firstIn(Edge&, const Node&) const {}
979 void nextIn(Edge&) const {}
981 void firstOut(Edge&, const Node&) const {}
982 void nextOut(Edge&) const {}
984 void firstInc(UEdge &, bool &, const Node &) const {}
985 void nextInc(UEdge &, bool &) const {}
987 void firstFromANode(UEdge&, const Node&) const {}
988 void nextFromANode(UEdge&) const {}
990 void firstFromBNode(UEdge&, const Node&) const {}
991 void nextFromBNode(UEdge&) const {}
993 template <typename Graph>
996 checkConcept<IterableBpUGraphComponent<>, Graph>();
997 checkConcept<MappableBpUGraphComponent<>, Graph>();