COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/graph_adaptor.h @ 2079:7fe378247fea

Last change on this file since 2079:7fe378247fea was 2079:7fe378247fea, checked in by Balazs Dezso, 18 years ago

Remade SplitGraphAdaptor?

File size: 76.8 KB
RevLine 
[906]1/* -*- C++ -*-
2 *
[1956]3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
[1359]7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
[906]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
[1401]19#ifndef LEMON_GRAPH_ADAPTOR_H
20#define LEMON_GRAPH_ADAPTOR_H
[556]21
[2037]22///\ingroup graph_adaptors
23///\file
24///\brief Several graph adaptors.
[556]25///
[2037]26///This file contains several useful graph adaptor functions.
[556]27///
[2037]28///\author Marton Makai and Balazs Dezso
[556]29
[1993]30#include <lemon/bits/invalid.h>
[921]31#include <lemon/maps.h>
[1979]32
[1999]33#include <lemon/bits/base_extender.h>
[1979]34#include <lemon/bits/graph_adaptor_extender.h>
[1791]35#include <lemon/bits/graph_extender.h>
[1979]36
[2034]37#include <lemon/tolerance.h>
38
[2079]39#include <algorithm>
[556]40
[921]41namespace lemon {
[556]42
[1951]43  ///\brief Base type for the Graph Adaptors
44  ///\ingroup graph_adaptors
45  ///
46  ///Base type for the Graph Adaptors
47  ///
48  ///This is the base type for most of LEMON graph adaptors.
49  ///This class implements a trivial graph adaptor i.e. it only wraps the
50  ///functions and types of the graph. The purpose of this class is to
51  ///make easier implementing graph adaptors. E.g. if an adaptor is
52  ///considered which differs from the wrapped graph only in some of its
53  ///functions or types, then it can be derived from GraphAdaptor,
54  ///and only the
55  ///differences should be implemented.
56  ///
57  ///author Marton Makai
[970]58  template<typename _Graph>
[1401]59  class GraphAdaptorBase {
[970]60  public:
61    typedef _Graph Graph;
[2031]62    typedef GraphAdaptorBase Adaptor;
[970]63    typedef Graph ParentGraph;
64
[556]65  protected:
66    Graph* graph;
[1401]67    GraphAdaptorBase() : graph(0) { }
[556]68    void setGraph(Graph& _graph) { graph=&_graph; }
69
70  public:
[1401]71    GraphAdaptorBase(Graph& _graph) : graph(&_graph) { }
[2034]72
[774]73    typedef typename Graph::Node Node;
74    typedef typename Graph::Edge Edge;
[556]75   
[970]76    void first(Node& i) const { graph->first(i); }
77    void first(Edge& i) const { graph->first(i); }
78    void firstIn(Edge& i, const Node& n) const { graph->firstIn(i, n); }
79    void firstOut(Edge& i, const Node& n ) const { graph->firstOut(i, n); }
[556]80
[970]81    void next(Node& i) const { graph->next(i); }
82    void next(Edge& i) const { graph->next(i); }
83    void nextIn(Edge& i) const { graph->nextIn(i); }
84    void nextOut(Edge& i) const { graph->nextOut(i); }
85
[986]86    Node source(const Edge& e) const { return graph->source(e); }
87    Node target(const Edge& e) const { return graph->target(e); }
[556]88
[1697]89    typedef NodeNumTagIndicator<Graph> NodeNumTag;
[556]90    int nodeNum() const { return graph->nodeNum(); }
[1697]91   
92    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
[556]93    int edgeNum() const { return graph->edgeNum(); }
[1697]94
95    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
96    Edge findEdge(const Node& source, const Node& target,
97                  const Edge& prev = INVALID) {
98      return graph->findEdge(source, target, prev);
99    }
[556]100 
[1697]101    Node addNode() const {
102      return Node(graph->addNode());
103    }
104
[986]105    Edge addEdge(const Node& source, const Node& target) const {
[1697]106      return Edge(graph->addEdge(source, target));
107    }
[556]108
109    void erase(const Node& i) const { graph->erase(i); }
110    void erase(const Edge& i) const { graph->erase(i); }
111 
112    void clear() const { graph->clear(); }
113   
[739]114    int id(const Node& v) const { return graph->id(v); }
115    int id(const Edge& e) const { return graph->id(e); }
[1991]116
[2031]117    Node fromNodeId(int id) const {
118      return graph->fromNodeId(id);
119    }
120
121    Edge fromEdgeId(int id) const {
122      return graph->fromEdgeId(id);
123    }
124
[1991]125    int maxNodeId() const {
126      return graph->maxNodeId();
127    }
128
129    int maxEdgeId() const {
130      return graph->maxEdgeId();
131    }
132
133    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
134
135    NodeNotifier& getNotifier(Node) const {
136      return graph->getNotifier(Node());
137    }
138
139    typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
140
141    EdgeNotifier& getNotifier(Edge) const {
142      return graph->getNotifier(Edge());
143    }
[650]144   
[970]145    template <typename _Value>
[2031]146    class NodeMap : public Graph::template NodeMap<_Value> {
[970]147    public:
[2031]148
149      typedef typename Graph::template NodeMap<_Value> Parent;
150
151      explicit NodeMap(const Adaptor& ga)
152        : Parent(*ga.graph) {}
153
154      NodeMap(const Adaptor& ga, const _Value& value)
[1991]155        : Parent(*ga.graph, value) { }
[2031]156
157      NodeMap& operator=(const NodeMap& cmap) {
158        return operator=<NodeMap>(cmap);
159      }
160
161      template <typename CMap>
162      NodeMap& operator=(const CMap& cmap) {
163        Parent::operator=(cmap);
164        return *this;
165      }
166     
[970]167    };
[556]168
[970]169    template <typename _Value>
[2031]170    class EdgeMap : public Graph::template EdgeMap<_Value> {
[970]171    public:
[2031]172     
173      typedef typename Graph::template EdgeMap<_Value> Parent;
174     
175      explicit EdgeMap(const Adaptor& ga)
176        : Parent(*ga.graph) {}
177
178      EdgeMap(const Adaptor& ga, const _Value& value)
179        : Parent(*ga.graph, value) {}
180
181      EdgeMap& operator=(const EdgeMap& cmap) {
182        return operator=<EdgeMap>(cmap);
183      }
184
185      template <typename CMap>
186      EdgeMap& operator=(const CMap& cmap) {
187        Parent::operator=(cmap);
188        return *this;
189      }
190
[970]191    };
[877]192
[556]193  };
194
[970]195  template <typename _Graph>
[1401]196  class GraphAdaptor :
[1979]197    public GraphAdaptorExtender<GraphAdaptorBase<_Graph> > {
[970]198  public:
199    typedef _Graph Graph;
[1979]200    typedef GraphAdaptorExtender<GraphAdaptorBase<_Graph> > Parent;
[970]201  protected:
[1401]202    GraphAdaptor() : Parent() { }
[569]203
[970]204  public:
[1755]205    explicit GraphAdaptor(Graph& _graph) { setGraph(_graph); }
[970]206  };
[569]207
[1991]208  /// \brief Just gives back a graph adaptor
209  ///
210  /// Just gives back a graph adaptor which
211  /// should be provide original graph
212  template<typename Graph>
213  GraphAdaptor<const Graph>
214  graphAdaptor(const Graph& graph) {
215    return GraphAdaptor<const Graph>(graph);
216  }
217
218
[997]219  template <typename _Graph>
[1401]220  class RevGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
[997]221  public:
222    typedef _Graph Graph;
[1401]223    typedef GraphAdaptorBase<_Graph> Parent;
[997]224  protected:
[1401]225    RevGraphAdaptorBase() : Parent() { }
[997]226  public:
227    typedef typename Parent::Node Node;
228    typedef typename Parent::Edge Edge;
229
230    void firstIn(Edge& i, const Node& n) const { Parent::firstOut(i, n); }
231    void firstOut(Edge& i, const Node& n ) const { Parent::firstIn(i, n); }
232
233    void nextIn(Edge& i) const { Parent::nextOut(i); }
234    void nextOut(Edge& i) const { Parent::nextIn(i); }
235
236    Node source(const Edge& e) const { return Parent::target(e); }
237    Node target(const Edge& e) const { return Parent::source(e); }
[1991]238
239    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
240    Edge findEdge(const Node& source, const Node& target,
241                  const Edge& prev = INVALID) {
242      return Parent::findEdge(target, source, prev);
243    }
244
[997]245  };
246   
247
[1949]248  ///\brief A graph adaptor which reverses the orientation of the edges.
249  ///\ingroup graph_adaptors
250  ///
251  /// If \c g is defined as
[1946]252  ///\code
[923]253  /// ListGraph g;
[1946]254  ///\endcode
[1949]255  /// then
[1946]256  ///\code
[1991]257  /// RevGraphAdaptor<ListGraph> ga(g);
[1946]258  ///\endcode
[2079]259  /// implements the graph obtained from \c g by
[1949]260  /// reversing the orientation of its edges.
[997]261  template<typename _Graph>
[1401]262  class RevGraphAdaptor :
[1979]263    public GraphAdaptorExtender<RevGraphAdaptorBase<_Graph> > {
[650]264  public:
[997]265    typedef _Graph Graph;
[1979]266    typedef GraphAdaptorExtender<
[1401]267      RevGraphAdaptorBase<_Graph> > Parent;
[556]268  protected:
[1401]269    RevGraphAdaptor() { }
[556]270  public:
[1755]271    explicit RevGraphAdaptor(_Graph& _graph) { setGraph(_graph); }
[997]272  };
[556]273
[1991]274  /// \brief Just gives back a reverse graph adaptor
275  ///
276  /// Just gives back a reverse graph adaptor
277  template<typename Graph>
278  RevGraphAdaptor<const Graph>
279  revGraphAdaptor(const Graph& graph) {
280    return RevGraphAdaptor<const Graph>(graph);
281  }
282
[1681]283  template <typename _Graph, typename NodeFilterMap,
284            typename EdgeFilterMap, bool checked = true>
[1401]285  class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
[992]286  public:
287    typedef _Graph Graph;
[2031]288    typedef SubGraphAdaptorBase Adaptor;
[1401]289    typedef GraphAdaptorBase<_Graph> Parent;
[992]290  protected:
291    NodeFilterMap* node_filter_map;
292    EdgeFilterMap* edge_filter_map;
[1401]293    SubGraphAdaptorBase() : Parent(),
[992]294                            node_filter_map(0), edge_filter_map(0) { }
[775]295
[992]296    void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
297      node_filter_map=&_node_filter_map;
298    }
299    void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
300      edge_filter_map=&_edge_filter_map;
301    }
302
303  public:
304
305    typedef typename Parent::Node Node;
306    typedef typename Parent::Edge Edge;
307
308    void first(Node& i) const {
309      Parent::first(i);
310      while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i);
311    }
[1681]312
313    void first(Edge& i) const {
314      Parent::first(i);
315      while (i!=INVALID && (!(*edge_filter_map)[i]
316             || !(*node_filter_map)[Parent::source(i)]
317             || !(*node_filter_map)[Parent::target(i)])) Parent::next(i);
318    }
319
320    void firstIn(Edge& i, const Node& n) const {
321      Parent::firstIn(i, n);
322      while (i!=INVALID && (!(*edge_filter_map)[i]
323             || !(*node_filter_map)[Parent::source(i)])) Parent::nextIn(i);
324    }
325
326    void firstOut(Edge& i, const Node& n) const {
327      Parent::firstOut(i, n);
328      while (i!=INVALID && (!(*edge_filter_map)[i]
329             || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i);
330    }
331
332    void next(Node& i) const {
333      Parent::next(i);
334      while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i);
335    }
336
337    void next(Edge& i) const {
338      Parent::next(i);
339      while (i!=INVALID && (!(*edge_filter_map)[i]
340             || !(*node_filter_map)[Parent::source(i)]
341             || !(*node_filter_map)[Parent::target(i)])) Parent::next(i);
342    }
343
344    void nextIn(Edge& i) const {
345      Parent::nextIn(i);
346      while (i!=INVALID && (!(*edge_filter_map)[i]
347             || !(*node_filter_map)[Parent::source(i)])) Parent::nextIn(i);
348    }
349
350    void nextOut(Edge& i) const {
351      Parent::nextOut(i);
352      while (i!=INVALID && (!(*edge_filter_map)[i]
353             || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i);
354    }
355
[1951]356    ///\e
[1949]357
[1951]358    /// This function hides \c n in the graph, i.e. the iteration
359    /// jumps over it. This is done by simply setting the value of \c n 
360    /// to be false in the corresponding node-map.
[1681]361    void hide(const Node& n) const { node_filter_map->set(n, false); }
362
[1951]363    ///\e
[1949]364
[1951]365    /// This function hides \c e in the graph, i.e. the iteration
366    /// jumps over it. This is done by simply setting the value of \c e 
367    /// to be false in the corresponding edge-map.
[1681]368    void hide(const Edge& e) const { edge_filter_map->set(e, false); }
369
[1951]370    ///\e
[1949]371
[1951]372    /// The value of \c n is set to be true in the node-map which stores
373    /// hide information. If \c n was hidden previuosly, then it is shown
374    /// again
[1681]375     void unHide(const Node& n) const { node_filter_map->set(n, true); }
376
[1951]377    ///\e
[1949]378
[1951]379    /// The value of \c e is set to be true in the edge-map which stores
380    /// hide information. If \c e was hidden previuosly, then it is shown
381    /// again
[1681]382    void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
383
[1951]384    /// Returns true if \c n is hidden.
[1949]385   
[1951]386    ///\e
387    ///
[1681]388    bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
389
[1951]390    /// Returns true if \c n is hidden.
[1949]391   
[1951]392    ///\e
393    ///
[1681]394    bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
395
[1697]396    typedef False NodeNumTag;
397    typedef False EdgeNumTag;
[1991]398
399    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
400    Edge findEdge(const Node& source, const Node& target,
401                  const Edge& prev = INVALID) {
402      if (!(*node_filter_map)[source] || !(*node_filter_map)[target]) {
403        return INVALID;
404      }
405      Edge edge = Parent::findEdge(source, target, prev);
406      while (edge != INVALID && !(*edge_filter_map)[edge]) {
407        edge = Parent::findEdge(source, target, edge);
408      }
409      return edge;
410    }
[2031]411
412    template <typename _Value>
413    class NodeMap
414      : public SubMapExtender<Adaptor,
415                              typename Parent::template NodeMap<_Value> >
416    {
417    public:
418      typedef Adaptor Graph;
419      typedef SubMapExtender<Adaptor, typename Parent::
420                             template NodeMap<_Value> > Parent;
421   
422      NodeMap(const Graph& graph)
423        : Parent(graph) {}
424      NodeMap(const Graph& graph, const _Value& value)
425        : Parent(graph, value) {}
426   
427      NodeMap& operator=(const NodeMap& cmap) {
428        return operator=<NodeMap>(cmap);
429      }
430   
431      template <typename CMap>
432      NodeMap& operator=(const CMap& cmap) {
433        Parent::operator=(cmap);
434        return *this;
435      }
436    };
437
438    template <typename _Value>
439    class EdgeMap
440      : public SubMapExtender<Adaptor,
441                              typename Parent::template EdgeMap<_Value> >
442    {
443    public:
444      typedef Adaptor Graph;
445      typedef SubMapExtender<Adaptor, typename Parent::
446                             template EdgeMap<_Value> > Parent;
447   
448      EdgeMap(const Graph& graph)
449        : Parent(graph) {}
450      EdgeMap(const Graph& graph, const _Value& value)
451        : Parent(graph, value) {}
452   
453      EdgeMap& operator=(const EdgeMap& cmap) {
454        return operator=<EdgeMap>(cmap);
455      }
456   
457      template <typename CMap>
458      EdgeMap& operator=(const CMap& cmap) {
459        Parent::operator=(cmap);
460        return *this;
461      }
462    };
463
[1681]464  };
465
466  template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
467  class SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, false>
468    : public GraphAdaptorBase<_Graph> {
469  public:
470    typedef _Graph Graph;
[2031]471    typedef SubGraphAdaptorBase Adaptor;
[1681]472    typedef GraphAdaptorBase<_Graph> Parent;
473  protected:
474    NodeFilterMap* node_filter_map;
475    EdgeFilterMap* edge_filter_map;
476    SubGraphAdaptorBase() : Parent(),
477                            node_filter_map(0), edge_filter_map(0) { }
478
479    void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
480      node_filter_map=&_node_filter_map;
481    }
482    void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
483      edge_filter_map=&_edge_filter_map;
484    }
485
486  public:
487
488    typedef typename Parent::Node Node;
489    typedef typename Parent::Edge Edge;
490
491    void first(Node& i) const {
492      Parent::first(i);
493      while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i);
494    }
495
[992]496    void first(Edge& i) const {
497      Parent::first(i);
498      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::next(i);
499    }
[1681]500
[992]501    void firstIn(Edge& i, const Node& n) const {
502      Parent::firstIn(i, n);
503      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextIn(i);
504    }
[1681]505
[992]506    void firstOut(Edge& i, const Node& n) const {
507      Parent::firstOut(i, n);
508      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i);
509    }
510
511    void next(Node& i) const {
512      Parent::next(i);
513      while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i);
514    }
515    void next(Edge& i) const {
516      Parent::next(i);
517      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::next(i);
518    }
519    void nextIn(Edge& i) const {
520      Parent::nextIn(i);
521      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextIn(i);
522    }
[1681]523
[992]524    void nextOut(Edge& i) const {
525      Parent::nextOut(i);
526      while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i);
527    }
528
[1951]529    ///\e
[1949]530
[1951]531    /// This function hides \c n in the graph, i.e. the iteration
532    /// jumps over it. This is done by simply setting the value of \c n 
533    /// to be false in the corresponding node-map.
[992]534    void hide(const Node& n) const { node_filter_map->set(n, false); }
535
[1951]536    ///\e
[1949]537
[1951]538    /// This function hides \c e in the graph, i.e. the iteration
539    /// jumps over it. This is done by simply setting the value of \c e 
540    /// to be false in the corresponding edge-map.
[992]541    void hide(const Edge& e) const { edge_filter_map->set(e, false); }
542
[1951]543    ///\e
[1949]544
[1951]545    /// The value of \c n is set to be true in the node-map which stores
546    /// hide information. If \c n was hidden previuosly, then it is shown
547    /// again
[992]548     void unHide(const Node& n) const { node_filter_map->set(n, true); }
549
[1951]550    ///\e
[1949]551
[1951]552    /// The value of \c e is set to be true in the edge-map which stores
553    /// hide information. If \c e was hidden previuosly, then it is shown
554    /// again
[992]555    void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
556
[1951]557    /// Returns true if \c n is hidden.
[1949]558   
[1951]559    ///\e
560    ///
[992]561    bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
562
[1951]563    /// Returns true if \c n is hidden.
[1949]564   
[1951]565    ///\e
566    ///
[992]567    bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
568
[1697]569    typedef False NodeNumTag;
570    typedef False EdgeNumTag;
[1991]571
572    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
573    Edge findEdge(const Node& source, const Node& target,
574                  const Edge& prev = INVALID) {
575      if (!(*node_filter_map)[source] || !(*node_filter_map)[target]) {
576        return INVALID;
577      }
578      Edge edge = Parent::findEdge(source, target, prev);
579      while (edge != INVALID && !(*edge_filter_map)[edge]) {
580        edge = Parent::findEdge(source, target, edge);
581      }
582      return edge;
583    }
[2031]584
585    template <typename _Value>
586    class NodeMap
587      : public SubMapExtender<Adaptor,
588                              typename Parent::template NodeMap<_Value> >
589    {
590    public:
591      typedef Adaptor Graph;
592      typedef SubMapExtender<Adaptor, typename Parent::
593                             template NodeMap<_Value> > Parent;
594   
595      NodeMap(const Graph& graph)
596        : Parent(graph) {}
597      NodeMap(const Graph& graph, const _Value& value)
598        : Parent(graph, value) {}
599   
600      NodeMap& operator=(const NodeMap& cmap) {
601        return operator=<NodeMap>(cmap);
602      }
603   
604      template <typename CMap>
605      NodeMap& operator=(const CMap& cmap) {
606        Parent::operator=(cmap);
607        return *this;
608      }
609    };
610
611    template <typename _Value>
612    class EdgeMap
613      : public SubMapExtender<Adaptor,
614                              typename Parent::template EdgeMap<_Value> >
615    {
616    public:
617      typedef Adaptor Graph;
618      typedef SubMapExtender<Adaptor, typename Parent::
619                             template EdgeMap<_Value> > Parent;
620   
621      EdgeMap(const Graph& graph)
622        : Parent(graph) {}
623      EdgeMap(const Graph& graph, const _Value& value)
624        : Parent(graph, value) {}
625   
626      EdgeMap& operator=(const EdgeMap& cmap) {
627        return operator=<EdgeMap>(cmap);
628      }
629   
630      template <typename CMap>
631      EdgeMap& operator=(const CMap& cmap) {
632        Parent::operator=(cmap);
633        return *this;
634      }
635    };
636
[992]637  };
[775]638
[1951]639  /// \brief A graph adaptor for hiding nodes and edges from a graph.
640  /// \ingroup graph_adaptors
641  ///
642  /// SubGraphAdaptor shows the graph with filtered node-set and
643  /// edge-set. If the \c checked parameter is true then it filters the edgeset
644  /// to do not get invalid edges without source or target.
[1952]645  /// Let \f$ G=(V, A) \f$ be a directed graph
[1951]646  /// and suppose that the graph instance \c g of type ListGraph
[1952]647  /// implements \f$ G \f$.
648  /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp.
[1951]649  /// on the node-set and edge-set.
650  /// SubGraphAdaptor<...>::NodeIt iterates
[1952]651  /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and
[1951]652  /// SubGraphAdaptor<...>::EdgeIt iterates
[1952]653  /// on the edge-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly,
[1951]654  /// SubGraphAdaptor<...>::OutEdgeIt and
655  /// SubGraphAdaptor<...>::InEdgeIt iterates
656  /// only on edges leaving and entering a specific node which have true value.
657  ///
658  /// If the \c checked template parameter is false then we have to note that
659  /// the node-iterator cares only the filter on the node-set, and the
660  /// edge-iterator cares only the filter on the edge-set.
661  /// This way the edge-map
662  /// should filter all edges which's source or target is filtered by the
663  /// node-filter.
[1957]664  ///\code
[1951]665  /// typedef ListGraph Graph;
666  /// Graph g;
667  /// typedef Graph::Node Node;
668  /// typedef Graph::Edge Edge;
669  /// Node u=g.addNode(); //node of id 0
670  /// Node v=g.addNode(); //node of id 1
671  /// Node e=g.addEdge(u, v); //edge of id 0
672  /// Node f=g.addEdge(v, u); //edge of id 1
673  /// Graph::NodeMap<bool> nm(g, true);
674  /// nm.set(u, false);
675  /// Graph::EdgeMap<bool> em(g, true);
676  /// em.set(e, false);
[1991]677  /// typedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > SubGA;
678  /// SubGA ga(g, nm, em);
679  /// for (SubGA::NodeIt n(ga); n!=INVALID; ++n) std::cout << g.id(n) << std::endl;
[1951]680  /// std::cout << ":-)" << std::endl;
[1991]681  /// for (SubGA::EdgeIt e(ga); e!=INVALID; ++e) std::cout << g.id(e) << std::endl;
[1957]682  ///\endcode
[1951]683  /// The output of the above code is the following.
[1957]684  ///\code
[1951]685  /// 1
686  /// :-)
687  /// 1
[1957]688  ///\endcode
[1991]689  /// Note that \c n is of type \c SubGA::NodeIt, but it can be converted to
[1951]690  /// \c Graph::Node that is why \c g.id(n) can be applied.
691  ///
692  /// For other examples see also the documentation of NodeSubGraphAdaptor and
693  /// EdgeSubGraphAdaptor.
694  ///
695  /// \author Marton Makai
[1242]696
[992]697  template<typename _Graph, typename NodeFilterMap,
[1681]698           typename EdgeFilterMap, bool checked = true>
[1401]699  class SubGraphAdaptor :
[1979]700    public GraphAdaptorExtender<
[1681]701    SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
[650]702  public:
[992]703    typedef _Graph Graph;
[2031]704    typedef GraphAdaptorExtender< SubGraphAdaptorBase<_Graph, NodeFilterMap,
705                                                      EdgeFilterMap, checked> >
706    Parent;
707
[556]708  protected:
[1401]709    SubGraphAdaptor() { }
[992]710  public:
[2031]711
[1401]712    SubGraphAdaptor(_Graph& _graph, NodeFilterMap& _node_filter_map,
[992]713                    EdgeFilterMap& _edge_filter_map) {
714      setGraph(_graph);
715      setNodeFilterMap(_node_filter_map);
716      setEdgeFilterMap(_edge_filter_map);
717    }
[2031]718
[992]719  };
[556]720
[1991]721  /// \brief Just gives back a sub graph adaptor
722  ///
723  /// Just gives back a sub graph adaptor
724  template<typename Graph, typename NodeFilterMap, typename EdgeFilterMap>
725  SubGraphAdaptor<const Graph, NodeFilterMap, EdgeFilterMap>
726  subGraphAdaptor(const Graph& graph,
727                   NodeFilterMap& nfm, EdgeFilterMap& efm) {
728    return SubGraphAdaptor<const Graph, NodeFilterMap, EdgeFilterMap>
729      (graph, nfm, efm);
730  }
731
732  template<typename Graph, typename NodeFilterMap, typename EdgeFilterMap>
733  SubGraphAdaptor<const Graph, const NodeFilterMap, EdgeFilterMap>
734  subGraphAdaptor(const Graph& graph,
735                   NodeFilterMap& nfm, EdgeFilterMap& efm) {
736    return SubGraphAdaptor<const Graph, const NodeFilterMap, EdgeFilterMap>
737      (graph, nfm, efm);
738  }
739
740  template<typename Graph, typename NodeFilterMap, typename EdgeFilterMap>
741  SubGraphAdaptor<const Graph, NodeFilterMap, const EdgeFilterMap>
742  subGraphAdaptor(const Graph& graph,
743                   NodeFilterMap& nfm, EdgeFilterMap& efm) {
744    return SubGraphAdaptor<const Graph, NodeFilterMap, const EdgeFilterMap>
745      (graph, nfm, efm);
746  }
747
748  template<typename Graph, typename NodeFilterMap, typename EdgeFilterMap>
749  SubGraphAdaptor<const Graph, const NodeFilterMap, const EdgeFilterMap>
750  subGraphAdaptor(const Graph& graph,
751                   NodeFilterMap& nfm, EdgeFilterMap& efm) {
752    return SubGraphAdaptor<const Graph, const NodeFilterMap,
753      const EdgeFilterMap>(graph, nfm, efm);
754  }
755
[556]756
[569]757
[1951]758  ///\brief An adaptor for hiding nodes from a graph.
759  ///\ingroup graph_adaptors
760  ///
761  ///An adaptor for hiding nodes from a graph.
762  ///This adaptor specializes SubGraphAdaptor in the way that only
763  ///the node-set
764  ///can be filtered. In usual case the checked parameter is true, we get the
765  ///induced subgraph. But if the checked parameter is false then we can only
766  ///filter only isolated nodes.
767  ///\author Marton Makai
[1681]768  template<typename Graph, typename NodeFilterMap, bool checked = true>
[1401]769  class NodeSubGraphAdaptor :
770    public SubGraphAdaptor<Graph, NodeFilterMap,
[1681]771                           ConstMap<typename Graph::Edge,bool>, checked> {
[933]772  public:
[2031]773
[1401]774    typedef SubGraphAdaptor<Graph, NodeFilterMap,
[2031]775                            ConstMap<typename Graph::Edge,bool>, checked >
776    Parent;
777
[933]778  protected:
779    ConstMap<typename Graph::Edge, bool> const_true_map;
[1991]780
781    NodeSubGraphAdaptor() : const_true_map(true) {
782      Parent::setEdgeFilterMap(const_true_map);
783    }
784
[933]785  public:
[2031]786
[1401]787    NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& _node_filter_map) :
[933]788      Parent(), const_true_map(true) {
789      Parent::setGraph(_graph);
790      Parent::setNodeFilterMap(_node_filter_map);
791      Parent::setEdgeFilterMap(const_true_map);
792    }
[2031]793
[933]794  };
795
796
[1991]797  /// \brief Just gives back a node sub graph adaptor
798  ///
799  /// Just gives back a node sub graph adaptor
800  template<typename Graph, typename NodeFilterMap>
801  NodeSubGraphAdaptor<const Graph, NodeFilterMap>
802  nodeSubGraphAdaptor(const Graph& graph, NodeFilterMap& nfm) {
803    return NodeSubGraphAdaptor<const Graph, NodeFilterMap>(graph, nfm);
804  }
805
806  template<typename Graph, typename NodeFilterMap>
807  NodeSubGraphAdaptor<const Graph, const NodeFilterMap>
808  nodeSubGraphAdaptor(const Graph& graph, const NodeFilterMap& nfm) {
809    return NodeSubGraphAdaptor<const Graph, const NodeFilterMap>(graph, nfm);
810  }
811
[1951]812  ///\brief An adaptor for hiding edges from a graph.
813  ///
814  ///An adaptor for hiding edges from a graph.
815  ///This adaptor specializes SubGraphAdaptor in the way that
816  ///only the edge-set
817  ///can be filtered. The usefulness of this adaptor is demonstrated in the
818  ///problem of searching a maximum number of edge-disjoint shortest paths
819  ///between
820  ///two nodes \c s and \c t. Shortest here means being shortest w.r.t.
821  ///non-negative edge-lengths. Note that
822  ///the comprehension of the presented solution
823  ///need's some elementary knowledge from combinatorial optimization.
824  ///
825  ///If a single shortest path is to be
826  ///searched between \c s and \c t, then this can be done easily by
827  ///applying the Dijkstra algorithm. What happens, if a maximum number of
828  ///edge-disjoint shortest paths is to be computed. It can be proved that an
829  ///edge can be in a shortest path if and only
830  ///if it is tight with respect to
831  ///the potential function computed by Dijkstra.
832  ///Moreover, any path containing
833  ///only such edges is a shortest one.
834  ///Thus we have to compute a maximum number
835  ///of edge-disjoint paths between \c s and \c t in
836  ///the graph which has edge-set
837  ///all the tight edges. The computation will be demonstrated
838  ///on the following
839  ///graph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim.
840  ///The full source code is available in \ref sub_graph_adaptor_demo.cc.
841  ///If you are interested in more demo programs, you can use
842  ///\ref dim_to_dot.cc to generate .dot files from dimacs files.
843  ///The .dot file of the following figure was generated by 
844  ///the demo program \ref dim_to_dot.cc.
845  ///
846  ///\dot
847  ///digraph lemon_dot_example {
848  ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
849  ///n0 [ label="0 (s)" ];
850  ///n1 [ label="1" ];
851  ///n2 [ label="2" ];
852  ///n3 [ label="3" ];
853  ///n4 [ label="4" ];
854  ///n5 [ label="5" ];
855  ///n6 [ label="6 (t)" ];
856  ///edge [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
857  ///n5 ->  n6 [ label="9, length:4" ];
858  ///n4 ->  n6 [ label="8, length:2" ];
859  ///n3 ->  n5 [ label="7, length:1" ];
860  ///n2 ->  n5 [ label="6, length:3" ];
861  ///n2 ->  n6 [ label="5, length:5" ];
862  ///n2 ->  n4 [ label="4, length:2" ];
863  ///n1 ->  n4 [ label="3, length:3" ];
864  ///n0 ->  n3 [ label="2, length:1" ];
865  ///n0 ->  n2 [ label="1, length:2" ];
866  ///n0 ->  n1 [ label="0, length:3" ];
867  ///}
868  ///\enddot
869  ///
870  ///\code
871  ///Graph g;
872  ///Node s, t;
873  ///LengthMap length(g);
874  ///
875  ///readDimacs(std::cin, g, length, s, t);
876  ///
877  ///cout << "edges with lengths (of form id, source--length->target): " << endl;
878  ///for(EdgeIt e(g); e!=INVALID; ++e)
879  ///  cout << g.id(e) << ", " << g.id(g.source(e)) << "--"
880  ///       << length[e] << "->" << g.id(g.target(e)) << endl;
881  ///
882  ///cout << "s: " << g.id(s) << " t: " << g.id(t) << endl;
883  ///\endcode
884  ///Next, the potential function is computed with Dijkstra.
885  ///\code
886  ///typedef Dijkstra<Graph, LengthMap> Dijkstra;
887  ///Dijkstra dijkstra(g, length);
888  ///dijkstra.run(s);
889  ///\endcode
890  ///Next, we consrtruct a map which filters the edge-set to the tight edges.
891  ///\code
892  ///typedef TightEdgeFilterMap<Graph, const Dijkstra::DistMap, LengthMap>
893  ///  TightEdgeFilter;
894  ///TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length);
895  ///
[1991]896  ///typedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> SubGA;
897  ///SubGA ga(g, tight_edge_filter);
[1951]898  ///\endcode
899  ///Then, the maximum nimber of edge-disjoint \c s-\c t paths are computed
900  ///with a max flow algorithm Preflow.
901  ///\code
902  ///ConstMap<Edge, int> const_1_map(1);
903  ///Graph::EdgeMap<int> flow(g, 0);
904  ///
[1991]905  ///Preflow<SubGA, int, ConstMap<Edge, int>, Graph::EdgeMap<int> >
906  ///  preflow(ga, s, t, const_1_map, flow);
[1951]907  ///preflow.run();
908  ///\endcode
909  ///Last, the output is:
910  ///\code 
911  ///cout << "maximum number of edge-disjoint shortest path: "
912  ///     << preflow.flowValue() << endl;
913  ///cout << "edges of the maximum number of edge-disjoint shortest s-t paths: "
914  ///     << endl;
915  ///for(EdgeIt e(g); e!=INVALID; ++e)
916  ///  if (flow[e])
917  ///    cout << " " << g.id(g.source(e)) << "--"
918  ///         << length[e] << "->" << g.id(g.target(e)) << endl;
919  ///\endcode
920  ///The program has the following (expected :-)) output:
921  ///\code
922  ///edges with lengths (of form id, source--length->target):
923  /// 9, 5--4->6
924  /// 8, 4--2->6
925  /// 7, 3--1->5
926  /// 6, 2--3->5
927  /// 5, 2--5->6
928  /// 4, 2--2->4
929  /// 3, 1--3->4
930  /// 2, 0--1->3
931  /// 1, 0--2->2
932  /// 0, 0--3->1
933  ///s: 0 t: 6
934  ///maximum number of edge-disjoint shortest path: 2
935  ///edges of the maximum number of edge-disjoint shortest s-t paths:
936  /// 9, 5--4->6
937  /// 8, 4--2->6
938  /// 7, 3--1->5
939  /// 4, 2--2->4
940  /// 2, 0--1->3
941  /// 1, 0--2->2
942  ///\endcode
943  ///
944  ///\author Marton Makai
[932]945  template<typename Graph, typename EdgeFilterMap>
[1401]946  class EdgeSubGraphAdaptor :
947    public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>,
[1681]948                           EdgeFilterMap, false> {
[932]949  public:
[1401]950    typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>,
[1685]951                            EdgeFilterMap, false> Parent;
[932]952  protected:
953    ConstMap<typename Graph::Node, bool> const_true_map;
[1991]954
955    EdgeSubGraphAdaptor() : const_true_map(true) {
956      Parent::setNodeFilterMap(const_true_map);
957    }
958
[932]959  public:
[2031]960
[1401]961    EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& _edge_filter_map) :
[932]962      Parent(), const_true_map(true) {
963      Parent::setGraph(_graph);
964      Parent::setNodeFilterMap(const_true_map);
965      Parent::setEdgeFilterMap(_edge_filter_map);
966    }
[2031]967
[932]968  };
969
[1991]970  /// \brief Just gives back an edge sub graph adaptor
971  ///
972  /// Just gives back an edge sub graph adaptor
973  template<typename Graph, typename EdgeFilterMap>
974  EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>
975  edgeSubGraphAdaptor(const Graph& graph, EdgeFilterMap& efm) {
976    return EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>(graph, efm);
977  }
978
979  template<typename Graph, typename EdgeFilterMap>
980  EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>
981  edgeSubGraphAdaptor(const Graph& graph, const EdgeFilterMap& efm) {
982    return EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>(graph, efm);
983  }
984
[2079]985  template <typename _Graph>
[1980]986  class UndirGraphAdaptorBase :
[2079]987    public UndirGraphExtender<GraphAdaptorBase<_Graph> > {
[1383]988  public:
989    typedef _Graph Graph;
[2031]990    typedef UndirGraphAdaptorBase Adaptor;
[2079]991    typedef UndirGraphExtender<GraphAdaptorBase<_Graph> > Parent;
[1991]992
[1383]993  protected:
[1991]994
995    UndirGraphAdaptorBase() : Parent() {}
996
[1383]997  public:
[1991]998
[1909]999    typedef typename Parent::UEdge UEdge;
[1383]1000    typedef typename Parent::Edge Edge;
[1991]1001
[2031]1002  private:
[1383]1003   
[1991]1004    template <typename _Value>
[2031]1005    class EdgeMapBase {
[1991]1006    private:
1007     
1008      typedef typename _Graph::template EdgeMap<_Value> MapImpl;
1009     
[1383]1010    public:
[1991]1011
1012      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
1013
1014      typedef _Value Value;
[1383]1015      typedef Edge Key;
1016     
[2031]1017      EdgeMapBase(const Adaptor& adaptor) :
1018        forward_map(*adaptor.graph), backward_map(*adaptor.graph) {}
[569]1019
[2031]1020      EdgeMapBase(const Adaptor& adaptor, const Value& v)
1021        : forward_map(*adaptor.graph, v), backward_map(*adaptor.graph, v) {}
[1383]1022     
[1991]1023      void set(const Edge& e, const Value& a) {
1024        if (Parent::direction(e)) {
[1383]1025          forward_map.set(e, a);
[1991]1026        } else {
1027          backward_map.set(e, a);
1028        }
[1383]1029      }
[556]1030
[1991]1031      typename MapTraits<MapImpl>::ConstReturnValue operator[](Edge e) const {
1032        if (Parent::direction(e)) {
[1383]1033          return forward_map[e];
[1991]1034        } else {
[1383]1035          return backward_map[e];
[1991]1036        }
[556]1037      }
[1991]1038
1039      typename MapTraits<MapImpl>::ReturnValue operator[](Edge e) {
1040        if (Parent::direction(e)) {
1041          return forward_map[e];
1042        } else {
1043          return backward_map[e];
1044        }
1045      }
1046
1047    protected:
1048
1049      MapImpl forward_map, backward_map;
1050
[556]1051    };
[2031]1052
1053  public:
1054
1055    template <typename _Value>
1056    class EdgeMap
1057      : public SubMapExtender<Adaptor, EdgeMapBase<_Value> >
1058    {
1059    public:
1060      typedef Adaptor Graph;
1061      typedef SubMapExtender<Adaptor, EdgeMapBase<_Value> > Parent;
1062   
1063      EdgeMap(const Graph& graph)
1064        : Parent(graph) {}
1065      EdgeMap(const Graph& graph, const _Value& value)
1066        : Parent(graph, value) {}
1067   
1068      EdgeMap& operator=(const EdgeMap& cmap) {
1069        return operator=<EdgeMap>(cmap);
1070      }
1071   
1072      template <typename CMap>
1073      EdgeMap& operator=(const CMap& cmap) {
1074        Parent::operator=(cmap);
1075        return *this;
1076      }
1077    };
[1383]1078       
[1991]1079    template <typename _Value>
[2031]1080    class UEdgeMap : public Graph::template EdgeMap<_Value> {
[1383]1081    public:
[2031]1082     
1083      typedef typename Graph::template EdgeMap<_Value> Parent;
1084     
1085      explicit UEdgeMap(const Adaptor& ga)
1086        : Parent(*ga.graph) {}
[1991]1087
[2031]1088      UEdgeMap(const Adaptor& ga, const _Value& value)
1089        : Parent(*ga.graph, value) {}
[1991]1090
[2031]1091      UEdgeMap& operator=(const UEdgeMap& cmap) {
1092        return operator=<UEdgeMap>(cmap);
1093      }
[1991]1094
[2031]1095      template <typename CMap>
1096      UEdgeMap& operator=(const CMap& cmap) {
1097        Parent::operator=(cmap);
1098        return *this;
1099      }
1100
[1991]1101    };
1102     
1103  };
[556]1104
[2079]1105  template <typename _Graph, typename Enable = void>
1106  class AlterableUndirGraphAdaptor
1107    : public UGraphAdaptorExtender<UndirGraphAdaptorBase<_Graph> > {
1108  public:
1109    typedef UGraphAdaptorExtender<UndirGraphAdaptorBase<_Graph> > Parent;
1110   
1111  protected:
1112
1113    AlterableUndirGraphAdaptor() : Parent() {}
1114
[1991]1115  public:
1116
[2079]1117    typedef typename Parent::EdgeNotifier UEdgeNotifier;
1118    typedef InvalidType EdgeNotifier;
1119
1120  };
1121
1122  template <typename _Graph>
1123  class AlterableUndirGraphAdaptor<
1124    _Graph,
1125    typename enable_if<typename _Graph::EdgeNotifier::Notifier>::type >
1126    : public UGraphAdaptorExtender<UndirGraphAdaptorBase<_Graph> > {
1127  public:
1128
1129    typedef UGraphAdaptorExtender<UndirGraphAdaptorBase<_Graph> > Parent;
[1991]1130    typedef _Graph Graph;
[2079]1131    typedef typename _Graph::Edge GraphEdge;
1132   
[1991]1133  protected:
1134
[2079]1135    AlterableUndirGraphAdaptor()
1136      : Parent(), edge_notifier(*this), edge_notifier_proxy(*this) {}
[1991]1137
1138    void setGraph(_Graph& graph) {
1139      Parent::setGraph(graph);
[2079]1140      edge_notifier_proxy.setNotifier(graph.getNotifier(GraphEdge()));
[1991]1141    }
1142
1143  public:
1144
[2079]1145    ~AlterableUndirGraphAdaptor() {
[1999]1146      edge_notifier.clear();
1147    }
1148
[1991]1149    typedef typename Parent::UEdge UEdge;
1150    typedef typename Parent::Edge Edge;
1151
1152    typedef typename Parent::EdgeNotifier UEdgeNotifier;
1153
1154    using Parent::getNotifier;
1155
[2079]1156    typedef AlterationNotifier<AlterableUndirGraphAdaptor,
1157                               Edge> EdgeNotifier;
[1991]1158    EdgeNotifier& getNotifier(Edge) const { return edge_notifier; }
1159
1160  protected:
1161
[2079]1162    class NotifierProxy : public Graph::EdgeNotifier::ObserverBase {
[1991]1163    public:
1164
[2079]1165      typedef typename Graph::EdgeNotifier::ObserverBase Parent;
1166      typedef AlterableUndirGraphAdaptor AdaptorBase;
[1383]1167     
[2079]1168      NotifierProxy(const AdaptorBase& _adaptor)
1169        : Parent(), adaptor(&_adaptor) {
[1383]1170      }
[556]1171
[1991]1172      virtual ~NotifierProxy() {
1173        if (Parent::attached()) {
1174          Parent::detach();
1175        }
[1383]1176      }
[1991]1177
[2079]1178      void setNotifier(typename Graph::EdgeNotifier& notifier) {
1179        Parent::attach(notifier);
[1991]1180      }
1181
1182     
1183    protected:
1184
[2079]1185      virtual void add(const GraphEdge& ge) {
[1991]1186        std::vector<Edge> edges;
[2079]1187        edges.push_back(AdaptorBase::Parent::direct(ge, true));
1188        edges.push_back(AdaptorBase::Parent::direct(ge, false));
1189        adaptor->getNotifier(Edge()).add(edges);
[1991]1190      }
[2079]1191      virtual void add(const std::vector<GraphEdge>& ge) {
[1991]1192        std::vector<Edge> edges;
[2079]1193        for (int i = 0; i < (int)ge.size(); ++i) {
1194          edges.push_back(AdaptorBase::Parent::direct(ge[i], true));
1195          edges.push_back(AdaptorBase::Parent::direct(ge[i], false));
[1991]1196        }
[2079]1197        adaptor->getNotifier(Edge()).add(edges);
[1991]1198      }
[2079]1199      virtual void erase(const GraphEdge& ge) {
[1991]1200        std::vector<Edge> edges;
[2079]1201        edges.push_back(AdaptorBase::Parent::direct(ge, true));
1202        edges.push_back(AdaptorBase::Parent::direct(ge, false));
1203        adaptor->getNotifier(Edge()).erase(edges);
[1991]1204      }
[2079]1205      virtual void erase(const std::vector<GraphEdge>& ge) {
[1991]1206        std::vector<Edge> edges;
[2079]1207        for (int i = 0; i < (int)ge.size(); ++i) {
1208          edges.push_back(AdaptorBase::Parent::direct(ge[i], true));
1209          edges.push_back(AdaptorBase::Parent::direct(ge[i], false));
[1991]1210        }
[2079]1211        adaptor->getNotifier(Edge()).erase(edges);
[1991]1212      }
1213      virtual void build() {
[2079]1214        adaptor->getNotifier(Edge()).build();
[1991]1215      }
1216      virtual void clear() {
[2079]1217        adaptor->getNotifier(Edge()).clear();
[1991]1218      }
1219
[2079]1220      const AdaptorBase* adaptor;
[1991]1221    };
1222
1223
1224    mutable EdgeNotifier edge_notifier;
1225    NotifierProxy edge_notifier_proxy;
1226
[1383]1227  };
1228
[2079]1229
1230  /// \brief An undirected graph is made from a directed graph by an adaptor
1231  /// \ingroup graph_adaptors
[1951]1232  ///
1233  /// Undocumented, untested!!!
1234  /// If somebody knows nice demo application, let's polulate it.
1235  ///
1236  /// \author Marton Makai
[1383]1237  template<typename _Graph>
[2079]1238  class UndirGraphAdaptor : public AlterableUndirGraphAdaptor<_Graph> {
[1383]1239  public:
1240    typedef _Graph Graph;
[2079]1241    typedef AlterableUndirGraphAdaptor<_Graph> Parent;
[1383]1242  protected:
[1980]1243    UndirGraphAdaptor() { }
[1383]1244  public:
[1980]1245    UndirGraphAdaptor(_Graph& _graph) {
[1383]1246      setGraph(_graph);
[556]1247    }
1248
[1991]1249    template <typename _ForwardMap, typename _BackwardMap>
1250    class CombinedEdgeMap {
1251    public:
1252     
1253      typedef _ForwardMap ForwardMap;
1254      typedef _BackwardMap BackwardMap;
[992]1255
[1991]1256      typedef typename MapTraits<ForwardMap>::ReferenceMapTag ReferenceMapTag;
[992]1257
[1991]1258      typedef typename ForwardMap::Value Value;
1259      typedef typename Parent::Edge Key;
1260     
1261      CombinedEdgeMap() : forward_map(0), backward_map(0) {}
[992]1262
[1991]1263      CombinedEdgeMap(ForwardMap& _forward_map, BackwardMap& _backward_map)
1264        : forward_map(&_forward_map), backward_map(&_backward_map) {}
[992]1265     
[1991]1266      void set(const Key& e, const Value& a) {
1267        if (Parent::direction(e)) {
1268          forward_map->set(e, a);
1269        } else {
1270          backward_map->set(e, a);
1271        }
[992]1272      }
1273
[1991]1274      typename MapTraits<ForwardMap>::ConstReturnValue
1275      operator[](const Key& e) const {
1276        if (Parent::direction(e)) {
1277          return (*forward_map)[e];
1278        } else {
1279          return (*backward_map)[e];
1280        }
[992]1281      }
1282
[1991]1283      typename MapTraits<ForwardMap>::ReturnValue
1284      operator[](const Key& e) {
1285        if (Parent::direction(e)) {
1286          return (*forward_map)[e];
1287        } else {
1288          return (*backward_map)[e];
1289        }
[992]1290      }
[1991]1291
1292      void setForwardMap(ForwardMap& _forward_map) {
1293        forward_map = &_forward_map;
1294      }
1295
1296      void setBackwardMap(BackwardMap& _backward_map) {
1297        backward_map = &_backward_map;
1298      }
1299
1300    protected:
1301
1302      ForwardMap* forward_map;
1303      BackwardMap* backward_map;
1304
[992]1305    };
1306
1307  };
[569]1308
[1991]1309  /// \brief Just gives back an undir graph adaptor
[1951]1310  ///
[1991]1311  /// Just gives back an undir graph adaptor
[650]1312  template<typename Graph>
[1991]1313  UndirGraphAdaptor<const Graph>
1314  undirGraphAdaptor(const Graph& graph) {
1315    return UndirGraphAdaptor<const Graph>(graph);
1316  }
[650]1317
[2034]1318  template<typename Graph, typename Number, 
1319           typename CapacityMap, typename FlowMap,
1320           typename Tolerance = Tolerance<Number> >
[658]1321  class ResForwardFilter {
[650]1322    const CapacityMap* capacity;
1323    const FlowMap* flow;
[2034]1324    Tolerance tolerance;
[650]1325  public:
[1991]1326    typedef typename Graph::Edge Key;
1327    typedef bool Value;
1328
[2034]1329    ResForwardFilter(const CapacityMap& _capacity, const FlowMap& _flow,
1330                     const Tolerance& _tolerance = Tolerance())
1331      : capacity(&_capacity), flow(&_flow), tolerance(_tolerance) { }
1332
1333    ResForwardFilter(const Tolerance& _tolerance)
1334      : capacity(0), flow(0), tolerance(_tolerance)  { }
1335
[1991]1336    void setCapacity(const CapacityMap& _capacity) { capacity = &_capacity; }
1337    void setFlow(const FlowMap& _flow) { flow = &_flow; }
[2034]1338
[650]1339    bool operator[](const typename Graph::Edge& e) const {
[2034]1340      return tolerance.less((*flow)[e], (*capacity)[e]);
[650]1341    }
1342  };
1343
1344  template<typename Graph, typename Number,
[2034]1345           typename CapacityMap, typename FlowMap,
1346           typename Tolerance = Tolerance<Number> >
[658]1347  class ResBackwardFilter {
[650]1348    const CapacityMap* capacity;
1349    const FlowMap* flow;
[2034]1350    Tolerance tolerance;
[650]1351  public:
[1991]1352    typedef typename Graph::Edge Key;
1353    typedef bool Value;
1354
[2034]1355    ResBackwardFilter(const CapacityMap& _capacity, const FlowMap& _flow,
1356                      const Tolerance& _tolerance = Tolerance())
1357      : capacity(&_capacity), flow(&_flow), tolerance(_tolerance) { }
1358    ResBackwardFilter(const Tolerance& _tolerance = Tolerance())
1359      : capacity(0), flow(0), tolerance(_tolerance) { }
[1991]1360    void setCapacity(const CapacityMap& _capacity) { capacity = &_capacity; }
1361    void setFlow(const FlowMap& _flow) { flow = &_flow; }
[650]1362    bool operator[](const typename Graph::Edge& e) const {
[2034]1363      return tolerance.less(0, Number((*flow)[e]));
[650]1364    }
1365  };
1366
[653]1367 
[1951]1368  ///\brief An adaptor for composing the residual
1369  ///graph for directed flow and circulation problems.
[2037]1370  ///
[1951]1371  ///\ingroup graph_adaptors
1372  ///
[2042]1373  ///An adaptor for composing the residual graph for directed flow and
1374  ///circulation problems.  Let \f$ G=(V, A) \f$ be a directed graph
1375  ///and let \f$ F \f$ be a number type. Let moreover \f$ f,c:A\to F \f$,
1376  ///be functions on the edge-set.
1377  ///
1378  ///In the appications of ResGraphAdaptor, \f$ f \f$ usually stands
1379  ///for a flow and \f$ c \f$ for a capacity function.  Suppose that a
1380  ///graph instange \c g of type \c ListGraph implements \f$ G \f$.
1381  ///
1382  ///\code
1383  ///  ListGraph g;
1384  ///\endcode
1385  ///
1386  ///Then RevGraphAdaptor implements the graph structure with node-set
1387  /// \f$ V \f$ and edge-set \f$ A_{forward}\cup A_{backward} \f$,
1388  ///where \f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and
1389  /// \f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$, i.e. the so called
1390  ///residual graph.  When we take the union
1391  /// \f$ A_{forward}\cup A_{backward} \f$, multilicities are counted, i.e.
1392  ///if an edge is in both \f$ A_{forward} \f$ and \f$ A_{backward} \f$,
1393  ///then in the adaptor it appears twice. The following code shows how
1394  ///such an instance can be constructed.
1395  ///
1396  ///\code
1397  ///  typedef ListGraph Graph;
1398  ///  Graph::EdgeMap<int> f(g);
1399  ///  Graph::EdgeMap<int> c(g);
1400  ///  ResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > ga(g);
1401  ///\endcode
1402  ///\author Marton Makai
1403  ///
[650]1404  template<typename Graph, typename Number,
[2034]1405           typename CapacityMap, typename FlowMap,
1406           typename Tolerance = Tolerance<Number> >
[1401]1407  class ResGraphAdaptor :
[1991]1408    public EdgeSubGraphAdaptor<
[2034]1409    UndirGraphAdaptor<const Graph>,
1410    typename UndirGraphAdaptor<const Graph>::template CombinedEdgeMap<
1411    ResForwardFilter<const Graph, Number, CapacityMap, FlowMap>, 
1412    ResBackwardFilter<const Graph, Number, CapacityMap, FlowMap> > > {
[650]1413  public:
[1991]1414
[2034]1415    typedef UndirGraphAdaptor<const Graph> UGraph;
[1991]1416
[2034]1417    typedef ResForwardFilter<const Graph, Number, CapacityMap, FlowMap>
[1991]1418    ForwardFilter;
1419
[2034]1420    typedef ResBackwardFilter<const Graph, Number, CapacityMap, FlowMap>
[1991]1421    BackwardFilter;
1422
1423    typedef typename UGraph::
1424    template CombinedEdgeMap<ForwardFilter, BackwardFilter>
1425    EdgeFilter;
1426
1427    typedef EdgeSubGraphAdaptor<UGraph, EdgeFilter> Parent;
1428
[650]1429  protected:
[1991]1430
[650]1431    const CapacityMap* capacity;
1432    FlowMap* flow;
[1991]1433
1434    UGraph ugraph;
1435    ForwardFilter forward_filter;
1436    BackwardFilter backward_filter;
1437    EdgeFilter edge_filter;
1438
[658]1439    void setCapacityMap(const CapacityMap& _capacity) {
1440      capacity=&_capacity;
1441      forward_filter.setCapacity(_capacity);
1442      backward_filter.setCapacity(_capacity);
1443    }
[1991]1444
[658]1445    void setFlowMap(FlowMap& _flow) {
1446      flow=&_flow;
1447      forward_filter.setFlow(_flow);
1448      backward_filter.setFlow(_flow);
1449    }
[1991]1450
[650]1451  public:
[1991]1452
[2034]1453    /// \brief Constructor of the residual graph.
1454    ///
1455    /// Constructor of the residual graph. The parameters are the graph type,
1456    /// the flow map, the capacity map and a tolerance object.
1457    ResGraphAdaptor(const Graph& _graph, const CapacityMap& _capacity,
1458                    FlowMap& _flow, const Tolerance& _tolerance = Tolerance())
1459      : Parent(), capacity(&_capacity), flow(&_flow), ugraph(_graph),
1460        forward_filter(_capacity, _flow, _tolerance),
1461        backward_filter(_capacity, _flow, _tolerance),
1462        edge_filter(forward_filter, backward_filter)
1463    {
[1991]1464      Parent::setGraph(ugraph);
1465      Parent::setEdgeFilterMap(edge_filter);
[650]1466    }
1467
[660]1468    typedef typename Parent::Edge Edge;
1469
[2034]1470    /// \brief Gives back the residual capacity of the edge.
1471    ///
1472    /// Gives back the residual capacity of the edge.
1473    Number rescap(const Edge& edge) const {
1474      if (UGraph::direction(edge)) {
1475        return (*capacity)[edge]-(*flow)[edge];
1476      } else {
1477        return (*flow)[edge];
1478      }
1479    }
1480
1481    /// \brief Augment on the given edge in the residual graph.
1482    ///
1483    /// Augment on the given edge in the residual graph. It increase
1484    /// or decrease the flow on the original edge depend on the direction
1485    /// of the residual edge.
[660]1486    void augment(const Edge& e, Number a) const {
[1991]1487      if (UGraph::direction(e)) {
[2034]1488        flow->set(e, (*flow)[e] + a);
[1991]1489      } else { 
[2034]1490        flow->set(e, (*flow)[e] - a);
[1991]1491      }
[650]1492    }
1493
[2034]1494    /// \brief Returns the direction of the edge.
1495    ///
1496    /// Returns true when the edge is same oriented as the original edge.
[1991]1497    static bool forward(const Edge& e) {
1498      return UGraph::direction(e);
1499    }
1500
[2034]1501    /// \brief Returns the direction of the edge.
1502    ///
1503    /// Returns true when the edge is opposite oriented as the original edge.
[1991]1504    static bool backward(const Edge& e) {
1505      return !UGraph::direction(e);
1506    }
1507
[2034]1508    /// \brief Gives back the forward oriented residual edge.
1509    ///
1510    /// Gives back the forward oriented residual edge.
[1991]1511    static Edge forward(const typename Graph::Edge& e) {
1512      return UGraph::direct(e, true);
1513    }
1514
[2034]1515    /// \brief Gives back the backward oriented residual edge.
1516    ///
1517    /// Gives back the backward oriented residual edge.
[1991]1518    static Edge backward(const typename Graph::Edge& e) {
1519      return UGraph::direct(e, false);
1520    }
1521
[1951]1522    /// \brief Residual capacity map.
1523    ///
1524    /// In generic residual graphs the residual capacity can be obtained
1525    /// as a map.
[660]1526    class ResCap {
1527    protected:
[1991]1528      const ResGraphAdaptor* res_graph;
[660]1529    public:
[987]1530      typedef Number Value;
1531      typedef Edge Key;
[1991]1532      ResCap(const ResGraphAdaptor& _res_graph)
1533        : res_graph(&_res_graph) {}
1534     
[2034]1535      Number operator[](const Edge& e) const {
1536        return res_graph->rescap(e);
[660]1537      }
[1991]1538     
[660]1539    };
1540
[650]1541  };
1542
1543
[998]1544
1545  template <typename _Graph, typename FirstOutEdgesMap>
[1401]1546  class ErasingFirstGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
[998]1547  public:
1548    typedef _Graph Graph;
[1401]1549    typedef GraphAdaptorBase<_Graph> Parent;
[998]1550  protected:
1551    FirstOutEdgesMap* first_out_edges;
[1401]1552    ErasingFirstGraphAdaptorBase() : Parent(),
[998]1553                                     first_out_edges(0) { }
1554
1555    void setFirstOutEdgesMap(FirstOutEdgesMap& _first_out_edges) {
1556      first_out_edges=&_first_out_edges;
1557    }
1558
1559  public:
1560
1561    typedef typename Parent::Node Node;
1562    typedef typename Parent::Edge Edge;
1563
1564    void firstOut(Edge& i, const Node& n) const {
1565      i=(*first_out_edges)[n];
1566    }
1567
1568    void erase(const Edge& e) const {
1569      Node n=source(e);
1570      Edge f=e;
1571      Parent::nextOut(f);
1572      first_out_edges->set(n, f);
1573    }   
1574  };
1575
1576
[1951]1577  ///\brief For blocking flows.
1578  ///\ingroup graph_adaptors
1579  ///
1580  ///This graph adaptor is used for on-the-fly
1581  ///Dinits blocking flow computations.
1582  ///For each node, an out-edge is stored which is used when the
1583  ///\code
1584  ///OutEdgeIt& first(OutEdgeIt&, const Node&)
1585  ///\endcode
1586  ///is called.
1587  ///
1588  ///\author Marton Makai
1589  ///
[998]1590  template <typename _Graph, typename FirstOutEdgesMap>
[1401]1591  class ErasingFirstGraphAdaptor :
[1979]1592    public GraphAdaptorExtender<
[1401]1593    ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > {
[650]1594  public:
[998]1595    typedef _Graph Graph;
[1979]1596    typedef GraphAdaptorExtender<
[1401]1597      ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > Parent;
1598    ErasingFirstGraphAdaptor(Graph& _graph,
[998]1599                             FirstOutEdgesMap& _first_out_edges) {
1600      setGraph(_graph);
1601      setFirstOutEdgesMap(_first_out_edges);
1602    }
[1019]1603
[998]1604  };
[556]1605
[2079]1606  /// \brief Base class for split graph adaptor
1607  ///
1608  /// Base class of split graph adaptor. In most case you do not need to
1609  /// use it directly but the documented member functions of this class can
1610  /// be used with the SplitGraphAdaptor class.
1611  /// \sa SplitGraphAdaptor
1612  template <typename _Graph>
1613  class SplitGraphAdaptorBase
1614    : public GraphAdaptorBase<const _Graph> {
1615  public:
[1697]1616
[2079]1617    typedef _Graph Graph;
1618
1619    typedef GraphAdaptorBase<const _Graph> Parent;
1620
1621    typedef typename Graph::Node GraphNode;
1622    typedef typename Graph::Edge GraphEdge;
1623
1624    class Node;
1625    class Edge;
1626
1627    template <typename T> class NodeMap;
1628    template <typename T> class EdgeMap;
[1697]1629   
1630
[2079]1631    class Node : public GraphNode {
1632      friend class SplitGraphAdaptorBase;
1633      template <typename T> friend class NodeMap;
1634    private:
[1697]1635
[2079]1636      bool in_node;
1637      Node(GraphNode _node, bool _in_node)
1638        : GraphNode(_node), in_node(_in_node) {}
[1697]1639     
[2079]1640    public:
[1697]1641
[2079]1642      Node() {}
1643      Node(Invalid) : GraphNode(INVALID), in_node(true) {}
1644
1645      bool operator==(const Node& node) const {
1646        return GraphNode::operator==(node) && in_node == node.in_node;
1647      }
[1697]1648     
[2079]1649      bool operator!=(const Node& node) const {
1650        return !(*this == node);
1651      }
[1697]1652     
[2079]1653      bool operator<(const Node& node) const {
1654        return GraphNode::operator<(node) ||
1655          (GraphNode::operator==(node) && in_node < node.in_node);
1656      }
1657    };
[1697]1658
[2079]1659    class Edge {
1660      friend class SplitGraphAdaptorBase;
1661      template <typename T> friend class EdgeMap;
1662    private:
1663      typedef BiVariant<GraphEdge, GraphNode> EdgeImpl;
[1697]1664
[2079]1665      explicit Edge(const GraphEdge& edge) : item(edge) {}
1666      explicit Edge(const GraphNode& node) : item(node) {}
1667     
1668      EdgeImpl item;
[1697]1669
[2079]1670    public:
1671      Edge() {}
1672      Edge(Invalid) : item(GraphEdge(INVALID)) {}
1673
1674      bool operator==(const Edge& edge) const {
1675        if (item.firstState()) {
1676          if (edge.item.firstState()) {
1677            return item.first() == edge.item.first();
1678          }
1679        } else {
1680          if (edge.item.secondState()) {
1681            return item.second() == edge.item.second();
1682          }
1683        }
1684        return false;
1685      }
[1697]1686     
[2079]1687      bool operator!=(const Edge& edge) const {
1688        return !(*this == edge);
1689      }
[1697]1690     
[2079]1691      bool operator<(const Edge& edge) const {
1692        if (item.firstState()) {
1693          if (edge.item.firstState()) {
1694            return item.first() < edge.item.first();
1695          }
1696          return false;
1697        } else {
1698          if (edge.item.secondState()) {
1699            return item.second() < edge.item.second();
1700          }
1701          return true;
1702        }
1703      }
[1697]1704
[2079]1705      operator GraphEdge() const { return item.first(); }
1706      operator GraphNode() const { return item.second(); }
[1697]1707
[2079]1708    };
[1697]1709
[2079]1710    void first(Node& node) const {
1711      Parent::first(node);
1712      node.in_node = true;
1713    }
[1697]1714
[2079]1715    void next(Node& node) const {
1716      if (node.in_node) {
1717        node.in_node = false;
1718      } else {
1719        node.in_node = true;
1720        Parent::next(node);
1721      }
1722    }
[1697]1723
[2079]1724    void first(Edge& edge) const {
1725      edge.item.setSecond();
1726      Parent::first(edge.item.second());
1727      if (edge.item.second() == INVALID) {
1728        edge.item.setFirst();
1729        Parent::first(edge.item.first());
1730      }
1731    }
[1697]1732
[2079]1733    void next(Edge& edge) const {
1734      if (edge.item.secondState()) {
1735        Parent::next(edge.item.second());
1736        if (edge.item.second() == INVALID) {
1737          edge.item.setFirst();
1738          Parent::first(edge.item.first());
1739        }
1740      } else {
1741        Parent::next(edge.item.first());
1742      }     
1743    }
[1697]1744
[2079]1745    void firstOut(Edge& edge, const Node& node) const {
1746      if (node.in_node) {
1747        edge.item.setSecond(node);
1748      } else {
1749        edge.item.setFirst();
1750        Parent::firstOut(edge.item.first(), node);
1751      }
1752    }
[1697]1753
[2079]1754    void nextOut(Edge& edge) const {
1755      if (!edge.item.firstState()) {
1756        edge.item.setFirst(INVALID);
1757      } else {
1758        Parent::nextOut(edge.item.first());
1759      }     
1760    }
[1697]1761
[2079]1762    void firstIn(Edge& edge, const Node& node) const {
1763      if (!node.in_node) {
1764        edge.item.setSecond(node);       
1765      } else {
1766        edge.item.setFirst();
1767        Parent::firstIn(edge.item.first(), node);
1768      }
1769    }
[1697]1770
[2079]1771    void nextIn(Edge& edge) const {
1772      if (!edge.item.firstState()) {
1773        edge.item.setFirst(INVALID);
1774      } else {
1775        Parent::nextIn(edge.item.first());
1776      }
1777    }
[1697]1778
[2079]1779    Node source(const Edge& edge) const {
1780      if (edge.item.firstState()) {
1781        return Node(Parent::source(edge.item.first()), false);
1782      } else {
1783        return Node(edge.item.second(), true);
1784      }
1785    }
[1697]1786
[2079]1787    Node target(const Edge& edge) const {
1788      if (edge.item.firstState()) {
1789        return Node(Parent::target(edge.item.first()), true);
1790      } else {
1791        return Node(edge.item.second(), false);
1792      }
1793    }
[1697]1794
[2079]1795    int id(const Node& node) const {
1796      return (Parent::id(node) << 1) | (node.in_node ? 0 : 1);
1797    }
1798    Node nodeFromId(int id) const {
1799      return Node(Parent::nodeFromId(id >> 1), (id & 1) == 0);
1800    }
1801    int maxNodeId() const {
1802      return 2 * Parent::maxNodeId() + 1;
1803    }
[1697]1804
[2079]1805    int id(const Edge& edge) const {
1806      if (edge.item.firstState()) {
1807        return Parent::id(edge.item.first()) << 1;
1808      } else {
1809        return (Parent::id(edge.item.second()) << 1) | 1;
1810      }
1811    }
1812    Edge edgeFromId(int id) const {
1813      if ((id & 1) == 0) {
1814        return Edge(Parent::edgeFromId(id >> 1));
1815      } else {
1816        return Edge(Parent::nodeFromId(id >> 1));
1817      }
1818    }
1819    int maxEdgeId() const {
1820      return std::max(Parent::maxNodeId() << 1,
1821                      (Parent::maxEdgeId() << 1) | 1);
1822    }
[1697]1823
[2079]1824    /// \brief Returns true when the node is in-node.
1825    ///
1826    /// Returns true when the node is in-node.
1827    static bool inNode(const Node& node) {
1828      return node.in_node;
1829    }
[1697]1830
[2079]1831    /// \brief Returns true when the node is out-node.
1832    ///
1833    /// Returns true when the node is out-node.
1834    static bool outNode(const Node& node) {
1835      return !node.in_node;
1836    }
[1697]1837
[2079]1838    /// \brief Returns true when the edge is edge in the original graph.
1839    ///
1840    /// Returns true when the edge is edge in the original graph.
1841    static bool origEdge(const Edge& edge) {
1842      return edge.item.firstState();
1843    }
[1697]1844
[2079]1845    /// \brief Returns true when the edge binds an in-node and an out-node.
1846    ///
1847    /// Returns true when the edge binds an in-node and an out-node.
1848    static bool bindEdge(const Edge& edge) {
1849      return edge.item.secondState();
1850    }
[1697]1851
[2079]1852    /// \brief Gives back the in-node created from the \c node.
1853    ///
1854    /// Gives back the in-node created from the \c node.
1855    static Node inNode(const GraphNode& node) {
1856      return Node(node, true);
1857    }
1858
1859    /// \brief Gives back the out-node created from the \c node.
1860    ///
1861    /// Gives back the out-node created from the \c node.
1862    static Node outNode(const GraphNode& node) {
1863      return Node(node, false);
1864    }
1865
1866    /// \brief Gives back the edge binds the two part of the node.
1867    ///
1868    /// Gives back the edge binds the two part of the node.
1869    static Edge edge(const GraphNode& node) {
1870      return Edge(node);
1871    }
1872
1873    /// \brief Gives back the edge of the original edge.
1874    ///
1875    /// Gives back the edge of the original edge.
1876    static Edge edge(const GraphEdge& edge) {
1877      return Edge(edge);
1878    }
1879
1880    typedef True NodeNumTag;
1881
1882    int nodeNum() const {
1883      return  2 * countNodes(*Parent::graph);
1884    }
1885
1886    typedef True EdgeNumTag;
[1697]1887   
[2079]1888    int edgeNum() const {
1889      return countEdges(*Parent::graph) + countNodes(*Parent::graph);
1890    }
[1697]1891
[2079]1892    typedef True FindEdgeTag;
1893
1894    Edge findEdge(const Node& source, const Node& target,
1895                  const Edge& prev = INVALID) const {
1896      if (inNode(source)) {
1897        if (outNode(target)) {
1898          if ((GraphNode&)source == (GraphNode&)target && prev == INVALID) {
1899            return Edge(source);
1900          }
1901        }
1902      } else {
1903        if (inNode(target)) {
1904          return Edge(findEdge(*Parent::graph, source, target, prev));
1905        }
1906      }
1907      return INVALID;
1908    }
[1697]1909   
[2079]1910    template <typename T>
1911    class NodeMap : public MapBase<Node, T> {
1912      typedef typename Parent::template NodeMap<T> NodeImpl;
1913    public:
1914      NodeMap(const SplitGraphAdaptorBase& _graph)
1915        : inNodeMap(_graph), outNodeMap(_graph) {}
1916      NodeMap(const SplitGraphAdaptorBase& _graph, const T& t)
1917        : inNodeMap(_graph, t), outNodeMap(_graph, t) {}
[1697]1918     
[2079]1919      void set(const Node& key, const T& val) {
1920        if (SplitGraphAdaptorBase::inNode(key)) { inNodeMap.set(key, val); }
1921        else {outNodeMap.set(key, val); }
1922      }
[1697]1923     
[2079]1924      typename MapTraits<NodeImpl>::ReturnValue
1925      operator[](const Node& key) {
1926        if (SplitGraphAdaptorBase::inNode(key)) { return inNodeMap[key]; }
1927        else { return outNodeMap[key]; }
1928      }
[1697]1929
[2079]1930      typename MapTraits<NodeImpl>::ConstReturnValue
1931      operator[](const Node& key) const {
1932        if (SplitGraphAdaptorBase::inNode(key)) { return inNodeMap[key]; }
1933        else { return outNodeMap[key]; }
1934      }
[1697]1935
[2079]1936    private:
1937      NodeImpl inNodeMap, outNodeMap;
1938    };
[1697]1939
[2079]1940    template <typename T>
1941    class EdgeMap : public MapBase<Edge, T> {
1942      typedef typename Parent::template EdgeMap<T> EdgeMapImpl;
1943      typedef typename Parent::template NodeMap<T> NodeMapImpl;
1944    public:
1945
1946      EdgeMap(const SplitGraphAdaptorBase& _graph)
1947        : edge_map(_graph), node_map(_graph) {}
1948      EdgeMap(const SplitGraphAdaptorBase& _graph, const T& t)
1949        : edge_map(_graph, t), node_map(_graph, t) {}
[1697]1950     
[2079]1951      void set(const Edge& key, const T& val) {
1952        if (SplitGraphAdaptorBase::origEdge(key)) {
1953          edge_map.set(key.item.first(), val);
1954        } else {
1955          node_map.set(key.item.second(), val);
1956        }
1957      }
[1697]1958     
[2079]1959      typename MapTraits<EdgeMapImpl>::ReturnValue
1960      operator[](const Edge& key) {
1961        if (SplitGraphAdaptorBase::origEdge(key)) {
1962          return edge_map[key.item.first()];
1963        } else {
1964          return node_map[key.item.second()];
1965        }
1966      }
[1697]1967
[2079]1968      typename MapTraits<EdgeMapImpl>::ConstReturnValue
1969      operator[](const Edge& key) const {
1970        if (SplitGraphAdaptorBase::origEdge(key)) {
1971          return edge_map[key.item.first()];
1972        } else {
1973          return node_map[key.item.second()];
1974        }
1975      }
[1697]1976
[2079]1977    private:
1978      typename Parent::template EdgeMap<T> edge_map;
1979      typename Parent::template NodeMap<T> node_map;
1980    };
[1697]1981
1982
[2079]1983  };
[1697]1984
[2079]1985  template <typename _Graph, typename NodeEnable = void,
1986            typename EdgeEnable = void>
1987  class AlterableSplitGraphAdaptor
1988    : public GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > {
1989  public:
[1697]1990
[2079]1991    typedef GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > Parent;
1992    typedef _Graph Graph;
[1697]1993
[2079]1994    typedef typename Graph::Node GraphNode;
1995    typedef typename Graph::Node GraphEdge;
[1697]1996
[2079]1997  protected:
1998
1999    AlterableSplitGraphAdaptor() : Parent() {}
2000
2001  public:
2002   
2003    typedef InvalidType NodeNotifier;
2004    typedef InvalidType EdgeNotifier;
2005
2006  };
2007
2008  template <typename _Graph, typename EdgeEnable>
2009  class AlterableSplitGraphAdaptor<
2010    _Graph,
2011    typename enable_if<typename _Graph::NodeNotifier::Notifier>::type,
2012    EdgeEnable>
2013      : public GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > {
2014  public:
2015
2016    typedef GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > Parent;
2017    typedef _Graph Graph;
2018
2019    typedef typename Graph::Node GraphNode;
2020    typedef typename Graph::Edge GraphEdge;
2021
2022    typedef typename Parent::Node Node;
2023    typedef typename Parent::Edge Edge;
2024 
2025  protected:
2026
2027    AlterableSplitGraphAdaptor()
2028      : Parent(), node_notifier(*this), node_notifier_proxy(*this) {}
2029
2030    void setGraph(_Graph& graph) {
2031      Parent::setGraph(graph);
2032      node_notifier_proxy.setNotifier(graph.getNotifier(GraphNode()));
2033    }
2034
2035  public:
2036
2037    ~AlterableSplitGraphAdaptor() {
2038      node_notifier.clear();
2039    }
2040
2041    typedef AlterationNotifier<AlterableSplitGraphAdaptor, Node> NodeNotifier;
2042    typedef InvalidType EdgeNotifier;
2043
2044    NodeNotifier& getNotifier(Node) const { return node_notifier; }
2045
2046  protected:
2047
2048    class NodeNotifierProxy : public Graph::NodeNotifier::ObserverBase {
2049    public:
2050
2051      typedef typename Graph::NodeNotifier::ObserverBase Parent;
2052      typedef AlterableSplitGraphAdaptor AdaptorBase;
[1697]2053     
[2079]2054      NodeNotifierProxy(const AdaptorBase& _adaptor)
2055        : Parent(), adaptor(&_adaptor) {
2056      }
2057
2058      virtual ~NodeNotifierProxy() {
2059        if (Parent::attached()) {
2060          Parent::detach();
2061        }
2062      }
2063
2064      void setNotifier(typename Graph::NodeNotifier& graph_notifier) {
2065        Parent::attach(graph_notifier);
2066      }
2067
[1697]2068     
[2079]2069    protected:
2070
2071      virtual void add(const GraphNode& gn) {
2072        std::vector<Node> nodes;
2073        nodes.push_back(AdaptorBase::Parent::inNode(gn));
2074        nodes.push_back(AdaptorBase::Parent::outNode(gn));
2075        adaptor->getNotifier(Node()).add(nodes);
2076      }
2077
2078      virtual void add(const std::vector<GraphNode>& gn) {
2079        std::vector<Node> nodes;
2080        for (int i = 0; i < (int)gn.size(); ++i) {
2081          nodes.push_back(AdaptorBase::Parent::inNode(gn[i]));
2082          nodes.push_back(AdaptorBase::Parent::outNode(gn[i]));
2083        }
2084        adaptor->getNotifier(Node()).add(nodes);
2085      }
2086
2087      virtual void erase(const GraphNode& gn) {
2088        std::vector<Node> nodes;
2089        nodes.push_back(AdaptorBase::Parent::inNode(gn));
2090        nodes.push_back(AdaptorBase::Parent::outNode(gn));
2091        adaptor->getNotifier(Node()).erase(nodes);
2092      }
2093
2094      virtual void erase(const std::vector<GraphNode>& gn) {
2095        std::vector<Node> nodes;
2096        for (int i = 0; i < (int)gn.size(); ++i) {
2097          nodes.push_back(AdaptorBase::Parent::inNode(gn[i]));
2098          nodes.push_back(AdaptorBase::Parent::outNode(gn[i]));
2099        }
2100        adaptor->getNotifier(Node()).erase(nodes);
2101      }
2102      virtual void build() {
2103        adaptor->getNotifier(Node()).build();
2104      }
2105      virtual void clear() {
2106        adaptor->getNotifier(Node()).clear();
2107      }
2108
2109      const AdaptorBase* adaptor;
2110    };
2111
2112
2113    mutable NodeNotifier node_notifier;
2114
2115    NodeNotifierProxy node_notifier_proxy;
2116
2117  };
2118
2119  template <typename _Graph>
2120  class AlterableSplitGraphAdaptor<
2121    _Graph,
2122    typename enable_if<typename _Graph::NodeNotifier::Notifier>::type,
2123    typename enable_if<typename _Graph::EdgeNotifier::Notifier>::type>
2124      : public GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > {
2125  public:
2126
2127    typedef GraphAdaptorExtender<SplitGraphAdaptorBase<_Graph> > Parent;
2128    typedef _Graph Graph;
2129
2130    typedef typename Graph::Node GraphNode;
2131    typedef typename Graph::Edge GraphEdge;
2132
2133    typedef typename Parent::Node Node;
2134    typedef typename Parent::Edge Edge;
2135 
2136  protected:
2137   
2138    AlterableSplitGraphAdaptor()
2139      : Parent(), node_notifier(*this), edge_notifier(*this),
2140        node_notifier_proxy(*this), edge_notifier_proxy(*this) {}
2141   
2142    void setGraph(_Graph& graph) {
2143      Parent::setGraph(graph);
2144      node_notifier_proxy.setNotifier(graph.getNotifier(GraphNode()));
2145      edge_notifier_proxy.setNotifier(graph.getNotifier(GraphEdge()));
2146    }
2147
2148  public:
2149
2150    ~AlterableSplitGraphAdaptor() {
2151      node_notifier.clear();
2152      edge_notifier.clear();
2153    }
2154
2155    typedef AlterationNotifier<AlterableSplitGraphAdaptor, Node> NodeNotifier;
2156    typedef AlterationNotifier<AlterableSplitGraphAdaptor, Edge> EdgeNotifier;
2157
2158    NodeNotifier& getNotifier(Node) const { return node_notifier; }
2159    EdgeNotifier& getNotifier(Edge) const { return edge_notifier; }
2160
2161  protected:
2162
2163    class NodeNotifierProxy : public Graph::NodeNotifier::ObserverBase {
2164    public:
[1697]2165     
[2079]2166      typedef typename Graph::NodeNotifier::ObserverBase Parent;
2167      typedef AlterableSplitGraphAdaptor AdaptorBase;
2168     
2169      NodeNotifierProxy(const AdaptorBase& _adaptor)
2170        : Parent(), adaptor(&_adaptor) {
2171      }
[1697]2172
[2079]2173      virtual ~NodeNotifierProxy() {
2174        if (Parent::attached()) {
2175          Parent::detach();
2176        }
2177      }
[1697]2178
[2079]2179      void setNotifier(typename Graph::NodeNotifier& graph_notifier) {
2180        Parent::attach(graph_notifier);
2181      }
[1697]2182
[2079]2183     
2184    protected:
[1697]2185
[2079]2186      virtual void add(const GraphNode& gn) {
2187        std::vector<Node> nodes;
2188        nodes.push_back(AdaptorBase::Parent::inNode(gn));
2189        nodes.push_back(AdaptorBase::Parent::outNode(gn));
2190        adaptor->getNotifier(Node()).add(nodes);
2191        adaptor->getNotifier(Edge()).add(AdaptorBase::Parent::edge(gn));
2192      }
2193      virtual void add(const std::vector<GraphNode>& gn) {
2194        std::vector<Node> nodes;
2195        std::vector<Edge> edges;
2196        for (int i = 0; i < (int)gn.size(); ++i) {
2197          edges.push_back(AdaptorBase::Parent::edge(gn[i]));
2198          nodes.push_back(AdaptorBase::Parent::inNode(gn[i]));
2199          nodes.push_back(AdaptorBase::Parent::outNode(gn[i]));
2200        }
2201        adaptor->getNotifier(Node()).add(nodes);
2202        adaptor->getNotifier(Edge()).add(edges);
2203      }
2204      virtual void erase(const GraphNode& gn) {
2205        adaptor->getNotifier(Edge()).erase(AdaptorBase::Parent::edge(gn));
2206        std::vector<Node> nodes;
2207        nodes.push_back(AdaptorBase::Parent::inNode(gn));
2208        nodes.push_back(AdaptorBase::Parent::outNode(gn));
2209        adaptor->getNotifier(Node()).erase(nodes);
2210      }
2211      virtual void erase(const std::vector<GraphNode>& gn) {
2212        std::vector<Node> nodes;
2213        std::vector<Edge> edges;
2214        for (int i = 0; i < (int)gn.size(); ++i) {
2215          edges.push_back(AdaptorBase::Parent::edge(gn[i]));
2216          nodes.push_back(AdaptorBase::Parent::inNode(gn[i]));
2217          nodes.push_back(AdaptorBase::Parent::outNode(gn[i]));
2218        }
2219        adaptor->getNotifier(Edge()).erase(edges);
2220        adaptor->getNotifier(Node()).erase(nodes);
2221      }
2222      virtual void build() {
2223        std::vector<Edge> edges;
2224        const typename Parent::Notifier* notifier = Parent::getNotifier();
2225        GraphNode it;
2226        for (notifier->first(it); it != INVALID; notifier->next(it)) {
2227          edges.push_back(AdaptorBase::Parent::edge(it));
2228        }
2229        adaptor->getNotifier(Node()).build();
2230        adaptor->getNotifier(Edge()).add(edges);       
2231      }
2232      virtual void clear() {
2233        std::vector<Edge> edges;
2234        const typename Parent::Notifier* notifier = Parent::getNotifier();
2235        GraphNode it;
2236        for (notifier->first(it); it != INVALID; notifier->next(it)) {
2237          edges.push_back(AdaptorBase::Parent::edge(it));
2238        }
2239        adaptor->getNotifier(Edge()).erase(edges);       
2240        adaptor->getNotifier(Node()).clear();
2241      }
[1697]2242
[2079]2243      const AdaptorBase* adaptor;
2244    };
[1697]2245
[2079]2246    class EdgeNotifierProxy : public Graph::EdgeNotifier::ObserverBase {
2247    public:
2248
2249      typedef typename Graph::EdgeNotifier::ObserverBase Parent;
2250      typedef AlterableSplitGraphAdaptor AdaptorBase;
[1697]2251     
[2079]2252      EdgeNotifierProxy(const AdaptorBase& _adaptor)
2253        : Parent(), adaptor(&_adaptor) {
2254      }
[1697]2255
[2079]2256      virtual ~EdgeNotifierProxy() {
2257        if (Parent::attached()) {
2258          Parent::detach();
2259        }
2260      }
[1697]2261
[2079]2262      void setNotifier(typename Graph::EdgeNotifier& graph_notifier) {
2263        Parent::attach(graph_notifier);
2264      }
[1697]2265
[2079]2266     
2267    protected:
[1697]2268
[2079]2269      virtual void add(const GraphEdge& ge) {
2270        adaptor->getNotifier(Edge()).add(AdaptorBase::edge(ge));
2271      }
2272      virtual void add(const std::vector<GraphEdge>& ge) {
2273        std::vector<Edge> edges;
2274        for (int i = 0; i < (int)ge.size(); ++i) {
2275          edges.push_back(AdaptorBase::edge(ge[i]));
2276        }
2277        adaptor->getNotifier(Edge()).add(edges);
2278      }
2279      virtual void erase(const GraphEdge& ge) {
2280        adaptor->getNotifier(Edge()).erase(AdaptorBase::edge(ge));
2281      }
2282      virtual void erase(const std::vector<GraphEdge>& ge) {
2283        std::vector<Edge> edges;
2284        for (int i = 0; i < (int)ge.size(); ++i) {
2285          edges.push_back(AdaptorBase::edge(ge[i]));
2286        }
2287        adaptor->getNotifier(Edge()).erase(edges);
2288      }
2289      virtual void build() {
2290        std::vector<Edge> edges;
2291        const typename Parent::Notifier* notifier = Parent::getNotifier();
2292        GraphEdge it;
2293        for (notifier->first(it); it != INVALID; notifier->next(it)) {
2294          edges.push_back(AdaptorBase::Parent::edge(it));
2295        }
2296        adaptor->getNotifier(Edge()).add(edges);
2297      }
2298      virtual void clear() {
2299        std::vector<Edge> edges;
2300        const typename Parent::Notifier* notifier = Parent::getNotifier();
2301        GraphEdge it;
2302        for (notifier->first(it); it != INVALID; notifier->next(it)) {
2303          edges.push_back(AdaptorBase::Parent::edge(it));
2304        }
2305        adaptor->getNotifier(Edge()).erase(edges);
2306      }
[1697]2307
[2079]2308      const AdaptorBase* adaptor;
2309    };
2310
2311
2312    mutable NodeNotifier node_notifier;
2313    mutable EdgeNotifier edge_notifier;
2314
2315    NodeNotifierProxy node_notifier_proxy;
2316    EdgeNotifierProxy edge_notifier_proxy;
2317
2318  };
2319
2320  /// \ingroup graph_adaptors
2321  ///
2322  /// \brief SplitGraphAdaptor class
2323  ///
2324  /// This is an graph adaptor which splits all node into an in-node
2325  /// and an out-node. Formaly, the adaptor replaces each \f$ u \f$
2326  /// node in the graph with two node, \f$ u_{in} \f$ node and
2327  /// \f$ u_{out} \f$ node. If there is an \f$ (v, u) \f$ edge in the
2328  /// original graph the new target of the edge will be \f$ u_{in} \f$ and
2329  /// similarly the source of the original \f$ (u, v) \f$ edge will be
2330  /// \f$ u_{out} \f$.  The adaptor will add for each node in the
2331  /// original graph an additional edge which will connect
2332  /// \f$ (u_{in}, u_{out}) \f$.
2333  ///
2334  /// The aim of this class is to run algorithm with node costs if the
2335  /// algorithm can use directly just edge costs. In this case we should use
2336  /// a \c SplitGraphAdaptor and set the node cost of the graph to the
2337  /// bind edge in the adapted graph.
2338  ///
2339  /// By example a maximum flow algoritm can compute how many edge
2340  /// disjoint paths are in the graph. But we would like to know how
2341  /// many node disjoint paths are in the graph. First we have to
2342  /// adapt the graph with the \c SplitGraphAdaptor. Then run the flow
2343  /// algorithm on the adapted graph. The bottleneck of the flow will
2344  /// be the bind edges which bounds the flow with the count of the
2345  /// node disjoint paths.
2346  ///
2347  ///\code
2348  ///
2349  /// typedef SplitGraphAdaptor<SmartGraph> SGraph;
2350  ///
2351  /// SGraph sgraph(graph);
2352  ///
2353  /// typedef ConstMap<SGraph::Edge, int> SCapacity;
2354  /// SCapacity scapacity(1);
2355  ///
2356  /// SGraph::EdgeMap<int> sflow(sgraph);
2357  ///
2358  /// Preflow<SGraph, int, SCapacity>
2359  ///   spreflow(sgraph, SGraph::outNode(source),SGraph::inNode(target), 
2360  ///            scapacity, sflow);
2361  ///                                           
2362  /// spreflow.run();
2363  ///
2364  ///\endcode
2365  ///
2366  /// The result of the mamixum flow on the original graph
2367  /// shows the next figure:
2368  ///
2369  /// \image html edge_disjoint.png
2370  /// \image latex edge_disjoint.eps "Edge disjoint paths" width=\textwidth
2371  ///
2372  /// And the maximum flow on the adapted graph:
2373  ///
2374  /// \image html node_disjoint.png
2375  /// \image latex node_disjoint.eps "Node disjoint paths" width=\textwidth
2376  ///
2377  /// The second solution contains just 3 disjoint paths while the first 4.
2378  ///
2379  /// This graph adaptor is fully conform to the
2380  /// \ref concept::StaticGraph "StaticGraph" concept and
2381  /// contains some additional member functions and types. The
2382  /// documentation of some member functions may be found just in the
2383  /// SplitGraphAdaptorBase class.
2384  ///
2385  /// \sa SplitGraphAdaptorBase
2386  template <typename _Graph>
2387  class SplitGraphAdaptor : public AlterableSplitGraphAdaptor<_Graph> {
2388  public:
2389    typedef AlterableSplitGraphAdaptor<_Graph> Parent;
2390
2391    typedef typename Parent::Node Node;
2392    typedef typename Parent::Edge Edge;
2393
2394    /// \brief Constructor of the adaptor.
2395    ///
2396    /// Constructor of the adaptor.
2397    SplitGraphAdaptor(_Graph& graph) {
2398      Parent::setGraph(graph);
2399    }
2400
2401    /// \brief NodeMap combined from two original NodeMap
2402    ///
2403    /// This class adapt two of the original graph NodeMap to
2404    /// get a node map on the adapted graph.
2405    template <typename InNodeMap, typename OutNodeMap>
2406    class CombinedNodeMap {
2407    public:
2408
2409      typedef Node Key;
2410      typedef typename InNodeMap::Value Value;
2411
2412      /// \brief Constructor
2413      ///
2414      /// Constructor.
2415      CombinedNodeMap(InNodeMap& _inNodeMap, OutNodeMap& _outNodeMap)
2416        : inNodeMap(_inNodeMap), outNodeMap(_outNodeMap) {}
2417
2418      /// \brief The subscript operator.
2419      ///
2420      /// The subscript operator.
2421      Value& operator[](const Key& key) {
2422        if (Parent::inNode(key)) {
2423          return inNodeMap[key];
2424        } else {
2425          return outNodeMap[key];
2426        }
2427      }
2428
2429      /// \brief The const subscript operator.
2430      ///
2431      /// The const subscript operator.
2432      Value operator[](const Key& key) const {
2433        if (Parent::inNode(key)) {
2434          return inNodeMap[key];
2435        } else {
2436          return outNodeMap[key];
2437        }
2438      }
2439
2440      /// \brief The setter function of the map.
2441      ///
2442      /// The setter function of the map.
2443      void set(const Key& key, const Value& value) {
2444        if (Parent::inNode(key)) {
2445          inNodeMap.set(key, value);
2446        } else {
2447          outNodeMap.set(key, value);
2448        }
2449      }
2450     
2451    private:
2452     
2453      InNodeMap& inNodeMap;
2454      OutNodeMap& outNodeMap;
2455     
2456    };
2457
2458
2459    /// \brief Just gives back a combined node map.
2460    ///
2461    /// Just gives back a combined node map.
2462    template <typename InNodeMap, typename OutNodeMap>
2463    static CombinedNodeMap<InNodeMap, OutNodeMap>
2464    combinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) {
2465      return CombinedNodeMap<InNodeMap, OutNodeMap>(in_map, out_map);
2466    }
2467
2468    template <typename InNodeMap, typename OutNodeMap>
2469    static CombinedNodeMap<const InNodeMap, OutNodeMap>
2470    combinedNodeMap(const InNodeMap& in_map, OutNodeMap& out_map) {
2471      return CombinedNodeMap<const InNodeMap, OutNodeMap>(in_map, out_map);
2472    }
2473
2474    template <typename InNodeMap, typename OutNodeMap>
2475    static CombinedNodeMap<InNodeMap, const OutNodeMap>
2476    combinedNodeMap(InNodeMap& in_map, const OutNodeMap& out_map) {
2477      return CombinedNodeMap<InNodeMap, const OutNodeMap>(in_map, out_map);
2478    }
2479
2480    template <typename InNodeMap, typename OutNodeMap>
2481    static CombinedNodeMap<const InNodeMap, const OutNodeMap>
2482    combinedNodeMap(const InNodeMap& in_map, const OutNodeMap& out_map) {
2483      return CombinedNodeMap<const InNodeMap,
2484        const OutNodeMap>(in_map, out_map);
2485    }
2486
2487    /// \brief EdgeMap combined from an original EdgeMap and NodeMap
2488    ///
2489    /// This class adapt an original graph EdgeMap and NodeMap to
2490    /// get an edge map on the adapted graph.
2491    template <typename GraphEdgeMap, typename GraphNodeMap>
2492    class CombinedEdgeMap
2493      : public MapBase<Edge, typename GraphEdgeMap::Value> {
2494    public:
2495      typedef MapBase<Edge, typename GraphEdgeMap::Value> Parent;
2496
2497      typedef typename Parent::Key Key;
2498      typedef typename Parent::Value Value;
2499
2500      /// \brief Constructor
2501      ///
2502      /// Constructor.
2503      CombinedEdgeMap(GraphEdgeMap& _edge_map, GraphNodeMap& _node_map)
2504        : edge_map(_edge_map), node_map(_node_map) {}
2505
2506      /// \brief The subscript operator.
2507      ///
2508      /// The subscript operator.
2509      void set(const Edge& edge, const Value& val) {
2510        if (Parent::origEdge(edge)) {
2511          edge_map.set(edge, val);
2512        } else {
2513          node_map.set(edge, val);
2514        }
2515      }
2516
2517      /// \brief The const subscript operator.
2518      ///
2519      /// The const subscript operator.
2520      Value operator[](const Key& edge) const {
2521        if (Parent::origEdge(edge)) {
2522          return edge_map[edge];
2523        } else {
2524          return node_map[edge];
2525        }
2526      }     
2527
2528      /// \brief The const subscript operator.
2529      ///
2530      /// The const subscript operator.
2531      Value& operator[](const Key& edge) {
2532        if (Parent::origEdge(edge)) {
2533          return edge_map[edge];
2534        } else {
2535          return node_map[edge];
2536        }
2537      }     
2538     
2539    private:
2540      GraphEdgeMap& edge_map;
2541      GraphNodeMap& node_map;
2542    };
2543                   
2544    /// \brief Just gives back a combined edge map.
2545    ///
2546    /// Just gives back a combined edge map.
2547    template <typename GraphEdgeMap, typename GraphNodeMap>
2548    static CombinedEdgeMap<GraphEdgeMap, GraphNodeMap>
2549    combinedEdgeMap(GraphEdgeMap& edge_map, GraphNodeMap& node_map) {
2550      return CombinedEdgeMap<GraphEdgeMap, GraphNodeMap>(edge_map, node_map);
2551    }
2552
2553    template <typename GraphEdgeMap, typename GraphNodeMap>
2554    static CombinedEdgeMap<const GraphEdgeMap, GraphNodeMap>
2555    combinedEdgeMap(const GraphEdgeMap& edge_map, GraphNodeMap& node_map) {
2556      return CombinedEdgeMap<const GraphEdgeMap,
2557        GraphNodeMap>(edge_map, node_map);
2558    }
2559
2560    template <typename GraphEdgeMap, typename GraphNodeMap>
2561    static CombinedEdgeMap<GraphEdgeMap, const GraphNodeMap>
2562    combinedEdgeMap(GraphEdgeMap& edge_map, const GraphNodeMap& node_map) {
2563      return CombinedEdgeMap<GraphEdgeMap,
2564        const GraphNodeMap>(edge_map, node_map);
2565    }
2566
2567    template <typename GraphEdgeMap, typename GraphNodeMap>
2568    static CombinedEdgeMap<const GraphEdgeMap, const GraphNodeMap>
2569    combinedEdgeMap(const GraphEdgeMap& edge_map,
2570                    const GraphNodeMap& node_map) {
2571      return CombinedEdgeMap<const GraphEdgeMap,
2572        const GraphNodeMap>(edge_map, node_map);
2573    }
2574
2575  };
2576
[1697]2577
[921]2578} //namespace lemon
[556]2579
[1401]2580#endif //LEMON_GRAPH_ADAPTOR_H
[556]2581
Note: See TracBrowser for help on using the repository browser.