Disable mip_test when no LP solver is available.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
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/concept/graph_components.h>
29 #include <lemon/concept/graph.h>
30 #include <lemon/concept/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::concept::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 /// two use just as template parameters for special map types.
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&) { }
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&) { }
155 /// Invalid constructor \& conversion.
157 /// This constructor initializes the iterator to be invalid.
158 /// \sa Invalid for more details.
160 /// Equality operator
162 /// Two iterators are equal if and only if they point to the
163 /// same object or both are invalid.
164 bool operator==(ANode) const { return true; }
166 /// Inequality operator
168 /// \sa operator==(ANode n)
170 bool operator!=(ANode) const { return true; }
172 /// Artificial ordering operator.
174 /// To allow the use of graph descriptors as key type in std::map or
175 /// similar associative container we require this.
177 /// \note This operator only have to define some strict ordering of
178 /// the items; this order has nothing to do with the iteration
179 /// ordering of the items.
180 bool operator<(ANode) const { return false; }
184 /// \brief Helper class for BNodes.
186 /// This class is just a helper class for BNodes, it is not
187 /// suggested to use it directly. It can be converted easily to
188 /// node and vice versa. The usage of this class is limited
189 /// two use just as template parameters for special map types.
192 /// Default constructor
194 /// @warning The default constructor sets the iterator
195 /// to an undefined value.
197 /// Copy constructor.
199 /// Copy constructor.
201 BNode(const BNode&) { }
203 /// Construct the same node as BNode.
205 /// Construct the same node as BNode. It may throws assertion
206 /// when the given node is from the ANode set.
207 BNode(const Node&) { }
209 /// Invalid constructor \& conversion.
211 /// This constructor initializes the iterator to be invalid.
212 /// \sa Invalid for more details.
214 /// Equality operator
216 /// Two iterators are equal if and only if they point to the
217 /// same object or both are invalid.
218 bool operator==(BNode) const { return true; }
220 /// Inequality operator
222 /// \sa operator==(BNode n)
224 bool operator!=(BNode) const { return true; }
226 /// Artificial ordering operator.
228 /// To allow the use of graph descriptors as key type in std::map or
229 /// similar associative container we require this.
231 /// \note This operator only have to define some strict ordering of
232 /// the items; this order has nothing to do with the iteration
233 /// ordering of the items.
234 bool operator<(BNode) const { return false; }
238 /// This iterator goes through each node.
240 /// This iterator goes through each node.
241 /// Its usage is quite simple, for example you can count the number
242 /// of nodes in graph \c g of type \c Graph like this:
245 /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
247 class NodeIt : public Node {
249 /// Default constructor
251 /// @warning The default constructor sets the iterator
252 /// to an undefined value.
254 /// Copy constructor.
256 /// Copy constructor.
258 NodeIt(const NodeIt& n) : Node(n) { }
259 /// Invalid constructor \& conversion.
261 /// Initialize the iterator to be invalid.
262 /// \sa Invalid for more details.
264 /// Sets the iterator to the first node.
266 /// Sets the iterator to the first node of \c g.
268 NodeIt(const BpUGraph&) { }
269 /// Node -> NodeIt conversion.
271 /// Sets the iterator to the node of \c the graph pointed by
272 /// the trivial iterator.
273 /// This feature necessitates that each time we
274 /// iterate the edge-set, the iteration order is the same.
275 NodeIt(const BpUGraph&, const Node&) { }
278 /// Assign the iterator to the next node.
280 NodeIt& operator++() { return *this; }
283 /// This iterator goes through each ANode.
285 /// This iterator goes through each ANode.
286 /// Its usage is quite simple, for example you can count the number
287 /// of nodes in graph \c g of type \c Graph like this:
290 /// for (Graph::ANodeIt n(g); n!=INVALID; ++n) ++count;
292 class ANodeIt : public Node {
294 /// Default constructor
296 /// @warning The default constructor sets the iterator
297 /// to an undefined value.
299 /// Copy constructor.
301 /// Copy constructor.
303 ANodeIt(const ANodeIt& n) : Node(n) { }
304 /// Invalid constructor \& conversion.
306 /// Initialize the iterator to be invalid.
307 /// \sa Invalid for more details.
309 /// Sets the iterator to the first node.
311 /// Sets the iterator to the first node of \c g.
313 ANodeIt(const BpUGraph&) { }
314 /// Node -> ANodeIt conversion.
316 /// Sets the iterator to the node of \c the graph pointed by
317 /// the trivial iterator.
318 /// This feature necessitates that each time we
319 /// iterate the edge-set, the iteration order is the same.
320 ANodeIt(const BpUGraph&, const Node&) { }
323 /// Assign the iterator to the next node.
325 ANodeIt& operator++() { return *this; }
328 /// This iterator goes through each BNode.
330 /// This iterator goes through each BNode.
331 /// Its usage is quite simple, for example you can count the number
332 /// of nodes in graph \c g of type \c Graph like this:
335 /// for (Graph::BNodeIt n(g); n!=INVALID; ++n) ++count;
337 class BNodeIt : public Node {
339 /// Default constructor
341 /// @warning The default constructor sets the iterator
342 /// to an undefined value.
344 /// Copy constructor.
346 /// Copy constructor.
348 BNodeIt(const BNodeIt& n) : Node(n) { }
349 /// Invalid constructor \& conversion.
351 /// Initialize the iterator to be invalid.
352 /// \sa Invalid for more details.
354 /// Sets the iterator to the first node.
356 /// Sets the iterator to the first node of \c g.
358 BNodeIt(const BpUGraph&) { }
359 /// Node -> BNodeIt conversion.
361 /// Sets the iterator to the node of \c the graph pointed by
362 /// the trivial iterator.
363 /// This feature necessitates that each time we
364 /// iterate the edge-set, the iteration order is the same.
365 BNodeIt(const BpUGraph&, const Node&) { }
368 /// Assign the iterator to the next node.
370 BNodeIt& operator++() { return *this; }
374 /// The base type of the undirected edge iterators.
376 /// The base type of the undirected edge iterators.
380 /// Default constructor
382 /// @warning The default constructor sets the iterator
383 /// to an undefined value.
385 /// Copy constructor.
387 /// Copy constructor.
389 UEdge(const UEdge&) { }
390 /// Initialize the iterator to be invalid.
392 /// Initialize the iterator to be invalid.
395 /// Equality operator
397 /// Two iterators are equal if and only if they point to the
398 /// same object or both are invalid.
399 bool operator==(UEdge) const { return true; }
400 /// Inequality operator
402 /// \sa operator==(UEdge n)
404 bool operator!=(UEdge) const { return true; }
406 /// Artificial ordering operator.
408 /// To allow the use of graph descriptors as key type in std::map or
409 /// similar associative container we require this.
411 /// \note This operator only have to define some strict ordering of
412 /// the items; this order has nothing to do with the iteration
413 /// ordering of the items.
414 bool operator<(UEdge) const { return false; }
417 /// This iterator goes through each undirected edge.
419 /// This iterator goes through each undirected edge of a graph.
420 /// Its usage is quite simple, for example you can count the number
421 /// of undirected edges in a graph \c g of type \c Graph as follows:
424 /// for(Graph::UEdgeIt e(g); e!=INVALID; ++e) ++count;
426 class UEdgeIt : public UEdge {
428 /// Default constructor
430 /// @warning The default constructor sets the iterator
431 /// to an undefined value.
433 /// Copy constructor.
435 /// Copy constructor.
437 UEdgeIt(const UEdgeIt& e) : UEdge(e) { }
438 /// Initialize the iterator to be invalid.
440 /// Initialize the iterator to be invalid.
443 /// This constructor sets the iterator to the first undirected edge.
445 /// This constructor sets the iterator to the first undirected edge.
446 UEdgeIt(const BpUGraph&) { }
447 /// UEdge -> UEdgeIt conversion
449 /// Sets the iterator to the value of the trivial iterator.
450 /// This feature necessitates that each time we
451 /// iterate the undirected edge-set, the iteration order is the
453 UEdgeIt(const BpUGraph&, const UEdge&) { }
454 /// Next undirected edge
456 /// Assign the iterator to the next undirected edge.
457 UEdgeIt& operator++() { return *this; }
460 /// \brief This iterator goes trough the incident undirected
463 /// This iterator goes trough the incident undirected edges
464 /// of a certain node
466 /// Its usage is quite simple, for example you can compute the
467 /// degree (i.e. count the number
468 /// of incident edges of a node \c n
469 /// in graph \c g of type \c Graph as follows.
472 /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
474 class IncEdgeIt : public UEdge {
476 /// Default constructor
478 /// @warning The default constructor sets the iterator
479 /// to an undefined value.
481 /// Copy constructor.
483 /// Copy constructor.
485 IncEdgeIt(const IncEdgeIt& e) : UEdge(e) { }
486 /// Initialize the iterator to be invalid.
488 /// Initialize the iterator to be invalid.
490 IncEdgeIt(Invalid) { }
491 /// This constructor sets the iterator to first incident edge.
493 /// This constructor set the iterator to the first incident edge of
495 IncEdgeIt(const BpUGraph&, const Node&) { }
496 /// UEdge -> IncEdgeIt conversion
498 /// Sets the iterator to the value of the trivial iterator \c e.
499 /// This feature necessitates that each time we
500 /// iterate the edge-set, the iteration order is the same.
501 IncEdgeIt(const BpUGraph&, const UEdge&) { }
502 /// Next incident edge
504 /// Assign the iterator to the next incident edge
505 /// of the corresponding node.
506 IncEdgeIt& operator++() { return *this; }
509 /// The directed edge type.
511 /// The directed edge type. It can be converted to the
513 class Edge : public UEdge {
515 /// Default constructor
517 /// @warning The default constructor sets the iterator
518 /// to an undefined value.
520 /// Copy constructor.
522 /// Copy constructor.
524 Edge(const Edge& e) : UEdge(e) { }
525 /// Initialize the iterator to be invalid.
527 /// Initialize the iterator to be invalid.
530 /// Equality operator
532 /// Two iterators are equal if and only if they point to the
533 /// same object or both are invalid.
534 bool operator==(Edge) const { return true; }
535 /// Inequality operator
537 /// \sa operator==(Edge n)
539 bool operator!=(Edge) const { return true; }
541 /// Artificial ordering operator.
543 /// To allow the use of graph descriptors as key type in std::map or
544 /// similar associative container we require this.
546 /// \note This operator only have to define some strict ordering of
547 /// the items; this order has nothing to do with the iteration
548 /// ordering of the items.
549 bool operator<(Edge) const { return false; }
552 /// This iterator goes through each directed edge.
554 /// This iterator goes through each edge of a graph.
555 /// Its usage is quite simple, for example you can count the number
556 /// of edges in a graph \c g of type \c Graph as follows:
559 /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
561 class EdgeIt : public Edge {
563 /// Default constructor
565 /// @warning The default constructor sets the iterator
566 /// to an undefined value.
568 /// Copy constructor.
570 /// Copy constructor.
572 EdgeIt(const EdgeIt& e) : Edge(e) { }
573 /// Initialize the iterator to be invalid.
575 /// Initialize the iterator to be invalid.
578 /// This constructor sets the iterator to the first edge.
580 /// This constructor sets the iterator to the first edge of \c g.
581 ///@param g the graph
582 EdgeIt(const BpUGraph &g) { ignore_unused_variable_warning(g); }
583 /// Edge -> EdgeIt conversion
585 /// Sets the iterator to the value of the trivial iterator \c e.
586 /// This feature necessitates that each time we
587 /// iterate the edge-set, the iteration order is the same.
588 EdgeIt(const BpUGraph&, const Edge&) { }
591 /// Assign the iterator to the next edge.
592 EdgeIt& operator++() { return *this; }
595 /// This iterator goes trough the outgoing directed edges of a node.
597 /// This iterator goes trough the \e outgoing edges of a certain node
599 /// Its usage is quite simple, for example you can count the number
600 /// of outgoing edges of a node \c n
601 /// in graph \c g of type \c Graph as follows.
604 /// for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) ++count;
607 class OutEdgeIt : public Edge {
609 /// Default constructor
611 /// @warning The default constructor sets the iterator
612 /// to an undefined value.
614 /// Copy constructor.
616 /// Copy constructor.
618 OutEdgeIt(const OutEdgeIt& e) : Edge(e) { }
619 /// Initialize the iterator to be invalid.
621 /// Initialize the iterator to be invalid.
623 OutEdgeIt(Invalid) { }
624 /// This constructor sets the iterator to the first outgoing edge.
626 /// This constructor sets the iterator to the first outgoing edge of
629 ///@param g the graph
630 OutEdgeIt(const BpUGraph& n, const Node& g) {
631 ignore_unused_variable_warning(n);
632 ignore_unused_variable_warning(g);
634 /// Edge -> OutEdgeIt conversion
636 /// Sets the iterator to the value of the trivial iterator.
637 /// This feature necessitates that each time we
638 /// iterate the edge-set, the iteration order is the same.
639 OutEdgeIt(const BpUGraph&, const Edge&) { }
640 ///Next outgoing edge
642 /// Assign the iterator to the next
643 /// outgoing edge of the corresponding node.
644 OutEdgeIt& operator++() { return *this; }
647 /// This iterator goes trough the incoming directed edges of a node.
649 /// This iterator goes trough the \e incoming edges of a certain node
651 /// Its usage is quite simple, for example you can count the number
652 /// of outgoing edges of a node \c n
653 /// in graph \c g of type \c Graph as follows.
656 /// for(Graph::InEdgeIt e(g, n); e!=INVALID; ++e) ++count;
659 class InEdgeIt : public Edge {
661 /// Default constructor
663 /// @warning The default constructor sets the iterator
664 /// to an undefined value.
666 /// Copy constructor.
668 /// Copy constructor.
670 InEdgeIt(const InEdgeIt& e) : Edge(e) { }
671 /// Initialize the iterator to be invalid.
673 /// Initialize the iterator to be invalid.
675 InEdgeIt(Invalid) { }
676 /// This constructor sets the iterator to first incoming edge.
678 /// This constructor set the iterator to the first incoming edge of
681 ///@param g the graph
682 InEdgeIt(const BpUGraph& g, const Node& n) {
683 ignore_unused_variable_warning(n);
684 ignore_unused_variable_warning(g);
686 /// Edge -> InEdgeIt conversion
688 /// Sets the iterator to the value of the trivial iterator \c e.
689 /// This feature necessitates that each time we
690 /// iterate the edge-set, the iteration order is the same.
691 InEdgeIt(const BpUGraph&, const Edge&) { }
692 /// Next incoming edge
694 /// Assign the iterator to the next inedge of the corresponding node.
696 InEdgeIt& operator++() { return *this; }
699 /// \brief Read write map of the nodes to type \c T.
701 /// ReadWrite map of the nodes to type \c T.
703 /// \warning Making maps that can handle bool type (NodeMap<bool>)
704 /// needs some extra attention!
705 /// \todo Wrong documentation
707 class NodeMap : public ReadWriteMap< Node, T >
712 NodeMap(const BpUGraph&) { }
714 NodeMap(const BpUGraph&, T) { }
717 NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
718 ///Assignment operator
719 NodeMap& operator=(const NodeMap&) { return *this; }
720 // \todo fix this concept
723 /// \brief Read write map of the ANodes to type \c T.
725 /// ReadWrite map of the ANodes to type \c T.
727 /// \warning Making maps that can handle bool type (NodeMap<bool>)
728 /// needs some extra attention!
729 /// \todo Wrong documentation
731 class ANodeMap : public ReadWriteMap< Node, T >
736 ANodeMap(const BpUGraph&) { }
738 ANodeMap(const BpUGraph&, T) { }
741 ANodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
742 ///Assignment operator
743 ANodeMap& operator=(const NodeMap&) { return *this; }
744 // \todo fix this concept
747 /// \brief Read write map of the BNodes to type \c T.
749 /// ReadWrite map of the BNodes to type \c T.
751 /// \warning Making maps that can handle bool type (NodeMap<bool>)
752 /// needs some extra attention!
753 /// \todo Wrong documentation
755 class BNodeMap : public ReadWriteMap< Node, T >
760 BNodeMap(const BpUGraph&) { }
762 BNodeMap(const BpUGraph&, T) { }
765 BNodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
766 ///Assignment operator
767 BNodeMap& operator=(const NodeMap&) { return *this; }
768 // \todo fix this concept
771 /// \brief Read write map of the directed edges to type \c T.
773 /// Reference map of the directed edges to type \c T.
775 /// \warning Making maps that can handle bool type (EdgeMap<bool>)
776 /// needs some extra attention!
777 /// \todo Wrong documentation
779 class EdgeMap : public ReadWriteMap<Edge,T>
784 EdgeMap(const BpUGraph&) { }
786 EdgeMap(const BpUGraph&, T) { }
788 EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) { }
789 ///Assignment operator
790 EdgeMap& operator=(const EdgeMap&) { return *this; }
791 // \todo fix this concept
794 /// Read write map of the undirected edges to type \c T.
796 /// Reference map of the edges to type \c T.
798 /// \warning Making maps that can handle bool type (UEdgeMap<bool>)
799 /// needs some extra attention!
800 /// \todo Wrong documentation
802 class UEdgeMap : public ReadWriteMap<UEdge,T>
807 UEdgeMap(const BpUGraph&) { }
809 UEdgeMap(const BpUGraph&, T) { }
811 UEdgeMap(const UEdgeMap& em) : ReadWriteMap<UEdge,T>(em) {}
812 ///Assignment operator
813 UEdgeMap &operator=(const UEdgeMap&) { return *this; }
814 // \todo fix this concept
817 /// \brief Direct the given undirected edge.
819 /// Direct the given undirected edge. The returned edge source
820 /// will be the given node.
821 Edge direct(const UEdge&, const Node&) const {
825 /// \brief Direct the given undirected edge.
827 /// Direct the given undirected edge. The returned edge
828 /// represents the given undireted edge and the direction comes
829 /// from the given bool. The source of the undirected edge and
830 /// the directed edge is the same when the given bool is true.
831 Edge direct(const UEdge&, bool) const {
835 /// \brief Returns true when the given node is an ANode.
837 /// Returns true when the given node is an ANode.
838 bool aNode(Node) const { return true;}
840 /// \brief Returns true when the given node is an BNode.
842 /// Returns true when the given node is an BNode.
843 bool bNode(Node) const { return true;}
845 /// \brief Returns the edge's end node which is in the ANode set.
847 /// Returns the edge's end node which is in the ANode set.
848 Node aNode(UEdge) const { return INVALID;}
850 /// \brief Returns the edge's end node which is in the BNode set.
852 /// Returns the edge's end node which is in the BNode set.
853 Node bNode(UEdge) const { return INVALID;}
855 /// \brief Returns true if the edge has default orientation.
857 /// Returns whether the given directed edge is same orientation as
858 /// the corresponding undirected edge's default orientation.
859 bool direction(Edge) const { return true; }
861 /// \brief Returns the opposite directed edge.
863 /// Returns the opposite directed edge.
864 Edge oppositeEdge(Edge) const { return INVALID; }
866 /// \brief Opposite node on an edge
868 /// \return the opposite of the given Node on the given UEdge
869 Node oppositeNode(Node, UEdge) const { return INVALID; }
871 /// \brief First node of the undirected edge.
873 /// \return the first node of the given UEdge.
875 /// Naturally undirected edges don't have direction and thus
876 /// don't have source and target node. But we use these two methods
877 /// to query the two endnodes of the edge. The direction of the edge
878 /// which arises this way is called the inherent direction of the
879 /// undirected edge, and is used to define the "default" direction
880 /// of the directed versions of the edges.
882 Node source(UEdge) const { return INVALID; }
884 /// \brief Second node of the undirected edge.
885 Node target(UEdge) const { return INVALID; }
887 /// \brief Source node of the directed edge.
888 Node source(Edge) const { return INVALID; }
890 /// \brief Target node of the directed edge.
891 Node target(Edge) const { return INVALID; }
893 /// \brief Base node of the iterator
895 /// Returns the base node (the source in this case) of the iterator
896 Node baseNode(OutEdgeIt e) const {
900 /// \brief Running node of the iterator
902 /// Returns the running node (the target in this case) of the
904 Node runningNode(OutEdgeIt e) const {
908 /// \brief Base node of the iterator
910 /// Returns the base node (the target in this case) of the iterator
911 Node baseNode(InEdgeIt e) const {
914 /// \brief Running node of the iterator
916 /// Returns the running node (the source in this case) of the
918 Node runningNode(InEdgeIt e) const {
922 /// \brief Base node of the iterator
924 /// Returns the base node of the iterator
925 Node baseNode(IncEdgeIt) const {
929 /// \brief Running node of the iterator
931 /// Returns the running node of the iterator
932 Node runningNode(IncEdgeIt) const {
936 template <typename Graph>