3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2008
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 #ifndef LEMON_GRAPH_UTILS_H
20 #define LEMON_GRAPH_UTILS_H
25 #include <lemon/math.h>
28 #include <lemon/bits/invalid.h>
29 #include <lemon/bits/utility.h>
30 #include <lemon/maps.h>
31 #include <lemon/bits/traits.h>
33 #include <lemon/bits/alteration_notifier.h>
34 #include <lemon/bits/default_map.h>
38 ///\brief Graph utilities.
42 /// \addtogroup gutils
45 ///Creates convenience typedefs for the graph types and iterators
47 ///This \c \#define creates convenience typedefs for the following types
48 ///of \c Graph: \c Node, \c NodeIt, \c Edge, \c EdgeIt, \c InEdgeIt,
50 ///\note If \c G it a template parameter, it should be used in this way.
52 /// GRAPH_TYPEDEFS(typename G);
55 ///\warning There are no typedefs for the graph maps because of the lack of
56 ///template typedefs in C++.
57 #define GRAPH_TYPEDEFS(Graph) \
58 typedef Graph:: Node Node; \
59 typedef Graph:: NodeIt NodeIt; \
60 typedef Graph:: Edge Edge; \
61 typedef Graph:: EdgeIt EdgeIt; \
62 typedef Graph:: InEdgeIt InEdgeIt; \
63 typedef Graph::OutEdgeIt OutEdgeIt
65 ///Creates convenience typedefs for the undirected graph types and iterators
67 ///This \c \#define creates the same convenience typedefs as defined by
68 ///\ref GRAPH_TYPEDEFS(Graph) and three more, namely it creates
69 ///\c UEdge, \c UEdgeIt, \c IncEdgeIt,
71 ///\note If \c G it a template parameter, it should be used in this way.
73 /// UGRAPH_TYPEDEFS(typename G);
76 ///\warning There are no typedefs for the graph maps because of the lack of
77 ///template typedefs in C++.
78 #define UGRAPH_TYPEDEFS(Graph) \
79 GRAPH_TYPEDEFS(Graph); \
80 typedef Graph:: UEdge UEdge; \
81 typedef Graph:: UEdgeIt UEdgeIt; \
82 typedef Graph:: IncEdgeIt IncEdgeIt
84 ///\brief Creates convenience typedefs for the bipartite undirected graph
85 ///types and iterators
87 ///This \c \#define creates the same convenience typedefs as defined by
88 ///\ref UGRAPH_TYPEDEFS(Graph) and two more, namely it creates
89 ///\c ANodeIt, \c BNodeIt,
91 ///\note If \c G it a template parameter, it should be used in this way.
93 /// BPUGRAPH_TYPEDEFS(typename G);
96 ///\warning There are no typedefs for the graph maps because of the lack of
97 ///template typedefs in C++.
98 #define BPUGRAPH_TYPEDEFS(Graph) \
99 UGRAPH_TYPEDEFS(Graph); \
100 typedef Graph::ANode ANode; \
101 typedef Graph::BNode BNode; \
102 typedef Graph::ANodeIt ANodeIt; \
103 typedef Graph::BNodeIt BNodeIt
105 /// \brief Function to count the items in the graph.
107 /// This function counts the items (nodes, edges etc) in the graph.
108 /// The complexity of the function is O(n) because
109 /// it iterates on all of the items.
111 template <typename Graph, typename Item>
112 inline int countItems(const Graph& g) {
113 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
115 for (ItemIt it(g); it != INVALID; ++it) {
123 namespace _graph_utils_bits {
125 template <typename Graph, typename Enable = void>
126 struct CountNodesSelector {
127 static int count(const Graph &g) {
128 return countItems<Graph, typename Graph::Node>(g);
132 template <typename Graph>
133 struct CountNodesSelector<
135 enable_if<typename Graph::NodeNumTag, void>::type>
137 static int count(const Graph &g) {
143 /// \brief Function to count the nodes in the graph.
145 /// This function counts the nodes in the graph.
146 /// The complexity of the function is O(n) but for some
147 /// graph structures it is specialized to run in O(1).
149 /// If the graph contains a \e nodeNum() member function and a
150 /// \e NodeNumTag tag then this function calls directly the member
151 /// function to query the cardinality of the node set.
152 template <typename Graph>
153 inline int countNodes(const Graph& g) {
154 return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
157 namespace _graph_utils_bits {
159 template <typename Graph, typename Enable = void>
160 struct CountANodesSelector {
161 static int count(const Graph &g) {
162 return countItems<Graph, typename Graph::ANode>(g);
166 template <typename Graph>
167 struct CountANodesSelector<
169 enable_if<typename Graph::NodeNumTag, void>::type>
171 static int count(const Graph &g) {
177 /// \brief Function to count the anodes in the graph.
179 /// This function counts the anodes in the graph.
180 /// The complexity of the function is O(an) but for some
181 /// graph structures it is specialized to run in O(1).
183 /// If the graph contains an \e aNodeNum() member function and a
184 /// \e NodeNumTag tag then this function calls directly the member
185 /// function to query the cardinality of the A-node set.
186 template <typename Graph>
187 inline int countANodes(const Graph& g) {
188 return _graph_utils_bits::CountANodesSelector<Graph>::count(g);
191 namespace _graph_utils_bits {
193 template <typename Graph, typename Enable = void>
194 struct CountBNodesSelector {
195 static int count(const Graph &g) {
196 return countItems<Graph, typename Graph::BNode>(g);
200 template <typename Graph>
201 struct CountBNodesSelector<
203 enable_if<typename Graph::NodeNumTag, void>::type>
205 static int count(const Graph &g) {
211 /// \brief Function to count the bnodes in the graph.
213 /// This function counts the bnodes in the graph.
214 /// The complexity of the function is O(bn) but for some
215 /// graph structures it is specialized to run in O(1).
217 /// If the graph contains a \e bNodeNum() member function and a
218 /// \e NodeNumTag tag then this function calls directly the member
219 /// function to query the cardinality of the B-node set.
220 template <typename Graph>
221 inline int countBNodes(const Graph& g) {
222 return _graph_utils_bits::CountBNodesSelector<Graph>::count(g);
228 namespace _graph_utils_bits {
230 template <typename Graph, typename Enable = void>
231 struct CountEdgesSelector {
232 static int count(const Graph &g) {
233 return countItems<Graph, typename Graph::Edge>(g);
237 template <typename Graph>
238 struct CountEdgesSelector<
240 typename enable_if<typename Graph::EdgeNumTag, void>::type>
242 static int count(const Graph &g) {
248 /// \brief Function to count the edges in the graph.
250 /// This function counts the edges in the graph.
251 /// The complexity of the function is O(e) but for some
252 /// graph structures it is specialized to run in O(1).
254 /// If the graph contains a \e edgeNum() member function and a
255 /// \e EdgeNumTag tag then this function calls directly the member
256 /// function to query the cardinality of the edge set.
257 template <typename Graph>
258 inline int countEdges(const Graph& g) {
259 return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
262 // Undirected edge counting:
263 namespace _graph_utils_bits {
265 template <typename Graph, typename Enable = void>
266 struct CountUEdgesSelector {
267 static int count(const Graph &g) {
268 return countItems<Graph, typename Graph::UEdge>(g);
272 template <typename Graph>
273 struct CountUEdgesSelector<
275 typename enable_if<typename Graph::EdgeNumTag, void>::type>
277 static int count(const Graph &g) {
283 /// \brief Function to count the undirected edges in the graph.
285 /// This function counts the undirected edges in the graph.
286 /// The complexity of the function is O(e) but for some
287 /// graph structures it is specialized to run in O(1).
289 /// If the graph contains a \e uEdgeNum() member function and a
290 /// \e EdgeNumTag tag then this function calls directly the member
291 /// function to query the cardinality of the undirected edge set.
292 template <typename Graph>
293 inline int countUEdges(const Graph& g) {
294 return _graph_utils_bits::CountUEdgesSelector<Graph>::count(g);
299 template <typename Graph, typename DegIt>
300 inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
302 for (DegIt it(_g, _n); it != INVALID; ++it) {
308 /// \brief Function to count the number of the out-edges from node \c n.
310 /// This function counts the number of the out-edges from node \c n
312 template <typename Graph>
313 inline int countOutEdges(const Graph& _g, const typename Graph::Node& _n) {
314 return countNodeDegree<Graph, typename Graph::OutEdgeIt>(_g, _n);
317 /// \brief Function to count the number of the in-edges to node \c n.
319 /// This function counts the number of the in-edges to node \c n
321 template <typename Graph>
322 inline int countInEdges(const Graph& _g, const typename Graph::Node& _n) {
323 return countNodeDegree<Graph, typename Graph::InEdgeIt>(_g, _n);
326 /// \brief Function to count the number of the inc-edges to node \c n.
328 /// This function counts the number of the inc-edges to node \c n
330 template <typename Graph>
331 inline int countIncEdges(const Graph& _g, const typename Graph::Node& _n) {
332 return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
335 namespace _graph_utils_bits {
337 template <typename Graph, typename Enable = void>
338 struct FindEdgeSelector {
339 typedef typename Graph::Node Node;
340 typedef typename Graph::Edge Edge;
341 static Edge find(const Graph &g, Node u, Node v, Edge e) {
347 while (e != INVALID && g.target(e) != v) {
354 template <typename Graph>
355 struct FindEdgeSelector<
357 typename enable_if<typename Graph::FindEdgeTag, void>::type>
359 typedef typename Graph::Node Node;
360 typedef typename Graph::Edge Edge;
361 static Edge find(const Graph &g, Node u, Node v, Edge prev) {
362 return g.findEdge(u, v, prev);
367 /// \brief Finds an edge between two nodes of a graph.
369 /// Finds an edge from node \c u to node \c v in graph \c g.
371 /// If \c prev is \ref INVALID (this is the default value), then
372 /// it finds the first edge from \c u to \c v. Otherwise it looks for
373 /// the next edge from \c u to \c v after \c prev.
374 /// \return The found edge or \ref INVALID if there is no such an edge.
376 /// Thus you can iterate through each edge from \c u to \c v as it follows.
378 /// for(Edge e=findEdge(g,u,v);e!=INVALID;e=findEdge(g,u,v,e)) {
387 template <typename Graph>
388 inline typename Graph::Edge
389 findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
390 typename Graph::Edge prev = INVALID) {
391 return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, prev);
394 /// \brief Iterator for iterating on edges connected the same nodes.
396 /// Iterator for iterating on edges connected the same nodes. It is
397 /// higher level interface for the findEdge() function. You can
398 /// use it the following way:
400 /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
410 /// \author Balazs Dezso
411 template <typename _Graph>
412 class ConEdgeIt : public _Graph::Edge {
415 typedef _Graph Graph;
416 typedef typename Graph::Edge Parent;
418 typedef typename Graph::Edge Edge;
419 typedef typename Graph::Node Node;
421 /// \brief Constructor.
423 /// Construct a new ConEdgeIt iterating on the edges which
424 /// connects the \c u and \c v node.
425 ConEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
426 Parent::operator=(findEdge(graph, u, v));
429 /// \brief Constructor.
431 /// Construct a new ConEdgeIt which continues the iterating from
433 ConEdgeIt(const Graph& g, Edge e) : Parent(e), graph(g) {}
435 /// \brief Increment operator.
437 /// It increments the iterator and gives back the next edge.
438 ConEdgeIt& operator++() {
439 Parent::operator=(findEdge(graph, graph.source(*this),
440 graph.target(*this), *this));
447 namespace _graph_utils_bits {
449 template <typename Graph, typename Enable = void>
450 struct FindUEdgeSelector {
451 typedef typename Graph::Node Node;
452 typedef typename Graph::UEdge UEdge;
453 static UEdge find(const Graph &g, Node u, Node v, UEdge e) {
459 b = g.source(e) == u;
462 while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
472 while (e != INVALID && (!b || g.target(e) != v)) {
480 template <typename Graph>
481 struct FindUEdgeSelector<
483 typename enable_if<typename Graph::FindEdgeTag, void>::type>
485 typedef typename Graph::Node Node;
486 typedef typename Graph::UEdge UEdge;
487 static UEdge find(const Graph &g, Node u, Node v, UEdge prev) {
488 return g.findUEdge(u, v, prev);
493 /// \brief Finds an uedge between two nodes of a graph.
495 /// Finds an uedge from node \c u to node \c v in graph \c g.
496 /// If the node \c u and node \c v is equal then each loop edge
497 /// will be enumerated.
499 /// If \c prev is \ref INVALID (this is the default value), then
500 /// it finds the first edge from \c u to \c v. Otherwise it looks for
501 /// the next edge from \c u to \c v after \c prev.
502 /// \return The found edge or \ref INVALID if there is no such an edge.
504 /// Thus you can iterate through each edge from \c u to \c v as it follows.
506 /// for(UEdge e = findUEdge(g,u,v); e != INVALID;
507 /// e = findUEdge(g,u,v,e)) {
514 template <typename Graph>
515 inline typename Graph::UEdge
516 findUEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
517 typename Graph::UEdge p = INVALID) {
518 return _graph_utils_bits::FindUEdgeSelector<Graph>::find(g, u, v, p);
521 /// \brief Iterator for iterating on uedges connected the same nodes.
523 /// Iterator for iterating on uedges connected the same nodes. It is
524 /// higher level interface for the findUEdge() function. You can
525 /// use it the following way:
527 /// for (ConUEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
534 /// \author Balazs Dezso
535 template <typename _Graph>
536 class ConUEdgeIt : public _Graph::UEdge {
539 typedef _Graph Graph;
540 typedef typename Graph::UEdge Parent;
542 typedef typename Graph::UEdge UEdge;
543 typedef typename Graph::Node Node;
545 /// \brief Constructor.
547 /// Construct a new ConUEdgeIt iterating on the edges which
548 /// connects the \c u and \c v node.
549 ConUEdgeIt(const Graph& g, Node u, Node v) : graph(g) {
550 Parent::operator=(findUEdge(graph, u, v));
553 /// \brief Constructor.
555 /// Construct a new ConUEdgeIt which continues the iterating from
557 ConUEdgeIt(const Graph& g, UEdge e) : Parent(e), graph(g) {}
559 /// \brief Increment operator.
561 /// It increments the iterator and gives back the next edge.
562 ConUEdgeIt& operator++() {
563 Parent::operator=(findUEdge(graph, graph.source(*this),
564 graph.target(*this), *this));
571 /// \brief Copy a map.
573 /// This function copies the \c from map to the \c to map. It uses the
574 /// given iterator to iterate on the data structure and it uses the \c ref
575 /// mapping to convert the from's keys to the to's keys.
576 template <typename To, typename From,
577 typename ItemIt, typename Ref>
578 void copyMap(To& to, const From& from,
579 ItemIt it, const Ref& ref) {
580 for (; it != INVALID; ++it) {
581 to[ref[it]] = from[it];
585 /// \brief Copy the from map to the to map.
587 /// Copy the \c from map to the \c to map. It uses the given iterator
588 /// to iterate on the data structure.
589 template <typename To, typename From, typename ItemIt>
590 void copyMap(To& to, const From& from, ItemIt it) {
591 for (; it != INVALID; ++it) {
596 namespace _graph_utils_bits {
598 template <typename Graph, typename Item, typename RefMap>
601 virtual void copy(const Graph& from, const RefMap& refMap) = 0;
603 virtual ~MapCopyBase() {}
606 template <typename Graph, typename Item, typename RefMap,
607 typename ToMap, typename FromMap>
608 class MapCopy : public MapCopyBase<Graph, Item, RefMap> {
611 MapCopy(ToMap& tmap, const FromMap& map)
612 : _tmap(tmap), _map(map) {}
614 virtual void copy(const Graph& graph, const RefMap& refMap) {
615 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
616 for (ItemIt it(graph); it != INVALID; ++it) {
617 _tmap.set(refMap[it], _map[it]);
626 template <typename Graph, typename Item, typename RefMap, typename It>
627 class ItemCopy : public MapCopyBase<Graph, Item, RefMap> {
630 ItemCopy(It& it, const Item& item) : _it(it), _item(item) {}
632 virtual void copy(const Graph&, const RefMap& refMap) {
641 template <typename Graph, typename Item, typename RefMap, typename Ref>
642 class RefCopy : public MapCopyBase<Graph, Item, RefMap> {
645 RefCopy(Ref& map) : _map(map) {}
647 virtual void copy(const Graph& graph, const RefMap& refMap) {
648 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
649 for (ItemIt it(graph); it != INVALID; ++it) {
650 _map.set(it, refMap[it]);
658 template <typename Graph, typename Item, typename RefMap,
660 class CrossRefCopy : public MapCopyBase<Graph, Item, RefMap> {
663 CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {}
665 virtual void copy(const Graph& graph, const RefMap& refMap) {
666 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
667 for (ItemIt it(graph); it != INVALID; ++it) {
668 _cmap.set(refMap[it], it);
676 template <typename Graph, typename Enable = void>
677 struct GraphCopySelector {
678 template <typename From, typename NodeRefMap, typename EdgeRefMap>
679 static void copy(Graph &to, const From& from,
680 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
681 for (typename From::NodeIt it(from); it != INVALID; ++it) {
682 nodeRefMap[it] = to.addNode();
684 for (typename From::EdgeIt it(from); it != INVALID; ++it) {
685 edgeRefMap[it] = to.addEdge(nodeRefMap[from.source(it)],
686 nodeRefMap[from.target(it)]);
691 template <typename Graph>
692 struct GraphCopySelector<
694 typename enable_if<typename Graph::BuildTag, void>::type>
696 template <typename From, typename NodeRefMap, typename EdgeRefMap>
697 static void copy(Graph &to, const From& from,
698 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
699 to.build(from, nodeRefMap, edgeRefMap);
703 template <typename UGraph, typename Enable = void>
704 struct UGraphCopySelector {
705 template <typename From, typename NodeRefMap, typename UEdgeRefMap>
706 static void copy(UGraph &to, const From& from,
707 NodeRefMap& nodeRefMap, UEdgeRefMap& uEdgeRefMap) {
708 for (typename From::NodeIt it(from); it != INVALID; ++it) {
709 nodeRefMap[it] = to.addNode();
711 for (typename From::UEdgeIt it(from); it != INVALID; ++it) {
712 uEdgeRefMap[it] = to.addEdge(nodeRefMap[from.source(it)],
713 nodeRefMap[from.target(it)]);
718 template <typename UGraph>
719 struct UGraphCopySelector<
721 typename enable_if<typename UGraph::BuildTag, void>::type>
723 template <typename From, typename NodeRefMap, typename UEdgeRefMap>
724 static void copy(UGraph &to, const From& from,
725 NodeRefMap& nodeRefMap, UEdgeRefMap& uEdgeRefMap) {
726 to.build(from, nodeRefMap, uEdgeRefMap);
730 template <typename BpUGraph, typename Enable = void>
731 struct BpUGraphCopySelector {
732 template <typename From, typename ANodeRefMap,
733 typename BNodeRefMap, typename UEdgeRefMap>
734 static void copy(BpUGraph &to, const From& from,
735 ANodeRefMap& aNodeRefMap, BNodeRefMap& bNodeRefMap,
736 UEdgeRefMap& uEdgeRefMap) {
737 for (typename From::ANodeIt it(from); it != INVALID; ++it) {
738 aNodeRefMap[it] = to.addANode();
740 for (typename From::BNodeIt it(from); it != INVALID; ++it) {
741 bNodeRefMap[it] = to.addBNode();
743 for (typename From::UEdgeIt it(from); it != INVALID; ++it) {
744 uEdgeRefMap[it] = to.addEdge(aNodeRefMap[from.aNode(it)],
745 bNodeRefMap[from.bNode(it)]);
750 template <typename BpUGraph>
751 struct BpUGraphCopySelector<
753 typename enable_if<typename BpUGraph::BuildTag, void>::type>
755 template <typename From, typename ANodeRefMap,
756 typename BNodeRefMap, typename UEdgeRefMap>
757 static void copy(BpUGraph &to, const From& from,
758 ANodeRefMap& aNodeRefMap, BNodeRefMap& bNodeRefMap,
759 UEdgeRefMap& uEdgeRefMap) {
760 to.build(from, aNodeRefMap, bNodeRefMap, uEdgeRefMap);
767 /// \brief Class to copy a graph.
769 /// Class to copy a graph to another graph (duplicate a graph). The
770 /// simplest way of using it is through the \c copyGraph() function.
771 template <typename To, typename From>
775 typedef typename From::Node Node;
776 typedef typename From::NodeIt NodeIt;
777 typedef typename From::Edge Edge;
778 typedef typename From::EdgeIt EdgeIt;
780 typedef typename To::Node TNode;
781 typedef typename To::Edge TEdge;
783 typedef typename From::template NodeMap<TNode> NodeRefMap;
784 typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
790 /// \brief Constructor for the GraphCopy.
792 /// It copies the content of the \c _from graph into the
794 GraphCopy(To& _to, const From& _from)
795 : from(_from), to(_to) {}
797 /// \brief Destructor of the GraphCopy
799 /// Destructor of the GraphCopy
801 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
802 delete nodeMapCopies[i];
804 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
805 delete edgeMapCopies[i];
810 /// \brief Copies the node references into the given map.
812 /// Copies the node references into the given map.
813 template <typename NodeRef>
814 GraphCopy& nodeRef(NodeRef& map) {
815 nodeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Node,
816 NodeRefMap, NodeRef>(map));
820 /// \brief Copies the node cross references into the given map.
822 /// Copies the node cross references (reverse references) into
824 template <typename NodeCrossRef>
825 GraphCopy& nodeCrossRef(NodeCrossRef& map) {
826 nodeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
827 NodeRefMap, NodeCrossRef>(map));
831 /// \brief Make copy of the given map.
833 /// Makes copy of the given map for the newly created graph.
834 /// The new map's key type is the to graph's node type,
835 /// and the copied map's key type is the from graph's node
837 template <typename ToMap, typename FromMap>
838 GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
839 nodeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Node,
840 NodeRefMap, ToMap, FromMap>(tmap, map));
844 /// \brief Make a copy of the given node.
846 /// Make a copy of the given node.
847 GraphCopy& node(TNode& tnode, const Node& snode) {
848 nodeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Node,
849 NodeRefMap, TNode>(tnode, snode));
853 /// \brief Copies the edge references into the given map.
855 /// Copies the edge references into the given map.
856 template <typename EdgeRef>
857 GraphCopy& edgeRef(EdgeRef& map) {
858 edgeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Edge,
859 EdgeRefMap, EdgeRef>(map));
863 /// \brief Copies the edge cross references into the given map.
865 /// Copies the edge cross references (reverse references) into
867 template <typename EdgeCrossRef>
868 GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
869 edgeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Edge,
870 EdgeRefMap, EdgeCrossRef>(map));
874 /// \brief Make copy of the given map.
876 /// Makes copy of the given map for the newly created graph.
877 /// The new map's key type is the to graph's edge type,
878 /// and the copied map's key type is the from graph's edge
880 template <typename ToMap, typename FromMap>
881 GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
882 edgeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Edge,
883 EdgeRefMap, ToMap, FromMap>(tmap, map));
887 /// \brief Make a copy of the given edge.
889 /// Make a copy of the given edge.
890 GraphCopy& edge(TEdge& tedge, const Edge& sedge) {
891 edgeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Edge,
892 EdgeRefMap, TEdge>(tedge, sedge));
896 /// \brief Executes the copies.
898 /// Executes the copies.
900 NodeRefMap nodeRefMap(from);
901 EdgeRefMap edgeRefMap(from);
902 _graph_utils_bits::GraphCopySelector<To>::
903 copy(to, from, nodeRefMap, edgeRefMap);
904 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
905 nodeMapCopies[i]->copy(from, nodeRefMap);
907 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
908 edgeMapCopies[i]->copy(from, edgeRefMap);
918 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
921 std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
926 /// \brief Copy a graph to another graph.
928 /// Copy a graph to another graph.
929 /// The usage of the function:
932 /// copyGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr).run();
935 /// After the copy the \c nr map will contain the mapping from the
936 /// nodes of the \c from graph to the nodes of the \c to graph and
937 /// \c ecr will contain the mapping from the edges of the \c to graph
938 /// to the edges of the \c from graph.
941 template <typename To, typename From>
942 GraphCopy<To, From> copyGraph(To& to, const From& from) {
943 return GraphCopy<To, From>(to, from);
946 /// \brief Class to copy an undirected graph.
948 /// Class to copy an undirected graph to another graph (duplicate a graph).
949 /// The simplest way of using it is through the \c copyUGraph() function.
950 template <typename To, typename From>
954 typedef typename From::Node Node;
955 typedef typename From::NodeIt NodeIt;
956 typedef typename From::Edge Edge;
957 typedef typename From::EdgeIt EdgeIt;
958 typedef typename From::UEdge UEdge;
959 typedef typename From::UEdgeIt UEdgeIt;
961 typedef typename To::Node TNode;
962 typedef typename To::Edge TEdge;
963 typedef typename To::UEdge TUEdge;
965 typedef typename From::template NodeMap<TNode> NodeRefMap;
966 typedef typename From::template UEdgeMap<TUEdge> UEdgeRefMap;
969 EdgeRefMap(const To& _to, const From& _from,
970 const UEdgeRefMap& _uedge_ref, const NodeRefMap& _node_ref)
971 : to(_to), from(_from),
972 uedge_ref(_uedge_ref), node_ref(_node_ref) {}
974 typedef typename From::Edge Key;
975 typedef typename To::Edge Value;
977 Value operator[](const Key& key) const {
979 (from.direction(key) ==
980 (node_ref[from.source(static_cast<const UEdge&>(key))] ==
981 to.source(uedge_ref[static_cast<const UEdge&>(key)])));
982 return to.direct(uedge_ref[key], forward);
987 const UEdgeRefMap& uedge_ref;
988 const NodeRefMap& node_ref;
995 /// \brief Constructor for the GraphCopy.
997 /// It copies the content of the \c _from graph into the
999 UGraphCopy(To& _to, const From& _from)
1000 : from(_from), to(_to) {}
1002 /// \brief Destructor of the GraphCopy
1004 /// Destructor of the GraphCopy
1006 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
1007 delete nodeMapCopies[i];
1009 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
1010 delete edgeMapCopies[i];
1012 for (int i = 0; i < int(uEdgeMapCopies.size()); ++i) {
1013 delete uEdgeMapCopies[i];
1018 /// \brief Copies the node references into the given map.
1020 /// Copies the node references into the given map.
1021 template <typename NodeRef>
1022 UGraphCopy& nodeRef(NodeRef& map) {
1023 nodeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Node,
1024 NodeRefMap, NodeRef>(map));
1028 /// \brief Copies the node cross references into the given map.
1030 /// Copies the node cross references (reverse references) into
1032 template <typename NodeCrossRef>
1033 UGraphCopy& nodeCrossRef(NodeCrossRef& map) {
1034 nodeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
1035 NodeRefMap, NodeCrossRef>(map));
1039 /// \brief Make copy of the given map.
1041 /// Makes copy of the given map for the newly created graph.
1042 /// The new map's key type is the to graph's node type,
1043 /// and the copied map's key type is the from graph's node
1045 template <typename ToMap, typename FromMap>
1046 UGraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
1047 nodeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Node,
1048 NodeRefMap, ToMap, FromMap>(tmap, map));
1052 /// \brief Make a copy of the given node.
1054 /// Make a copy of the given node.
1055 UGraphCopy& node(TNode& tnode, const Node& snode) {
1056 nodeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Node,
1057 NodeRefMap, TNode>(tnode, snode));
1061 /// \brief Copies the edge references into the given map.
1063 /// Copies the edge references into the given map.
1064 template <typename EdgeRef>
1065 UGraphCopy& edgeRef(EdgeRef& map) {
1066 edgeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Edge,
1067 EdgeRefMap, EdgeRef>(map));
1071 /// \brief Copies the edge cross references into the given map.
1073 /// Copies the edge cross references (reverse references) into
1075 template <typename EdgeCrossRef>
1076 UGraphCopy& edgeCrossRef(EdgeCrossRef& map) {
1077 edgeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Edge,
1078 EdgeRefMap, EdgeCrossRef>(map));
1082 /// \brief Make copy of the given map.
1084 /// Makes copy of the given map for the newly created graph.
1085 /// The new map's key type is the to graph's edge type,
1086 /// and the copied map's key type is the from graph's edge
1088 template <typename ToMap, typename FromMap>
1089 UGraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
1090 edgeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Edge,
1091 EdgeRefMap, ToMap, FromMap>(tmap, map));
1095 /// \brief Make a copy of the given edge.
1097 /// Make a copy of the given edge.
1098 UGraphCopy& edge(TEdge& tedge, const Edge& sedge) {
1099 edgeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Edge,
1100 EdgeRefMap, TEdge>(tedge, sedge));
1104 /// \brief Copies the undirected edge references into the given map.
1106 /// Copies the undirected edge references into the given map.
1107 template <typename UEdgeRef>
1108 UGraphCopy& uEdgeRef(UEdgeRef& map) {
1109 uEdgeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, UEdge,
1110 UEdgeRefMap, UEdgeRef>(map));
1114 /// \brief Copies the undirected edge cross references into the given map.
1116 /// Copies the undirected edge cross references (reverse
1117 /// references) into the given map.
1118 template <typename UEdgeCrossRef>
1119 UGraphCopy& uEdgeCrossRef(UEdgeCrossRef& map) {
1120 uEdgeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From,
1121 UEdge, UEdgeRefMap, UEdgeCrossRef>(map));
1125 /// \brief Make copy of the given map.
1127 /// Makes copy of the given map for the newly created graph.
1128 /// The new map's key type is the to graph's undirected edge type,
1129 /// and the copied map's key type is the from graph's undirected edge
1131 template <typename ToMap, typename FromMap>
1132 UGraphCopy& uEdgeMap(ToMap& tmap, const FromMap& map) {
1133 uEdgeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, UEdge,
1134 UEdgeRefMap, ToMap, FromMap>(tmap, map));
1138 /// \brief Make a copy of the given undirected edge.
1140 /// Make a copy of the given undirected edge.
1141 UGraphCopy& uEdge(TUEdge& tuedge, const UEdge& suedge) {
1142 uEdgeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, UEdge,
1143 UEdgeRefMap, TUEdge>(tuedge, suedge));
1147 /// \brief Executes the copies.
1149 /// Executes the copies.
1151 NodeRefMap nodeRefMap(from);
1152 UEdgeRefMap uEdgeRefMap(from);
1153 EdgeRefMap edgeRefMap(to, from, uEdgeRefMap, nodeRefMap);
1154 _graph_utils_bits::UGraphCopySelector<To>::
1155 copy(to, from, nodeRefMap, uEdgeRefMap);
1156 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
1157 nodeMapCopies[i]->copy(from, nodeRefMap);
1159 for (int i = 0; i < int(uEdgeMapCopies.size()); ++i) {
1160 uEdgeMapCopies[i]->copy(from, uEdgeRefMap);
1162 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
1163 edgeMapCopies[i]->copy(from, edgeRefMap);
1172 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
1175 std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
1178 std::vector<_graph_utils_bits::MapCopyBase<From, UEdge, UEdgeRefMap>* >
1183 /// \brief Copy an undirected graph to another graph.
1185 /// Copy an undirected graph to another graph.
1186 /// The usage of the function:
1189 /// copyUGraph(trg, src).nodeRef(nr).edgeCrossRef(ecr).run();
1192 /// After the copy the \c nr map will contain the mapping from the
1193 /// nodes of the \c from graph to the nodes of the \c to graph and
1194 /// \c ecr will contain the mapping from the edges of the \c to graph
1195 /// to the edges of the \c from graph.
1198 template <typename To, typename From>
1199 UGraphCopy<To, From>
1200 copyUGraph(To& to, const From& from) {
1201 return UGraphCopy<To, From>(to, from);
1204 /// \brief Class to copy a bipartite undirected graph.
1206 /// Class to copy a bipartite undirected graph to another graph
1207 /// (duplicate a graph). The simplest way of using it is through
1208 /// the \c copyBpUGraph() function.
1209 template <typename To, typename From>
1210 class BpUGraphCopy {
1213 typedef typename From::Node Node;
1214 typedef typename From::ANode ANode;
1215 typedef typename From::BNode BNode;
1216 typedef typename From::NodeIt NodeIt;
1217 typedef typename From::Edge Edge;
1218 typedef typename From::EdgeIt EdgeIt;
1219 typedef typename From::UEdge UEdge;
1220 typedef typename From::UEdgeIt UEdgeIt;
1222 typedef typename To::Node TNode;
1223 typedef typename To::Edge TEdge;
1224 typedef typename To::UEdge TUEdge;
1226 typedef typename From::template ANodeMap<TNode> ANodeRefMap;
1227 typedef typename From::template BNodeMap<TNode> BNodeRefMap;
1228 typedef typename From::template UEdgeMap<TUEdge> UEdgeRefMap;
1231 NodeRefMap(const From& _from, const ANodeRefMap& _anode_ref,
1232 const BNodeRefMap& _bnode_ref)
1233 : from(_from), anode_ref(_anode_ref), bnode_ref(_bnode_ref) {}
1235 typedef typename From::Node Key;
1236 typedef typename To::Node Value;
1238 Value operator[](const Key& key) const {
1239 return from.aNode(key) ? anode_ref[key] : bnode_ref[key];
1243 const ANodeRefMap& anode_ref;
1244 const BNodeRefMap& bnode_ref;
1248 EdgeRefMap(const To& _to, const From& _from,
1249 const UEdgeRefMap& _uedge_ref, const NodeRefMap& _node_ref)
1250 : to(_to), from(_from),
1251 uedge_ref(_uedge_ref), node_ref(_node_ref) {}
1253 typedef typename From::Edge Key;
1254 typedef typename To::Edge Value;
1256 Value operator[](const Key& key) const {
1258 (from.direction(key) ==
1259 (node_ref[from.source(static_cast<const UEdge&>(key))] ==
1260 to.source(uedge_ref[static_cast<const UEdge&>(key)])));
1261 return to.direct(uedge_ref[key], forward);
1266 const UEdgeRefMap& uedge_ref;
1267 const NodeRefMap& node_ref;
1273 /// \brief Constructor for the GraphCopy.
1275 /// It copies the content of the \c _from graph into the
1277 BpUGraphCopy(To& _to, const From& _from)
1278 : from(_from), to(_to) {}
1280 /// \brief Destructor of the GraphCopy
1282 /// Destructor of the GraphCopy
1284 for (int i = 0; i < int(aNodeMapCopies.size()); ++i) {
1285 delete aNodeMapCopies[i];
1287 for (int i = 0; i < int(bNodeMapCopies.size()); ++i) {
1288 delete bNodeMapCopies[i];
1290 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
1291 delete nodeMapCopies[i];
1293 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
1294 delete edgeMapCopies[i];
1296 for (int i = 0; i < int(uEdgeMapCopies.size()); ++i) {
1297 delete uEdgeMapCopies[i];
1302 /// \brief Copies the A-node references into the given map.
1304 /// Copies the A-node references into the given map.
1305 template <typename ANodeRef>
1306 BpUGraphCopy& aNodeRef(ANodeRef& map) {
1307 aNodeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, ANode,
1308 ANodeRefMap, ANodeRef>(map));
1312 /// \brief Copies the A-node cross references into the given map.
1314 /// Copies the A-node cross references (reverse references) into
1316 template <typename ANodeCrossRef>
1317 BpUGraphCopy& aNodeCrossRef(ANodeCrossRef& map) {
1318 aNodeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From,
1319 ANode, ANodeRefMap, ANodeCrossRef>(map));
1323 /// \brief Make copy of the given A-node map.
1325 /// Makes copy of the given map for the newly created graph.
1326 /// The new map's key type is the to graph's node type,
1327 /// and the copied map's key type is the from graph's node
1329 template <typename ToMap, typename FromMap>
1330 BpUGraphCopy& aNodeMap(ToMap& tmap, const FromMap& map) {
1331 aNodeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, ANode,
1332 ANodeRefMap, ToMap, FromMap>(tmap, map));
1336 /// \brief Copies the B-node references into the given map.
1338 /// Copies the B-node references into the given map.
1339 template <typename BNodeRef>
1340 BpUGraphCopy& bNodeRef(BNodeRef& map) {
1341 bNodeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, BNode,
1342 BNodeRefMap, BNodeRef>(map));
1346 /// \brief Copies the B-node cross references into the given map.
1348 /// Copies the B-node cross references (reverse references) into
1350 template <typename BNodeCrossRef>
1351 BpUGraphCopy& bNodeCrossRef(BNodeCrossRef& map) {
1352 bNodeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From,
1353 BNode, BNodeRefMap, BNodeCrossRef>(map));
1357 /// \brief Make copy of the given B-node map.
1359 /// Makes copy of the given map for the newly created graph.
1360 /// The new map's key type is the to graph's node type,
1361 /// and the copied map's key type is the from graph's node
1363 template <typename ToMap, typename FromMap>
1364 BpUGraphCopy& bNodeMap(ToMap& tmap, const FromMap& map) {
1365 bNodeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, BNode,
1366 BNodeRefMap, ToMap, FromMap>(tmap, map));
1369 /// \brief Copies the node references into the given map.
1371 /// Copies the node references into the given map.
1372 template <typename NodeRef>
1373 BpUGraphCopy& nodeRef(NodeRef& map) {
1374 nodeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Node,
1375 NodeRefMap, NodeRef>(map));
1379 /// \brief Copies the node cross references into the given map.
1381 /// Copies the node cross references (reverse references) into
1383 template <typename NodeCrossRef>
1384 BpUGraphCopy& nodeCrossRef(NodeCrossRef& map) {
1385 nodeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
1386 NodeRefMap, NodeCrossRef>(map));
1390 /// \brief Make copy of the given map.
1392 /// Makes copy of the given map for the newly created graph.
1393 /// The new map's key type is the to graph's node type,
1394 /// and the copied map's key type is the from graph's node
1396 template <typename ToMap, typename FromMap>
1397 BpUGraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
1398 nodeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Node,
1399 NodeRefMap, ToMap, FromMap>(tmap, map));
1403 /// \brief Make a copy of the given node.
1405 /// Make a copy of the given node.
1406 BpUGraphCopy& node(TNode& tnode, const Node& snode) {
1407 nodeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Node,
1408 NodeRefMap, TNode>(tnode, snode));
1412 /// \brief Copies the edge references into the given map.
1414 /// Copies the edge references into the given map.
1415 template <typename EdgeRef>
1416 BpUGraphCopy& edgeRef(EdgeRef& map) {
1417 edgeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, Edge,
1418 EdgeRefMap, EdgeRef>(map));
1422 /// \brief Copies the edge cross references into the given map.
1424 /// Copies the edge cross references (reverse references) into
1426 template <typename EdgeCrossRef>
1427 BpUGraphCopy& edgeCrossRef(EdgeCrossRef& map) {
1428 edgeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From, Edge,
1429 EdgeRefMap, EdgeCrossRef>(map));
1433 /// \brief Make copy of the given map.
1435 /// Makes copy of the given map for the newly created graph.
1436 /// The new map's key type is the to graph's edge type,
1437 /// and the copied map's key type is the from graph's edge
1439 template <typename ToMap, typename FromMap>
1440 BpUGraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
1441 edgeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, Edge,
1442 EdgeRefMap, ToMap, FromMap>(tmap, map));
1446 /// \brief Make a copy of the given edge.
1448 /// Make a copy of the given edge.
1449 BpUGraphCopy& edge(TEdge& tedge, const Edge& sedge) {
1450 edgeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, Edge,
1451 EdgeRefMap, TEdge>(tedge, sedge));
1455 /// \brief Copies the undirected edge references into the given map.
1457 /// Copies the undirected edge references into the given map.
1458 template <typename UEdgeRef>
1459 BpUGraphCopy& uEdgeRef(UEdgeRef& map) {
1460 uEdgeMapCopies.push_back(new _graph_utils_bits::RefCopy<From, UEdge,
1461 UEdgeRefMap, UEdgeRef>(map));
1465 /// \brief Copies the undirected edge cross references into the given map.
1467 /// Copies the undirected edge cross references (reverse
1468 /// references) into the given map.
1469 template <typename UEdgeCrossRef>
1470 BpUGraphCopy& uEdgeCrossRef(UEdgeCrossRef& map) {
1471 uEdgeMapCopies.push_back(new _graph_utils_bits::CrossRefCopy<From,
1472 UEdge, UEdgeRefMap, UEdgeCrossRef>(map));
1476 /// \brief Make copy of the given map.
1478 /// Makes copy of the given map for the newly created graph.
1479 /// The new map's key type is the to graph's undirected edge type,
1480 /// and the copied map's key type is the from graph's undirected edge
1482 template <typename ToMap, typename FromMap>
1483 BpUGraphCopy& uEdgeMap(ToMap& tmap, const FromMap& map) {
1484 uEdgeMapCopies.push_back(new _graph_utils_bits::MapCopy<From, UEdge,
1485 UEdgeRefMap, ToMap, FromMap>(tmap, map));
1489 /// \brief Make a copy of the given undirected edge.
1491 /// Make a copy of the given undirected edge.
1492 BpUGraphCopy& uEdge(TUEdge& tuedge, const UEdge& suedge) {
1493 uEdgeMapCopies.push_back(new _graph_utils_bits::ItemCopy<From, UEdge,
1494 UEdgeRefMap, TUEdge>(tuedge, suedge));
1498 /// \brief Executes the copies.
1500 /// Executes the copies.
1502 ANodeRefMap aNodeRefMap(from);
1503 BNodeRefMap bNodeRefMap(from);
1504 NodeRefMap nodeRefMap(from, aNodeRefMap, bNodeRefMap);
1505 UEdgeRefMap uEdgeRefMap(from);
1506 EdgeRefMap edgeRefMap(to, from, uEdgeRefMap, nodeRefMap);
1507 _graph_utils_bits::BpUGraphCopySelector<To>::
1508 copy(to, from, aNodeRefMap, bNodeRefMap, uEdgeRefMap);
1509 for (int i = 0; i < int(aNodeMapCopies.size()); ++i) {
1510 aNodeMapCopies[i]->copy(from, aNodeRefMap);
1512 for (int i = 0; i < int(bNodeMapCopies.size()); ++i) {
1513 bNodeMapCopies[i]->copy(from, bNodeRefMap);
1515 for (int i = 0; i < int(nodeMapCopies.size()); ++i) {
1516 nodeMapCopies[i]->copy(from, nodeRefMap);
1518 for (int i = 0; i < int(uEdgeMapCopies.size()); ++i) {
1519 uEdgeMapCopies[i]->copy(from, uEdgeRefMap);
1521 for (int i = 0; i < int(edgeMapCopies.size()); ++i) {
1522 edgeMapCopies[i]->copy(from, edgeRefMap);
1531 std::vector<_graph_utils_bits::MapCopyBase<From, ANode, ANodeRefMap>* >
1534 std::vector<_graph_utils_bits::MapCopyBase<From, BNode, BNodeRefMap>* >
1537 std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* >
1540 std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
1543 std::vector<_graph_utils_bits::MapCopyBase<From, UEdge, UEdgeRefMap>* >
1548 /// \brief Copy a bipartite undirected graph to another graph.
1550 /// Copy a bipartite undirected graph to another graph.
1551 /// The usage of the function:
1554 /// copyBpUGraph(trg, src).aNodeRef(anr).edgeCrossRef(ecr).run();
1557 /// After the copy the \c nr map will contain the mapping from the
1558 /// nodes of the \c from graph to the nodes of the \c to graph and
1559 /// \c ecr will contain the mapping from the edges of the \c to graph
1560 /// to the edges of the \c from graph.
1562 /// \see BpUGraphCopy
1563 template <typename To, typename From>
1564 BpUGraphCopy<To, From>
1565 copyBpUGraph(To& to, const From& from) {
1566 return BpUGraphCopy<To, From>(to, from);
1572 /// \addtogroup graph_maps
1575 /// Provides an immutable and unique id for each item in the graph.
1577 /// The IdMap class provides a unique and immutable id for each item of the
1578 /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1579 /// different items (nodes) get different ids <li>\b immutable: the id of an
1580 /// item (node) does not change (even if you delete other nodes). </ul>
1581 /// Through this map you get access (i.e. can read) the inner id values of
1582 /// the items stored in the graph. This map can be inverted with its member
1583 /// class \c InverseMap.
1585 template <typename _Graph, typename _Item>
1588 typedef _Graph Graph;
1593 /// \brief Constructor.
1595 /// Constructor of the map.
1596 explicit IdMap(const Graph& _graph) : graph(&_graph) {}
1598 /// \brief Gives back the \e id of the item.
1600 /// Gives back the immutable and unique \e id of the item.
1601 int operator[](const Item& item) const { return graph->id(item);}
1603 /// \brief Gives back the item by its id.
1605 /// Gives back the item by its id.
1606 Item operator()(int id) { return graph->fromId(id, Item()); }
1613 /// \brief The class represents the inverse of its owner (IdMap).
1615 /// The class represents the inverse of its owner (IdMap).
1620 /// \brief Constructor.
1622 /// Constructor for creating an id-to-item map.
1623 explicit InverseMap(const Graph& _graph) : graph(&_graph) {}
1625 /// \brief Constructor.
1627 /// Constructor for creating an id-to-item map.
1628 explicit InverseMap(const IdMap& idMap) : graph(idMap.graph) {}
1630 /// \brief Gives back the given item from its id.
1632 /// Gives back the given item from its id.
1634 Item operator[](int id) const { return graph->fromId(id, Item());}
1640 /// \brief Gives back the inverse of the map.
1642 /// Gives back the inverse of the IdMap.
1643 InverseMap inverse() const { return InverseMap(*graph);}
1648 /// \brief General invertable graph-map type.
1650 /// This type provides simple invertable graph-maps.
1651 /// The InvertableMap wraps an arbitrary ReadWriteMap
1652 /// and if a key is set to a new value then store it
1653 /// in the inverse map.
1655 /// The values of the map can be accessed
1656 /// with stl compatible forward iterator.
1658 /// \param _Graph The graph type.
1659 /// \param _Item The item type of the graph.
1660 /// \param _Value The value type of the map.
1662 /// \see IterableValueMap
1663 template <typename _Graph, typename _Item, typename _Value>
1664 class InvertableMap : protected DefaultMap<_Graph, _Item, _Value> {
1667 typedef DefaultMap<_Graph, _Item, _Value> Map;
1668 typedef _Graph Graph;
1670 typedef std::map<_Value, _Item> Container;
1675 /// The key type of InvertableMap (Node, Edge, UEdge).
1676 typedef typename Map::Key Key;
1677 /// The value type of the InvertableMap.
1678 typedef typename Map::Value Value;
1682 /// \brief Constructor.
1684 /// Construct a new InvertableMap for the graph.
1686 explicit InvertableMap(const Graph& graph) : Map(graph) {}
1688 /// \brief Forward iterator for values.
1690 /// This iterator is an stl compatible forward
1691 /// iterator on the values of the map. The values can
1692 /// be accessed in the [beginValue, endValue) range.
1695 : public std::iterator<std::forward_iterator_tag, Value> {
1696 friend class InvertableMap;
1698 ValueIterator(typename Container::const_iterator _it)
1704 ValueIterator& operator++() { ++it; return *this; }
1705 ValueIterator operator++(int) {
1706 ValueIterator tmp(*this);
1711 const Value& operator*() const { return it->first; }
1712 const Value* operator->() const { return &(it->first); }
1714 bool operator==(ValueIterator jt) const { return it == jt.it; }
1715 bool operator!=(ValueIterator jt) const { return it != jt.it; }
1718 typename Container::const_iterator it;
1721 /// \brief Returns an iterator to the first value.
1723 /// Returns an stl compatible iterator to the
1724 /// first value of the map. The values of the
1725 /// map can be accessed in the [beginValue, endValue)
1727 ValueIterator beginValue() const {
1728 return ValueIterator(invMap.begin());
1731 /// \brief Returns an iterator after the last value.
1733 /// Returns an stl compatible iterator after the
1734 /// last value of the map. The values of the
1735 /// map can be accessed in the [beginValue, endValue)
1737 ValueIterator endValue() const {
1738 return ValueIterator(invMap.end());
1741 /// \brief The setter function of the map.
1743 /// Sets the mapped value.
1744 void set(const Key& key, const Value& val) {
1745 Value oldval = Map::operator[](key);
1746 typename Container::iterator it = invMap.find(oldval);
1747 if (it != invMap.end() && it->second == key) {
1750 invMap.insert(make_pair(val, key));
1754 /// \brief The getter function of the map.
1756 /// It gives back the value associated with the key.
1757 typename MapTraits<Map>::ConstReturnValue
1758 operator[](const Key& key) const {
1759 return Map::operator[](key);
1762 /// \brief Gives back the item by its value.
1764 /// Gives back the item by its value.
1765 Key operator()(const Value& key) const {
1766 typename Container::const_iterator it = invMap.find(key);
1767 return it != invMap.end() ? it->second : INVALID;
1772 /// \brief Erase the key from the map.
1774 /// Erase the key to the map. It is called by the
1775 /// \c AlterationNotifier.
1776 virtual void erase(const Key& key) {
1777 Value val = Map::operator[](key);
1778 typename Container::iterator it = invMap.find(val);
1779 if (it != invMap.end() && it->second == key) {
1785 /// \brief Erase more keys from the map.
1787 /// Erase more keys from the map. It is called by the
1788 /// \c AlterationNotifier.
1789 virtual void erase(const std::vector<Key>& keys) {
1790 for (int i = 0; i < int(keys.size()); ++i) {
1791 Value val = Map::operator[](keys[i]);
1792 typename Container::iterator it = invMap.find(val);
1793 if (it != invMap.end() && it->second == keys[i]) {
1800 /// \brief Clear the keys from the map and inverse map.
1802 /// Clear the keys from the map and inverse map. It is called by the
1803 /// \c AlterationNotifier.
1804 virtual void clear() {
1811 /// \brief The inverse map type.
1813 /// The inverse of this map. The subscript operator of the map
1814 /// gives back always the item what was last assigned to the value.
1817 /// \brief Constructor of the InverseMap.
1819 /// Constructor of the InverseMap.
1820 explicit InverseMap(const InvertableMap& _inverted)
1821 : inverted(_inverted) {}
1823 /// The value type of the InverseMap.
1824 typedef typename InvertableMap::Key Value;
1825 /// The key type of the InverseMap.
1826 typedef typename InvertableMap::Value Key;
1828 /// \brief Subscript operator.
1830 /// Subscript operator. It gives back always the item
1831 /// what was last assigned to the value.
1832 Value operator[](const Key& key) const {
1833 return inverted(key);
1837 const InvertableMap& inverted;
1840 /// \brief It gives back the just readable inverse map.
1842 /// It gives back the just readable inverse map.
1843 InverseMap inverse() const {
1844 return InverseMap(*this);
1851 /// \brief Provides a mutable, continuous and unique descriptor for each
1852 /// item in the graph.
1854 /// The DescriptorMap class provides a unique and continuous (but mutable)
1855 /// descriptor (id) for each item of the same type (e.g. node) in the
1856 /// graph. This id is <ul><li>\b unique: different items (nodes) get
1857 /// different ids <li>\b continuous: the range of the ids is the set of
1858 /// integers between 0 and \c n-1, where \c n is the number of the items of
1859 /// this type (e.g. nodes) (so the id of a node can change if you delete an
1860 /// other node, i.e. this id is mutable). </ul> This map can be inverted
1861 /// with its member class \c InverseMap.
1863 /// \param _Graph The graph class the \c DescriptorMap belongs to.
1864 /// \param _Item The Item is the Key of the Map. It may be Node, Edge or
1866 template <typename _Graph, typename _Item>
1867 class DescriptorMap : protected DefaultMap<_Graph, _Item, int> {
1870 typedef DefaultMap<_Graph, _Item, int> Map;
1873 /// The graph class of DescriptorMap.
1874 typedef _Graph Graph;
1876 /// The key type of DescriptorMap (Node, Edge, UEdge).
1877 typedef typename Map::Key Key;
1878 /// The value type of DescriptorMap.
1879 typedef typename Map::Value Value;
1881 /// \brief Constructor.
1883 /// Constructor for descriptor map.
1884 explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
1886 const typename Map::Notifier* nf = Map::notifier();
1887 for (nf->first(it); it != INVALID; nf->next(it)) {
1888 Map::set(it, invMap.size());
1889 invMap.push_back(it);
1895 /// \brief Add a new key to the map.
1897 /// Add a new key to the map. It is called by the
1898 /// \c AlterationNotifier.
1899 virtual void add(const Item& item) {
1901 Map::set(item, invMap.size());
1902 invMap.push_back(item);
1905 /// \brief Add more new keys to the map.
1907 /// Add more new keys to the map. It is called by the
1908 /// \c AlterationNotifier.
1909 virtual void add(const std::vector<Item>& items) {
1911 for (int i = 0; i < int(items.size()); ++i) {
1912 Map::set(items[i], invMap.size());
1913 invMap.push_back(items[i]);
1917 /// \brief Erase the key from the map.
1919 /// Erase the key from the map. It is called by the
1920 /// \c AlterationNotifier.
1921 virtual void erase(const Item& item) {
1922 Map::set(invMap.back(), Map::operator[](item));
1923 invMap[Map::operator[](item)] = invMap.back();
1928 /// \brief Erase more keys from the map.
1930 /// Erase more keys from the map. It is called by the
1931 /// \c AlterationNotifier.
1932 virtual void erase(const std::vector<Item>& items) {
1933 for (int i = 0; i < int(items.size()); ++i) {
1934 Map::set(invMap.back(), Map::operator[](items[i]));
1935 invMap[Map::operator[](items[i])] = invMap.back();
1941 /// \brief Build the unique map.
1943 /// Build the unique map. It is called by the
1944 /// \c AlterationNotifier.
1945 virtual void build() {
1948 const typename Map::Notifier* nf = Map::notifier();
1949 for (nf->first(it); it != INVALID; nf->next(it)) {
1950 Map::set(it, invMap.size());
1951 invMap.push_back(it);
1955 /// \brief Clear the keys from the map.
1957 /// Clear the keys from the map. It is called by the
1958 /// \c AlterationNotifier.
1959 virtual void clear() {
1966 /// \brief Returns the maximal value plus one.
1968 /// Returns the maximal value plus one in the map.
1969 unsigned int size() const {
1970 return invMap.size();
1973 /// \brief Swaps the position of the two items in the map.
1975 /// Swaps the position of the two items in the map.
1976 void swap(const Item& p, const Item& q) {
1977 int pi = Map::operator[](p);
1978 int qi = Map::operator[](q);
1985 /// \brief Gives back the \e descriptor of the item.
1987 /// Gives back the mutable and unique \e descriptor of the map.
1988 int operator[](const Item& item) const {
1989 return Map::operator[](item);
1992 /// \brief Gives back the item by its descriptor.
1994 /// Gives back th item by its descriptor.
1995 Item operator()(int id) const {
2001 typedef std::vector<Item> Container;
2005 /// \brief The inverse map type of DescriptorMap.
2007 /// The inverse map type of DescriptorMap.
2010 /// \brief Constructor of the InverseMap.
2012 /// Constructor of the InverseMap.
2013 explicit InverseMap(const DescriptorMap& _inverted)
2014 : inverted(_inverted) {}
2017 /// The value type of the InverseMap.
2018 typedef typename DescriptorMap::Key Value;
2019 /// The key type of the InverseMap.
2020 typedef typename DescriptorMap::Value Key;
2022 /// \brief Subscript operator.
2024 /// Subscript operator. It gives back the item
2025 /// that the descriptor belongs to currently.
2026 Value operator[](const Key& key) const {
2027 return inverted(key);
2030 /// \brief Size of the map.
2032 /// Returns the size of the map.
2033 unsigned int size() const {
2034 return inverted.size();
2038 const DescriptorMap& inverted;
2041 /// \brief Gives back the inverse of the map.
2043 /// Gives back the inverse of the map.
2044 const InverseMap inverse() const {
2045 return InverseMap(*this);
2049 /// \brief Returns the source of the given edge.
2051 /// The SourceMap gives back the source Node of the given edge.
2053 /// \author Balazs Dezso
2054 template <typename Graph>
2058 typedef typename Graph::Node Value;
2059 typedef typename Graph::Edge Key;
2061 /// \brief Constructor
2064 /// \param _graph The graph that the map belongs to.
2065 explicit SourceMap(const Graph& _graph) : graph(_graph) {}
2067 /// \brief The subscript operator.
2069 /// The subscript operator.
2070 /// \param edge The edge
2071 /// \return The source of the edge
2072 Value operator[](const Key& edge) const {
2073 return graph.source(edge);
2080 /// \brief Returns a \ref SourceMap class.
2082 /// This function just returns an \ref SourceMap class.
2083 /// \relates SourceMap
2084 template <typename Graph>
2085 inline SourceMap<Graph> sourceMap(const Graph& graph) {
2086 return SourceMap<Graph>(graph);
2089 /// \brief Returns the target of the given edge.
2091 /// The TargetMap gives back the target Node of the given edge.
2093 /// \author Balazs Dezso
2094 template <typename Graph>
2098 typedef typename Graph::Node Value;
2099 typedef typename Graph::Edge Key;
2101 /// \brief Constructor
2104 /// \param _graph The graph that the map belongs to.
2105 explicit TargetMap(const Graph& _graph) : graph(_graph) {}
2107 /// \brief The subscript operator.
2109 /// The subscript operator.
2110 /// \param e The edge
2111 /// \return The target of the edge
2112 Value operator[](const Key& e) const {
2113 return graph.target(e);
2120 /// \brief Returns a \ref TargetMap class.
2122 /// This function just returns a \ref TargetMap class.
2123 /// \relates TargetMap
2124 template <typename Graph>
2125 inline TargetMap<Graph> targetMap(const Graph& graph) {
2126 return TargetMap<Graph>(graph);
2129 /// \brief Returns the "forward" directed edge view of an undirected edge.
2131 /// Returns the "forward" directed edge view of an undirected edge.
2132 /// \see BackwardMap
2133 /// \author Balazs Dezso
2134 template <typename Graph>
2138 typedef typename Graph::Edge Value;
2139 typedef typename Graph::UEdge Key;
2141 /// \brief Constructor
2144 /// \param _graph The graph that the map belongs to.
2145 explicit ForwardMap(const Graph& _graph) : graph(_graph) {}
2147 /// \brief The subscript operator.
2149 /// The subscript operator.
2150 /// \param key An undirected edge
2151 /// \return The "forward" directed edge view of undirected edge
2152 Value operator[](const Key& key) const {
2153 return graph.direct(key, true);
2160 /// \brief Returns a \ref ForwardMap class.
2162 /// This function just returns an \ref ForwardMap class.
2163 /// \relates ForwardMap
2164 template <typename Graph>
2165 inline ForwardMap<Graph> forwardMap(const Graph& graph) {
2166 return ForwardMap<Graph>(graph);
2169 /// \brief Returns the "backward" directed edge view of an undirected edge.
2171 /// Returns the "backward" directed edge view of an undirected edge.
2173 /// \author Balazs Dezso
2174 template <typename Graph>
2178 typedef typename Graph::Edge Value;
2179 typedef typename Graph::UEdge Key;
2181 /// \brief Constructor
2184 /// \param _graph The graph that the map belongs to.
2185 explicit BackwardMap(const Graph& _graph) : graph(_graph) {}
2187 /// \brief The subscript operator.
2189 /// The subscript operator.
2190 /// \param key An undirected edge
2191 /// \return The "backward" directed edge view of undirected edge
2192 Value operator[](const Key& key) const {
2193 return graph.direct(key, false);
2200 /// \brief Returns a \ref BackwardMap class
2202 /// This function just returns a \ref BackwardMap class.
2203 /// \relates BackwardMap
2204 template <typename Graph>
2205 inline BackwardMap<Graph> backwardMap(const Graph& graph) {
2206 return BackwardMap<Graph>(graph);
2209 /// \brief Potential difference map
2211 /// If there is an potential map on the nodes then we
2212 /// can get an edge map as we get the substraction of the
2213 /// values of the target and source.
2214 template <typename Graph, typename NodeMap>
2215 class PotentialDifferenceMap {
2217 typedef typename Graph::Edge Key;
2218 typedef typename NodeMap::Value Value;
2220 /// \brief Constructor
2222 /// Contructor of the map
2223 explicit PotentialDifferenceMap(const Graph& _graph,
2224 const NodeMap& _potential)
2225 : graph(_graph), potential(_potential) {}
2227 /// \brief Const subscription operator
2229 /// Const subscription operator
2230 Value operator[](const Key& edge) const {
2231 return potential[graph.target(edge)] - potential[graph.source(edge)];
2236 const NodeMap& potential;
2239 /// \brief Returns a PotentialDifferenceMap.
2241 /// This function just returns a PotentialDifferenceMap.
2242 /// \relates PotentialDifferenceMap
2243 template <typename Graph, typename NodeMap>
2244 PotentialDifferenceMap<Graph, NodeMap>
2245 potentialDifferenceMap(const Graph& graph, const NodeMap& potential) {
2246 return PotentialDifferenceMap<Graph, NodeMap>(graph, potential);
2249 /// \brief Map of the node in-degrees.
2251 /// This map returns the in-degree of a node. Once it is constructed,
2252 /// the degrees are stored in a standard NodeMap, so each query is done
2253 /// in constant time. On the other hand, the values are updated automatically
2254 /// whenever the graph changes.
2256 /// \warning Besides addNode() and addEdge(), a graph structure may provide
2257 /// alternative ways to modify the graph. The correct behavior of InDegMap
2258 /// is not guarantied if these additional features are used. For example
2259 /// the functions \ref ListGraph::changeSource() "changeSource()",
2260 /// \ref ListGraph::changeTarget() "changeTarget()" and
2261 /// \ref ListGraph::reverseEdge() "reverseEdge()"
2262 /// of \ref ListGraph will \e not update the degree values correctly.
2266 template <typename _Graph>
2268 : protected ItemSetTraits<_Graph, typename _Graph::Edge>
2269 ::ItemNotifier::ObserverBase {
2273 typedef _Graph Graph;
2275 typedef typename Graph::Node Key;
2277 typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
2278 ::ItemNotifier::ObserverBase Parent;
2282 class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
2285 typedef DefaultMap<_Graph, Key, int> Parent;
2286 typedef typename Parent::Graph Graph;
2288 AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
2290 virtual void add(const Key& key) {
2292 Parent::set(key, 0);
2295 virtual void add(const std::vector<Key>& keys) {
2297 for (int i = 0; i < int(keys.size()); ++i) {
2298 Parent::set(keys[i], 0);
2302 virtual void build() {
2305 typename Parent::Notifier* nf = Parent::notifier();
2306 for (nf->first(it); it != INVALID; nf->next(it)) {
2314 /// \brief Constructor.
2316 /// Constructor for creating in-degree map.
2317 explicit InDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
2318 Parent::attach(graph.notifier(typename _Graph::Edge()));
2320 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2321 deg[it] = countInEdges(graph, it);
2325 /// Gives back the in-degree of a Node.
2326 int operator[](const Key& key) const {
2332 typedef typename Graph::Edge Edge;
2334 virtual void add(const Edge& edge) {
2335 ++deg[graph.target(edge)];
2338 virtual void add(const std::vector<Edge>& edges) {
2339 for (int i = 0; i < int(edges.size()); ++i) {
2340 ++deg[graph.target(edges[i])];
2344 virtual void erase(const Edge& edge) {
2345 --deg[graph.target(edge)];
2348 virtual void erase(const std::vector<Edge>& edges) {
2349 for (int i = 0; i < int(edges.size()); ++i) {
2350 --deg[graph.target(edges[i])];
2354 virtual void build() {
2355 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2356 deg[it] = countInEdges(graph, it);
2360 virtual void clear() {
2361 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2367 const _Graph& graph;
2371 /// \brief Map of the node out-degrees.
2373 /// This map returns the out-degree of a node. Once it is constructed,
2374 /// the degrees are stored in a standard NodeMap, so each query is done
2375 /// in constant time. On the other hand, the values are updated automatically
2376 /// whenever the graph changes.
2378 /// \warning Besides addNode() and addEdge(), a graph structure may provide
2379 /// alternative ways to modify the graph. The correct behavior of OutDegMap
2380 /// is not guarantied if these additional features are used. For example
2381 /// the functions \ref ListGraph::changeSource() "changeSource()",
2382 /// \ref ListGraph::changeTarget() "changeTarget()" and
2383 /// \ref ListGraph::reverseEdge() "reverseEdge()"
2384 /// of \ref ListGraph will \e not update the degree values correctly.
2388 template <typename _Graph>
2390 : protected ItemSetTraits<_Graph, typename _Graph::Edge>
2391 ::ItemNotifier::ObserverBase {
2395 typedef typename ItemSetTraits<_Graph, typename _Graph::Edge>
2396 ::ItemNotifier::ObserverBase Parent;
2398 typedef _Graph Graph;
2400 typedef typename Graph::Node Key;
2404 class AutoNodeMap : public DefaultMap<_Graph, Key, int> {
2407 typedef DefaultMap<_Graph, Key, int> Parent;
2408 typedef typename Parent::Graph Graph;
2410 AutoNodeMap(const Graph& graph) : Parent(graph, 0) {}
2412 virtual void add(const Key& key) {
2414 Parent::set(key, 0);
2416 virtual void add(const std::vector<Key>& keys) {
2418 for (int i = 0; i < int(keys.size()); ++i) {
2419 Parent::set(keys[i], 0);
2422 virtual void build() {
2425 typename Parent::Notifier* nf = Parent::notifier();
2426 for (nf->first(it); it != INVALID; nf->next(it)) {
2434 /// \brief Constructor.
2436 /// Constructor for creating out-degree map.
2437 explicit OutDegMap(const Graph& _graph) : graph(_graph), deg(_graph) {
2438 Parent::attach(graph.notifier(typename _Graph::Edge()));
2440 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2441 deg[it] = countOutEdges(graph, it);
2445 /// Gives back the out-degree of a Node.
2446 int operator[](const Key& key) const {
2452 typedef typename Graph::Edge Edge;
2454 virtual void add(const Edge& edge) {
2455 ++deg[graph.source(edge)];
2458 virtual void add(const std::vector<Edge>& edges) {
2459 for (int i = 0; i < int(edges.size()); ++i) {
2460 ++deg[graph.source(edges[i])];
2464 virtual void erase(const Edge& edge) {
2465 --deg[graph.source(edge)];
2468 virtual void erase(const std::vector<Edge>& edges) {
2469 for (int i = 0; i < int(edges.size()); ++i) {
2470 --deg[graph.source(edges[i])];
2474 virtual void build() {
2475 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2476 deg[it] = countOutEdges(graph, it);
2480 virtual void clear() {
2481 for(typename _Graph::NodeIt it(graph); it != INVALID; ++it) {
2487 const _Graph& graph;
2492 ///Dynamic edge look up between given endpoints.
2495 ///Using this class, you can find an edge in a graph from a given
2496 ///source to a given target in amortized time <em>O(log d)</em>,
2497 ///where <em>d</em> is the out-degree of the source node.
2499 ///It is possible to find \e all parallel edges between two nodes with
2500 ///the \c findFirst() and \c findNext() members.
2502 ///See the \ref EdgeLookUp and \ref AllEdgeLookUp classes if your
2503 ///graph do not changed so frequently.
2505 ///This class uses a self-adjusting binary search tree, Sleator's
2506 ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2507 ///time bound for edge lookups. This class also guarantees the
2508 ///optimal time bound in a constant factor for any distribution of
2511 ///\param G The type of the underlying graph.
2514 ///\sa AllEdgeLookUp
2517 : protected ItemSetTraits<G, typename G::Edge>::ItemNotifier::ObserverBase
2520 typedef typename ItemSetTraits<G, typename G::Edge>
2521 ::ItemNotifier::ObserverBase Parent;
2523 GRAPH_TYPEDEFS(typename G);
2528 class AutoNodeMap : public DefaultMap<G, Node, Edge> {
2531 typedef DefaultMap<G, Node, Edge> Parent;
2533 AutoNodeMap(const G& graph) : Parent(graph, INVALID) {}
2535 virtual void add(const Node& node) {
2537 Parent::set(node, INVALID);
2540 virtual void add(const std::vector<Node>& nodes) {
2542 for (int i = 0; i < int(nodes.size()); ++i) {
2543 Parent::set(nodes[i], INVALID);
2547 virtual void build() {
2550 typename Parent::Notifier* nf = Parent::notifier();
2551 for (nf->first(it); it != INVALID; nf->next(it)) {
2552 Parent::set(it, INVALID);
2559 typename Graph::template EdgeMap<Edge> _parent;
2560 typename Graph::template EdgeMap<Edge> _left;
2561 typename Graph::template EdgeMap<Edge> _right;
2566 EdgeLess(const Graph &_g) : g(_g) {}
2567 bool operator()(Edge a,Edge b) const
2569 return g.target(a)<g.target(b);
2579 ///It builds up the search database.
2580 DynEdgeLookUp(const Graph &g)
2581 : _g(g),_head(g),_parent(g),_left(g),_right(g)
2583 Parent::attach(_g.notifier(typename Graph::Edge()));
2589 virtual void add(const Edge& edge) {
2593 virtual void add(const std::vector<Edge>& edges) {
2594 for (int i = 0; i < int(edges.size()); ++i) {
2599 virtual void erase(const Edge& edge) {
2603 virtual void erase(const std::vector<Edge>& edges) {
2604 for (int i = 0; i < int(edges.size()); ++i) {
2609 virtual void build() {
2613 virtual void clear() {
2614 for(NodeIt n(_g);n!=INVALID;++n) {
2615 _head.set(n, INVALID);
2619 void insert(Edge edge) {
2620 Node s = _g.source(edge);
2621 Node t = _g.target(edge);
2622 _left.set(edge, INVALID);
2623 _right.set(edge, INVALID);
2628 _parent.set(edge, INVALID);
2632 if (t < _g.target(e)) {
2633 if (_left[e] == INVALID) {
2635 _parent.set(edge, e);
2642 if (_right[e] == INVALID) {
2643 _right.set(e, edge);
2644 _parent.set(edge, e);
2654 void remove(Edge edge) {
2655 if (_left[edge] == INVALID) {
2656 if (_right[edge] != INVALID) {
2657 _parent.set(_right[edge], _parent[edge]);
2659 if (_parent[edge] != INVALID) {
2660 if (_left[_parent[edge]] == edge) {
2661 _left.set(_parent[edge], _right[edge]);
2663 _right.set(_parent[edge], _right[edge]);
2666 _head.set(_g.source(edge), _right[edge]);
2668 } else if (_right[edge] == INVALID) {
2669 _parent.set(_left[edge], _parent[edge]);
2670 if (_parent[edge] != INVALID) {
2671 if (_left[_parent[edge]] == edge) {
2672 _left.set(_parent[edge], _left[edge]);
2674 _right.set(_parent[edge], _left[edge]);
2677 _head.set(_g.source(edge), _left[edge]);
2680 Edge e = _left[edge];
2681 if (_right[e] != INVALID) {
2683 while (_right[e] != INVALID) {
2686 Edge s = _parent[e];
2687 _right.set(_parent[e], _left[e]);
2688 if (_left[e] != INVALID) {
2689 _parent.set(_left[e], _parent[e]);
2692 _left.set(e, _left[edge]);
2693 _parent.set(_left[edge], e);
2694 _right.set(e, _right[edge]);
2695 _parent.set(_right[edge], e);
2697 _parent.set(e, _parent[edge]);
2698 if (_parent[edge] != INVALID) {
2699 if (_left[_parent[edge]] == edge) {
2700 _left.set(_parent[edge], e);
2702 _right.set(_parent[edge], e);
2707 _right.set(e, _right[edge]);
2708 _parent.set(_right[edge], e);
2710 if (_parent[edge] != INVALID) {
2711 if (_left[_parent[edge]] == edge) {
2712 _left.set(_parent[edge], e);
2714 _right.set(_parent[edge], e);
2717 _head.set(_g.source(edge), e);
2723 Edge refreshRec(std::vector<Edge> &v,int a,int b)
2728 Edge left = refreshRec(v,a,m-1);
2729 _left.set(me, left);
2730 _parent.set(left, me);
2732 _left.set(me, INVALID);
2735 Edge right = refreshRec(v,m+1,b);
2736 _right.set(me, right);
2737 _parent.set(right, me);
2739 _right.set(me, INVALID);
2745 for(NodeIt n(_g);n!=INVALID;++n) {
2746 std::vector<Edge> v;
2747 for(OutEdgeIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2749 std::sort(v.begin(),v.end(),EdgeLess(_g));
2750 Edge head = refreshRec(v,0,v.size()-1);
2752 _parent.set(head, INVALID);
2754 else _head.set(n, INVALID);
2759 Edge w = _parent[v];
2760 _parent.set(v, _parent[w]);
2762 _left.set(w, _right[v]);
2764 if (_parent[v] != INVALID) {
2765 if (_right[_parent[v]] == w) {
2766 _right.set(_parent[v], v);
2768 _left.set(_parent[v], v);
2771 if (_left[w] != INVALID){
2772 _parent.set(_left[w], w);
2777 Edge w = _parent[v];
2778 _parent.set(v, _parent[w]);
2780 _right.set(w, _left[v]);
2782 if (_parent[v] != INVALID){
2783 if (_left[_parent[v]] == w) {
2784 _left.set(_parent[v], v);
2786 _right.set(_parent[v], v);
2789 if (_right[w] != INVALID){
2790 _parent.set(_right[w], w);
2794 void splay(Edge v) {
2795 while (_parent[v] != INVALID) {
2796 if (v == _left[_parent[v]]) {
2797 if (_parent[_parent[v]] == INVALID) {
2800 if (_parent[v] == _left[_parent[_parent[v]]]) {
2809 if (_parent[_parent[v]] == INVALID) {
2812 if (_parent[v] == _left[_parent[_parent[v]]]) {
2822 _head[_g.source(v)] = v;
2828 ///Find an edge between two nodes.
2830 ///Find an edge between two nodes in time <em>O(</em>log<em>d)</em>, where
2831 /// <em>d</em> is the number of outgoing edges of \c s.
2832 ///\param s The source node
2833 ///\param t The target node
2834 ///\return An edge from \c s to \c t if there exists,
2835 ///\ref INVALID otherwise.
2836 Edge operator()(Node s, Node t) const
2840 if (_g.target(e) == t) {
2841 const_cast<DynEdgeLookUp&>(*this).splay(e);
2843 } else if (t < _g.target(e)) {
2844 if (_left[e] == INVALID) {
2845 const_cast<DynEdgeLookUp&>(*this).splay(e);
2851 if (_right[e] == INVALID) {
2852 const_cast<DynEdgeLookUp&>(*this).splay(e);
2861 ///Find the first edge between two nodes.
2863 ///Find the first edge between two nodes in time
2864 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2865 /// outgoing edges of \c s.
2866 ///\param s The source node
2867 ///\param t The target node
2868 ///\return An edge from \c s to \c t if there exists, \ref INVALID
2870 Edge findFirst(Node s, Node t) const
2875 if (_g.target(e) < t) {
2876 if (_right[e] == INVALID) {
2877 const_cast<DynEdgeLookUp&>(*this).splay(e);
2883 if (_g.target(e) == t) {
2886 if (_left[e] == INVALID) {
2887 const_cast<DynEdgeLookUp&>(*this).splay(e);
2896 ///Find the next edge between two nodes.
2898 ///Find the next edge between two nodes in time
2899 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2900 /// outgoing edges of \c s.
2901 ///\param s The source node
2902 ///\param t The target node
2903 ///\return An edge from \c s to \c t if there exists, \ref INVALID
2906 ///\note If \c e is not the result of the previous \c findFirst()
2907 ///operation then the amorized time bound can not be guaranteed.
2909 Edge findNext(Node s, Node t, Edge e) const
2911 Edge findNext(Node, Node t, Edge e) const
2914 if (_right[e] != INVALID) {
2916 while (_left[e] != INVALID) {
2919 const_cast<DynEdgeLookUp&>(*this).splay(e);
2921 while (_parent[e] != INVALID && _right[_parent[e]] == e) {
2924 if (_parent[e] == INVALID) {
2928 const_cast<DynEdgeLookUp&>(*this).splay(e);
2931 if (_g.target(e) == t) return e;
2932 else return INVALID;
2937 ///Fast edge look up between given endpoints.
2940 ///Using this class, you can find an edge in a graph from a given
2941 ///source to a given target in time <em>O(log d)</em>,
2942 ///where <em>d</em> is the out-degree of the source node.
2944 ///It is not possible to find \e all parallel edges between two nodes.
2945 ///Use \ref AllEdgeLookUp for this purpose.
2947 ///\warning This class is static, so you should refresh() (or at least
2948 ///refresh(Node)) this data structure
2949 ///whenever the graph changes. This is a time consuming (superlinearly
2950 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of edges).
2952 ///\param G The type of the underlying graph.
2954 ///\sa DynEdgeLookUp
2955 ///\sa AllEdgeLookUp
2960 GRAPH_TYPEDEFS(typename G);
2965 typename Graph::template NodeMap<Edge> _head;
2966 typename Graph::template EdgeMap<Edge> _left;
2967 typename Graph::template EdgeMap<Edge> _right;
2972 EdgeLess(const Graph &_g) : g(_g) {}
2973 bool operator()(Edge a,Edge b) const
2975 return g.target(a)<g.target(b);
2985 ///It builds up the search database, which remains valid until the graph
2987 EdgeLookUp(const Graph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
2990 Edge refreshRec(std::vector<Edge> &v,int a,int b)
2994 _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
2995 _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
2999 ///Refresh the data structure at a node.
3001 ///Build up the search database of node \c n.
3003 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
3004 ///the number of the outgoing edges of \c n.
3005 void refresh(Node n)
3007 std::vector<Edge> v;
3008 for(OutEdgeIt e(_g,n);e!=INVALID;++e) v.push_back(e);
3010 std::sort(v.begin(),v.end(),EdgeLess(_g));
3011 _head[n]=refreshRec(v,0,v.size()-1);
3013 else _head[n]=INVALID;
3015 ///Refresh the full data structure.
3017 ///Build up the full search database. In fact, it simply calls
3018 ///\ref refresh(Node) "refresh(n)" for each node \c n.
3020 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
3021 ///the number of the edges of \c n and <em>D</em> is the maximum
3022 ///out-degree of the graph.
3026 for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
3029 ///Find an edge between two nodes.
3031 ///Find an edge between two nodes in time <em>O(</em>log<em>d)</em>, where
3032 /// <em>d</em> is the number of outgoing edges of \c s.
3033 ///\param s The source node
3034 ///\param t The target node
3035 ///\return An edge from \c s to \c t if there exists,
3036 ///\ref INVALID otherwise.
3038 ///\warning If you change the graph, refresh() must be called before using
3039 ///this operator. If you change the outgoing edges of
3040 ///a single node \c n, then
3041 ///\ref refresh(Node) "refresh(n)" is enough.
3043 Edge operator()(Node s, Node t) const
3047 e!=INVALID&&_g.target(e)!=t;
3048 e = t < _g.target(e)?_left[e]:_right[e]) ;
3054 ///Fast look up of all edges between given endpoints.
3057 ///This class is the same as \ref EdgeLookUp, with the addition
3058 ///that it makes it possible to find all edges between given endpoints.
3060 ///\warning This class is static, so you should refresh() (or at least
3061 ///refresh(Node)) this data structure
3062 ///whenever the graph changes. This is a time consuming (superlinearly
3063 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of edges).
3065 ///\param G The type of the underlying graph.
3067 ///\sa DynEdgeLookUp
3070 class AllEdgeLookUp : public EdgeLookUp<G>
3072 using EdgeLookUp<G>::_g;
3073 using EdgeLookUp<G>::_right;
3074 using EdgeLookUp<G>::_left;
3075 using EdgeLookUp<G>::_head;
3077 GRAPH_TYPEDEFS(typename G);
3080 typename Graph::template EdgeMap<Edge> _next;
3082 Edge refreshNext(Edge head,Edge next=INVALID)
3084 if(head==INVALID) return next;
3086 next=refreshNext(_right[head],next);
3087 // _next[head]=next;
3088 _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
3090 return refreshNext(_left[head],head);
3096 for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
3104 ///It builds up the search database, which remains valid until the graph
3106 AllEdgeLookUp(const Graph &g) : EdgeLookUp<G>(g), _next(g) {refreshNext();}
3108 ///Refresh the data structure at a node.
3110 ///Build up the search database of node \c n.
3112 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
3113 ///the number of the outgoing edges of \c n.
3115 void refresh(Node n)
3117 EdgeLookUp<G>::refresh(n);
3118 refreshNext(_head[n]);
3121 ///Refresh the full data structure.
3123 ///Build up the full search database. In fact, it simply calls
3124 ///\ref refresh(Node) "refresh(n)" for each node \c n.
3126 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
3127 ///the number of the edges of \c n and <em>D</em> is the maximum
3128 ///out-degree of the graph.
3132 for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
3135 ///Find an edge between two nodes.
3137 ///Find an edge between two nodes.
3138 ///\param s The source node
3139 ///\param t The target node
3140 ///\param prev The previous edge between \c s and \c t. It it is INVALID or
3141 ///not given, the operator finds the first appropriate edge.
3142 ///\return An edge from \c s to \c t after \c prev or
3143 ///\ref INVALID if there is no more.
3145 ///For example, you can count the number of edges from \c u to \c v in the
3148 ///AllEdgeLookUp<ListGraph> ae(g);
3151 ///for(Edge e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++;
3154 ///Finding the first edge take <em>O(</em>log<em>d)</em> time, where
3155 /// <em>d</em> is the number of outgoing edges of \c s. Then, the
3156 ///consecutive edges are found in constant time.
3158 ///\warning If you change the graph, refresh() must be called before using
3159 ///this operator. If you change the outgoing edges of
3160 ///a single node \c n, then
3161 ///\ref refresh(Node) "refresh(n)" is enough.
3164 Edge operator()(Node s, Node t, Edge prev=INVALID) const {}
3166 using EdgeLookUp<G>::operator() ;
3167 Edge operator()(Node s, Node t, Edge prev) const
3169 return prev==INVALID?(*this)(s,t):_next[prev];
3177 } //END OF NAMESPACE LEMON