src/hugo/graph_wrapper.h
author marci
Thu, 20 May 2004 15:40:59 +0000
changeset 650 588ff2ca55bd
parent 626 0015642b0990
child 653 c3ad7c661a49
permissions -rw-r--r--
a
marci@556
     1
// -*- c++ -*-
marci@556
     2
#ifndef HUGO_GRAPH_WRAPPER_H
marci@556
     3
#define HUGO_GRAPH_WRAPPER_H
marci@556
     4
marci@556
     5
///\ingroup gwrappers
marci@556
     6
///\file
marci@556
     7
///\brief Several graph wrappers.
marci@556
     8
///
marci@556
     9
///This file contains several useful graph wrapper functions.
marci@556
    10
///
marci@556
    11
///\author Marton Makai
marci@556
    12
marci@556
    13
#include <hugo/invalid.h>
marci@650
    14
#include <hugo/maps.h>
marci@556
    15
//#include <iter_map.h>
marci@556
    16
marci@556
    17
namespace hugo {
marci@556
    18
marci@556
    19
  // Graph wrappers
marci@556
    20
marci@556
    21
  /// \addtogroup gwrappers
marci@556
    22
  /// A main parts of HUGOlib are the different graph structures, 
marci@556
    23
  /// generic graph algorithms, graph concepts which couple these, and 
marci@556
    24
  /// graph wrappers. While the previous ones are more or less clear, the 
marci@556
    25
  /// latter notion needs further explanation.
marci@556
    26
  /// Graph wrappers are graph classes which serve for considering graph 
marci@556
    27
  /// structures in different ways. A short example makes the notion much 
marci@556
    28
  /// clearer. 
marci@556
    29
  /// Suppose that we have an instance \c g of a directed graph
marci@556
    30
  /// type say \c ListGraph and an algorithm 
marci@556
    31
  /// \code template<typename Graph> int algorithm(const Graph&); \endcode 
marci@556
    32
  /// is needed to run on the reversely oriented graph. 
marci@556
    33
  /// It may be expensive (in time or in memory usage) to copy 
marci@556
    34
  /// \c g with the reverse orientation. 
marci@556
    35
  /// Thus, a wrapper class
marci@556
    36
  /// \code template<typename Graph> class RevGraphWrapper; \endcode is used. 
marci@556
    37
  /// The code looks as follows
marci@556
    38
  /// \code
marci@556
    39
  /// ListGraph g;
marci@556
    40
  /// RevGraphWrapper<ListGraph> rgw(g);
marci@556
    41
  /// int result=algorithm(rgw);
marci@556
    42
  /// \endcode
marci@556
    43
  /// After running the algorithm, the original graph \c g 
marci@556
    44
  /// remains untouched. Thus the graph wrapper used above is to consider the 
marci@556
    45
  /// original graph with reverse orientation. 
marci@556
    46
  /// This techniques gives rise to an elegant code, and 
marci@556
    47
  /// based on stable graph wrappers, complex algorithms can be 
marci@556
    48
  /// implemented easily. 
marci@556
    49
  /// In flow, circulation and bipartite matching problems, the residual 
marci@556
    50
  /// graph is of particular importance. Combining a wrapper implementing 
marci@556
    51
  /// this, shortest path algorithms and minimum mean cycle algorithms, 
marci@556
    52
  /// a range of weighted and cardinality optimization algorithms can be 
marci@556
    53
  /// obtained. For lack of space, for other examples, 
marci@556
    54
  /// the interested user is referred to the detailed documentation of graph 
marci@556
    55
  /// wrappers. 
marci@556
    56
  /// The behavior of graph wrappers can be very different. Some of them keep 
marci@556
    57
  /// capabilities of the original graph while in other cases this would be 
marci@556
    58
  /// meaningless. This means that the concepts that they are a model of depend 
marci@556
    59
  /// on the graph wrapper, and the wrapped graph(s). 
marci@556
    60
  /// If an edge of \c rgw is deleted, this is carried out by 
marci@556
    61
  /// deleting the corresponding edge of \c g. But for a residual 
marci@556
    62
  /// graph, this operation has no sense. 
marci@556
    63
  /// Let we stand one more example here to simplify your work. 
marci@556
    64
  /// wrapper class
marci@556
    65
  /// \code template<typename Graph> class RevGraphWrapper; \endcode 
marci@556
    66
  /// has constructor 
marci@556
    67
  /// <tt> RevGraphWrapper(Graph& _g)</tt>. 
marci@556
    68
  /// This means that in a situation, 
marci@556
    69
  /// when a <tt> const ListGraph& </tt> reference to a graph is given, 
marci@556
    70
  /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
marci@556
    71
  /// \code
marci@556
    72
  /// int algorithm1(const ListGraph& g) {
marci@556
    73
  ///   RevGraphWrapper<const ListGraph> rgw(g);
marci@556
    74
  ///   return algorithm2(rgw);
marci@556
    75
  /// }
marci@556
    76
  /// \endcode
marci@556
    77
marci@556
    78
  /// \addtogroup gwrappers
marci@556
    79
  /// @{
marci@556
    80
marci@556
    81
  ///Base type for the Graph Wrappers
marci@556
    82
marci@556
    83
  ///This is the base type for the Graph Wrappers.
marci@556
    84
  ///\todo Some more docs... 
marci@556
    85
  ///
marci@612
    86
  ///\author Marton Makai 
marci@556
    87
  template<typename Graph>
marci@556
    88
  class GraphWrapper {
marci@556
    89
  protected:
marci@556
    90
    Graph* graph;
marci@556
    91
    GraphWrapper() : graph(0) { }
marci@556
    92
    void setGraph(Graph& _graph) { graph=&_graph; }
marci@556
    93
marci@556
    94
  public:
marci@556
    95
    typedef Graph BaseGraph;
marci@556
    96
    typedef Graph ParentGraph;
marci@556
    97
marci@556
    98
    GraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@556
    99
//     Graph& getGraph() const { return *graph; }
marci@556
   100
 
marci@556
   101
//    typedef typename Graph::Node Node;
marci@556
   102
    class Node : public Graph::Node {
marci@556
   103
      friend class GraphWrapper<Graph>;
marci@556
   104
    public:
marci@556
   105
      Node() { }
marci@556
   106
      Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
marci@650
   107
      // /// \bug construction throughrthr multiple levels should be 
marci@650
   108
      // /// handled better
marci@650
   109
      // Node(const typename ParentGraph::ParentGraph::Node& _n) : 
marci@650
   110
      // Graph::Node(_n) { }
marci@556
   111
      Node(const Invalid& i) : Graph::Node(i) { }
marci@556
   112
    };
marci@556
   113
    class NodeIt { 
marci@556
   114
      friend class GraphWrapper<Graph>;
marci@556
   115
      typename Graph::NodeIt n;
marci@556
   116
     public:
marci@556
   117
      NodeIt() { }
marci@556
   118
      NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
marci@556
   119
      NodeIt(const Invalid& i) : n(i) { }
marci@556
   120
      NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
marci@556
   121
      operator Node() const { return Node(typename Graph::Node(n)); }
marci@556
   122
    };
marci@556
   123
//    typedef typename Graph::Edge Edge;
marci@556
   124
    class Edge : public Graph::Edge {
marci@556
   125
      friend class GraphWrapper<Graph>;
marci@556
   126
    public:
marci@556
   127
      Edge() { }
marci@556
   128
      Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
marci@556
   129
      Edge(const Invalid& i) : Graph::Edge(i) { }
marci@556
   130
    };
marci@556
   131
    class OutEdgeIt { 
marci@556
   132
      friend class GraphWrapper<Graph>;
marci@556
   133
      typename Graph::OutEdgeIt e;
marci@556
   134
    public:
marci@556
   135
      OutEdgeIt() { }
marci@556
   136
      OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
marci@556
   137
      OutEdgeIt(const Invalid& i) : e(i) { }
marci@556
   138
      OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) : 
marci@556
   139
	e(*(_G.graph), typename Graph::Node(_n)) { }
marci@556
   140
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   141
    };
marci@556
   142
    class InEdgeIt { 
marci@556
   143
      friend class GraphWrapper<Graph>;
marci@556
   144
      typename Graph::InEdgeIt e;
marci@556
   145
    public:
marci@556
   146
      InEdgeIt() { }
marci@556
   147
      InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
marci@556
   148
      InEdgeIt(const Invalid& i) : e(i) { }
marci@556
   149
      InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) : 
marci@556
   150
	e(*(_G.graph), typename Graph::Node(_n)) { }
marci@556
   151
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   152
    };
marci@556
   153
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@556
   154
    class EdgeIt { 
marci@556
   155
      friend class GraphWrapper<Graph>;
marci@556
   156
      typename Graph::EdgeIt e;
marci@556
   157
    public:
marci@556
   158
      EdgeIt() { }
marci@556
   159
      EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
marci@556
   160
      EdgeIt(const Invalid& i) : e(i) { }
marci@556
   161
      EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
marci@556
   162
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   163
    };
marci@556
   164
   
marci@556
   165
    NodeIt& first(NodeIt& i) const { 
marci@556
   166
      i=NodeIt(*this); return i;
marci@556
   167
    }
marci@556
   168
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
   169
      i=OutEdgeIt(*this, p); return i;
marci@556
   170
    }
marci@556
   171
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
   172
      i=InEdgeIt(*this, p); return i;
marci@556
   173
    }
marci@556
   174
    EdgeIt& first(EdgeIt& i) const { 
marci@556
   175
      i=EdgeIt(*this); return i;
marci@556
   176
    }
marci@556
   177
marci@556
   178
    NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
marci@556
   179
    OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
marci@556
   180
    InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
marci@556
   181
    EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }    
marci@556
   182
marci@556
   183
    Node tail(const Edge& e) const { 
marci@556
   184
      return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
marci@556
   185
    Node head(const Edge& e) const { 
marci@556
   186
      return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
marci@556
   187
marci@556
   188
    bool valid(const Node& n) const { 
marci@556
   189
      return graph->valid(static_cast<typename Graph::Node>(n)); }
marci@556
   190
    bool valid(const Edge& e) const { 
marci@556
   191
      return graph->valid(static_cast<typename Graph::Edge>(e)); }
marci@556
   192
marci@556
   193
    int nodeNum() const { return graph->nodeNum(); }
marci@556
   194
    int edgeNum() const { return graph->edgeNum(); }
marci@556
   195
  
marci@556
   196
    Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
marci@556
   197
    Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
marci@556
   198
    Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
marci@556
   199
    Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
marci@556
   200
  
marci@556
   201
    Node addNode() const { return Node(graph->addNode()); }
marci@556
   202
    Edge addEdge(const Node& tail, const Node& head) const { 
marci@556
   203
      return Edge(graph->addEdge(tail, head)); }
marci@556
   204
marci@556
   205
    void erase(const Node& i) const { graph->erase(i); }
marci@556
   206
    void erase(const Edge& i) const { graph->erase(i); }
marci@556
   207
  
marci@556
   208
    void clear() const { graph->clear(); }
marci@556
   209
    
marci@650
   210
    bool forward(const Edge& e) const { graph->forward(e); }
marci@650
   211
    bool backward(const Edge& e) const { graph->backward(e); }
marci@650
   212
    
marci@650
   213
    Edge opposite(const Edge& e) const { Edge(graph->opposite(e)); }
marci@650
   214
marci@556
   215
    template<typename T> class NodeMap : public Graph::template NodeMap<T> { 
marci@556
   216
      typedef typename Graph::template NodeMap<T> Parent;
marci@556
   217
    public:
marci@556
   218
      NodeMap(const GraphWrapper<Graph>& _G) :  Parent(*(_G.graph)) { }
marci@556
   219
      NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
marci@556
   220
    };
marci@556
   221
marci@556
   222
    template<typename T> class EdgeMap : public Graph::template EdgeMap<T> { 
marci@556
   223
      typedef typename Graph::template EdgeMap<T> Parent;
marci@556
   224
    public:
marci@556
   225
      EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
marci@556
   226
      EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
marci@556
   227
    };
marci@556
   228
  };
marci@556
   229
marci@569
   230
marci@569
   231
marci@556
   232
  /// A graph wrapper which reverses the orientation of the edges.
marci@556
   233
marci@556
   234
  /// A graph wrapper which reverses the orientation of the edges.
marci@612
   235
  /// Thus \c Graph have to be a directed graph type.
marci@556
   236
  ///
marci@556
   237
  ///\author Marton Makai
marci@556
   238
  template<typename Graph>
marci@556
   239
  class RevGraphWrapper : public GraphWrapper<Graph> {
marci@650
   240
  public:
marci@650
   241
    typedef GraphWrapper<Graph> Parent; 
marci@556
   242
  protected:
marci@612
   243
    RevGraphWrapper() : GraphWrapper<Graph>() { }
marci@556
   244
  public:
marci@556
   245
    RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
marci@556
   246
marci@556
   247
    typedef typename GraphWrapper<Graph>::Node Node;
marci@556
   248
    typedef typename GraphWrapper<Graph>::Edge Edge;
marci@556
   249
    //If Graph::OutEdgeIt is not defined
marci@556
   250
    //and we do not want to use RevGraphWrapper::InEdgeIt,
marci@556
   251
    //the typdef techinque does not work.
marci@556
   252
    //Unfortunately all the typedefs are instantiated in templates.
marci@556
   253
    //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
marci@556
   254
    //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
marci@556
   255
marci@556
   256
    class OutEdgeIt { 
marci@556
   257
      friend class GraphWrapper<Graph>;
marci@556
   258
      friend class RevGraphWrapper<Graph>;
marci@556
   259
      typename Graph::InEdgeIt e;
marci@556
   260
    public:
marci@556
   261
      OutEdgeIt() { }
marci@556
   262
      OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
marci@556
   263
      OutEdgeIt(const Invalid& i) : e(i) { }
marci@556
   264
      OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) : 
marci@556
   265
	e(*(_G.graph), typename Graph::Node(_n)) { }
marci@556
   266
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   267
    };
marci@556
   268
    class InEdgeIt { 
marci@556
   269
      friend class GraphWrapper<Graph>;
marci@556
   270
      friend class RevGraphWrapper<Graph>;
marci@556
   271
      typename Graph::OutEdgeIt e;
marci@556
   272
    public:
marci@556
   273
      InEdgeIt() { }
marci@556
   274
      InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
marci@556
   275
      InEdgeIt(const Invalid& i) : e(i) { }
marci@556
   276
      InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) : 
marci@556
   277
	e(*(_G.graph), typename Graph::Node(_n)) { }
marci@556
   278
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   279
    };
marci@556
   280
marci@556
   281
    using GraphWrapper<Graph>::first;
marci@556
   282
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
   283
      i=OutEdgeIt(*this, p); return i;
marci@556
   284
    }
marci@556
   285
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
   286
      i=InEdgeIt(*this, p); return i;
marci@556
   287
    }
marci@556
   288
marci@556
   289
    using GraphWrapper<Graph>::next;
marci@556
   290
    OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
marci@556
   291
    InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
marci@556
   292
marci@556
   293
    Node aNode(const OutEdgeIt& e) const { 
marci@556
   294
      return Node(this->graph->aNode(e.e)); }
marci@556
   295
    Node aNode(const InEdgeIt& e) const { 
marci@556
   296
      return Node(this->graph->aNode(e.e)); }
marci@556
   297
    Node bNode(const OutEdgeIt& e) const { 
marci@556
   298
      return Node(this->graph->bNode(e.e)); }
marci@556
   299
    Node bNode(const InEdgeIt& e) const { 
marci@556
   300
      return Node(this->graph->bNode(e.e)); }
marci@556
   301
marci@556
   302
    Node tail(const Edge& e) const { 
marci@556
   303
      return GraphWrapper<Graph>::head(e); }
marci@556
   304
    Node head(const Edge& e) const { 
marci@556
   305
      return GraphWrapper<Graph>::tail(e); }
marci@556
   306
marci@556
   307
  };
marci@556
   308
marci@569
   309
marci@569
   310
marci@612
   311
  /// A graph wrapper for hiding nodes and edges from a graph.
marci@556
   312
  
marci@556
   313
  /// This wrapper shows a graph with filtered node-set and 
marci@556
   314
  /// edge-set. The quick brown fox iterator jumps over 
marci@556
   315
  /// the lazy dog nodes or edges if the values for them are false 
marci@556
   316
  /// in the bool maps. 
marci@556
   317
  ///
marci@556
   318
  ///\author Marton Makai
marci@556
   319
  template<typename Graph, typename NodeFilterMap, 
marci@556
   320
	   typename EdgeFilterMap>
marci@556
   321
  class SubGraphWrapper : public GraphWrapper<Graph> {
marci@650
   322
  public:
marci@650
   323
    typedef GraphWrapper<Graph> Parent;
marci@556
   324
  protected:
marci@556
   325
    NodeFilterMap* node_filter_map;
marci@556
   326
    EdgeFilterMap* edge_filter_map;
marci@556
   327
marci@612
   328
    SubGraphWrapper() : GraphWrapper<Graph>(), 
marci@556
   329
			node_filter_map(0), edge_filter_map(0) { }
marci@556
   330
    void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
marci@556
   331
      node_filter_map=&_node_filter_map;
marci@556
   332
    }
marci@556
   333
    void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
marci@556
   334
      edge_filter_map=&_edge_filter_map;
marci@556
   335
    }
marci@556
   336
    
marci@556
   337
  public:
marci@556
   338
    SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map, 
marci@556
   339
		    EdgeFilterMap& _edge_filter_map) : 
marci@556
   340
      GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), 
marci@556
   341
      edge_filter_map(&_edge_filter_map) { }  
marci@556
   342
marci@556
   343
    typedef typename GraphWrapper<Graph>::Node Node;
marci@556
   344
    class NodeIt { 
marci@556
   345
      friend class GraphWrapper<Graph>;
marci@556
   346
      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
marci@556
   347
      typename Graph::NodeIt n;
marci@556
   348
     public:
marci@556
   349
      NodeIt() { }
marci@556
   350
      NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
marci@556
   351
      NodeIt(const Invalid& i) : n(i) { }
marci@556
   352
      NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
marci@556
   353
	n(*(_G.graph)) { 
marci@556
   354
	while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n]) 
marci@556
   355
	  _G.graph->next(n);
marci@556
   356
      }
marci@556
   357
      operator Node() const { return Node(typename Graph::Node(n)); }
marci@556
   358
    };
marci@556
   359
    typedef typename GraphWrapper<Graph>::Edge Edge;
marci@556
   360
    class OutEdgeIt { 
marci@556
   361
      friend class GraphWrapper<Graph>;
marci@556
   362
      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
marci@556
   363
      typename Graph::OutEdgeIt e;
marci@556
   364
    public:
marci@556
   365
      OutEdgeIt() { }
marci@556
   366
      OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
marci@556
   367
      OutEdgeIt(const Invalid& i) : e(i) { }
marci@556
   368
      OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G, 
marci@556
   369
		const Node& _n) : 
marci@556
   370
	e(*(_G.graph), typename Graph::Node(_n)) { 
marci@556
   371
      	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
marci@556
   372
	  _G.graph->next(e);
marci@556
   373
      }
marci@556
   374
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   375
    };
marci@556
   376
    class InEdgeIt { 
marci@556
   377
      friend class GraphWrapper<Graph>;
marci@556
   378
      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
marci@556
   379
      typename Graph::InEdgeIt e;
marci@556
   380
    public:
marci@556
   381
      InEdgeIt() { }
marci@556
   382
      InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
marci@556
   383
      InEdgeIt(const Invalid& i) : e(i) { }
marci@556
   384
      InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G, 
marci@556
   385
	       const Node& _n) : 
marci@556
   386
	e(*(_G.graph), typename Graph::Node(_n)) { 
marci@556
   387
      	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
marci@556
   388
	  _G.graph->next(e);
marci@556
   389
      }
marci@556
   390
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   391
    };
marci@556
   392
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@556
   393
    class EdgeIt { 
marci@556
   394
      friend class GraphWrapper<Graph>;
marci@556
   395
      friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
marci@556
   396
      typename Graph::EdgeIt e;
marci@556
   397
    public:
marci@556
   398
      EdgeIt() { }
marci@556
   399
      EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
marci@556
   400
      EdgeIt(const Invalid& i) : e(i) { }
marci@556
   401
      EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
marci@556
   402
	e(*(_G.graph)) { 
marci@556
   403
      	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
marci@556
   404
	  _G.graph->next(e);
marci@556
   405
      }
marci@556
   406
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
   407
    };
marci@556
   408
marci@556
   409
    NodeIt& first(NodeIt& i) const { 
marci@556
   410
      i=NodeIt(*this); return i;
marci@556
   411
    }
marci@556
   412
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
   413
      i=OutEdgeIt(*this, p); return i;
marci@556
   414
    }
marci@556
   415
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
   416
      i=InEdgeIt(*this, p); return i;
marci@556
   417
    }
marci@556
   418
    EdgeIt& first(EdgeIt& i) const { 
marci@556
   419
      i=EdgeIt(*this); return i;
marci@556
   420
    }
marci@556
   421
    
marci@556
   422
    NodeIt& next(NodeIt& i) const {
marci@556
   423
      this->graph->next(i.n); 
marci@556
   424
      while (this->graph->valid(i) && !(*node_filter_map)[i.n]) { 
marci@556
   425
	this->graph->next(i.n); }
marci@556
   426
      return i;
marci@556
   427
    }
marci@556
   428
    OutEdgeIt& next(OutEdgeIt& i) const {
marci@556
   429
      this->graph->next(i.e); 
marci@556
   430
      while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
marci@556
   431
	this->graph->next(i.e); }
marci@556
   432
      return i;
marci@556
   433
    }
marci@556
   434
    InEdgeIt& next(InEdgeIt& i) const {
marci@556
   435
      this->graph->next(i.e); 
marci@556
   436
      while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
marci@556
   437
	this->graph->next(i.e); }
marci@556
   438
      return i;
marci@556
   439
    }
marci@556
   440
    EdgeIt& next(EdgeIt& i) const {
marci@556
   441
      this->graph->next(i.e); 
marci@556
   442
      while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
marci@556
   443
	this->graph->next(i.e); }
marci@556
   444
      return i;
marci@556
   445
    }
marci@556
   446
marci@556
   447
    Node aNode(const OutEdgeIt& e) const { 
marci@556
   448
      return Node(this->graph->aNode(e.e)); }
marci@556
   449
    Node aNode(const InEdgeIt& e) const { 
marci@556
   450
      return Node(this->graph->aNode(e.e)); }
marci@556
   451
    Node bNode(const OutEdgeIt& e) const { 
marci@556
   452
      return Node(this->graph->bNode(e.e)); }
marci@556
   453
    Node bNode(const InEdgeIt& e) const { 
marci@556
   454
      return Node(this->graph->bNode(e.e)); }
marci@556
   455
marci@561
   456
    /// This function hides \c n in the graph, i.e. the iteration 
marci@561
   457
    /// jumps over it. This is done by simply setting the value of \c n  
marci@561
   458
    /// to be false in the corresponding node-map.
marci@556
   459
    void hide(const Node& n) const { node_filter_map->set(n, false); }
marci@561
   460
marci@561
   461
    /// This function hides \c e in the graph, i.e. the iteration 
marci@561
   462
    /// jumps over it. This is done by simply setting the value of \c e  
marci@561
   463
    /// to be false in the corresponding edge-map.
marci@556
   464
    void hide(const Edge& e) const { edge_filter_map->set(e, false); }
marci@556
   465
marci@561
   466
    /// The value of \c n is set to be true in the node-map which stores 
marci@561
   467
    /// hide information. If \c n was hidden previuosly, then it is shown 
marci@561
   468
    /// again
marci@561
   469
     void unHide(const Node& n) const { node_filter_map->set(n, true); }
marci@561
   470
marci@561
   471
    /// The value of \c e is set to be true in the edge-map which stores 
marci@561
   472
    /// hide information. If \c e was hidden previuosly, then it is shown 
marci@561
   473
    /// again
marci@556
   474
    void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
marci@556
   475
marci@561
   476
    /// Returns true if \c n is hidden.
marci@561
   477
    bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
marci@561
   478
marci@561
   479
    /// Returns true if \c n is hidden.
marci@561
   480
    bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
marci@593
   481
alpar@594
   482
    /// This is a linear time operation and works only if 
marci@593
   483
    /// NodeIt is defined.
marci@593
   484
    int nodeNum() const { 
marci@593
   485
      int i=0;
marci@593
   486
      NodeIt n;
marci@593
   487
      for (this->first(n); this->valid(n); this->next(n)) ++i;
marci@593
   488
      return i; 
marci@593
   489
    }
marci@593
   490
marci@593
   491
    /// This is a linear time operation and works only if 
marci@593
   492
    /// EdgeIt is defined.
marci@593
   493
    int edgeNum() const { 
marci@593
   494
      int i=0;
marci@593
   495
      EdgeIt e;
marci@593
   496
      for (this->first(e); this->valid(e); this->next(e)) ++i;
marci@593
   497
      return i; 
marci@593
   498
    }
marci@593
   499
marci@556
   500
  };
marci@556
   501
marci@569
   502
marci@569
   503
marci@612
   504
  /// \brief A wrapper for forgetting the orientation of a graph.
marci@612
   505
  ///
marci@556
   506
  /// A wrapper for getting an undirected graph by forgetting
marci@556
   507
  /// the orientation of a directed one.
alpar@589
   508
  ///
marci@612
   509
  /// \author Marton Makai
marci@556
   510
  template<typename Graph>
marci@556
   511
  class UndirGraphWrapper : public GraphWrapper<Graph> {
marci@650
   512
  public:
marci@650
   513
    typedef GraphWrapper<Graph> Parent; 
marci@556
   514
  protected:
marci@556
   515
    UndirGraphWrapper() : GraphWrapper<Graph>() { }
marci@556
   516
    
marci@556
   517
  public:
marci@556
   518
    typedef typename GraphWrapper<Graph>::Node Node;
marci@556
   519
    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
marci@556
   520
    typedef typename GraphWrapper<Graph>::Edge Edge;
marci@556
   521
    typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
marci@556
   522
marci@556
   523
    UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
marci@556
   524
marci@556
   525
    class OutEdgeIt {
marci@556
   526
      friend class UndirGraphWrapper<Graph>;
marci@556
   527
      bool out_or_in; //true iff out
marci@556
   528
      typename Graph::OutEdgeIt out;
marci@556
   529
      typename Graph::InEdgeIt in;
marci@556
   530
    public:
marci@556
   531
      OutEdgeIt() { }
marci@556
   532
      OutEdgeIt(const Invalid& i) : Edge(i) { }
marci@556
   533
      OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
marci@556
   534
	out_or_in=true; _G.graph->first(out, _n);
marci@556
   535
	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n);	}
marci@556
   536
      } 
marci@556
   537
      operator Edge() const { 
marci@556
   538
	if (out_or_in) return Edge(out); else return Edge(in); 
marci@556
   539
      }
marci@556
   540
    };
marci@556
   541
marci@556
   542
//FIXME InEdgeIt
marci@556
   543
    typedef OutEdgeIt InEdgeIt; 
marci@556
   544
marci@556
   545
    using GraphWrapper<Graph>::first;
marci@556
   546
//     NodeIt& first(NodeIt& i) const { 
marci@556
   547
//       i=NodeIt(*this); return i;
marci@556
   548
//     }
marci@556
   549
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
   550
      i=OutEdgeIt(*this, p); return i;
marci@556
   551
    }
marci@556
   552
//FIXME
marci@556
   553
//     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
   554
//       i=InEdgeIt(*this, p); return i;
marci@556
   555
//     }
marci@556
   556
//     EdgeIt& first(EdgeIt& i) const { 
marci@556
   557
//       i=EdgeIt(*this); return i;
marci@556
   558
//     }
marci@556
   559
marci@556
   560
    using GraphWrapper<Graph>::next;
marci@556
   561
//     NodeIt& next(NodeIt& n) const {
marci@556
   562
//       GraphWrapper<Graph>::next(n);
marci@556
   563
//       return n;
marci@556
   564
//     }
marci@556
   565
    OutEdgeIt& next(OutEdgeIt& e) const {
marci@556
   566
      if (e.out_or_in) {
marci@556
   567
	typename Graph::Node n=this->graph->tail(e.out);
marci@556
   568
	this->graph->next(e.out);
marci@556
   569
	if (!this->graph->valid(e.out)) { 
marci@556
   570
	  e.out_or_in=false; this->graph->first(e.in, n); }
marci@556
   571
      } else {
marci@556
   572
	this->graph->next(e.in);
marci@556
   573
      }
marci@556
   574
      return e;
marci@556
   575
    }
marci@556
   576
    //FIXME InEdgeIt
marci@556
   577
//     EdgeIt& next(EdgeIt& e) const {
marci@556
   578
//       GraphWrapper<Graph>::next(n);
marci@556
   579
// //      graph->next(e.e);
marci@556
   580
//       return e;
marci@556
   581
//     }
marci@556
   582
marci@556
   583
    Node aNode(const OutEdgeIt& e) const { 
marci@556
   584
      if (e.out_or_in) return this->graph->tail(e); else 
marci@556
   585
	return this->graph->head(e); }
marci@556
   586
    Node bNode(const OutEdgeIt& e) const { 
marci@556
   587
      if (e.out_or_in) return this->graph->head(e); else 
marci@556
   588
	return this->graph->tail(e); }
marci@556
   589
  };
marci@556
   590
  
marci@612
   591
  /// \brief An undirected graph template.
marci@612
   592
  ///
marci@612
   593
  /// An undirected graph template.
marci@612
   594
  /// This class works as an undirected graph and a directed graph of 
marci@612
   595
  /// class \c Graph is used for the physical storage.
marci@612
   596
  /// \ingroup graphs
marci@556
   597
  template<typename Graph>
marci@556
   598
  class UndirGraph : public UndirGraphWrapper<Graph> {
marci@556
   599
    typedef UndirGraphWrapper<Graph> Parent;
marci@556
   600
  protected:
marci@556
   601
    Graph gr;
marci@556
   602
  public:
marci@556
   603
    UndirGraph() : UndirGraphWrapper<Graph>() { 
marci@556
   604
      Parent::setGraph(gr); 
marci@556
   605
    }
marci@556
   606
  };
marci@556
   607
marci@569
   608
marci@650
   609
marci@650
   610
  ///\brief A wrapper for composing a subgraph of a 
marci@650
   611
  /// bidirected graph composed from a directed one. 
marci@612
   612
  /// experimental, for fezso's sake.
marci@612
   613
  ///
marci@650
   614
  /// A wrapper for composing a subgraps of a 
marci@650
   615
  /// bidirected graph composed from a directed one. 
marci@576
   616
  /// experimental, for fezso's sake.
marci@612
   617
  /// A bidirected graph is composed over the directed one without physical 
marci@612
   618
  /// storage. As the oppositely directed edges are logically different ones 
marci@612
   619
  /// the maps are able to attach different values for them.
marci@650
   620
  template<typename Graph, 
marci@650
   621
	   typename ForwardFilterMap, typename BackwardFilterMap>
marci@650
   622
  class SubBidirGraphWrapper : public GraphWrapper<Graph> {
marci@650
   623
  public:
marci@650
   624
    typedef GraphWrapper<Graph> Parent; 
marci@569
   625
  protected:
marci@569
   626
    //const CapacityMap* capacity;
marci@569
   627
    //FlowMap* flow;
marci@569
   628
marci@650
   629
    ForwardFilterMap* forward_filter;
marci@650
   630
    BackwardFilterMap* backward_filter;
marci@650
   631
marci@650
   632
    SubBidirGraphWrapper() : GraphWrapper<Graph>()/*, 
marci@569
   633
						 capacity(0), flow(0)*/ { }
marci@650
   634
    void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
marci@650
   635
      forward_filter=&_forward_filter;
marci@650
   636
    }
marci@650
   637
    void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
marci@650
   638
      backward_filter=&_backward_filter;
marci@650
   639
    }
marci@569
   640
marci@569
   641
  public:
marci@569
   642
marci@650
   643
    SubBidirGraphWrapper(Graph& _graph, ForwardFilterMap& _forward_filter, 
marci@650
   644
			 BackwardFilterMap& _backward_filter) : 
marci@650
   645
      GraphWrapper<Graph>(_graph), 
marci@650
   646
      forward_filter(&_forward_filter), backward_filter(&_backward_filter) { }
marci@569
   647
marci@569
   648
    class Edge; 
marci@569
   649
    class OutEdgeIt; 
marci@569
   650
    friend class Edge; 
marci@569
   651
    friend class OutEdgeIt; 
marci@569
   652
marci@621
   653
    //template<typename T> class NodeMap;    
marci@621
   654
    template<typename T> class EdgeMap;
marci@621
   655
marci@569
   656
    typedef typename GraphWrapper<Graph>::Node Node;
marci@569
   657
    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
marci@621
   658
marci@569
   659
    class Edge : public Graph::Edge {
marci@650
   660
      friend class SubBidirGraphWrapper<Graph, 
marci@650
   661
					ForwardFilterMap, BackwardFilterMap>;
marci@621
   662
      ///\bug ez nem is kell
marci@621
   663
      //template<typename T> friend class NodeMap;
marci@621
   664
      template<typename T> friend class EdgeMap;
marci@569
   665
    protected:
marci@569
   666
      bool backward; //true, iff backward
marci@569
   667
//      typename Graph::Edge e;
marci@569
   668
    public:
marci@569
   669
      Edge() { }
marci@626
   670
      ///\bug =false kell-e? zsoltnak kell az addEdge miatt
marci@626
   671
      Edge(const typename Graph::Edge& _e, bool _backward=false) : 
marci@569
   672
	Graph::Edge(_e), backward(_backward) { }
marci@569
   673
      Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
marci@569
   674
//the unique invalid iterator
marci@569
   675
      friend bool operator==(const Edge& u, const Edge& v) { 
marci@569
   676
	return (v.backward==u.backward && 
marci@569
   677
		static_cast<typename Graph::Edge>(u)==
marci@569
   678
		static_cast<typename Graph::Edge>(v));
marci@569
   679
      } 
marci@569
   680
      friend bool operator!=(const Edge& u, const Edge& v) { 
marci@569
   681
	return (v.backward!=u.backward || 
marci@569
   682
		static_cast<typename Graph::Edge>(u)!=
marci@569
   683
		static_cast<typename Graph::Edge>(v));
marci@569
   684
      } 
marci@569
   685
    };
marci@569
   686
marci@569
   687
    class OutEdgeIt {
marci@650
   688
      friend class SubBidirGraphWrapper<Graph, 
marci@650
   689
					ForwardFilterMap, BackwardFilterMap>;
marci@569
   690
    protected:
marci@569
   691
      typename Graph::OutEdgeIt out;
marci@569
   692
      typename Graph::InEdgeIt in;
marci@569
   693
      bool backward;
marci@569
   694
    public:
marci@569
   695
      OutEdgeIt() { }
marci@569
   696
      //FIXME
marci@569
   697
//      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@569
   698
      OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@569
   699
//the unique invalid iterator
marci@650
   700
      OutEdgeIt(const SubBidirGraphWrapper<Graph, 
marci@650
   701
		ForwardFilterMap, BackwardFilterMap>& _G, Node v) { 
marci@569
   702
	backward=false;
marci@569
   703
	_G.graph->first(out, v);
marci@650
   704
	while(_G.graph->valid(out) && !(*_G.forward_filter)[*this]) { _G.graph->next(out); }
marci@569
   705
	if (!_G.graph->valid(out)) {
marci@569
   706
	  backward=true;
marci@569
   707
	  _G.graph->first(in, v);
marci@650
   708
	  while(_G.graph->valid(in) && !(*_G.backward_filter)[*this]) { _G.graph->next(in); }
marci@569
   709
	}
marci@569
   710
      }
marci@569
   711
      operator Edge() const { 
marci@569
   712
//	Edge e;
marci@569
   713
//	e.forward=this->forward;
marci@569
   714
//	if (this->forward) e=out; else e=in;
marci@569
   715
//	return e;
marci@569
   716
	if (this->backward) 
marci@569
   717
	  return Edge(in, this->backward); 
marci@569
   718
	else 
marci@569
   719
	  return Edge(out, this->backward);
marci@569
   720
      }
marci@569
   721
    };
marci@569
   722
marci@569
   723
    class InEdgeIt {
marci@650
   724
      friend class SubBidirGraphWrapper<Graph, 
marci@650
   725
					ForwardFilterMap, BackwardFilterMap>;
marci@569
   726
    protected:
marci@569
   727
      typename Graph::OutEdgeIt out;
marci@569
   728
      typename Graph::InEdgeIt in;
marci@569
   729
      bool backward;
marci@569
   730
    public:
marci@569
   731
      InEdgeIt() { }
marci@569
   732
      //FIXME
marci@569
   733
//      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@569
   734
      InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@569
   735
//the unique invalid iterator
marci@650
   736
      InEdgeIt(const SubBidirGraphWrapper<Graph, 
marci@650
   737
	       ForwardFilterMap, BackwardFilterMap>& _G, Node v) { 
marci@569
   738
	backward=false;
marci@569
   739
	_G.graph->first(in, v);
marci@650
   740
	while(_G.graph->valid(in) && !(*_G.forward_filter)[*this]) { _G.graph->next(in); }
marci@569
   741
	if (!_G.graph->valid(in)) {
marci@569
   742
	  backward=true;
marci@569
   743
	  _G.graph->first(out, v);
marci@650
   744
	  while(_G.graph->valid(out) && !(*_G.backward_filter)[*this]) { _G.graph->next(out); }
marci@569
   745
	}
marci@569
   746
      }
marci@569
   747
      operator Edge() const { 
marci@569
   748
//	Edge e;
marci@569
   749
//	e.forward=this->forward;
marci@569
   750
//	if (this->forward) e=out; else e=in;
marci@569
   751
//	return e;
marci@569
   752
	if (this->backward) 
marci@569
   753
	  return Edge(out, this->backward); 
marci@569
   754
	else 
marci@569
   755
	  return Edge(in, this->backward);
marci@569
   756
      }
marci@569
   757
    };
marci@569
   758
marci@569
   759
    class EdgeIt {
marci@650
   760
      friend class SubBidirGraphWrapper<Graph, 
marci@650
   761
					ForwardFilterMap, BackwardFilterMap>;
marci@569
   762
    protected:
marci@569
   763
      typename Graph::EdgeIt e;
marci@569
   764
      bool backward;
marci@569
   765
    public:
marci@569
   766
      EdgeIt() { }
marci@569
   767
      EdgeIt(const Invalid& i) : e(i), backward(true) { }
marci@650
   768
      EdgeIt(const SubBidirGraphWrapper<Graph, 
marci@650
   769
	     ForwardFilterMap, BackwardFilterMap>& _G) { 
marci@569
   770
	backward=false;
marci@569
   771
	_G.graph->first(e);
marci@650
   772
	while (_G.graph->valid(e) && !(*_G.forward_filter)[*this]) _G.graph->next(e);
marci@569
   773
	if (!_G.graph->valid(e)) {
marci@569
   774
	  backward=true;
marci@569
   775
	  _G.graph->first(e);
marci@650
   776
	  while (_G.graph->valid(e) && !(*_G.backward_filter)[*this]) _G.graph->next(e);
marci@569
   777
	}
marci@569
   778
      }
marci@569
   779
      operator Edge() const { 
marci@569
   780
	return Edge(e, this->backward);
marci@569
   781
      }
marci@569
   782
    };
marci@569
   783
marci@569
   784
    using GraphWrapper<Graph>::first;
marci@569
   785
//     NodeIt& first(NodeIt& i) const { 
marci@569
   786
//       i=NodeIt(*this); return i;
marci@569
   787
//     }
marci@569
   788
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@569
   789
      i=OutEdgeIt(*this, p); return i;
marci@569
   790
    }
marci@569
   791
//    FIXME not tested
marci@569
   792
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@569
   793
      i=InEdgeIt(*this, p); return i;
marci@569
   794
    }
marci@569
   795
    EdgeIt& first(EdgeIt& i) const { 
marci@569
   796
      i=EdgeIt(*this); return i;
marci@569
   797
    }
marci@556
   798
  
marci@569
   799
    using GraphWrapper<Graph>::next;
marci@569
   800
//    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
marci@569
   801
    OutEdgeIt& next(OutEdgeIt& e) const { 
marci@569
   802
      if (!e.backward) {
marci@569
   803
	Node v=this->graph->aNode(e.out);
marci@569
   804
	this->graph->next(e.out);
marci@650
   805
	while(this->graph->valid(e.out) && !(*forward_filter)[e]) { 
marci@569
   806
	  this->graph->next(e.out); }
marci@569
   807
	if (!this->graph->valid(e.out)) {
marci@569
   808
	  e.backward=true;
marci@569
   809
	  this->graph->first(e.in, v); 
marci@650
   810
	  while(this->graph->valid(e.in) && !(*backward_filter)[e]) { 
marci@569
   811
	    this->graph->next(e.in); }
marci@569
   812
	}
marci@569
   813
      } else {
marci@569
   814
	this->graph->next(e.in);
marci@650
   815
	while(this->graph->valid(e.in) && !(*backward_filter)[e]) { 
marci@569
   816
	  this->graph->next(e.in); } 
marci@569
   817
      }
marci@569
   818
      return e;
marci@569
   819
    }
marci@569
   820
//     FIXME Not tested
marci@569
   821
    InEdgeIt& next(InEdgeIt& e) const { 
marci@569
   822
      if (!e.backward) {
marci@569
   823
	Node v=this->graph->aNode(e.in);
marci@569
   824
	this->graph->next(e.in);
marci@650
   825
	while(this->graph->valid(e.in) && !(*forward_filter)[e]) { 
marci@569
   826
	  this->graph->next(e.in); }
marci@569
   827
	if (!this->graph->valid(e.in)) {
marci@569
   828
	  e.backward=true;
marci@569
   829
	  this->graph->first(e.out, v); 
marci@650
   830
	  while(this->graph->valid(e.out) && !(*backward_filter)[e]) { 
marci@569
   831
	    this->graph->next(e.out); }
marci@569
   832
	}
marci@569
   833
      } else {
marci@569
   834
	this->graph->next(e.out);
marci@650
   835
	while(this->graph->valid(e.out) && !(*backward_filter)[e]) { 
marci@569
   836
	  this->graph->next(e.out); } 
marci@569
   837
      }
marci@569
   838
      return e;
marci@569
   839
    }
marci@569
   840
    EdgeIt& next(EdgeIt& e) const {
marci@569
   841
      if (!e.backward) {
marci@569
   842
	this->graph->next(e.e);
marci@650
   843
	while(this->graph->valid(e.e) && !(*forward_filter)[e]) { 
marci@569
   844
	  this->graph->next(e.e); }
marci@569
   845
	if (!this->graph->valid(e.e)) {
marci@569
   846
	  e.backward=true;
marci@569
   847
	  this->graph->first(e.e); 
marci@650
   848
	  while(this->graph->valid(e.e) && !(*backward_filter)[e]) { 
marci@569
   849
	    this->graph->next(e.e); }
marci@569
   850
	}
marci@569
   851
      } else {
marci@569
   852
	this->graph->next(e.e);
marci@650
   853
	while(this->graph->valid(e.e) && !(*backward_filter)[e]) { 
marci@569
   854
	  this->graph->next(e.e); } 
marci@569
   855
      }
marci@569
   856
      return e;
marci@569
   857
    }
marci@569
   858
marci@569
   859
    Node tail(Edge e) const { 
marci@569
   860
      return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
marci@569
   861
    Node head(Edge e) const { 
marci@569
   862
      return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
marci@569
   863
marci@569
   864
    Node aNode(OutEdgeIt e) const { 
marci@569
   865
      return ((!e.backward) ? this->graph->aNode(e.out) : 
marci@569
   866
	      this->graph->aNode(e.in)); }
marci@569
   867
    Node bNode(OutEdgeIt e) const { 
marci@569
   868
      return ((!e.backward) ? this->graph->bNode(e.out) : 
marci@569
   869
	      this->graph->bNode(e.in)); }
marci@569
   870
marci@569
   871
    Node aNode(InEdgeIt e) const { 
marci@569
   872
      return ((!e.backward) ? this->graph->aNode(e.in) : 
marci@569
   873
	      this->graph->aNode(e.out)); }
marci@569
   874
    Node bNode(InEdgeIt e) const { 
marci@569
   875
      return ((!e.backward) ? this->graph->bNode(e.in) : 
marci@569
   876
	      this->graph->bNode(e.out)); }
marci@569
   877
marci@572
   878
    /// Gives back the opposite edge.
marci@572
   879
    Edge opposite(const Edge& e) const { 
marci@572
   880
      Edge f=e;
marci@572
   881
      f.backward=!f.backward;
marci@572
   882
      return f;
marci@572
   883
    }
marci@572
   884
marci@569
   885
//    int nodeNum() const { return graph->nodeNum(); }
marci@569
   886
    //FIXME
marci@569
   887
    void edgeNum() const { }
marci@569
   888
    //int edgeNum() const { return graph->edgeNum(); }
marci@569
   889
marci@569
   890
marci@569
   891
//    int id(Node v) const { return graph->id(v); }
marci@569
   892
marci@569
   893
    bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
marci@569
   894
    bool valid(Edge e) const { 
marci@569
   895
      return this->graph->valid(e);
marci@569
   896
	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
marci@569
   897
    }
marci@569
   898
marci@569
   899
    bool forward(const Edge& e) const { return !e.backward; }
marci@569
   900
    bool backward(const Edge& e) const { return e.backward; }
marci@569
   901
marci@569
   902
//     void augment(const Edge& e, Number a) const {
marci@569
   903
//       if (!e.backward)  
marci@569
   904
// // 	flow->set(e.out, flow->get(e.out)+a);
marci@569
   905
// 	flow->set(e, (*flow)[e]+a);
marci@569
   906
//       else  
marci@569
   907
// // 	flow->set(e.in, flow->get(e.in)-a);
marci@569
   908
// 	flow->set(e, (*flow)[e]-a);
marci@569
   909
//     }
marci@569
   910
marci@650
   911
//     bool enabled(const Edge& e) const { 
marci@650
   912
//       if (!e.backward) 
marci@650
   913
// //	return (capacity->get(e.out)-flow->get(e.out)); 
marci@650
   914
// 	//return ((*capacity)[e]-(*flow)[e]);
marci@650
   915
// 	return true;
marci@650
   916
//       else 
marci@650
   917
// //	return (flow->get(e.in)); 
marci@650
   918
// 	//return ((*flow)[e]); 
marci@650
   919
// 	return true;
marci@650
   920
//     }
marci@569
   921
marci@569
   922
//     Number enabled(typename Graph::OutEdgeIt out) const { 
marci@569
   923
// //      return (capacity->get(out)-flow->get(out)); 
marci@569
   924
//       return ((*capacity)[out]-(*flow)[out]); 
marci@569
   925
//     }
marci@569
   926
    
marci@569
   927
//     Number enabled(typename Graph::InEdgeIt in) const { 
marci@569
   928
// //      return (flow->get(in)); 
marci@569
   929
//       return ((*flow)[in]); 
marci@569
   930
//     }
marci@569
   931
marci@569
   932
    template <typename T>
marci@569
   933
    class EdgeMap {
marci@569
   934
      typename Graph::template EdgeMap<T> forward_map, backward_map; 
marci@569
   935
    public:
marci@623
   936
      typedef T ValueType;
marci@623
   937
      typedef Edge KeyType;
marci@650
   938
      EdgeMap(const SubBidirGraphWrapper<Graph, 
marci@650
   939
	      ForwardFilterMap, BackwardFilterMap>& _G) : 
marci@650
   940
	forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
marci@650
   941
      EdgeMap(const SubBidirGraphWrapper<Graph, 
marci@650
   942
	      ForwardFilterMap, BackwardFilterMap>& _G, T a) : 
marci@650
   943
	forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
marci@569
   944
      void set(Edge e, T a) { 
marci@569
   945
	if (!e.backward) 
marci@622
   946
	  forward_map.set(e/*.out*/, a); 
marci@569
   947
	else 
marci@622
   948
	  backward_map.set(e/*.in*/, a); 
marci@569
   949
      }
marci@569
   950
      T operator[](Edge e) const { 
marci@569
   951
	if (!e.backward) 
marci@622
   952
	  return forward_map[e/*.out*/]; 
marci@569
   953
	else 
marci@622
   954
	  return backward_map[e/*.in*/]; 
marci@569
   955
      }
marci@625
   956
      void update() { 
marci@625
   957
	forward_map.update(); 
marci@625
   958
	backward_map.update();
marci@625
   959
      }
marci@569
   960
//       T get(Edge e) const { 
marci@569
   961
// 	if (e.out_or_in) 
marci@569
   962
// 	  return forward_map.get(e.out); 
marci@569
   963
// 	else 
marci@569
   964
// 	  return backward_map.get(e.in); 
marci@569
   965
//       }
marci@569
   966
    };
marci@569
   967
  };
marci@569
   968
marci@650
   969
marci@650
   970
marci@650
   971
  ///\brief A wrapper for composing bidirected graph from a directed one. 
marci@650
   972
  /// experimental, for fezso's sake.
marci@650
   973
  ///
marci@650
   974
  /// A wrapper for composing bidirected graph from a directed one. 
marci@650
   975
  /// experimental, for fezso's sake.
marci@650
   976
  /// A bidirected graph is composed over the directed one without physical 
marci@650
   977
  /// storage. As the oppositely directed edges are logically different ones 
marci@650
   978
  /// the maps are able to attach different values for them.
marci@650
   979
  template<typename Graph>
marci@650
   980
  class BidirGraphWrapper : 
marci@650
   981
    public SubBidirGraphWrapper<
marci@650
   982
    Graph, 
marci@650
   983
    ConstMap<typename Graph::Edge, bool>, 
marci@650
   984
    ConstMap<typename Graph::Edge, bool> > {
marci@650
   985
  public:
marci@650
   986
    typedef  SubBidirGraphWrapper<
marci@650
   987
      Graph, 
marci@650
   988
      ConstMap<typename Graph::Edge, bool>, 
marci@650
   989
      ConstMap<typename Graph::Edge, bool> > Parent; 
marci@650
   990
  protected:
marci@650
   991
    ConstMap<typename Graph::Edge, bool> cm;
marci@650
   992
    //const CapacityMap* capacity;
marci@650
   993
    //FlowMap* flow;
marci@650
   994
marci@650
   995
    BidirGraphWrapper() : Parent(), cm(true) { }
marci@650
   996
//     void setCapacityMap(const CapacityMap& _capacity) {
marci@650
   997
//       capacity=&_capacity;
marci@650
   998
//     }
marci@650
   999
//     void setFlowMap(FlowMap& _flow) {
marci@650
  1000
//       flow=&_flow;
marci@650
  1001
//     }
marci@650
  1002
marci@650
  1003
  public:
marci@650
  1004
marci@650
  1005
    BidirGraphWrapper(Graph& _graph) : Parent() { 
marci@650
  1006
      Parent::setGraph(_graph);
marci@650
  1007
      Parent::setForwardFilterMap(cm);
marci@650
  1008
      Parent::setBackwardFilterMap(cm);
marci@650
  1009
    }
marci@650
  1010
  };
marci@650
  1011
marci@650
  1012
marci@650
  1013
marci@650
  1014
marci@650
  1015
//   ///\brief A wrapper for composing bidirected graph from a directed one. 
marci@650
  1016
//   /// experimental, for fezso's sake.
marci@650
  1017
//   ///
marci@650
  1018
//   /// A wrapper for composing bidirected graph from a directed one. 
marci@650
  1019
//   /// experimental, for fezso's sake.
marci@650
  1020
//   /// A bidirected graph is composed over the directed one without physical 
marci@650
  1021
//   /// storage. As the oppositely directed edges are logically different ones 
marci@650
  1022
//   /// the maps are able to attach different values for them.
marci@650
  1023
//   template<typename Graph>
marci@650
  1024
//   class BidirGraphWrapper : public GraphWrapper<Graph> {
marci@650
  1025
//   public:
marci@650
  1026
//     typedef GraphWrapper<Graph> Parent; 
marci@650
  1027
//   protected:
marci@650
  1028
//     //const CapacityMap* capacity;
marci@650
  1029
//     //FlowMap* flow;
marci@650
  1030
marci@650
  1031
//     BidirGraphWrapper() : GraphWrapper<Graph>()/*, 
marci@650
  1032
// 						 capacity(0), flow(0)*/ { }
marci@650
  1033
// //     void setCapacityMap(const CapacityMap& _capacity) {
marci@650
  1034
// //       capacity=&_capacity;
marci@650
  1035
// //     }
marci@650
  1036
// //     void setFlowMap(FlowMap& _flow) {
marci@650
  1037
// //       flow=&_flow;
marci@650
  1038
// //     }
marci@650
  1039
marci@650
  1040
//   public:
marci@650
  1041
marci@650
  1042
//     BidirGraphWrapper(Graph& _graph/*, const CapacityMap& _capacity, 
marci@650
  1043
// 				     FlowMap& _flow*/) : 
marci@650
  1044
//       GraphWrapper<Graph>(_graph)/*, capacity(&_capacity), flow(&_flow)*/ { }
marci@650
  1045
marci@650
  1046
//     class Edge; 
marci@650
  1047
//     class OutEdgeIt; 
marci@650
  1048
//     friend class Edge; 
marci@650
  1049
//     friend class OutEdgeIt; 
marci@650
  1050
marci@650
  1051
//     //template<typename T> class NodeMap;    
marci@650
  1052
//     template<typename T> class EdgeMap;
marci@650
  1053
marci@650
  1054
//     typedef typename GraphWrapper<Graph>::Node Node;
marci@650
  1055
//     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
marci@650
  1056
marci@650
  1057
//     class Edge : public Graph::Edge {
marci@650
  1058
//       friend class BidirGraphWrapper<Graph>;
marci@650
  1059
//       ///\bug ez nem is kell
marci@650
  1060
//       //template<typename T> friend class NodeMap;
marci@650
  1061
//       template<typename T> friend class EdgeMap;
marci@650
  1062
//     protected:
marci@650
  1063
//       bool backward; //true, iff backward
marci@650
  1064
// //      typename Graph::Edge e;
marci@650
  1065
//     public:
marci@650
  1066
//       Edge() { }
marci@650
  1067
//       ///\bug =false kell-e? zsoltnak kell az addEdge miatt
marci@650
  1068
//       Edge(const typename Graph::Edge& _e, bool _backward=false) : 
marci@650
  1069
// 	Graph::Edge(_e), backward(_backward) { }
marci@650
  1070
//       Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
marci@650
  1071
// //the unique invalid iterator
marci@650
  1072
//       friend bool operator==(const Edge& u, const Edge& v) { 
marci@650
  1073
// 	return (v.backward==u.backward && 
marci@650
  1074
// 		static_cast<typename Graph::Edge>(u)==
marci@650
  1075
// 		static_cast<typename Graph::Edge>(v));
marci@650
  1076
//       } 
marci@650
  1077
//       friend bool operator!=(const Edge& u, const Edge& v) { 
marci@650
  1078
// 	return (v.backward!=u.backward || 
marci@650
  1079
// 		static_cast<typename Graph::Edge>(u)!=
marci@650
  1080
// 		static_cast<typename Graph::Edge>(v));
marci@650
  1081
//       } 
marci@650
  1082
//     };
marci@650
  1083
marci@650
  1084
//     class OutEdgeIt {
marci@650
  1085
//       friend class BidirGraphWrapper<Graph>;
marci@650
  1086
//     protected:
marci@650
  1087
//       typename Graph::OutEdgeIt out;
marci@650
  1088
//       typename Graph::InEdgeIt in;
marci@650
  1089
//       bool backward;
marci@650
  1090
//     public:
marci@650
  1091
//       OutEdgeIt() { }
marci@650
  1092
//       //FIXME
marci@650
  1093
// //      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@650
  1094
//       OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@650
  1095
// //the unique invalid iterator
marci@650
  1096
//       OutEdgeIt(const BidirGraphWrapper<Graph>& _G, Node v) { 
marci@650
  1097
// 	backward=false;
marci@650
  1098
// 	_G.graph->first(out, v);
marci@650
  1099
// 	while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
marci@650
  1100
// 	if (!_G.graph->valid(out)) {
marci@650
  1101
// 	  backward=true;
marci@650
  1102
// 	  _G.graph->first(in, v);
marci@650
  1103
// 	  while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
marci@650
  1104
// 	}
marci@650
  1105
//       }
marci@650
  1106
//       operator Edge() const { 
marci@650
  1107
// //	Edge e;
marci@650
  1108
// //	e.forward=this->forward;
marci@650
  1109
// //	if (this->forward) e=out; else e=in;
marci@650
  1110
// //	return e;
marci@650
  1111
// 	if (this->backward) 
marci@650
  1112
// 	  return Edge(in, this->backward); 
marci@650
  1113
// 	else 
marci@650
  1114
// 	  return Edge(out, this->backward);
marci@650
  1115
//       }
marci@650
  1116
//     };
marci@650
  1117
marci@650
  1118
//     class InEdgeIt {
marci@650
  1119
//       friend class BidirGraphWrapper<Graph>;
marci@650
  1120
//     protected:
marci@650
  1121
//       typename Graph::OutEdgeIt out;
marci@650
  1122
//       typename Graph::InEdgeIt in;
marci@650
  1123
//       bool backward;
marci@650
  1124
//     public:
marci@650
  1125
//       InEdgeIt() { }
marci@650
  1126
//       //FIXME
marci@650
  1127
// //      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@650
  1128
//       InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@650
  1129
// //the unique invalid iterator
marci@650
  1130
//       InEdgeIt(const BidirGraphWrapper<Graph>& _G, Node v) { 
marci@650
  1131
// 	backward=false;
marci@650
  1132
// 	_G.graph->first(in, v);
marci@650
  1133
// 	while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
marci@650
  1134
// 	if (!_G.graph->valid(in)) {
marci@650
  1135
// 	  backward=true;
marci@650
  1136
// 	  _G.graph->first(out, v);
marci@650
  1137
// 	  while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
marci@650
  1138
// 	}
marci@650
  1139
//       }
marci@650
  1140
//       operator Edge() const { 
marci@650
  1141
// //	Edge e;
marci@650
  1142
// //	e.forward=this->forward;
marci@650
  1143
// //	if (this->forward) e=out; else e=in;
marci@650
  1144
// //	return e;
marci@650
  1145
// 	if (this->backward) 
marci@650
  1146
// 	  return Edge(out, this->backward); 
marci@650
  1147
// 	else 
marci@650
  1148
// 	  return Edge(in, this->backward);
marci@650
  1149
//       }
marci@650
  1150
//     };
marci@650
  1151
marci@650
  1152
//     class EdgeIt {
marci@650
  1153
//       friend class BidirGraphWrapper<Graph>;
marci@650
  1154
//     protected:
marci@650
  1155
//       typename Graph::EdgeIt e;
marci@650
  1156
//       bool backward;
marci@650
  1157
//     public:
marci@650
  1158
//       EdgeIt() { }
marci@650
  1159
//       EdgeIt(const Invalid& i) : e(i), backward(true) { }
marci@650
  1160
//       EdgeIt(const BidirGraphWrapper<Graph>& _G) { 
marci@650
  1161
// 	backward=false;
marci@650
  1162
// 	_G.graph->first(e);
marci@650
  1163
// 	while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
marci@650
  1164
// 	if (!_G.graph->valid(e)) {
marci@650
  1165
// 	  backward=true;
marci@650
  1166
// 	  _G.graph->first(e);
marci@650
  1167
// 	  while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
marci@650
  1168
// 	}
marci@650
  1169
//       }
marci@650
  1170
//       operator Edge() const { 
marci@650
  1171
// 	return Edge(e, this->backward);
marci@650
  1172
//       }
marci@650
  1173
//     };
marci@650
  1174
marci@650
  1175
//     using GraphWrapper<Graph>::first;
marci@650
  1176
// //     NodeIt& first(NodeIt& i) const { 
marci@650
  1177
// //       i=NodeIt(*this); return i;
marci@650
  1178
// //     }
marci@650
  1179
//     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@650
  1180
//       i=OutEdgeIt(*this, p); return i;
marci@650
  1181
//     }
marci@650
  1182
// //    FIXME not tested
marci@650
  1183
//     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@650
  1184
//       i=InEdgeIt(*this, p); return i;
marci@650
  1185
//     }
marci@650
  1186
//     EdgeIt& first(EdgeIt& i) const { 
marci@650
  1187
//       i=EdgeIt(*this); return i;
marci@650
  1188
//     }
marci@650
  1189
  
marci@650
  1190
//     using GraphWrapper<Graph>::next;
marci@650
  1191
// //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
marci@650
  1192
//     OutEdgeIt& next(OutEdgeIt& e) const { 
marci@650
  1193
//       if (!e.backward) {
marci@650
  1194
// 	Node v=this->graph->aNode(e.out);
marci@650
  1195
// 	this->graph->next(e.out);
marci@650
  1196
// 	while(this->graph->valid(e.out) && !enabled(e)) { 
marci@650
  1197
// 	  this->graph->next(e.out); }
marci@650
  1198
// 	if (!this->graph->valid(e.out)) {
marci@650
  1199
// 	  e.backward=true;
marci@650
  1200
// 	  this->graph->first(e.in, v); 
marci@650
  1201
// 	  while(this->graph->valid(e.in) && !enabled(e)) { 
marci@650
  1202
// 	    this->graph->next(e.in); }
marci@650
  1203
// 	}
marci@650
  1204
//       } else {
marci@650
  1205
// 	this->graph->next(e.in);
marci@650
  1206
// 	while(this->graph->valid(e.in) && !enabled(e)) { 
marci@650
  1207
// 	  this->graph->next(e.in); } 
marci@650
  1208
//       }
marci@650
  1209
//       return e;
marci@650
  1210
//     }
marci@650
  1211
// //     FIXME Not tested
marci@650
  1212
//     InEdgeIt& next(InEdgeIt& e) const { 
marci@650
  1213
//       if (!e.backward) {
marci@650
  1214
// 	Node v=this->graph->aNode(e.in);
marci@650
  1215
// 	this->graph->next(e.in);
marci@650
  1216
// 	while(this->graph->valid(e.in) && !enabled(e)) { 
marci@650
  1217
// 	  this->graph->next(e.in); }
marci@650
  1218
// 	if (!this->graph->valid(e.in)) {
marci@650
  1219
// 	  e.backward=true;
marci@650
  1220
// 	  this->graph->first(e.out, v); 
marci@650
  1221
// 	  while(this->graph->valid(e.out) && !enabled(e)) { 
marci@650
  1222
// 	    this->graph->next(e.out); }
marci@650
  1223
// 	}
marci@650
  1224
//       } else {
marci@650
  1225
// 	this->graph->next(e.out);
marci@650
  1226
// 	while(this->graph->valid(e.out) && !enabled(e)) { 
marci@650
  1227
// 	  this->graph->next(e.out); } 
marci@650
  1228
//       }
marci@650
  1229
//       return e;
marci@650
  1230
//     }
marci@650
  1231
//     EdgeIt& next(EdgeIt& e) const {
marci@650
  1232
//       if (!e.backward) {
marci@650
  1233
// 	this->graph->next(e.e);
marci@650
  1234
// 	while(this->graph->valid(e.e) && !enabled(e)) { 
marci@650
  1235
// 	  this->graph->next(e.e); }
marci@650
  1236
// 	if (!this->graph->valid(e.e)) {
marci@650
  1237
// 	  e.backward=true;
marci@650
  1238
// 	  this->graph->first(e.e); 
marci@650
  1239
// 	  while(this->graph->valid(e.e) && !enabled(e)) { 
marci@650
  1240
// 	    this->graph->next(e.e); }
marci@650
  1241
// 	}
marci@650
  1242
//       } else {
marci@650
  1243
// 	this->graph->next(e.e);
marci@650
  1244
// 	while(this->graph->valid(e.e) && !enabled(e)) { 
marci@650
  1245
// 	  this->graph->next(e.e); } 
marci@650
  1246
//       }
marci@650
  1247
//       return e;
marci@650
  1248
//     }
marci@650
  1249
marci@650
  1250
//     Node tail(Edge e) const { 
marci@650
  1251
//       return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
marci@650
  1252
//     Node head(Edge e) const { 
marci@650
  1253
//       return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
marci@650
  1254
marci@650
  1255
//     Node aNode(OutEdgeIt e) const { 
marci@650
  1256
//       return ((!e.backward) ? this->graph->aNode(e.out) : 
marci@650
  1257
// 	      this->graph->aNode(e.in)); }
marci@650
  1258
//     Node bNode(OutEdgeIt e) const { 
marci@650
  1259
//       return ((!e.backward) ? this->graph->bNode(e.out) : 
marci@650
  1260
// 	      this->graph->bNode(e.in)); }
marci@650
  1261
marci@650
  1262
//     Node aNode(InEdgeIt e) const { 
marci@650
  1263
//       return ((!e.backward) ? this->graph->aNode(e.in) : 
marci@650
  1264
// 	      this->graph->aNode(e.out)); }
marci@650
  1265
//     Node bNode(InEdgeIt e) const { 
marci@650
  1266
//       return ((!e.backward) ? this->graph->bNode(e.in) : 
marci@650
  1267
// 	      this->graph->bNode(e.out)); }
marci@650
  1268
marci@650
  1269
//     /// Gives back the opposite edge.
marci@650
  1270
//     Edge opposite(const Edge& e) const { 
marci@650
  1271
//       Edge f=e;
marci@650
  1272
//       f.backward=!f.backward;
marci@650
  1273
//       return f;
marci@650
  1274
//     }
marci@650
  1275
marci@650
  1276
// //    int nodeNum() const { return graph->nodeNum(); }
marci@650
  1277
//     //FIXME
marci@650
  1278
//     void edgeNum() const { }
marci@650
  1279
//     //int edgeNum() const { return graph->edgeNum(); }
marci@650
  1280
marci@650
  1281
marci@650
  1282
// //    int id(Node v) const { return graph->id(v); }
marci@650
  1283
marci@650
  1284
//     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
marci@650
  1285
//     bool valid(Edge e) const { 
marci@650
  1286
//       return this->graph->valid(e);
marci@650
  1287
// 	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
marci@650
  1288
//     }
marci@650
  1289
marci@650
  1290
//     bool forward(const Edge& e) const { return !e.backward; }
marci@650
  1291
//     bool backward(const Edge& e) const { return e.backward; }
marci@650
  1292
marci@650
  1293
// //     void augment(const Edge& e, Number a) const {
marci@650
  1294
// //       if (!e.backward)  
marci@650
  1295
// // // 	flow->set(e.out, flow->get(e.out)+a);
marci@650
  1296
// // 	flow->set(e, (*flow)[e]+a);
marci@650
  1297
// //       else  
marci@650
  1298
// // // 	flow->set(e.in, flow->get(e.in)-a);
marci@650
  1299
// // 	flow->set(e, (*flow)[e]-a);
marci@650
  1300
// //     }
marci@650
  1301
marci@650
  1302
//     bool enabled(const Edge& e) const { 
marci@650
  1303
//       if (!e.backward) 
marci@650
  1304
// //	return (capacity->get(e.out)-flow->get(e.out)); 
marci@650
  1305
// 	//return ((*capacity)[e]-(*flow)[e]);
marci@650
  1306
// 	return true;
marci@650
  1307
//       else 
marci@650
  1308
// //	return (flow->get(e.in)); 
marci@650
  1309
// 	//return ((*flow)[e]); 
marci@650
  1310
// 	return true;
marci@650
  1311
//     }
marci@650
  1312
marci@650
  1313
// //     Number enabled(typename Graph::OutEdgeIt out) const { 
marci@650
  1314
// // //      return (capacity->get(out)-flow->get(out)); 
marci@650
  1315
// //       return ((*capacity)[out]-(*flow)[out]); 
marci@650
  1316
// //     }
marci@650
  1317
    
marci@650
  1318
// //     Number enabled(typename Graph::InEdgeIt in) const { 
marci@650
  1319
// // //      return (flow->get(in)); 
marci@650
  1320
// //       return ((*flow)[in]); 
marci@650
  1321
// //     }
marci@650
  1322
marci@650
  1323
//     template <typename T>
marci@650
  1324
//     class EdgeMap {
marci@650
  1325
//       typename Graph::template EdgeMap<T> forward_map, backward_map; 
marci@650
  1326
//     public:
marci@650
  1327
//       typedef T ValueType;
marci@650
  1328
//       typedef Edge KeyType;
marci@650
  1329
//       EdgeMap(const BidirGraphWrapper<Graph>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
marci@650
  1330
//       EdgeMap(const BidirGraphWrapper<Graph>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
marci@650
  1331
//       void set(Edge e, T a) { 
marci@650
  1332
// 	if (!e.backward) 
marci@650
  1333
// 	  forward_map.set(e/*.out*/, a); 
marci@650
  1334
// 	else 
marci@650
  1335
// 	  backward_map.set(e/*.in*/, a); 
marci@650
  1336
//       }
marci@650
  1337
//       T operator[](Edge e) const { 
marci@650
  1338
// 	if (!e.backward) 
marci@650
  1339
// 	  return forward_map[e/*.out*/]; 
marci@650
  1340
// 	else 
marci@650
  1341
// 	  return backward_map[e/*.in*/]; 
marci@650
  1342
//       }
marci@650
  1343
//       void update() { 
marci@650
  1344
// 	forward_map.update(); 
marci@650
  1345
// 	backward_map.update();
marci@650
  1346
//       }
marci@650
  1347
// //       T get(Edge e) const { 
marci@650
  1348
// // 	if (e.out_or_in) 
marci@650
  1349
// // 	  return forward_map.get(e.out); 
marci@650
  1350
// // 	else 
marci@650
  1351
// // 	  return backward_map.get(e.in); 
marci@650
  1352
// //       }
marci@650
  1353
//     };
marci@650
  1354
//   };
marci@650
  1355
marci@612
  1356
  /// \brief A bidirected graph template.
marci@612
  1357
  ///
marci@612
  1358
  /// A bidirected graph template.
marci@612
  1359
  /// Such a bidirected graph stores each pair of oppositely directed edges 
marci@612
  1360
  /// ones in the memory, i.e. a directed graph of type 
marci@612
  1361
  /// \c Graph is used for that.
marci@612
  1362
  /// As the oppositely directed edges are logically different ones 
marci@612
  1363
  /// the maps are able to attach different values for them.
marci@612
  1364
  /// \ingroup graphs
marci@612
  1365
  template<typename Graph>
marci@612
  1366
  class BidirGraph : public BidirGraphWrapper<Graph> {
marci@650
  1367
  public:
marci@612
  1368
    typedef UndirGraphWrapper<Graph> Parent;
marci@612
  1369
  protected:
marci@612
  1370
    Graph gr;
marci@612
  1371
  public:
marci@612
  1372
    BidirGraph() : BidirGraphWrapper<Graph>() { 
marci@612
  1373
      Parent::setGraph(gr); 
marci@612
  1374
    }
marci@612
  1375
  };
marci@569
  1376
marci@556
  1377
marci@650
  1378
marci@650
  1379
  /// An experiment for ResGraphWrapper.
marci@650
  1380
  template<typename Graph, typename Number,
marci@650
  1381
	   typename CapacityMap, typename FlowMap>
marci@650
  1382
  class ForwardFilter {
marci@650
  1383
    const Graph* graph;
marci@650
  1384
    const CapacityMap* capacity;
marci@650
  1385
    const FlowMap* flow;
marci@650
  1386
  public:
marci@650
  1387
    ForwardFilter(const Graph& _graph, 
marci@650
  1388
		  const CapacityMap& _capacity, const FlowMap& _flow) :
marci@650
  1389
      graph(&_graph), capacity(&_capacity), flow(&_flow) { }
marci@650
  1390
    bool operator[](const typename Graph::Edge& e) const {
marci@650
  1391
      return ((*flow)[e] < (*capacity)[e]);
marci@650
  1392
    }
marci@650
  1393
  };
marci@650
  1394
marci@650
  1395
  /// An experiment for ResGraphWrapper.
marci@650
  1396
  template<typename Graph, typename Number,
marci@650
  1397
	   typename CapacityMap, typename FlowMap>
marci@650
  1398
  class BackwardFilter {
marci@650
  1399
    const Graph* graph;
marci@650
  1400
    const CapacityMap* capacity;
marci@650
  1401
    const FlowMap* flow;
marci@650
  1402
  public:
marci@650
  1403
    BackwardFilter(const Graph& _graph, 
marci@650
  1404
		   const CapacityMap& _capacity, const FlowMap& _flow) :
marci@650
  1405
      graph(&_graph), capacity(&_capacity), flow(&_flow) { }
marci@650
  1406
    bool operator[](const typename Graph::Edge& e) const {
marci@650
  1407
      return (0 < (*flow)[e]);
marci@650
  1408
    }
marci@650
  1409
  };
marci@650
  1410
marci@650
  1411
marci@650
  1412
  /// An experiment for ResGraphWrapper.
marci@650
  1413
  template<typename Graph, typename Number, 
marci@650
  1414
	   typename CapacityMap, typename FlowMap>
marci@650
  1415
  class ExpResGraphWrapper : 
marci@650
  1416
    public SubBidirGraphWrapper< 
marci@650
  1417
    Graph, 
marci@650
  1418
    ForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
marci@650
  1419
    BackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
marci@650
  1420
  public:
marci@650
  1421
    typedef SubBidirGraphWrapper< 
marci@650
  1422
      Graph, 
marci@650
  1423
      ForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
marci@650
  1424
      BackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
marci@650
  1425
  protected:
marci@650
  1426
    const CapacityMap* capacity;
marci@650
  1427
    FlowMap* flow;
marci@650
  1428
    ForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
marci@650
  1429
    BackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
marci@650
  1430
  public:
marci@650
  1431
    ExpResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
marci@650
  1432
		       FlowMap& _flow) : 
marci@650
  1433
      Parent(), capacity(&_capacity), flow(&_flow), 
marci@650
  1434
      forward_filter(_graph, _capacity, _flow), 
marci@650
  1435
      backward_filter(_graph, _capacity, _flow) {
marci@650
  1436
      Parent::setGraph(_graph);
marci@650
  1437
      Parent::setForwardFilterMap(forward_filter);
marci@650
  1438
      Parent::setBackwardFilterMap(backward_filter);
marci@650
  1439
    }
marci@650
  1440
marci@650
  1441
    //    bool forward(const Parent::Edge& e) const { return Parent::forward(e); }
marci@650
  1442
    //bool backward(const Edge& e) const { return e.backward; }
marci@650
  1443
marci@650
  1444
    void augment(const typename Parent::Edge& e, Number a) const {
marci@650
  1445
      if (Parent::forward(e))  
marci@650
  1446
// 	flow->set(e.out, flow->get(e.out)+a);
marci@650
  1447
	flow->set(e, (*flow)[e]+a);
marci@650
  1448
      else  
marci@650
  1449
	//flow->set(e.in, flow->get(e.in)-a);
marci@650
  1450
	flow->set(e, (*flow)[e]-a);
marci@650
  1451
    }
marci@650
  1452
marci@650
  1453
    Number resCap(const typename Parent::Edge& e) const { 
marci@650
  1454
      if (Parent::forward(e)) 
marci@650
  1455
//	return (capacity->get(e.out)-flow->get(e.out)); 
marci@650
  1456
	return ((*capacity)[e]-(*flow)[e]); 
marci@650
  1457
      else 
marci@650
  1458
//	return (flow->get(e.in)); 
marci@650
  1459
	return ((*flow)[e]); 
marci@650
  1460
    }
marci@650
  1461
marci@650
  1462
  };
marci@650
  1463
marci@650
  1464
marci@650
  1465
marci@650
  1466
marci@650
  1467
//   /// An experiment for ResGraphWrapper.
marci@650
  1468
//   template<typename Graph, typename Number, 
marci@650
  1469
// 	   typename CapacityMap, typename FlowMap>
marci@650
  1470
//   class ExpResGraphWrapper : 
marci@650
  1471
//     public SubGraphWrapper< BidirGraphWrapper<Graph>, 
marci@650
  1472
// 			    ConstMap<typename BidirGraphWrapper<Graph>::Node, 
marci@650
  1473
// 				     bool>, 
marci@650
  1474
// 			    EdgeFilter< BidirGraphWrapper<Graph>, 
marci@650
  1475
// 					CapacityMap, FlowMap> > {
marci@650
  1476
//   public:
marci@650
  1477
//     typedef SubGraphWrapper< BidirGraphWrapper<Graph>, 
marci@650
  1478
// 			     ConstMap<typename BidirGraphWrapper<Graph>::Node, 
marci@650
  1479
// 				      bool>, 
marci@650
  1480
// 			     EdgeFilter< BidirGraphWrapper<Graph>, 
marci@650
  1481
// 					 CapacityMap, FlowMap> > Parent; 
marci@650
  1482
//   protected:
marci@650
  1483
//     const CapacityMap* capacity;
marci@650
  1484
//     FlowMap* flow;
marci@650
  1485
//     BidirGraphWrapper<Graph> bidir_graph;
marci@650
  1486
//     ConstMap<typename BidirGraphWrapper<Graph>::Node, bool> node_filter;
marci@650
  1487
//     EdgeFilter< BidirGraphWrapper<Graph>, CapacityMap, FlowMap> edge_filter;
marci@650
  1488
//   public:
marci@650
  1489
//     ExpResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
marci@650
  1490
// 		       FlowMap& _flow) : 
marci@650
  1491
//       Parent(), capacity(&_capacity), flow(&_flow), 
marci@650
  1492
//       bidir_graph(_graph), 
marci@650
  1493
//       node_filter(true),
marci@650
  1494
//       edge_filter(bidir_graph, *capacity, *flow) { 
marci@650
  1495
//       Parent::setGraph(bidir_graph);
marci@650
  1496
//       Parent::setNodeFilterMap(node_filter);
marci@650
  1497
//       Parent::setEdgeFilterMap(edge_filter);
marci@650
  1498
//     }
marci@650
  1499
marci@650
  1500
//     //    bool forward(const Parent::Edge& e) const { return Parent::forward(e); }
marci@650
  1501
//     //bool backward(const Edge& e) const { return e.backward; }
marci@650
  1502
marci@650
  1503
//     void augment(const typename Parent::Edge& e, Number a) const {
marci@650
  1504
//       if (Parent::forward(e))  
marci@650
  1505
// // 	flow->set(e.out, flow->get(e.out)+a);
marci@650
  1506
// 	flow->set(e, (*flow)[e]+a);
marci@650
  1507
//       else  
marci@650
  1508
// // 	flow->set(e.in, flow->get(e.in)-a);
marci@650
  1509
// 	flow->set(e, (*flow)[e]-a);
marci@650
  1510
//     }
marci@650
  1511
marci@650
  1512
//     Number resCap(const typename Parent::Edge& e) const { 
marci@650
  1513
//       if (Parent::forward(e)) 
marci@650
  1514
// //	return (capacity->get(e.out)-flow->get(e.out)); 
marci@650
  1515
// 	return ((*capacity)[e]-(*flow)[e]); 
marci@650
  1516
//       else 
marci@650
  1517
// //	return (flow->get(e.in)); 
marci@650
  1518
// 	return ((*flow)[e]); 
marci@650
  1519
//     }
marci@650
  1520
marci@650
  1521
//   };
marci@650
  1522
marci@650
  1523
marci@650
  1524
marci@556
  1525
  /// A wrapper for composing the residual graph for directed flow and circulation problems.
marci@556
  1526
marci@556
  1527
  /// A wrapper for composing the residual graph for directed flow and circulation problems.
marci@556
  1528
  template<typename Graph, typename Number, 
marci@556
  1529
	   typename CapacityMap, typename FlowMap>
marci@556
  1530
  class ResGraphWrapper : public GraphWrapper<Graph> {
marci@650
  1531
  public:
marci@650
  1532
    typedef GraphWrapper<Graph> Parent; 
marci@556
  1533
  protected:
marci@556
  1534
    const CapacityMap* capacity;
marci@556
  1535
    FlowMap* flow;
marci@556
  1536
marci@556
  1537
    ResGraphWrapper() : GraphWrapper<Graph>(0), 
marci@556
  1538
			capacity(0), flow(0) { }
marci@560
  1539
    void setCapacityMap(const CapacityMap& _capacity) {
marci@560
  1540
      capacity=&_capacity;
marci@556
  1541
    }
marci@556
  1542
    void setFlowMap(FlowMap& _flow) {
marci@556
  1543
      flow=&_flow;
marci@556
  1544
    }
marci@556
  1545
marci@556
  1546
  public:
marci@556
  1547
marci@556
  1548
    ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
marci@556
  1549
		    FlowMap& _flow) : 
marci@556
  1550
      GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
marci@556
  1551
marci@556
  1552
    class Edge; 
marci@556
  1553
    class OutEdgeIt; 
marci@556
  1554
    friend class Edge; 
marci@556
  1555
    friend class OutEdgeIt; 
marci@556
  1556
marci@556
  1557
    typedef typename GraphWrapper<Graph>::Node Node;
marci@556
  1558
    typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
marci@556
  1559
    class Edge : public Graph::Edge {
marci@556
  1560
      friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
marci@556
  1561
    protected:
marci@565
  1562
      bool backward; //true, iff backward
marci@556
  1563
//      typename Graph::Edge e;
marci@556
  1564
    public:
marci@556
  1565
      Edge() { }
marci@565
  1566
      Edge(const typename Graph::Edge& _e, bool _backward) : 
marci@565
  1567
	Graph::Edge(_e), backward(_backward) { }
marci@565
  1568
      Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
marci@556
  1569
//the unique invalid iterator
marci@556
  1570
      friend bool operator==(const Edge& u, const Edge& v) { 
marci@565
  1571
	return (v.backward==u.backward && 
marci@556
  1572
		static_cast<typename Graph::Edge>(u)==
marci@556
  1573
		static_cast<typename Graph::Edge>(v));
marci@556
  1574
      } 
marci@556
  1575
      friend bool operator!=(const Edge& u, const Edge& v) { 
marci@565
  1576
	return (v.backward!=u.backward || 
marci@556
  1577
		static_cast<typename Graph::Edge>(u)!=
marci@556
  1578
		static_cast<typename Graph::Edge>(v));
marci@556
  1579
      } 
marci@556
  1580
    };
marci@556
  1581
marci@556
  1582
    class OutEdgeIt {
marci@556
  1583
      friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
marci@556
  1584
    protected:
marci@556
  1585
      typename Graph::OutEdgeIt out;
marci@556
  1586
      typename Graph::InEdgeIt in;
marci@565
  1587
      bool backward;
marci@556
  1588
    public:
marci@556
  1589
      OutEdgeIt() { }
marci@556
  1590
      //FIXME
marci@556
  1591
//      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@565
  1592
      OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@556
  1593
//the unique invalid iterator
marci@569
  1594
      OutEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) { 
marci@565
  1595
	backward=false;
marci@569
  1596
	_G.graph->first(out, v);
marci@569
  1597
	while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
marci@569
  1598
	if (!_G.graph->valid(out)) {
marci@565
  1599
	  backward=true;
marci@569
  1600
	  _G.graph->first(in, v);
marci@569
  1601
	  while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
marci@556
  1602
	}
marci@556
  1603
      }
marci@556
  1604
      operator Edge() const { 
marci@556
  1605
//	Edge e;
marci@556
  1606
//	e.forward=this->forward;
marci@556
  1607
//	if (this->forward) e=out; else e=in;
marci@556
  1608
//	return e;
marci@565
  1609
	if (this->backward) 
marci@565
  1610
	  return Edge(in, this->backward); 
marci@556
  1611
	else 
marci@565
  1612
	  return Edge(out, this->backward);
marci@556
  1613
      }
marci@556
  1614
    };
marci@556
  1615
marci@556
  1616
    class InEdgeIt {
marci@556
  1617
      friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
marci@556
  1618
    protected:
marci@556
  1619
      typename Graph::OutEdgeIt out;
marci@556
  1620
      typename Graph::InEdgeIt in;
marci@565
  1621
      bool backward;
marci@556
  1622
    public:
marci@556
  1623
      InEdgeIt() { }
marci@556
  1624
      //FIXME
marci@556
  1625
//      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@565
  1626
      InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
marci@556
  1627
//the unique invalid iterator
marci@569
  1628
      InEdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) { 
marci@565
  1629
	backward=false;
marci@569
  1630
	_G.graph->first(in, v);
marci@569
  1631
	while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
marci@569
  1632
	if (!_G.graph->valid(in)) {
marci@565
  1633
	  backward=true;
marci@569
  1634
	  _G.graph->first(out, v);
marci@569
  1635
	  while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
marci@556
  1636
	}
marci@556
  1637
      }
marci@556
  1638
      operator Edge() const { 
marci@556
  1639
//	Edge e;
marci@556
  1640
//	e.forward=this->forward;
marci@556
  1641
//	if (this->forward) e=out; else e=in;
marci@556
  1642
//	return e;
marci@565
  1643
	if (this->backward) 
marci@565
  1644
	  return Edge(out, this->backward); 
marci@556
  1645
	else 
marci@565
  1646
	  return Edge(in, this->backward);
marci@556
  1647
      }
marci@556
  1648
    };
marci@556
  1649
marci@556
  1650
    class EdgeIt {
marci@556
  1651
      friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
marci@556
  1652
    protected:
marci@556
  1653
      typename Graph::EdgeIt e;
marci@565
  1654
      bool backward;
marci@556
  1655
    public:
marci@556
  1656
      EdgeIt() { }
marci@565
  1657
      EdgeIt(const Invalid& i) : e(i), backward(true) { }
marci@569
  1658
      EdgeIt(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) { 
marci@565
  1659
	backward=false;
marci@569
  1660
	_G.graph->first(e);
marci@569
  1661
	while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
marci@569
  1662
	if (!_G.graph->valid(e)) {
marci@565
  1663
	  backward=true;
marci@569
  1664
	  _G.graph->first(e);
marci@569
  1665
	  while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
marci@556
  1666
	}
marci@556
  1667
      }
marci@556
  1668
      operator Edge() const { 
marci@565
  1669
	return Edge(e, this->backward);
marci@556
  1670
      }
marci@556
  1671
    };
marci@556
  1672
marci@556
  1673
    using GraphWrapper<Graph>::first;
marci@556
  1674
//     NodeIt& first(NodeIt& i) const { 
marci@556
  1675
//       i=NodeIt(*this); return i;
marci@556
  1676
//     }
marci@556
  1677
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
  1678
      i=OutEdgeIt(*this, p); return i;
marci@556
  1679
    }
marci@556
  1680
//    FIXME not tested
marci@556
  1681
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
  1682
      i=InEdgeIt(*this, p); return i;
marci@556
  1683
    }
marci@556
  1684
    EdgeIt& first(EdgeIt& i) const { 
marci@556
  1685
      i=EdgeIt(*this); return i;
marci@556
  1686
    }
marci@556
  1687
  
marci@556
  1688
    using GraphWrapper<Graph>::next;
marci@556
  1689
//    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
marci@556
  1690
    OutEdgeIt& next(OutEdgeIt& e) const { 
marci@565
  1691
      if (!e.backward) {
marci@556
  1692
	Node v=this->graph->aNode(e.out);
marci@556
  1693
	this->graph->next(e.out);
marci@556
  1694
	while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
marci@556
  1695
	  this->graph->next(e.out); }
marci@556
  1696
	if (!this->graph->valid(e.out)) {
marci@565
  1697
	  e.backward=true;
marci@556
  1698
	  this->graph->first(e.in, v); 
marci@556
  1699
	  while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
marci@556
  1700
	    this->graph->next(e.in); }
marci@556
  1701
	}
marci@556
  1702
      } else {
marci@556
  1703
	this->graph->next(e.in);
marci@556
  1704
	while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
marci@556
  1705
	  this->graph->next(e.in); } 
marci@556
  1706
      }
marci@556
  1707
      return e;
marci@556
  1708
    }
marci@556
  1709
//     FIXME Not tested
marci@556
  1710
    InEdgeIt& next(InEdgeIt& e) const { 
marci@565
  1711
      if (!e.backward) {
marci@556
  1712
	Node v=this->graph->aNode(e.in);
marci@556
  1713
	this->graph->next(e.in);
marci@556
  1714
	while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
marci@556
  1715
	  this->graph->next(e.in); }
marci@556
  1716
	if (!this->graph->valid(e.in)) {
marci@565
  1717
	  e.backward=true;
marci@556
  1718
	  this->graph->first(e.out, v); 
marci@556
  1719
	  while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
marci@556
  1720
	    this->graph->next(e.out); }
marci@556
  1721
	}
marci@556
  1722
      } else {
marci@556
  1723
	this->graph->next(e.out);
marci@556
  1724
	while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
marci@556
  1725
	  this->graph->next(e.out); } 
marci@556
  1726
      }
marci@556
  1727
      return e;
marci@556
  1728
    }
marci@556
  1729
    EdgeIt& next(EdgeIt& e) const {
marci@565
  1730
      if (!e.backward) {
marci@556
  1731
	this->graph->next(e.e);
marci@556
  1732
	while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
marci@556
  1733
	  this->graph->next(e.e); }
marci@556
  1734
	if (!this->graph->valid(e.e)) {
marci@565
  1735
	  e.backward=true;
marci@556
  1736
	  this->graph->first(e.e); 
marci@556
  1737
	  while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
marci@556
  1738
	    this->graph->next(e.e); }
marci@556
  1739
	}
marci@556
  1740
      } else {
marci@556
  1741
	this->graph->next(e.e);
marci@556
  1742
	while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
marci@556
  1743
	  this->graph->next(e.e); } 
marci@556
  1744
      }
marci@556
  1745
      return e;
marci@556
  1746
    }
marci@556
  1747
marci@556
  1748
    Node tail(Edge e) const { 
marci@565
  1749
      return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
marci@556
  1750
    Node head(Edge e) const { 
marci@565
  1751
      return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
marci@556
  1752
marci@556
  1753
    Node aNode(OutEdgeIt e) const { 
marci@565
  1754
      return ((!e.backward) ? this->graph->aNode(e.out) : 
marci@556
  1755
	      this->graph->aNode(e.in)); }
marci@556
  1756
    Node bNode(OutEdgeIt e) const { 
marci@565
  1757
      return ((!e.backward) ? this->graph->bNode(e.out) : 
marci@556
  1758
	      this->graph->bNode(e.in)); }
marci@556
  1759
marci@556
  1760
    Node aNode(InEdgeIt e) const { 
marci@565
  1761
      return ((!e.backward) ? this->graph->aNode(e.in) : 
marci@556
  1762
	      this->graph->aNode(e.out)); }
marci@556
  1763
    Node bNode(InEdgeIt e) const { 
marci@565
  1764
      return ((!e.backward) ? this->graph->bNode(e.in) : 
marci@556
  1765
	      this->graph->bNode(e.out)); }
marci@556
  1766
marci@556
  1767
//    int nodeNum() const { return graph->nodeNum(); }
marci@556
  1768
    //FIXME
marci@556
  1769
    void edgeNum() const { }
marci@556
  1770
    //int edgeNum() const { return graph->edgeNum(); }
marci@556
  1771
marci@556
  1772
marci@556
  1773
//    int id(Node v) const { return graph->id(v); }
marci@556
  1774
marci@556
  1775
    bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
marci@556
  1776
    bool valid(Edge e) const { 
marci@556
  1777
      return this->graph->valid(e);
marci@556
  1778
	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
marci@556
  1779
    }
marci@556
  1780
marci@565
  1781
    bool forward(const Edge& e) const { return !e.backward; }
marci@565
  1782
    bool backward(const Edge& e) const { return e.backward; }
marci@556
  1783
marci@556
  1784
    void augment(const Edge& e, Number a) const {
marci@565
  1785
      if (!e.backward)  
marci@556
  1786
// 	flow->set(e.out, flow->get(e.out)+a);
marci@556
  1787
	flow->set(e, (*flow)[e]+a);
marci@556
  1788
      else  
marci@556
  1789
// 	flow->set(e.in, flow->get(e.in)-a);
marci@556
  1790
	flow->set(e, (*flow)[e]-a);
marci@556
  1791
    }
marci@556
  1792
marci@556
  1793
    Number resCap(const Edge& e) const { 
marci@565
  1794
      if (!e.backward) 
marci@556
  1795
//	return (capacity->get(e.out)-flow->get(e.out)); 
marci@556
  1796
	return ((*capacity)[e]-(*flow)[e]); 
marci@556
  1797
      else 
marci@556
  1798
//	return (flow->get(e.in)); 
marci@556
  1799
	return ((*flow)[e]); 
marci@556
  1800
    }
marci@556
  1801
marci@556
  1802
//     Number resCap(typename Graph::OutEdgeIt out) const { 
marci@556
  1803
// //      return (capacity->get(out)-flow->get(out)); 
marci@556
  1804
//       return ((*capacity)[out]-(*flow)[out]); 
marci@556
  1805
//     }
marci@556
  1806
    
marci@556
  1807
//     Number resCap(typename Graph::InEdgeIt in) const { 
marci@556
  1808
// //      return (flow->get(in)); 
marci@556
  1809
//       return ((*flow)[in]); 
marci@556
  1810
//     }
marci@556
  1811
marci@556
  1812
    template <typename T>
marci@556
  1813
    class EdgeMap {
marci@556
  1814
      typename Graph::template EdgeMap<T> forward_map, backward_map; 
marci@556
  1815
    public:
marci@624
  1816
      typedef T ValueType;
marci@624
  1817
      typedef Edge KeyType;
marci@556
  1818
      EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
marci@556
  1819
      EdgeMap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
marci@556
  1820
      void set(Edge e, T a) { 
marci@565
  1821
	if (!e.backward) 
marci@624
  1822
	  forward_map.set(e/*.out*/, a); 
marci@556
  1823
	else 
marci@624
  1824
	  backward_map.set(e/*.in*/, a); 
marci@556
  1825
      }
marci@556
  1826
      T operator[](Edge e) const { 
marci@565
  1827
	if (!e.backward) 
marci@624
  1828
	  return forward_map[e/*.out*/]; 
marci@556
  1829
	else 
marci@624
  1830
	  return backward_map[e/*.in*/]; 
marci@556
  1831
      }
marci@625
  1832
      void update() { 
marci@625
  1833
	forward_map.update(); 
marci@625
  1834
	backward_map.update();
marci@625
  1835
      }
marci@556
  1836
//       T get(Edge e) const { 
marci@556
  1837
// 	if (e.out_or_in) 
marci@556
  1838
// 	  return forward_map.get(e.out); 
marci@556
  1839
// 	else 
marci@556
  1840
// 	  return backward_map.get(e.in); 
marci@556
  1841
//       }
marci@556
  1842
    };
marci@556
  1843
  };
marci@556
  1844
marci@569
  1845
marci@569
  1846
marci@612
  1847
  /// For blocking flows.
marci@556
  1848
marci@612
  1849
  /// This graph wrapper is used for Dinits blocking flow computations.
marci@612
  1850
  /// For each node, an out-edge is stored which is used when the 
marci@612
  1851
  /// \code 
marci@612
  1852
  /// OutEdgeIt& first(OutEdgeIt&, const Node&)
marci@612
  1853
  /// \endcode
marci@612
  1854
  /// is called. 
marci@556
  1855
  ///
marci@556
  1856
  ///\author Marton Makai
marci@556
  1857
  template<typename Graph, typename FirstOutEdgesMap>
marci@556
  1858
  class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
marci@650
  1859
  public:
marci@650
  1860
    typedef GraphWrapper<Graph> Parent; 
marci@556
  1861
  protected:
marci@556
  1862
    FirstOutEdgesMap* first_out_edges;
marci@556
  1863
  public:
marci@556
  1864
    ErasingFirstGraphWrapper(Graph& _graph, 
marci@556
  1865
			     FirstOutEdgesMap& _first_out_edges) : 
marci@556
  1866
      GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }  
marci@556
  1867
marci@556
  1868
    typedef typename GraphWrapper<Graph>::Node Node;
marci@556
  1869
//     class NodeIt { 
marci@556
  1870
//       friend class GraphWrapper<Graph>;
marci@556
  1871
//       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
marci@556
  1872
//       typename Graph::NodeIt n;
marci@556
  1873
//      public:
marci@556
  1874
//       NodeIt() { }
marci@556
  1875
//       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
marci@556
  1876
//       NodeIt(const Invalid& i) : n(i) { }
marci@556
  1877
//       NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
marci@556
  1878
// 	n(*(_G.graph)) { }
marci@556
  1879
//       operator Node() const { return Node(typename Graph::Node(n)); }
marci@556
  1880
//     };
marci@556
  1881
    typedef typename GraphWrapper<Graph>::Edge Edge;
marci@556
  1882
    class OutEdgeIt { 
marci@556
  1883
      friend class GraphWrapper<Graph>;
marci@556
  1884
      friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
marci@556
  1885
//      typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
marci@556
  1886
      typename Graph::OutEdgeIt e;
marci@556
  1887
    public:
marci@556
  1888
      OutEdgeIt() { }
marci@556
  1889
      OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
marci@556
  1890
      OutEdgeIt(const Invalid& i) : e(i) { }
marci@556
  1891
      OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
marci@556
  1892
		const Node& _n) : 
marci@556
  1893
	e((*_G.first_out_edges)[_n]) { }
marci@556
  1894
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
  1895
    };
marci@556
  1896
    class InEdgeIt { 
marci@556
  1897
      friend class GraphWrapper<Graph>;
marci@556
  1898
      friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
marci@556
  1899
//      typedef typename Graph::InEdgeIt GraphInEdgeIt;
marci@556
  1900
      typename Graph::InEdgeIt e;
marci@556
  1901
    public:
marci@556
  1902
      InEdgeIt() { }
marci@556
  1903
      InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
marci@556
  1904
      InEdgeIt(const Invalid& i) : e(i) { }
marci@556
  1905
      InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
marci@556
  1906
	       const Node& _n) : 
marci@556
  1907
	e(*(_G.graph), typename Graph::Node(_n)) { }
marci@556
  1908
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
  1909
    };
marci@556
  1910
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@556
  1911
    class EdgeIt { 
marci@556
  1912
      friend class GraphWrapper<Graph>;
marci@556
  1913
      friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
marci@556
  1914
//      typedef typename Graph::EdgeIt GraphEdgeIt;
marci@556
  1915
      typename Graph::EdgeIt e;
marci@556
  1916
    public:
marci@556
  1917
      EdgeIt() { }
marci@556
  1918
      EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
marci@556
  1919
      EdgeIt(const Invalid& i) : e(i) { }
marci@556
  1920
      EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
marci@556
  1921
	e(*(_G.graph)) { }
marci@556
  1922
      operator Edge() const { return Edge(typename Graph::Edge(e)); }
marci@556
  1923
    };
marci@556
  1924
marci@556
  1925
    using GraphWrapper<Graph>::first;
marci@556
  1926
//     NodeIt& first(NodeIt& i) const { 
marci@556
  1927
//       i=NodeIt(*this); return i;
marci@556
  1928
//     }
marci@556
  1929
    OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
marci@556
  1930
      i=OutEdgeIt(*this, p); return i;
marci@556
  1931
    }
marci@556
  1932
    InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
marci@556
  1933
      i=InEdgeIt(*this, p); return i;
marci@556
  1934
    }
marci@556
  1935
    EdgeIt& first(EdgeIt& i) const { 
marci@556
  1936
      i=EdgeIt(*this); return i;
marci@556
  1937
    }
marci@556
  1938
marci@556
  1939
    using GraphWrapper<Graph>::next;
marci@556
  1940
//    NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
marci@556
  1941
    OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
marci@556
  1942
    InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
marci@556
  1943
    EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }    
marci@556
  1944
    
marci@556
  1945
    Node aNode(const OutEdgeIt& e) const { 
marci@556
  1946
      return Node(this->graph->aNode(e.e)); }
marci@556
  1947
    Node aNode(const InEdgeIt& e) const { 
marci@556
  1948
      return Node(this->graph->aNode(e.e)); }
marci@556
  1949
    Node bNode(const OutEdgeIt& e) const { 
marci@556
  1950
      return Node(this->graph->bNode(e.e)); }
marci@556
  1951
    Node bNode(const InEdgeIt& e) const { 
marci@556
  1952
      return Node(this->graph->bNode(e.e)); }
marci@556
  1953
marci@556
  1954
    void erase(const OutEdgeIt& e) const {
marci@556
  1955
      OutEdgeIt f=e;
marci@556
  1956
      this->next(f);
marci@556
  1957
      first_out_edges->set(this->tail(e), f.e);
marci@556
  1958
    }
marci@556
  1959
  };
marci@556
  1960
marci@556
  1961
  ///@}
marci@556
  1962
marci@556
  1963
} //namespace hugo
marci@556
  1964
marci@556
  1965
#endif //HUGO_GRAPH_WRAPPER_H
marci@556
  1966