|
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
|
2 * |
|
3 * This file is a part of LEMON, a generic C++ optimization library. |
|
4 * |
|
5 * Copyright (C) 2003-2008 |
|
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
|
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
|
8 * |
|
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. |
|
12 * |
|
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 |
|
15 * purpose. |
|
16 * |
|
17 */ |
|
18 |
|
19 #ifndef LEMON_CORE_H |
|
20 #define LEMON_CORE_H |
|
21 |
|
22 #include <vector> |
|
23 #include <algorithm> |
|
24 |
|
25 #include <lemon/bits/enable_if.h> |
|
26 #include <lemon/bits/traits.h> |
|
27 |
|
28 ///\file |
|
29 ///\brief LEMON core utilities. |
|
30 |
|
31 namespace lemon { |
|
32 |
|
33 /// \brief Dummy type to make it easier to create invalid iterators. |
|
34 /// |
|
35 /// Dummy type to make it easier to create invalid iterators. |
|
36 /// See \ref INVALID for the usage. |
|
37 struct Invalid { |
|
38 public: |
|
39 bool operator==(Invalid) { return true; } |
|
40 bool operator!=(Invalid) { return false; } |
|
41 bool operator< (Invalid) { return false; } |
|
42 }; |
|
43 |
|
44 /// \brief Invalid iterators. |
|
45 /// |
|
46 /// \ref Invalid is a global type that converts to each iterator |
|
47 /// in such a way that the value of the target iterator will be invalid. |
|
48 #ifdef LEMON_ONLY_TEMPLATES |
|
49 const Invalid INVALID = Invalid(); |
|
50 #else |
|
51 extern const Invalid INVALID; |
|
52 #endif |
|
53 |
|
54 /// \addtogroup gutils |
|
55 /// @{ |
|
56 |
|
57 ///Creates convenience typedefs for the digraph types and iterators |
|
58 |
|
59 ///This \c \#define creates convenience typedefs for the following types |
|
60 ///of \c Digraph: \c Node, \c NodeIt, \c Arc, \c ArcIt, \c InArcIt, |
|
61 ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap, |
|
62 ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap. |
|
63 /// |
|
64 ///\note If the graph type is a dependent type, ie. the graph type depend |
|
65 ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS() |
|
66 ///macro. |
|
67 #define DIGRAPH_TYPEDEFS(Digraph) \ |
|
68 typedef Digraph::Node Node; \ |
|
69 typedef Digraph::NodeIt NodeIt; \ |
|
70 typedef Digraph::Arc Arc; \ |
|
71 typedef Digraph::ArcIt ArcIt; \ |
|
72 typedef Digraph::InArcIt InArcIt; \ |
|
73 typedef Digraph::OutArcIt OutArcIt; \ |
|
74 typedef Digraph::NodeMap<bool> BoolNodeMap; \ |
|
75 typedef Digraph::NodeMap<int> IntNodeMap; \ |
|
76 typedef Digraph::NodeMap<double> DoubleNodeMap; \ |
|
77 typedef Digraph::ArcMap<bool> BoolArcMap; \ |
|
78 typedef Digraph::ArcMap<int> IntArcMap; \ |
|
79 typedef Digraph::ArcMap<double> DoubleArcMap |
|
80 |
|
81 ///Creates convenience typedefs for the digraph types and iterators |
|
82 |
|
83 ///\see DIGRAPH_TYPEDEFS |
|
84 /// |
|
85 ///\note Use this macro, if the graph type is a dependent type, |
|
86 ///ie. the graph type depend on a template parameter. |
|
87 #define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph) \ |
|
88 typedef typename Digraph::Node Node; \ |
|
89 typedef typename Digraph::NodeIt NodeIt; \ |
|
90 typedef typename Digraph::Arc Arc; \ |
|
91 typedef typename Digraph::ArcIt ArcIt; \ |
|
92 typedef typename Digraph::InArcIt InArcIt; \ |
|
93 typedef typename Digraph::OutArcIt OutArcIt; \ |
|
94 typedef typename Digraph::template NodeMap<bool> BoolNodeMap; \ |
|
95 typedef typename Digraph::template NodeMap<int> IntNodeMap; \ |
|
96 typedef typename Digraph::template NodeMap<double> DoubleNodeMap; \ |
|
97 typedef typename Digraph::template ArcMap<bool> BoolArcMap; \ |
|
98 typedef typename Digraph::template ArcMap<int> IntArcMap; \ |
|
99 typedef typename Digraph::template ArcMap<double> DoubleArcMap |
|
100 |
|
101 ///Creates convenience typedefs for the graph types and iterators |
|
102 |
|
103 ///This \c \#define creates the same convenience typedefs as defined |
|
104 ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates |
|
105 ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap, |
|
106 ///\c DoubleEdgeMap. |
|
107 /// |
|
108 ///\note If the graph type is a dependent type, ie. the graph type depend |
|
109 ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS() |
|
110 ///macro. |
|
111 #define GRAPH_TYPEDEFS(Graph) \ |
|
112 DIGRAPH_TYPEDEFS(Graph); \ |
|
113 typedef Graph::Edge Edge; \ |
|
114 typedef Graph::EdgeIt EdgeIt; \ |
|
115 typedef Graph::IncEdgeIt IncEdgeIt; \ |
|
116 typedef Graph::EdgeMap<bool> BoolEdgeMap; \ |
|
117 typedef Graph::EdgeMap<int> IntEdgeMap; \ |
|
118 typedef Graph::EdgeMap<double> DoubleEdgeMap |
|
119 |
|
120 ///Creates convenience typedefs for the graph types and iterators |
|
121 |
|
122 ///\see GRAPH_TYPEDEFS |
|
123 /// |
|
124 ///\note Use this macro, if the graph type is a dependent type, |
|
125 ///ie. the graph type depend on a template parameter. |
|
126 #define TEMPLATE_GRAPH_TYPEDEFS(Graph) \ |
|
127 TEMPLATE_DIGRAPH_TYPEDEFS(Graph); \ |
|
128 typedef typename Graph::Edge Edge; \ |
|
129 typedef typename Graph::EdgeIt EdgeIt; \ |
|
130 typedef typename Graph::IncEdgeIt IncEdgeIt; \ |
|
131 typedef typename Graph::template EdgeMap<bool> BoolEdgeMap; \ |
|
132 typedef typename Graph::template EdgeMap<int> IntEdgeMap; \ |
|
133 typedef typename Graph::template EdgeMap<double> DoubleEdgeMap |
|
134 |
|
135 /// \brief Function to count the items in the graph. |
|
136 /// |
|
137 /// This function counts the items (nodes, arcs etc) in the graph. |
|
138 /// The complexity of the function is O(n) because |
|
139 /// it iterates on all of the items. |
|
140 template <typename Graph, typename Item> |
|
141 inline int countItems(const Graph& g) { |
|
142 typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt; |
|
143 int num = 0; |
|
144 for (ItemIt it(g); it != INVALID; ++it) { |
|
145 ++num; |
|
146 } |
|
147 return num; |
|
148 } |
|
149 |
|
150 // Node counting: |
|
151 |
|
152 namespace _core_bits { |
|
153 |
|
154 template <typename Graph, typename Enable = void> |
|
155 struct CountNodesSelector { |
|
156 static int count(const Graph &g) { |
|
157 return countItems<Graph, typename Graph::Node>(g); |
|
158 } |
|
159 }; |
|
160 |
|
161 template <typename Graph> |
|
162 struct CountNodesSelector< |
|
163 Graph, typename |
|
164 enable_if<typename Graph::NodeNumTag, void>::type> |
|
165 { |
|
166 static int count(const Graph &g) { |
|
167 return g.nodeNum(); |
|
168 } |
|
169 }; |
|
170 } |
|
171 |
|
172 /// \brief Function to count the nodes in the graph. |
|
173 /// |
|
174 /// This function counts the nodes in the graph. |
|
175 /// The complexity of the function is O(n) but for some |
|
176 /// graph structures it is specialized to run in O(1). |
|
177 /// |
|
178 /// If the graph contains a \e nodeNum() member function and a |
|
179 /// \e NodeNumTag tag then this function calls directly the member |
|
180 /// function to query the cardinality of the node set. |
|
181 template <typename Graph> |
|
182 inline int countNodes(const Graph& g) { |
|
183 return _core_bits::CountNodesSelector<Graph>::count(g); |
|
184 } |
|
185 |
|
186 // Arc counting: |
|
187 |
|
188 namespace _core_bits { |
|
189 |
|
190 template <typename Graph, typename Enable = void> |
|
191 struct CountArcsSelector { |
|
192 static int count(const Graph &g) { |
|
193 return countItems<Graph, typename Graph::Arc>(g); |
|
194 } |
|
195 }; |
|
196 |
|
197 template <typename Graph> |
|
198 struct CountArcsSelector< |
|
199 Graph, |
|
200 typename enable_if<typename Graph::ArcNumTag, void>::type> |
|
201 { |
|
202 static int count(const Graph &g) { |
|
203 return g.arcNum(); |
|
204 } |
|
205 }; |
|
206 } |
|
207 |
|
208 /// \brief Function to count the arcs in the graph. |
|
209 /// |
|
210 /// This function counts the arcs in the graph. |
|
211 /// The complexity of the function is O(e) but for some |
|
212 /// graph structures it is specialized to run in O(1). |
|
213 /// |
|
214 /// If the graph contains a \e arcNum() member function and a |
|
215 /// \e EdgeNumTag tag then this function calls directly the member |
|
216 /// function to query the cardinality of the arc set. |
|
217 template <typename Graph> |
|
218 inline int countArcs(const Graph& g) { |
|
219 return _core_bits::CountArcsSelector<Graph>::count(g); |
|
220 } |
|
221 |
|
222 // Edge counting: |
|
223 namespace _core_bits { |
|
224 |
|
225 template <typename Graph, typename Enable = void> |
|
226 struct CountEdgesSelector { |
|
227 static int count(const Graph &g) { |
|
228 return countItems<Graph, typename Graph::Edge>(g); |
|
229 } |
|
230 }; |
|
231 |
|
232 template <typename Graph> |
|
233 struct CountEdgesSelector< |
|
234 Graph, |
|
235 typename enable_if<typename Graph::EdgeNumTag, void>::type> |
|
236 { |
|
237 static int count(const Graph &g) { |
|
238 return g.edgeNum(); |
|
239 } |
|
240 }; |
|
241 } |
|
242 |
|
243 /// \brief Function to count the edges in the graph. |
|
244 /// |
|
245 /// This function counts the edges in the graph. |
|
246 /// The complexity of the function is O(m) but for some |
|
247 /// graph structures it is specialized to run in O(1). |
|
248 /// |
|
249 /// If the graph contains a \e edgeNum() member function and a |
|
250 /// \e EdgeNumTag tag then this function calls directly the member |
|
251 /// function to query the cardinality of the edge set. |
|
252 template <typename Graph> |
|
253 inline int countEdges(const Graph& g) { |
|
254 return _core_bits::CountEdgesSelector<Graph>::count(g); |
|
255 |
|
256 } |
|
257 |
|
258 |
|
259 template <typename Graph, typename DegIt> |
|
260 inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) { |
|
261 int num = 0; |
|
262 for (DegIt it(_g, _n); it != INVALID; ++it) { |
|
263 ++num; |
|
264 } |
|
265 return num; |
|
266 } |
|
267 |
|
268 /// \brief Function to count the number of the out-arcs from node \c n. |
|
269 /// |
|
270 /// This function counts the number of the out-arcs from node \c n |
|
271 /// in the graph. |
|
272 template <typename Graph> |
|
273 inline int countOutArcs(const Graph& _g, const typename Graph::Node& _n) { |
|
274 return countNodeDegree<Graph, typename Graph::OutArcIt>(_g, _n); |
|
275 } |
|
276 |
|
277 /// \brief Function to count the number of the in-arcs to node \c n. |
|
278 /// |
|
279 /// This function counts the number of the in-arcs to node \c n |
|
280 /// in the graph. |
|
281 template <typename Graph> |
|
282 inline int countInArcs(const Graph& _g, const typename Graph::Node& _n) { |
|
283 return countNodeDegree<Graph, typename Graph::InArcIt>(_g, _n); |
|
284 } |
|
285 |
|
286 /// \brief Function to count the number of the inc-edges to node \c n. |
|
287 /// |
|
288 /// This function counts the number of the inc-edges to node \c n |
|
289 /// in the graph. |
|
290 template <typename Graph> |
|
291 inline int countIncEdges(const Graph& _g, const typename Graph::Node& _n) { |
|
292 return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n); |
|
293 } |
|
294 |
|
295 namespace _core_bits { |
|
296 |
|
297 template <typename Digraph, typename Item, typename RefMap> |
|
298 class MapCopyBase { |
|
299 public: |
|
300 virtual void copy(const Digraph& from, const RefMap& refMap) = 0; |
|
301 |
|
302 virtual ~MapCopyBase() {} |
|
303 }; |
|
304 |
|
305 template <typename Digraph, typename Item, typename RefMap, |
|
306 typename ToMap, typename FromMap> |
|
307 class MapCopy : public MapCopyBase<Digraph, Item, RefMap> { |
|
308 public: |
|
309 |
|
310 MapCopy(ToMap& tmap, const FromMap& map) |
|
311 : _tmap(tmap), _map(map) {} |
|
312 |
|
313 virtual void copy(const Digraph& digraph, const RefMap& refMap) { |
|
314 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt; |
|
315 for (ItemIt it(digraph); it != INVALID; ++it) { |
|
316 _tmap.set(refMap[it], _map[it]); |
|
317 } |
|
318 } |
|
319 |
|
320 private: |
|
321 ToMap& _tmap; |
|
322 const FromMap& _map; |
|
323 }; |
|
324 |
|
325 template <typename Digraph, typename Item, typename RefMap, typename It> |
|
326 class ItemCopy : public MapCopyBase<Digraph, Item, RefMap> { |
|
327 public: |
|
328 |
|
329 ItemCopy(It& it, const Item& item) : _it(it), _item(item) {} |
|
330 |
|
331 virtual void copy(const Digraph&, const RefMap& refMap) { |
|
332 _it = refMap[_item]; |
|
333 } |
|
334 |
|
335 private: |
|
336 It& _it; |
|
337 Item _item; |
|
338 }; |
|
339 |
|
340 template <typename Digraph, typename Item, typename RefMap, typename Ref> |
|
341 class RefCopy : public MapCopyBase<Digraph, Item, RefMap> { |
|
342 public: |
|
343 |
|
344 RefCopy(Ref& map) : _map(map) {} |
|
345 |
|
346 virtual void copy(const Digraph& digraph, const RefMap& refMap) { |
|
347 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt; |
|
348 for (ItemIt it(digraph); it != INVALID; ++it) { |
|
349 _map.set(it, refMap[it]); |
|
350 } |
|
351 } |
|
352 |
|
353 private: |
|
354 Ref& _map; |
|
355 }; |
|
356 |
|
357 template <typename Digraph, typename Item, typename RefMap, |
|
358 typename CrossRef> |
|
359 class CrossRefCopy : public MapCopyBase<Digraph, Item, RefMap> { |
|
360 public: |
|
361 |
|
362 CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {} |
|
363 |
|
364 virtual void copy(const Digraph& digraph, const RefMap& refMap) { |
|
365 typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt; |
|
366 for (ItemIt it(digraph); it != INVALID; ++it) { |
|
367 _cmap.set(refMap[it], it); |
|
368 } |
|
369 } |
|
370 |
|
371 private: |
|
372 CrossRef& _cmap; |
|
373 }; |
|
374 |
|
375 template <typename Digraph, typename Enable = void> |
|
376 struct DigraphCopySelector { |
|
377 template <typename From, typename NodeRefMap, typename ArcRefMap> |
|
378 static void copy(Digraph &to, const From& from, |
|
379 NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) { |
|
380 for (typename From::NodeIt it(from); it != INVALID; ++it) { |
|
381 nodeRefMap[it] = to.addNode(); |
|
382 } |
|
383 for (typename From::ArcIt it(from); it != INVALID; ++it) { |
|
384 arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)], |
|
385 nodeRefMap[from.target(it)]); |
|
386 } |
|
387 } |
|
388 }; |
|
389 |
|
390 template <typename Digraph> |
|
391 struct DigraphCopySelector< |
|
392 Digraph, |
|
393 typename enable_if<typename Digraph::BuildTag, void>::type> |
|
394 { |
|
395 template <typename From, typename NodeRefMap, typename ArcRefMap> |
|
396 static void copy(Digraph &to, const From& from, |
|
397 NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) { |
|
398 to.build(from, nodeRefMap, arcRefMap); |
|
399 } |
|
400 }; |
|
401 |
|
402 template <typename Graph, typename Enable = void> |
|
403 struct GraphCopySelector { |
|
404 template <typename From, typename NodeRefMap, typename EdgeRefMap> |
|
405 static void copy(Graph &to, const From& from, |
|
406 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { |
|
407 for (typename From::NodeIt it(from); it != INVALID; ++it) { |
|
408 nodeRefMap[it] = to.addNode(); |
|
409 } |
|
410 for (typename From::EdgeIt it(from); it != INVALID; ++it) { |
|
411 edgeRefMap[it] = to.addEdge(nodeRefMap[from.u(it)], |
|
412 nodeRefMap[from.v(it)]); |
|
413 } |
|
414 } |
|
415 }; |
|
416 |
|
417 template <typename Graph> |
|
418 struct GraphCopySelector< |
|
419 Graph, |
|
420 typename enable_if<typename Graph::BuildTag, void>::type> |
|
421 { |
|
422 template <typename From, typename NodeRefMap, typename EdgeRefMap> |
|
423 static void copy(Graph &to, const From& from, |
|
424 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { |
|
425 to.build(from, nodeRefMap, edgeRefMap); |
|
426 } |
|
427 }; |
|
428 |
|
429 } |
|
430 |
|
431 /// \brief Class to copy a digraph. |
|
432 /// |
|
433 /// Class to copy a digraph to another digraph (duplicate a digraph). The |
|
434 /// simplest way of using it is through the \c copyDigraph() function. |
|
435 /// |
|
436 /// This class not just make a copy of a graph, but it can create |
|
437 /// references and cross references between the nodes and arcs of |
|
438 /// the two graphs, it can copy maps for use with the newly created |
|
439 /// graph and copy nodes and arcs. |
|
440 /// |
|
441 /// To make a copy from a graph, first an instance of DigraphCopy |
|
442 /// should be created, then the data belongs to the graph should |
|
443 /// assigned to copy. In the end, the \c run() member should be |
|
444 /// called. |
|
445 /// |
|
446 /// The next code copies a graph with several data: |
|
447 ///\code |
|
448 /// DigraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph); |
|
449 /// // create a reference for the nodes |
|
450 /// OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph); |
|
451 /// dc.nodeRef(nr); |
|
452 /// // create a cross reference (inverse) for the arcs |
|
453 /// NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph); |
|
454 /// dc.arcCrossRef(acr); |
|
455 /// // copy an arc map |
|
456 /// OrigGraph::ArcMap<double> oamap(orig_graph); |
|
457 /// NewGraph::ArcMap<double> namap(new_graph); |
|
458 /// dc.arcMap(namap, oamap); |
|
459 /// // copy a node |
|
460 /// OrigGraph::Node on; |
|
461 /// NewGraph::Node nn; |
|
462 /// dc.node(nn, on); |
|
463 /// // Executions of copy |
|
464 /// dc.run(); |
|
465 ///\endcode |
|
466 template <typename To, typename From> |
|
467 class DigraphCopy { |
|
468 private: |
|
469 |
|
470 typedef typename From::Node Node; |
|
471 typedef typename From::NodeIt NodeIt; |
|
472 typedef typename From::Arc Arc; |
|
473 typedef typename From::ArcIt ArcIt; |
|
474 |
|
475 typedef typename To::Node TNode; |
|
476 typedef typename To::Arc TArc; |
|
477 |
|
478 typedef typename From::template NodeMap<TNode> NodeRefMap; |
|
479 typedef typename From::template ArcMap<TArc> ArcRefMap; |
|
480 |
|
481 |
|
482 public: |
|
483 |
|
484 |
|
485 /// \brief Constructor for the DigraphCopy. |
|
486 /// |
|
487 /// It copies the content of the \c _from digraph into the |
|
488 /// \c _to digraph. |
|
489 DigraphCopy(To& to, const From& from) |
|
490 : _from(from), _to(to) {} |
|
491 |
|
492 /// \brief Destructor of the DigraphCopy |
|
493 /// |
|
494 /// Destructor of the DigraphCopy |
|
495 ~DigraphCopy() { |
|
496 for (int i = 0; i < int(_node_maps.size()); ++i) { |
|
497 delete _node_maps[i]; |
|
498 } |
|
499 for (int i = 0; i < int(_arc_maps.size()); ++i) { |
|
500 delete _arc_maps[i]; |
|
501 } |
|
502 |
|
503 } |
|
504 |
|
505 /// \brief Copies the node references into the given map. |
|
506 /// |
|
507 /// Copies the node references into the given map. The parameter |
|
508 /// should be a map, which key type is the Node type of the source |
|
509 /// graph, while the value type is the Node type of the |
|
510 /// destination graph. |
|
511 template <typename NodeRef> |
|
512 DigraphCopy& nodeRef(NodeRef& map) { |
|
513 _node_maps.push_back(new _core_bits::RefCopy<From, Node, |
|
514 NodeRefMap, NodeRef>(map)); |
|
515 return *this; |
|
516 } |
|
517 |
|
518 /// \brief Copies the node cross references into the given map. |
|
519 /// |
|
520 /// Copies the node cross references (reverse references) into |
|
521 /// the given map. The parameter should be a map, which key type |
|
522 /// is the Node type of the destination graph, while the value type is |
|
523 /// the Node type of the source graph. |
|
524 template <typename NodeCrossRef> |
|
525 DigraphCopy& nodeCrossRef(NodeCrossRef& map) { |
|
526 _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node, |
|
527 NodeRefMap, NodeCrossRef>(map)); |
|
528 return *this; |
|
529 } |
|
530 |
|
531 /// \brief Make copy of the given map. |
|
532 /// |
|
533 /// Makes copy of the given map for the newly created digraph. |
|
534 /// The new map's key type is the destination graph's node type, |
|
535 /// and the copied map's key type is the source graph's node type. |
|
536 template <typename ToMap, typename FromMap> |
|
537 DigraphCopy& nodeMap(ToMap& tmap, const FromMap& map) { |
|
538 _node_maps.push_back(new _core_bits::MapCopy<From, Node, |
|
539 NodeRefMap, ToMap, FromMap>(tmap, map)); |
|
540 return *this; |
|
541 } |
|
542 |
|
543 /// \brief Make a copy of the given node. |
|
544 /// |
|
545 /// Make a copy of the given node. |
|
546 DigraphCopy& node(TNode& tnode, const Node& snode) { |
|
547 _node_maps.push_back(new _core_bits::ItemCopy<From, Node, |
|
548 NodeRefMap, TNode>(tnode, snode)); |
|
549 return *this; |
|
550 } |
|
551 |
|
552 /// \brief Copies the arc references into the given map. |
|
553 /// |
|
554 /// Copies the arc references into the given map. |
|
555 template <typename ArcRef> |
|
556 DigraphCopy& arcRef(ArcRef& map) { |
|
557 _arc_maps.push_back(new _core_bits::RefCopy<From, Arc, |
|
558 ArcRefMap, ArcRef>(map)); |
|
559 return *this; |
|
560 } |
|
561 |
|
562 /// \brief Copies the arc cross references into the given map. |
|
563 /// |
|
564 /// Copies the arc cross references (reverse references) into |
|
565 /// the given map. |
|
566 template <typename ArcCrossRef> |
|
567 DigraphCopy& arcCrossRef(ArcCrossRef& map) { |
|
568 _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc, |
|
569 ArcRefMap, ArcCrossRef>(map)); |
|
570 return *this; |
|
571 } |
|
572 |
|
573 /// \brief Make copy of the given map. |
|
574 /// |
|
575 /// Makes copy of the given map for the newly created digraph. |
|
576 /// The new map's key type is the to digraph's arc type, |
|
577 /// and the copied map's key type is the from digraph's arc |
|
578 /// type. |
|
579 template <typename ToMap, typename FromMap> |
|
580 DigraphCopy& arcMap(ToMap& tmap, const FromMap& map) { |
|
581 _arc_maps.push_back(new _core_bits::MapCopy<From, Arc, |
|
582 ArcRefMap, ToMap, FromMap>(tmap, map)); |
|
583 return *this; |
|
584 } |
|
585 |
|
586 /// \brief Make a copy of the given arc. |
|
587 /// |
|
588 /// Make a copy of the given arc. |
|
589 DigraphCopy& arc(TArc& tarc, const Arc& sarc) { |
|
590 _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc, |
|
591 ArcRefMap, TArc>(tarc, sarc)); |
|
592 return *this; |
|
593 } |
|
594 |
|
595 /// \brief Executes the copies. |
|
596 /// |
|
597 /// Executes the copies. |
|
598 void run() { |
|
599 NodeRefMap nodeRefMap(_from); |
|
600 ArcRefMap arcRefMap(_from); |
|
601 _core_bits::DigraphCopySelector<To>:: |
|
602 copy(_to, _from, nodeRefMap, arcRefMap); |
|
603 for (int i = 0; i < int(_node_maps.size()); ++i) { |
|
604 _node_maps[i]->copy(_from, nodeRefMap); |
|
605 } |
|
606 for (int i = 0; i < int(_arc_maps.size()); ++i) { |
|
607 _arc_maps[i]->copy(_from, arcRefMap); |
|
608 } |
|
609 } |
|
610 |
|
611 protected: |
|
612 |
|
613 |
|
614 const From& _from; |
|
615 To& _to; |
|
616 |
|
617 std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* > |
|
618 _node_maps; |
|
619 |
|
620 std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* > |
|
621 _arc_maps; |
|
622 |
|
623 }; |
|
624 |
|
625 /// \brief Copy a digraph to another digraph. |
|
626 /// |
|
627 /// Copy a digraph to another digraph. The complete usage of the |
|
628 /// function is detailed in the DigraphCopy class, but a short |
|
629 /// example shows a basic work: |
|
630 ///\code |
|
631 /// copyDigraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run(); |
|
632 ///\endcode |
|
633 /// |
|
634 /// After the copy the \c nr map will contain the mapping from the |
|
635 /// nodes of the \c from digraph to the nodes of the \c to digraph and |
|
636 /// \c ecr will contain the mapping from the arcs of the \c to digraph |
|
637 /// to the arcs of the \c from digraph. |
|
638 /// |
|
639 /// \see DigraphCopy |
|
640 template <typename To, typename From> |
|
641 DigraphCopy<To, From> copyDigraph(To& to, const From& from) { |
|
642 return DigraphCopy<To, From>(to, from); |
|
643 } |
|
644 |
|
645 /// \brief Class to copy a graph. |
|
646 /// |
|
647 /// Class to copy a graph to another graph (duplicate a graph). The |
|
648 /// simplest way of using it is through the \c copyGraph() function. |
|
649 /// |
|
650 /// This class not just make a copy of a graph, but it can create |
|
651 /// references and cross references between the nodes, edges and arcs of |
|
652 /// the two graphs, it can copy maps for use with the newly created |
|
653 /// graph and copy nodes, edges and arcs. |
|
654 /// |
|
655 /// To make a copy from a graph, first an instance of GraphCopy |
|
656 /// should be created, then the data belongs to the graph should |
|
657 /// assigned to copy. In the end, the \c run() member should be |
|
658 /// called. |
|
659 /// |
|
660 /// The next code copies a graph with several data: |
|
661 ///\code |
|
662 /// GraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph); |
|
663 /// // create a reference for the nodes |
|
664 /// OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph); |
|
665 /// dc.nodeRef(nr); |
|
666 /// // create a cross reference (inverse) for the edges |
|
667 /// NewGraph::EdgeMap<OrigGraph::Arc> ecr(new_graph); |
|
668 /// dc.edgeCrossRef(ecr); |
|
669 /// // copy an arc map |
|
670 /// OrigGraph::ArcMap<double> oamap(orig_graph); |
|
671 /// NewGraph::ArcMap<double> namap(new_graph); |
|
672 /// dc.arcMap(namap, oamap); |
|
673 /// // copy a node |
|
674 /// OrigGraph::Node on; |
|
675 /// NewGraph::Node nn; |
|
676 /// dc.node(nn, on); |
|
677 /// // Executions of copy |
|
678 /// dc.run(); |
|
679 ///\endcode |
|
680 template <typename To, typename From> |
|
681 class GraphCopy { |
|
682 private: |
|
683 |
|
684 typedef typename From::Node Node; |
|
685 typedef typename From::NodeIt NodeIt; |
|
686 typedef typename From::Arc Arc; |
|
687 typedef typename From::ArcIt ArcIt; |
|
688 typedef typename From::Edge Edge; |
|
689 typedef typename From::EdgeIt EdgeIt; |
|
690 |
|
691 typedef typename To::Node TNode; |
|
692 typedef typename To::Arc TArc; |
|
693 typedef typename To::Edge TEdge; |
|
694 |
|
695 typedef typename From::template NodeMap<TNode> NodeRefMap; |
|
696 typedef typename From::template EdgeMap<TEdge> EdgeRefMap; |
|
697 |
|
698 struct ArcRefMap { |
|
699 ArcRefMap(const To& to, const From& from, |
|
700 const EdgeRefMap& edge_ref, const NodeRefMap& node_ref) |
|
701 : _to(to), _from(from), |
|
702 _edge_ref(edge_ref), _node_ref(node_ref) {} |
|
703 |
|
704 typedef typename From::Arc Key; |
|
705 typedef typename To::Arc Value; |
|
706 |
|
707 Value operator[](const Key& key) const { |
|
708 bool forward = _from.u(key) != _from.v(key) ? |
|
709 _node_ref[_from.source(key)] == |
|
710 _to.source(_to.direct(_edge_ref[key], true)) : |
|
711 _from.direction(key); |
|
712 return _to.direct(_edge_ref[key], forward); |
|
713 } |
|
714 |
|
715 const To& _to; |
|
716 const From& _from; |
|
717 const EdgeRefMap& _edge_ref; |
|
718 const NodeRefMap& _node_ref; |
|
719 }; |
|
720 |
|
721 |
|
722 public: |
|
723 |
|
724 |
|
725 /// \brief Constructor for the GraphCopy. |
|
726 /// |
|
727 /// It copies the content of the \c _from graph into the |
|
728 /// \c _to graph. |
|
729 GraphCopy(To& to, const From& from) |
|
730 : _from(from), _to(to) {} |
|
731 |
|
732 /// \brief Destructor of the GraphCopy |
|
733 /// |
|
734 /// Destructor of the GraphCopy |
|
735 ~GraphCopy() { |
|
736 for (int i = 0; i < int(_node_maps.size()); ++i) { |
|
737 delete _node_maps[i]; |
|
738 } |
|
739 for (int i = 0; i < int(_arc_maps.size()); ++i) { |
|
740 delete _arc_maps[i]; |
|
741 } |
|
742 for (int i = 0; i < int(_edge_maps.size()); ++i) { |
|
743 delete _edge_maps[i]; |
|
744 } |
|
745 |
|
746 } |
|
747 |
|
748 /// \brief Copies the node references into the given map. |
|
749 /// |
|
750 /// Copies the node references into the given map. |
|
751 template <typename NodeRef> |
|
752 GraphCopy& nodeRef(NodeRef& map) { |
|
753 _node_maps.push_back(new _core_bits::RefCopy<From, Node, |
|
754 NodeRefMap, NodeRef>(map)); |
|
755 return *this; |
|
756 } |
|
757 |
|
758 /// \brief Copies the node cross references into the given map. |
|
759 /// |
|
760 /// Copies the node cross references (reverse references) into |
|
761 /// the given map. |
|
762 template <typename NodeCrossRef> |
|
763 GraphCopy& nodeCrossRef(NodeCrossRef& map) { |
|
764 _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node, |
|
765 NodeRefMap, NodeCrossRef>(map)); |
|
766 return *this; |
|
767 } |
|
768 |
|
769 /// \brief Make copy of the given map. |
|
770 /// |
|
771 /// Makes copy of the given map for the newly created graph. |
|
772 /// The new map's key type is the to graph's node type, |
|
773 /// and the copied map's key type is the from graph's node |
|
774 /// type. |
|
775 template <typename ToMap, typename FromMap> |
|
776 GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) { |
|
777 _node_maps.push_back(new _core_bits::MapCopy<From, Node, |
|
778 NodeRefMap, ToMap, FromMap>(tmap, map)); |
|
779 return *this; |
|
780 } |
|
781 |
|
782 /// \brief Make a copy of the given node. |
|
783 /// |
|
784 /// Make a copy of the given node. |
|
785 GraphCopy& node(TNode& tnode, const Node& snode) { |
|
786 _node_maps.push_back(new _core_bits::ItemCopy<From, Node, |
|
787 NodeRefMap, TNode>(tnode, snode)); |
|
788 return *this; |
|
789 } |
|
790 |
|
791 /// \brief Copies the arc references into the given map. |
|
792 /// |
|
793 /// Copies the arc references into the given map. |
|
794 template <typename ArcRef> |
|
795 GraphCopy& arcRef(ArcRef& map) { |
|
796 _arc_maps.push_back(new _core_bits::RefCopy<From, Arc, |
|
797 ArcRefMap, ArcRef>(map)); |
|
798 return *this; |
|
799 } |
|
800 |
|
801 /// \brief Copies the arc cross references into the given map. |
|
802 /// |
|
803 /// Copies the arc cross references (reverse references) into |
|
804 /// the given map. |
|
805 template <typename ArcCrossRef> |
|
806 GraphCopy& arcCrossRef(ArcCrossRef& map) { |
|
807 _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc, |
|
808 ArcRefMap, ArcCrossRef>(map)); |
|
809 return *this; |
|
810 } |
|
811 |
|
812 /// \brief Make copy of the given map. |
|
813 /// |
|
814 /// Makes copy of the given map for the newly created graph. |
|
815 /// The new map's key type is the to graph's arc type, |
|
816 /// and the copied map's key type is the from graph's arc |
|
817 /// type. |
|
818 template <typename ToMap, typename FromMap> |
|
819 GraphCopy& arcMap(ToMap& tmap, const FromMap& map) { |
|
820 _arc_maps.push_back(new _core_bits::MapCopy<From, Arc, |
|
821 ArcRefMap, ToMap, FromMap>(tmap, map)); |
|
822 return *this; |
|
823 } |
|
824 |
|
825 /// \brief Make a copy of the given arc. |
|
826 /// |
|
827 /// Make a copy of the given arc. |
|
828 GraphCopy& arc(TArc& tarc, const Arc& sarc) { |
|
829 _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc, |
|
830 ArcRefMap, TArc>(tarc, sarc)); |
|
831 return *this; |
|
832 } |
|
833 |
|
834 /// \brief Copies the edge references into the given map. |
|
835 /// |
|
836 /// Copies the edge references into the given map. |
|
837 template <typename EdgeRef> |
|
838 GraphCopy& edgeRef(EdgeRef& map) { |
|
839 _edge_maps.push_back(new _core_bits::RefCopy<From, Edge, |
|
840 EdgeRefMap, EdgeRef>(map)); |
|
841 return *this; |
|
842 } |
|
843 |
|
844 /// \brief Copies the edge cross references into the given map. |
|
845 /// |
|
846 /// Copies the edge cross references (reverse |
|
847 /// references) into the given map. |
|
848 template <typename EdgeCrossRef> |
|
849 GraphCopy& edgeCrossRef(EdgeCrossRef& map) { |
|
850 _edge_maps.push_back(new _core_bits::CrossRefCopy<From, |
|
851 Edge, EdgeRefMap, EdgeCrossRef>(map)); |
|
852 return *this; |
|
853 } |
|
854 |
|
855 /// \brief Make copy of the given map. |
|
856 /// |
|
857 /// Makes copy of the given map for the newly created graph. |
|
858 /// The new map's key type is the to graph's edge type, |
|
859 /// and the copied map's key type is the from graph's edge |
|
860 /// type. |
|
861 template <typename ToMap, typename FromMap> |
|
862 GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) { |
|
863 _edge_maps.push_back(new _core_bits::MapCopy<From, Edge, |
|
864 EdgeRefMap, ToMap, FromMap>(tmap, map)); |
|
865 return *this; |
|
866 } |
|
867 |
|
868 /// \brief Make a copy of the given edge. |
|
869 /// |
|
870 /// Make a copy of the given edge. |
|
871 GraphCopy& edge(TEdge& tedge, const Edge& sedge) { |
|
872 _edge_maps.push_back(new _core_bits::ItemCopy<From, Edge, |
|
873 EdgeRefMap, TEdge>(tedge, sedge)); |
|
874 return *this; |
|
875 } |
|
876 |
|
877 /// \brief Executes the copies. |
|
878 /// |
|
879 /// Executes the copies. |
|
880 void run() { |
|
881 NodeRefMap nodeRefMap(_from); |
|
882 EdgeRefMap edgeRefMap(_from); |
|
883 ArcRefMap arcRefMap(_to, _from, edgeRefMap, nodeRefMap); |
|
884 _core_bits::GraphCopySelector<To>:: |
|
885 copy(_to, _from, nodeRefMap, edgeRefMap); |
|
886 for (int i = 0; i < int(_node_maps.size()); ++i) { |
|
887 _node_maps[i]->copy(_from, nodeRefMap); |
|
888 } |
|
889 for (int i = 0; i < int(_edge_maps.size()); ++i) { |
|
890 _edge_maps[i]->copy(_from, edgeRefMap); |
|
891 } |
|
892 for (int i = 0; i < int(_arc_maps.size()); ++i) { |
|
893 _arc_maps[i]->copy(_from, arcRefMap); |
|
894 } |
|
895 } |
|
896 |
|
897 private: |
|
898 |
|
899 const From& _from; |
|
900 To& _to; |
|
901 |
|
902 std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* > |
|
903 _node_maps; |
|
904 |
|
905 std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* > |
|
906 _arc_maps; |
|
907 |
|
908 std::vector<_core_bits::MapCopyBase<From, Edge, EdgeRefMap>* > |
|
909 _edge_maps; |
|
910 |
|
911 }; |
|
912 |
|
913 /// \brief Copy a graph to another graph. |
|
914 /// |
|
915 /// Copy a graph to another graph. The complete usage of the |
|
916 /// function is detailed in the GraphCopy class, but a short |
|
917 /// example shows a basic work: |
|
918 ///\code |
|
919 /// copyGraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run(); |
|
920 ///\endcode |
|
921 /// |
|
922 /// After the copy the \c nr map will contain the mapping from the |
|
923 /// nodes of the \c from graph to the nodes of the \c to graph and |
|
924 /// \c ecr will contain the mapping from the arcs of the \c to graph |
|
925 /// to the arcs of the \c from graph. |
|
926 /// |
|
927 /// \see GraphCopy |
|
928 template <typename To, typename From> |
|
929 GraphCopy<To, From> |
|
930 copyGraph(To& to, const From& from) { |
|
931 return GraphCopy<To, From>(to, from); |
|
932 } |
|
933 |
|
934 namespace _core_bits { |
|
935 |
|
936 template <typename Graph, typename Enable = void> |
|
937 struct FindArcSelector { |
|
938 typedef typename Graph::Node Node; |
|
939 typedef typename Graph::Arc Arc; |
|
940 static Arc find(const Graph &g, Node u, Node v, Arc e) { |
|
941 if (e == INVALID) { |
|
942 g.firstOut(e, u); |
|
943 } else { |
|
944 g.nextOut(e); |
|
945 } |
|
946 while (e != INVALID && g.target(e) != v) { |
|
947 g.nextOut(e); |
|
948 } |
|
949 return e; |
|
950 } |
|
951 }; |
|
952 |
|
953 template <typename Graph> |
|
954 struct FindArcSelector< |
|
955 Graph, |
|
956 typename enable_if<typename Graph::FindEdgeTag, void>::type> |
|
957 { |
|
958 typedef typename Graph::Node Node; |
|
959 typedef typename Graph::Arc Arc; |
|
960 static Arc find(const Graph &g, Node u, Node v, Arc prev) { |
|
961 return g.findArc(u, v, prev); |
|
962 } |
|
963 }; |
|
964 } |
|
965 |
|
966 /// \brief Finds an arc between two nodes of a graph. |
|
967 /// |
|
968 /// Finds an arc from node \c u to node \c v in graph \c g. |
|
969 /// |
|
970 /// If \c prev is \ref INVALID (this is the default value), then |
|
971 /// it finds the first arc from \c u to \c v. Otherwise it looks for |
|
972 /// the next arc from \c u to \c v after \c prev. |
|
973 /// \return The found arc or \ref INVALID if there is no such an arc. |
|
974 /// |
|
975 /// Thus you can iterate through each arc from \c u to \c v as it follows. |
|
976 ///\code |
|
977 /// for(Arc e=findArc(g,u,v);e!=INVALID;e=findArc(g,u,v,e)) { |
|
978 /// ... |
|
979 /// } |
|
980 ///\endcode |
|
981 /// |
|
982 ///\sa ArcLookUp |
|
983 ///\sa AllArcLookUp |
|
984 ///\sa DynArcLookUp |
|
985 ///\sa ConArcIt |
|
986 template <typename Graph> |
|
987 inline typename Graph::Arc |
|
988 findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v, |
|
989 typename Graph::Arc prev = INVALID) { |
|
990 return _core_bits::FindArcSelector<Graph>::find(g, u, v, prev); |
|
991 } |
|
992 |
|
993 /// \brief Iterator for iterating on arcs connected the same nodes. |
|
994 /// |
|
995 /// Iterator for iterating on arcs connected the same nodes. It is |
|
996 /// higher level interface for the findArc() function. You can |
|
997 /// use it the following way: |
|
998 ///\code |
|
999 /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) { |
|
1000 /// ... |
|
1001 /// } |
|
1002 ///\endcode |
|
1003 /// |
|
1004 ///\sa findArc() |
|
1005 ///\sa ArcLookUp |
|
1006 ///\sa AllArcLookUp |
|
1007 ///\sa DynArcLookUp |
|
1008 template <typename _Graph> |
|
1009 class ConArcIt : public _Graph::Arc { |
|
1010 public: |
|
1011 |
|
1012 typedef _Graph Graph; |
|
1013 typedef typename Graph::Arc Parent; |
|
1014 |
|
1015 typedef typename Graph::Arc Arc; |
|
1016 typedef typename Graph::Node Node; |
|
1017 |
|
1018 /// \brief Constructor. |
|
1019 /// |
|
1020 /// Construct a new ConArcIt iterating on the arcs which |
|
1021 /// connects the \c u and \c v node. |
|
1022 ConArcIt(const Graph& g, Node u, Node v) : _graph(g) { |
|
1023 Parent::operator=(findArc(_graph, u, v)); |
|
1024 } |
|
1025 |
|
1026 /// \brief Constructor. |
|
1027 /// |
|
1028 /// Construct a new ConArcIt which continues the iterating from |
|
1029 /// the \c e arc. |
|
1030 ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {} |
|
1031 |
|
1032 /// \brief Increment operator. |
|
1033 /// |
|
1034 /// It increments the iterator and gives back the next arc. |
|
1035 ConArcIt& operator++() { |
|
1036 Parent::operator=(findArc(_graph, _graph.source(*this), |
|
1037 _graph.target(*this), *this)); |
|
1038 return *this; |
|
1039 } |
|
1040 private: |
|
1041 const Graph& _graph; |
|
1042 }; |
|
1043 |
|
1044 namespace _core_bits { |
|
1045 |
|
1046 template <typename Graph, typename Enable = void> |
|
1047 struct FindEdgeSelector { |
|
1048 typedef typename Graph::Node Node; |
|
1049 typedef typename Graph::Edge Edge; |
|
1050 static Edge find(const Graph &g, Node u, Node v, Edge e) { |
|
1051 bool b; |
|
1052 if (u != v) { |
|
1053 if (e == INVALID) { |
|
1054 g.firstInc(e, b, u); |
|
1055 } else { |
|
1056 b = g.u(e) == u; |
|
1057 g.nextInc(e, b); |
|
1058 } |
|
1059 while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) { |
|
1060 g.nextInc(e, b); |
|
1061 } |
|
1062 } else { |
|
1063 if (e == INVALID) { |
|
1064 g.firstInc(e, b, u); |
|
1065 } else { |
|
1066 b = true; |
|
1067 g.nextInc(e, b); |
|
1068 } |
|
1069 while (e != INVALID && (!b || g.v(e) != v)) { |
|
1070 g.nextInc(e, b); |
|
1071 } |
|
1072 } |
|
1073 return e; |
|
1074 } |
|
1075 }; |
|
1076 |
|
1077 template <typename Graph> |
|
1078 struct FindEdgeSelector< |
|
1079 Graph, |
|
1080 typename enable_if<typename Graph::FindEdgeTag, void>::type> |
|
1081 { |
|
1082 typedef typename Graph::Node Node; |
|
1083 typedef typename Graph::Edge Edge; |
|
1084 static Edge find(const Graph &g, Node u, Node v, Edge prev) { |
|
1085 return g.findEdge(u, v, prev); |
|
1086 } |
|
1087 }; |
|
1088 } |
|
1089 |
|
1090 /// \brief Finds an edge between two nodes of a graph. |
|
1091 /// |
|
1092 /// Finds an edge from node \c u to node \c v in graph \c g. |
|
1093 /// If the node \c u and node \c v is equal then each loop edge |
|
1094 /// will be enumerated once. |
|
1095 /// |
|
1096 /// If \c prev is \ref INVALID (this is the default value), then |
|
1097 /// it finds the first arc from \c u to \c v. Otherwise it looks for |
|
1098 /// the next arc from \c u to \c v after \c prev. |
|
1099 /// \return The found arc or \ref INVALID if there is no such an arc. |
|
1100 /// |
|
1101 /// Thus you can iterate through each arc from \c u to \c v as it follows. |
|
1102 ///\code |
|
1103 /// for(Edge e = findEdge(g,u,v); e != INVALID; |
|
1104 /// e = findEdge(g,u,v,e)) { |
|
1105 /// ... |
|
1106 /// } |
|
1107 ///\endcode |
|
1108 /// |
|
1109 ///\sa ConEdgeIt |
|
1110 |
|
1111 template <typename Graph> |
|
1112 inline typename Graph::Edge |
|
1113 findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v, |
|
1114 typename Graph::Edge p = INVALID) { |
|
1115 return _core_bits::FindEdgeSelector<Graph>::find(g, u, v, p); |
|
1116 } |
|
1117 |
|
1118 /// \brief Iterator for iterating on edges connected the same nodes. |
|
1119 /// |
|
1120 /// Iterator for iterating on edges connected the same nodes. It is |
|
1121 /// higher level interface for the findEdge() function. You can |
|
1122 /// use it the following way: |
|
1123 ///\code |
|
1124 /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) { |
|
1125 /// ... |
|
1126 /// } |
|
1127 ///\endcode |
|
1128 /// |
|
1129 ///\sa findEdge() |
|
1130 template <typename _Graph> |
|
1131 class ConEdgeIt : public _Graph::Edge { |
|
1132 public: |
|
1133 |
|
1134 typedef _Graph Graph; |
|
1135 typedef typename Graph::Edge Parent; |
|
1136 |
|
1137 typedef typename Graph::Edge Edge; |
|
1138 typedef typename Graph::Node Node; |
|
1139 |
|
1140 /// \brief Constructor. |
|
1141 /// |
|
1142 /// Construct a new ConEdgeIt iterating on the edges which |
|
1143 /// connects the \c u and \c v node. |
|
1144 ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) { |
|
1145 Parent::operator=(findEdge(_graph, u, v)); |
|
1146 } |
|
1147 |
|
1148 /// \brief Constructor. |
|
1149 /// |
|
1150 /// Construct a new ConEdgeIt which continues the iterating from |
|
1151 /// the \c e edge. |
|
1152 ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {} |
|
1153 |
|
1154 /// \brief Increment operator. |
|
1155 /// |
|
1156 /// It increments the iterator and gives back the next edge. |
|
1157 ConEdgeIt& operator++() { |
|
1158 Parent::operator=(findEdge(_graph, _graph.u(*this), |
|
1159 _graph.v(*this), *this)); |
|
1160 return *this; |
|
1161 } |
|
1162 private: |
|
1163 const Graph& _graph; |
|
1164 }; |
|
1165 |
|
1166 |
|
1167 ///Dynamic arc look up between given endpoints. |
|
1168 |
|
1169 ///Using this class, you can find an arc in a digraph from a given |
|
1170 ///source to a given target in amortized time <em>O(log d)</em>, |
|
1171 ///where <em>d</em> is the out-degree of the source node. |
|
1172 /// |
|
1173 ///It is possible to find \e all parallel arcs between two nodes with |
|
1174 ///the \c findFirst() and \c findNext() members. |
|
1175 /// |
|
1176 ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your |
|
1177 ///digraph is not changed so frequently. |
|
1178 /// |
|
1179 ///This class uses a self-adjusting binary search tree, Sleator's |
|
1180 ///and Tarjan's Splay tree for guarantee the logarithmic amortized |
|
1181 ///time bound for arc lookups. This class also guarantees the |
|
1182 ///optimal time bound in a constant factor for any distribution of |
|
1183 ///queries. |
|
1184 /// |
|
1185 ///\tparam G The type of the underlying digraph. |
|
1186 /// |
|
1187 ///\sa ArcLookUp |
|
1188 ///\sa AllArcLookUp |
|
1189 template<class G> |
|
1190 class DynArcLookUp |
|
1191 : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase |
|
1192 { |
|
1193 public: |
|
1194 typedef typename ItemSetTraits<G, typename G::Arc> |
|
1195 ::ItemNotifier::ObserverBase Parent; |
|
1196 |
|
1197 TEMPLATE_DIGRAPH_TYPEDEFS(G); |
|
1198 typedef G Digraph; |
|
1199 |
|
1200 protected: |
|
1201 |
|
1202 class AutoNodeMap : public ItemSetTraits<G, Node>::template Map<Arc>::Type { |
|
1203 public: |
|
1204 |
|
1205 typedef typename ItemSetTraits<G, Node>::template Map<Arc>::Type Parent; |
|
1206 |
|
1207 AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {} |
|
1208 |
|
1209 virtual void add(const Node& node) { |
|
1210 Parent::add(node); |
|
1211 Parent::set(node, INVALID); |
|
1212 } |
|
1213 |
|
1214 virtual void add(const std::vector<Node>& nodes) { |
|
1215 Parent::add(nodes); |
|
1216 for (int i = 0; i < int(nodes.size()); ++i) { |
|
1217 Parent::set(nodes[i], INVALID); |
|
1218 } |
|
1219 } |
|
1220 |
|
1221 virtual void build() { |
|
1222 Parent::build(); |
|
1223 Node it; |
|
1224 typename Parent::Notifier* nf = Parent::notifier(); |
|
1225 for (nf->first(it); it != INVALID; nf->next(it)) { |
|
1226 Parent::set(it, INVALID); |
|
1227 } |
|
1228 } |
|
1229 }; |
|
1230 |
|
1231 const Digraph &_g; |
|
1232 AutoNodeMap _head; |
|
1233 typename Digraph::template ArcMap<Arc> _parent; |
|
1234 typename Digraph::template ArcMap<Arc> _left; |
|
1235 typename Digraph::template ArcMap<Arc> _right; |
|
1236 |
|
1237 class ArcLess { |
|
1238 const Digraph &g; |
|
1239 public: |
|
1240 ArcLess(const Digraph &_g) : g(_g) {} |
|
1241 bool operator()(Arc a,Arc b) const |
|
1242 { |
|
1243 return g.target(a)<g.target(b); |
|
1244 } |
|
1245 }; |
|
1246 |
|
1247 public: |
|
1248 |
|
1249 ///Constructor |
|
1250 |
|
1251 ///Constructor. |
|
1252 /// |
|
1253 ///It builds up the search database. |
|
1254 DynArcLookUp(const Digraph &g) |
|
1255 : _g(g),_head(g),_parent(g),_left(g),_right(g) |
|
1256 { |
|
1257 Parent::attach(_g.notifier(typename Digraph::Arc())); |
|
1258 refresh(); |
|
1259 } |
|
1260 |
|
1261 protected: |
|
1262 |
|
1263 virtual void add(const Arc& arc) { |
|
1264 insert(arc); |
|
1265 } |
|
1266 |
|
1267 virtual void add(const std::vector<Arc>& arcs) { |
|
1268 for (int i = 0; i < int(arcs.size()); ++i) { |
|
1269 insert(arcs[i]); |
|
1270 } |
|
1271 } |
|
1272 |
|
1273 virtual void erase(const Arc& arc) { |
|
1274 remove(arc); |
|
1275 } |
|
1276 |
|
1277 virtual void erase(const std::vector<Arc>& arcs) { |
|
1278 for (int i = 0; i < int(arcs.size()); ++i) { |
|
1279 remove(arcs[i]); |
|
1280 } |
|
1281 } |
|
1282 |
|
1283 virtual void build() { |
|
1284 refresh(); |
|
1285 } |
|
1286 |
|
1287 virtual void clear() { |
|
1288 for(NodeIt n(_g);n!=INVALID;++n) { |
|
1289 _head.set(n, INVALID); |
|
1290 } |
|
1291 } |
|
1292 |
|
1293 void insert(Arc arc) { |
|
1294 Node s = _g.source(arc); |
|
1295 Node t = _g.target(arc); |
|
1296 _left.set(arc, INVALID); |
|
1297 _right.set(arc, INVALID); |
|
1298 |
|
1299 Arc e = _head[s]; |
|
1300 if (e == INVALID) { |
|
1301 _head.set(s, arc); |
|
1302 _parent.set(arc, INVALID); |
|
1303 return; |
|
1304 } |
|
1305 while (true) { |
|
1306 if (t < _g.target(e)) { |
|
1307 if (_left[e] == INVALID) { |
|
1308 _left.set(e, arc); |
|
1309 _parent.set(arc, e); |
|
1310 splay(arc); |
|
1311 return; |
|
1312 } else { |
|
1313 e = _left[e]; |
|
1314 } |
|
1315 } else { |
|
1316 if (_right[e] == INVALID) { |
|
1317 _right.set(e, arc); |
|
1318 _parent.set(arc, e); |
|
1319 splay(arc); |
|
1320 return; |
|
1321 } else { |
|
1322 e = _right[e]; |
|
1323 } |
|
1324 } |
|
1325 } |
|
1326 } |
|
1327 |
|
1328 void remove(Arc arc) { |
|
1329 if (_left[arc] == INVALID) { |
|
1330 if (_right[arc] != INVALID) { |
|
1331 _parent.set(_right[arc], _parent[arc]); |
|
1332 } |
|
1333 if (_parent[arc] != INVALID) { |
|
1334 if (_left[_parent[arc]] == arc) { |
|
1335 _left.set(_parent[arc], _right[arc]); |
|
1336 } else { |
|
1337 _right.set(_parent[arc], _right[arc]); |
|
1338 } |
|
1339 } else { |
|
1340 _head.set(_g.source(arc), _right[arc]); |
|
1341 } |
|
1342 } else if (_right[arc] == INVALID) { |
|
1343 _parent.set(_left[arc], _parent[arc]); |
|
1344 if (_parent[arc] != INVALID) { |
|
1345 if (_left[_parent[arc]] == arc) { |
|
1346 _left.set(_parent[arc], _left[arc]); |
|
1347 } else { |
|
1348 _right.set(_parent[arc], _left[arc]); |
|
1349 } |
|
1350 } else { |
|
1351 _head.set(_g.source(arc), _left[arc]); |
|
1352 } |
|
1353 } else { |
|
1354 Arc e = _left[arc]; |
|
1355 if (_right[e] != INVALID) { |
|
1356 e = _right[e]; |
|
1357 while (_right[e] != INVALID) { |
|
1358 e = _right[e]; |
|
1359 } |
|
1360 Arc s = _parent[e]; |
|
1361 _right.set(_parent[e], _left[e]); |
|
1362 if (_left[e] != INVALID) { |
|
1363 _parent.set(_left[e], _parent[e]); |
|
1364 } |
|
1365 |
|
1366 _left.set(e, _left[arc]); |
|
1367 _parent.set(_left[arc], e); |
|
1368 _right.set(e, _right[arc]); |
|
1369 _parent.set(_right[arc], e); |
|
1370 |
|
1371 _parent.set(e, _parent[arc]); |
|
1372 if (_parent[arc] != INVALID) { |
|
1373 if (_left[_parent[arc]] == arc) { |
|
1374 _left.set(_parent[arc], e); |
|
1375 } else { |
|
1376 _right.set(_parent[arc], e); |
|
1377 } |
|
1378 } |
|
1379 splay(s); |
|
1380 } else { |
|
1381 _right.set(e, _right[arc]); |
|
1382 _parent.set(_right[arc], e); |
|
1383 |
|
1384 if (_parent[arc] != INVALID) { |
|
1385 if (_left[_parent[arc]] == arc) { |
|
1386 _left.set(_parent[arc], e); |
|
1387 } else { |
|
1388 _right.set(_parent[arc], e); |
|
1389 } |
|
1390 } else { |
|
1391 _head.set(_g.source(arc), e); |
|
1392 } |
|
1393 } |
|
1394 } |
|
1395 } |
|
1396 |
|
1397 Arc refreshRec(std::vector<Arc> &v,int a,int b) |
|
1398 { |
|
1399 int m=(a+b)/2; |
|
1400 Arc me=v[m]; |
|
1401 if (a < m) { |
|
1402 Arc left = refreshRec(v,a,m-1); |
|
1403 _left.set(me, left); |
|
1404 _parent.set(left, me); |
|
1405 } else { |
|
1406 _left.set(me, INVALID); |
|
1407 } |
|
1408 if (m < b) { |
|
1409 Arc right = refreshRec(v,m+1,b); |
|
1410 _right.set(me, right); |
|
1411 _parent.set(right, me); |
|
1412 } else { |
|
1413 _right.set(me, INVALID); |
|
1414 } |
|
1415 return me; |
|
1416 } |
|
1417 |
|
1418 void refresh() { |
|
1419 for(NodeIt n(_g);n!=INVALID;++n) { |
|
1420 std::vector<Arc> v; |
|
1421 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e); |
|
1422 if(v.size()) { |
|
1423 std::sort(v.begin(),v.end(),ArcLess(_g)); |
|
1424 Arc head = refreshRec(v,0,v.size()-1); |
|
1425 _head.set(n, head); |
|
1426 _parent.set(head, INVALID); |
|
1427 } |
|
1428 else _head.set(n, INVALID); |
|
1429 } |
|
1430 } |
|
1431 |
|
1432 void zig(Arc v) { |
|
1433 Arc w = _parent[v]; |
|
1434 _parent.set(v, _parent[w]); |
|
1435 _parent.set(w, v); |
|
1436 _left.set(w, _right[v]); |
|
1437 _right.set(v, w); |
|
1438 if (_parent[v] != INVALID) { |
|
1439 if (_right[_parent[v]] == w) { |
|
1440 _right.set(_parent[v], v); |
|
1441 } else { |
|
1442 _left.set(_parent[v], v); |
|
1443 } |
|
1444 } |
|
1445 if (_left[w] != INVALID){ |
|
1446 _parent.set(_left[w], w); |
|
1447 } |
|
1448 } |
|
1449 |
|
1450 void zag(Arc v) { |
|
1451 Arc w = _parent[v]; |
|
1452 _parent.set(v, _parent[w]); |
|
1453 _parent.set(w, v); |
|
1454 _right.set(w, _left[v]); |
|
1455 _left.set(v, w); |
|
1456 if (_parent[v] != INVALID){ |
|
1457 if (_left[_parent[v]] == w) { |
|
1458 _left.set(_parent[v], v); |
|
1459 } else { |
|
1460 _right.set(_parent[v], v); |
|
1461 } |
|
1462 } |
|
1463 if (_right[w] != INVALID){ |
|
1464 _parent.set(_right[w], w); |
|
1465 } |
|
1466 } |
|
1467 |
|
1468 void splay(Arc v) { |
|
1469 while (_parent[v] != INVALID) { |
|
1470 if (v == _left[_parent[v]]) { |
|
1471 if (_parent[_parent[v]] == INVALID) { |
|
1472 zig(v); |
|
1473 } else { |
|
1474 if (_parent[v] == _left[_parent[_parent[v]]]) { |
|
1475 zig(_parent[v]); |
|
1476 zig(v); |
|
1477 } else { |
|
1478 zig(v); |
|
1479 zag(v); |
|
1480 } |
|
1481 } |
|
1482 } else { |
|
1483 if (_parent[_parent[v]] == INVALID) { |
|
1484 zag(v); |
|
1485 } else { |
|
1486 if (_parent[v] == _left[_parent[_parent[v]]]) { |
|
1487 zag(v); |
|
1488 zig(v); |
|
1489 } else { |
|
1490 zag(_parent[v]); |
|
1491 zag(v); |
|
1492 } |
|
1493 } |
|
1494 } |
|
1495 } |
|
1496 _head[_g.source(v)] = v; |
|
1497 } |
|
1498 |
|
1499 |
|
1500 public: |
|
1501 |
|
1502 ///Find an arc between two nodes. |
|
1503 |
|
1504 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where |
|
1505 /// <em>d</em> is the number of outgoing arcs of \c s. |
|
1506 ///\param s The source node |
|
1507 ///\param t The target node |
|
1508 ///\return An arc from \c s to \c t if there exists, |
|
1509 ///\ref INVALID otherwise. |
|
1510 Arc operator()(Node s, Node t) const |
|
1511 { |
|
1512 Arc a = _head[s]; |
|
1513 while (true) { |
|
1514 if (_g.target(a) == t) { |
|
1515 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1516 return a; |
|
1517 } else if (t < _g.target(a)) { |
|
1518 if (_left[a] == INVALID) { |
|
1519 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1520 return INVALID; |
|
1521 } else { |
|
1522 a = _left[a]; |
|
1523 } |
|
1524 } else { |
|
1525 if (_right[a] == INVALID) { |
|
1526 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1527 return INVALID; |
|
1528 } else { |
|
1529 a = _right[a]; |
|
1530 } |
|
1531 } |
|
1532 } |
|
1533 } |
|
1534 |
|
1535 ///Find the first arc between two nodes. |
|
1536 |
|
1537 ///Find the first arc between two nodes in time |
|
1538 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of |
|
1539 /// outgoing arcs of \c s. |
|
1540 ///\param s The source node |
|
1541 ///\param t The target node |
|
1542 ///\return An arc from \c s to \c t if there exists, \ref INVALID |
|
1543 /// otherwise. |
|
1544 Arc findFirst(Node s, Node t) const |
|
1545 { |
|
1546 Arc a = _head[s]; |
|
1547 Arc r = INVALID; |
|
1548 while (true) { |
|
1549 if (_g.target(a) < t) { |
|
1550 if (_right[a] == INVALID) { |
|
1551 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1552 return r; |
|
1553 } else { |
|
1554 a = _right[a]; |
|
1555 } |
|
1556 } else { |
|
1557 if (_g.target(a) == t) { |
|
1558 r = a; |
|
1559 } |
|
1560 if (_left[a] == INVALID) { |
|
1561 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1562 return r; |
|
1563 } else { |
|
1564 a = _left[a]; |
|
1565 } |
|
1566 } |
|
1567 } |
|
1568 } |
|
1569 |
|
1570 ///Find the next arc between two nodes. |
|
1571 |
|
1572 ///Find the next arc between two nodes in time |
|
1573 /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of |
|
1574 /// outgoing arcs of \c s. |
|
1575 ///\param s The source node |
|
1576 ///\param t The target node |
|
1577 ///\return An arc from \c s to \c t if there exists, \ref INVALID |
|
1578 /// otherwise. |
|
1579 |
|
1580 ///\note If \c e is not the result of the previous \c findFirst() |
|
1581 ///operation then the amorized time bound can not be guaranteed. |
|
1582 #ifdef DOXYGEN |
|
1583 Arc findNext(Node s, Node t, Arc a) const |
|
1584 #else |
|
1585 Arc findNext(Node, Node t, Arc a) const |
|
1586 #endif |
|
1587 { |
|
1588 if (_right[a] != INVALID) { |
|
1589 a = _right[a]; |
|
1590 while (_left[a] != INVALID) { |
|
1591 a = _left[a]; |
|
1592 } |
|
1593 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1594 } else { |
|
1595 while (_parent[a] != INVALID && _right[_parent[a]] == a) { |
|
1596 a = _parent[a]; |
|
1597 } |
|
1598 if (_parent[a] == INVALID) { |
|
1599 return INVALID; |
|
1600 } else { |
|
1601 a = _parent[a]; |
|
1602 const_cast<DynArcLookUp&>(*this).splay(a); |
|
1603 } |
|
1604 } |
|
1605 if (_g.target(a) == t) return a; |
|
1606 else return INVALID; |
|
1607 } |
|
1608 |
|
1609 }; |
|
1610 |
|
1611 ///Fast arc look up between given endpoints. |
|
1612 |
|
1613 ///Using this class, you can find an arc in a digraph from a given |
|
1614 ///source to a given target in time <em>O(log d)</em>, |
|
1615 ///where <em>d</em> is the out-degree of the source node. |
|
1616 /// |
|
1617 ///It is not possible to find \e all parallel arcs between two nodes. |
|
1618 ///Use \ref AllArcLookUp for this purpose. |
|
1619 /// |
|
1620 ///\warning This class is static, so you should refresh() (or at least |
|
1621 ///refresh(Node)) this data structure |
|
1622 ///whenever the digraph changes. This is a time consuming (superlinearly |
|
1623 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs). |
|
1624 /// |
|
1625 ///\tparam G The type of the underlying digraph. |
|
1626 /// |
|
1627 ///\sa DynArcLookUp |
|
1628 ///\sa AllArcLookUp |
|
1629 template<class G> |
|
1630 class ArcLookUp |
|
1631 { |
|
1632 public: |
|
1633 TEMPLATE_DIGRAPH_TYPEDEFS(G); |
|
1634 typedef G Digraph; |
|
1635 |
|
1636 protected: |
|
1637 const Digraph &_g; |
|
1638 typename Digraph::template NodeMap<Arc> _head; |
|
1639 typename Digraph::template ArcMap<Arc> _left; |
|
1640 typename Digraph::template ArcMap<Arc> _right; |
|
1641 |
|
1642 class ArcLess { |
|
1643 const Digraph &g; |
|
1644 public: |
|
1645 ArcLess(const Digraph &_g) : g(_g) {} |
|
1646 bool operator()(Arc a,Arc b) const |
|
1647 { |
|
1648 return g.target(a)<g.target(b); |
|
1649 } |
|
1650 }; |
|
1651 |
|
1652 public: |
|
1653 |
|
1654 ///Constructor |
|
1655 |
|
1656 ///Constructor. |
|
1657 /// |
|
1658 ///It builds up the search database, which remains valid until the digraph |
|
1659 ///changes. |
|
1660 ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();} |
|
1661 |
|
1662 private: |
|
1663 Arc refreshRec(std::vector<Arc> &v,int a,int b) |
|
1664 { |
|
1665 int m=(a+b)/2; |
|
1666 Arc me=v[m]; |
|
1667 _left[me] = a<m?refreshRec(v,a,m-1):INVALID; |
|
1668 _right[me] = m<b?refreshRec(v,m+1,b):INVALID; |
|
1669 return me; |
|
1670 } |
|
1671 public: |
|
1672 ///Refresh the data structure at a node. |
|
1673 |
|
1674 ///Build up the search database of node \c n. |
|
1675 /// |
|
1676 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is |
|
1677 ///the number of the outgoing arcs of \c n. |
|
1678 void refresh(Node n) |
|
1679 { |
|
1680 std::vector<Arc> v; |
|
1681 for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e); |
|
1682 if(v.size()) { |
|
1683 std::sort(v.begin(),v.end(),ArcLess(_g)); |
|
1684 _head[n]=refreshRec(v,0,v.size()-1); |
|
1685 } |
|
1686 else _head[n]=INVALID; |
|
1687 } |
|
1688 ///Refresh the full data structure. |
|
1689 |
|
1690 ///Build up the full search database. In fact, it simply calls |
|
1691 ///\ref refresh(Node) "refresh(n)" for each node \c n. |
|
1692 /// |
|
1693 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is |
|
1694 ///the number of the arcs of \c n and <em>D</em> is the maximum |
|
1695 ///out-degree of the digraph. |
|
1696 |
|
1697 void refresh() |
|
1698 { |
|
1699 for(NodeIt n(_g);n!=INVALID;++n) refresh(n); |
|
1700 } |
|
1701 |
|
1702 ///Find an arc between two nodes. |
|
1703 |
|
1704 ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where |
|
1705 /// <em>d</em> is the number of outgoing arcs of \c s. |
|
1706 ///\param s The source node |
|
1707 ///\param t The target node |
|
1708 ///\return An arc from \c s to \c t if there exists, |
|
1709 ///\ref INVALID otherwise. |
|
1710 /// |
|
1711 ///\warning If you change the digraph, refresh() must be called before using |
|
1712 ///this operator. If you change the outgoing arcs of |
|
1713 ///a single node \c n, then |
|
1714 ///\ref refresh(Node) "refresh(n)" is enough. |
|
1715 /// |
|
1716 Arc operator()(Node s, Node t) const |
|
1717 { |
|
1718 Arc e; |
|
1719 for(e=_head[s]; |
|
1720 e!=INVALID&&_g.target(e)!=t; |
|
1721 e = t < _g.target(e)?_left[e]:_right[e]) ; |
|
1722 return e; |
|
1723 } |
|
1724 |
|
1725 }; |
|
1726 |
|
1727 ///Fast look up of all arcs between given endpoints. |
|
1728 |
|
1729 ///This class is the same as \ref ArcLookUp, with the addition |
|
1730 ///that it makes it possible to find all arcs between given endpoints. |
|
1731 /// |
|
1732 ///\warning This class is static, so you should refresh() (or at least |
|
1733 ///refresh(Node)) this data structure |
|
1734 ///whenever the digraph changes. This is a time consuming (superlinearly |
|
1735 ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs). |
|
1736 /// |
|
1737 ///\tparam G The type of the underlying digraph. |
|
1738 /// |
|
1739 ///\sa DynArcLookUp |
|
1740 ///\sa ArcLookUp |
|
1741 template<class G> |
|
1742 class AllArcLookUp : public ArcLookUp<G> |
|
1743 { |
|
1744 using ArcLookUp<G>::_g; |
|
1745 using ArcLookUp<G>::_right; |
|
1746 using ArcLookUp<G>::_left; |
|
1747 using ArcLookUp<G>::_head; |
|
1748 |
|
1749 TEMPLATE_DIGRAPH_TYPEDEFS(G); |
|
1750 typedef G Digraph; |
|
1751 |
|
1752 typename Digraph::template ArcMap<Arc> _next; |
|
1753 |
|
1754 Arc refreshNext(Arc head,Arc next=INVALID) |
|
1755 { |
|
1756 if(head==INVALID) return next; |
|
1757 else { |
|
1758 next=refreshNext(_right[head],next); |
|
1759 // _next[head]=next; |
|
1760 _next[head]=( next!=INVALID && _g.target(next)==_g.target(head)) |
|
1761 ? next : INVALID; |
|
1762 return refreshNext(_left[head],head); |
|
1763 } |
|
1764 } |
|
1765 |
|
1766 void refreshNext() |
|
1767 { |
|
1768 for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]); |
|
1769 } |
|
1770 |
|
1771 public: |
|
1772 ///Constructor |
|
1773 |
|
1774 ///Constructor. |
|
1775 /// |
|
1776 ///It builds up the search database, which remains valid until the digraph |
|
1777 ///changes. |
|
1778 AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();} |
|
1779 |
|
1780 ///Refresh the data structure at a node. |
|
1781 |
|
1782 ///Build up the search database of node \c n. |
|
1783 /// |
|
1784 ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is |
|
1785 ///the number of the outgoing arcs of \c n. |
|
1786 |
|
1787 void refresh(Node n) |
|
1788 { |
|
1789 ArcLookUp<G>::refresh(n); |
|
1790 refreshNext(_head[n]); |
|
1791 } |
|
1792 |
|
1793 ///Refresh the full data structure. |
|
1794 |
|
1795 ///Build up the full search database. In fact, it simply calls |
|
1796 ///\ref refresh(Node) "refresh(n)" for each node \c n. |
|
1797 /// |
|
1798 ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is |
|
1799 ///the number of the arcs of \c n and <em>D</em> is the maximum |
|
1800 ///out-degree of the digraph. |
|
1801 |
|
1802 void refresh() |
|
1803 { |
|
1804 for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]); |
|
1805 } |
|
1806 |
|
1807 ///Find an arc between two nodes. |
|
1808 |
|
1809 ///Find an arc between two nodes. |
|
1810 ///\param s The source node |
|
1811 ///\param t The target node |
|
1812 ///\param prev The previous arc between \c s and \c t. It it is INVALID or |
|
1813 ///not given, the operator finds the first appropriate arc. |
|
1814 ///\return An arc from \c s to \c t after \c prev or |
|
1815 ///\ref INVALID if there is no more. |
|
1816 /// |
|
1817 ///For example, you can count the number of arcs from \c u to \c v in the |
|
1818 ///following way. |
|
1819 ///\code |
|
1820 ///AllArcLookUp<ListDigraph> ae(g); |
|
1821 ///... |
|
1822 ///int n=0; |
|
1823 ///for(Arc e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++; |
|
1824 ///\endcode |
|
1825 /// |
|
1826 ///Finding the first arc take <em>O(</em>log<em>d)</em> time, where |
|
1827 /// <em>d</em> is the number of outgoing arcs of \c s. Then, the |
|
1828 ///consecutive arcs are found in constant time. |
|
1829 /// |
|
1830 ///\warning If you change the digraph, refresh() must be called before using |
|
1831 ///this operator. If you change the outgoing arcs of |
|
1832 ///a single node \c n, then |
|
1833 ///\ref refresh(Node) "refresh(n)" is enough. |
|
1834 /// |
|
1835 #ifdef DOXYGEN |
|
1836 Arc operator()(Node s, Node t, Arc prev=INVALID) const {} |
|
1837 #else |
|
1838 using ArcLookUp<G>::operator() ; |
|
1839 Arc operator()(Node s, Node t, Arc prev) const |
|
1840 { |
|
1841 return prev==INVALID?(*this)(s,t):_next[prev]; |
|
1842 } |
|
1843 #endif |
|
1844 |
|
1845 }; |
|
1846 |
|
1847 /// @} |
|
1848 |
|
1849 } //namespace lemon |
|
1850 |
|
1851 #endif |