src/work/marci/graph_wrapper.h
author marci
Thu, 18 Mar 2004 11:35:41 +0000
changeset 199 98b93792541e
parent 174 44700ed9ffaa
child 212 c07e4dd32438
permissions -rw-r--r--
.
marci@174
     1
// -*- c++ -*-
marci@76
     2
#ifndef GRAPH_WRAPPER_H
marci@76
     3
#define GRAPH_WRAPPER_H
marci@76
     4
marci@174
     5
#include <invalid.h>
marci@174
     6
alpar@105
     7
namespace hugo {
marci@76
     8
marci@76
     9
  template<typename Graph>
marci@76
    10
  class TrivGraphWrapper {
marci@199
    11
  protected:
marci@76
    12
    Graph* graph;
marci@76
    13
  
marci@76
    14
  public:
marci@76
    15
    typedef Graph BaseGraph;
marci@76
    16
marci@174
    17
    typedef typename Graph::Node Node;
marci@76
    18
    typedef typename Graph::NodeIt NodeIt;
marci@76
    19
marci@174
    20
    typedef typename Graph::Edge Edge;
marci@76
    21
    typedef typename Graph::OutEdgeIt OutEdgeIt;
marci@76
    22
    typedef typename Graph::InEdgeIt InEdgeIt;
marci@155
    23
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
    24
    typedef typename Graph::EdgeIt EdgeIt;
marci@168
    25
marci@168
    26
    //TrivGraphWrapper() : graph(0) { }
marci@168
    27
    TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@168
    28
marci@168
    29
    void setGraph(Graph& _graph) { graph = &_graph; }
marci@168
    30
    Graph& getGraph() const { return (*graph); }
marci@76
    31
    
marci@174
    32
    template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
marci@174
    33
    template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
    34
      return graph->/*getF*/first(i, p); }
marci@155
    35
    
marci@155
    36
    template<typename I> I getNext(const I& i) const { 
marci@155
    37
      return graph->getNext(i); }
marci@155
    38
    template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@76
    39
marci@76
    40
    template< typename It > It first() const { 
marci@174
    41
      It e; /*getF*/first(e); return e; }
marci@76
    42
marci@174
    43
    template< typename It > It first(const Node& v) const { 
marci@174
    44
      It e; /*getF*/first(e, v); return e; }
marci@76
    45
marci@174
    46
    Node head(const Edge& e) const { return graph->head(e); }
marci@174
    47
    Node tail(const Edge& e) const { return graph->tail(e); }
marci@155
    48
marci@155
    49
    template<typename I> bool valid(const I& i) const 
marci@155
    50
      { return graph->valid(i); }
marci@155
    51
  
marci@155
    52
    //template<typename I> void setInvalid(const I &i);
marci@155
    53
    //{ return graph->setInvalid(i); }
marci@155
    54
marci@155
    55
    int nodeNum() const { return graph->nodeNum(); }
marci@155
    56
    int edgeNum() const { return graph->edgeNum(); }
marci@76
    57
  
marci@174
    58
    template<typename I> Node aNode(const I& e) const { 
marci@76
    59
      return graph->aNode(e); }
marci@174
    60
    template<typename I> Node bNode(const I& e) const { 
marci@76
    61
      return graph->bNode(e); }
marci@76
    62
  
marci@174
    63
    Node addNode() const { return graph->addNode(); }
marci@174
    64
    Edge addEdge(const Node& tail, const Node& head) const { 
marci@76
    65
      return graph->addEdge(tail, head); }
marci@76
    66
  
marci@76
    67
    template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@76
    68
  
marci@76
    69
    void clear() const { graph->clear(); }
marci@155
    70
    
marci@76
    71
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@76
    72
    public:
marci@155
    73
      NodeMap(const TrivGraphWrapper<Graph>& _G) : 
marci@158
    74
	Graph::NodeMap<T>(_G.getGraph()) { }
marci@155
    75
      NodeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
marci@158
    76
	Graph::NodeMap<T>(_G.getGraph(), a) { }
marci@76
    77
    };
marci@168
    78
marci@155
    79
    template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
marci@155
    80
    public:
marci@155
    81
      EdgeMap(const TrivGraphWrapper<Graph>& _G) : 
marci@158
    82
	Graph::EdgeMap<T>(_G.getGraph()) { }
marci@155
    83
      EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
marci@158
    84
	Graph::EdgeMap<T>(_G.getGraph(), a) { }
marci@155
    85
    };
marci@76
    86
  };
marci@76
    87
marci@76
    88
  template<typename Graph>
marci@76
    89
  class RevGraphWrapper
marci@76
    90
  {
marci@199
    91
  protected:
marci@76
    92
    Graph* graph;
marci@76
    93
  
marci@76
    94
  public:
marci@76
    95
    typedef Graph BaseGraph;
marci@76
    96
marci@174
    97
    typedef typename Graph::Node Node;    
marci@174
    98
    typedef typename Graph::NodeIt NodeIt;
marci@76
    99
  
marci@174
   100
    typedef typename Graph::Edge Edge;
marci@76
   101
    typedef typename Graph::OutEdgeIt InEdgeIt;
marci@76
   102
    typedef typename Graph::InEdgeIt OutEdgeIt;
marci@155
   103
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   104
    typedef typename Graph::EdgeIt EdgeIt;
marci@168
   105
marci@168
   106
    //RevGraphWrapper() : graph(0) { }
marci@168
   107
    RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@168
   108
marci@168
   109
    void setGraph(Graph& _graph) { graph = &_graph; }
marci@168
   110
    Graph& getGraph() const { return (*graph); }
marci@76
   111
    
marci@174
   112
    template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
marci@174
   113
    template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
   114
      return graph->/*getF*/first(i, p); }
marci@155
   115
marci@155
   116
    template<typename I> I getNext(const I& i) const { 
marci@155
   117
      return graph->getNext(i); }
marci@155
   118
    template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@76
   119
marci@76
   120
    template< typename It > It first() const { 
marci@174
   121
      It e; /*getF*/first(e); return e; }
marci@76
   122
marci@174
   123
    template< typename It > It first(const Node& v) const { 
marci@174
   124
      It e; /*getF*/first(e, v); return e; }
marci@76
   125
marci@174
   126
    Node head(const Edge& e) const { return graph->tail(e); }
marci@174
   127
    Node tail(const Edge& e) const { return graph->head(e); }
marci@76
   128
  
marci@155
   129
    template<typename I> bool valid(const I& i) const 
marci@155
   130
      { return graph->valid(i); }
marci@155
   131
  
marci@155
   132
    //template<typename I> void setInvalid(const I &i);
marci@155
   133
    //{ return graph->setInvalid(i); }
marci@155
   134
  
marci@174
   135
    template<typename I> Node aNode(const I& e) const { 
marci@76
   136
      return graph->aNode(e); }
marci@174
   137
    template<typename I> Node bNode(const I& e) const { 
marci@76
   138
      return graph->bNode(e); }
marci@155
   139
marci@174
   140
    Node addNode() const { return graph->addNode(); }
marci@174
   141
    Edge addEdge(const Node& tail, const Node& head) const { 
marci@76
   142
      return graph->addEdge(tail, head); }
marci@76
   143
  
marci@155
   144
    int nodeNum() const { return graph->nodeNum(); }
marci@155
   145
    int edgeNum() const { return graph->edgeNum(); }
marci@76
   146
  
marci@155
   147
    template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@76
   148
  
marci@155
   149
    void clear() const { graph->clear(); }
marci@155
   150
marci@155
   151
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@155
   152
    public:
marci@155
   153
      NodeMap(const RevGraphWrapper<Graph>& _G) : 
marci@158
   154
	Graph::NodeMap<T>(_G.getGraph()) { }
marci@155
   155
      NodeMap(const RevGraphWrapper<Graph>& _G, T a) : 
marci@158
   156
	Graph::NodeMap<T>(_G.getGraph(), a) { }
marci@155
   157
    };
marci@168
   158
marci@155
   159
    template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
marci@155
   160
    public:
marci@155
   161
      EdgeMap(const RevGraphWrapper<Graph>& _G) : 
marci@158
   162
	Graph::EdgeMap<T>(_G.getGraph()) { }
marci@155
   163
      EdgeMap(const RevGraphWrapper<Graph>& _G, T a) : 
marci@158
   164
	Graph::EdgeMap<T>(_G.getGraph(), a) { }
marci@155
   165
    };
marci@76
   166
  };
marci@76
   167
marci@155
   168
marci@158
   169
  template<typename Graph>
marci@158
   170
  class UndirGraphWrapper {
marci@199
   171
  protected:
marci@158
   172
    Graph* graph;
marci@158
   173
  
marci@158
   174
  public:
marci@158
   175
    typedef Graph BaseGraph;
marci@158
   176
marci@174
   177
    typedef typename Graph::Node Node;
marci@158
   178
    typedef typename Graph::NodeIt NodeIt;
marci@158
   179
marci@174
   180
    //typedef typename Graph::Edge Edge;
marci@158
   181
    //typedef typename Graph::OutEdgeIt OutEdgeIt;
marci@158
   182
    //typedef typename Graph::InEdgeIt InEdgeIt;
marci@158
   183
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   184
    //typedef typename Graph::EdgeIt EdgeIt;
marci@158
   185
marci@158
   186
    //private:
marci@174
   187
    typedef typename Graph::Edge GraphEdge;
marci@158
   188
    typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
marci@158
   189
    typedef typename Graph::InEdgeIt GraphInEdgeIt;
marci@158
   190
    //public:
marci@158
   191
marci@168
   192
    //UndirGraphWrapper() : graph(0) { }
marci@168
   193
    UndirGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@168
   194
marci@168
   195
    void setGraph(Graph& _graph) { graph = &_graph; }
marci@168
   196
    Graph& getGraph() const { return (*graph); }
marci@168
   197
  
marci@174
   198
    class Edge {
marci@158
   199
      friend class UndirGraphWrapper<Graph>;
marci@158
   200
      bool out_or_in; //true iff out
marci@158
   201
      GraphOutEdgeIt out;
marci@158
   202
      GraphInEdgeIt in;
marci@158
   203
    public:
marci@174
   204
      Edge() : out_or_in(), out(), in() { }
marci@174
   205
      Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
marci@174
   206
      operator GraphEdge() const {
marci@158
   207
	if (out_or_in) return(out); else return(in);
marci@158
   208
      }
marci@174
   209
      friend bool operator==(const Edge& u, const Edge& v) { 
marci@174
   210
	if (v.out_or_in) 
marci@174
   211
	  return (u.out_or_in && u.out==v.out);
marci@174
   212
	else
marci@174
   213
	  return (!u.out_or_in && u.in==v.in);
marci@174
   214
      } 
marci@174
   215
      friend bool operator!=(const Edge& u, const Edge& v) { 
marci@174
   216
	if (v.out_or_in) 
marci@174
   217
	  return (!u.out_or_in || u.out!=v.out);
marci@174
   218
	else
marci@174
   219
	  return (u.out_or_in || u.in!=v.in);
marci@174
   220
      } 
marci@158
   221
    };
marci@158
   222
marci@174
   223
    class OutEdgeIt : public Edge {
marci@158
   224
      friend class UndirGraphWrapper<Graph>;
marci@158
   225
    public:
marci@174
   226
      OutEdgeIt() : Edge() { }
marci@174
   227
      OutEdgeIt(const Invalid& i) : Edge(i) { }
marci@174
   228
      OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() { 
marci@174
   229
	out_or_in=true;
marci@174
   230
	_G.graph->/*getF*/first(out, n);
marci@158
   231
	if (!(_G.graph->valid(out))) {
marci@158
   232
	  out_or_in=false;
marci@174
   233
	  _G.graph->/*getF*/first(in, n);
marci@158
   234
	}
marci@158
   235
      }
marci@158
   236
    };
marci@158
   237
marci@174
   238
    OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const {
marci@158
   239
      e.out_or_in=true;
marci@174
   240
      graph->/*getF*/first(e.out, n);
marci@158
   241
      if (!(graph->valid(e.out))) {
marci@158
   242
	e.out_or_in=false;
marci@174
   243
	graph->/*getF*/first(e.in, n);
marci@158
   244
      }
marci@158
   245
      return e;
marci@158
   246
    }
marci@158
   247
marci@158
   248
    OutEdgeIt& next(OutEdgeIt& e) const {
marci@158
   249
      if (e.out_or_in) {
marci@174
   250
	Node n=graph->tail(e.out);
marci@158
   251
	graph->next(e.out);
marci@158
   252
	if (!graph->valid(e.out)) {
marci@158
   253
	  e.out_or_in=false;
marci@174
   254
	  graph->/*getF*/first(e.in, n);
marci@158
   255
	}
marci@158
   256
      } else {
marci@158
   257
	graph->next(e.in);
marci@158
   258
      }
marci@158
   259
      return e;
marci@158
   260
    }
marci@158
   261
marci@174
   262
    Node aNode(const OutEdgeIt& e) const { 
marci@158
   263
      if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
marci@174
   264
    Node bNode(const OutEdgeIt& e) const { 
marci@158
   265
      if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
marci@158
   266
marci@158
   267
    typedef OutEdgeIt InEdgeIt; 
marci@158
   268
marci@174
   269
    template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
marci@174
   270
//     template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
   271
//       return graph->/*getF*/first(i, p); }
marci@158
   272
    
marci@158
   273
    template<typename I> I getNext(const I& i) const { 
marci@158
   274
      return graph->getNext(i); }
marci@158
   275
    template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@158
   276
marci@158
   277
    template< typename It > It first() const { 
marci@174
   278
      It e; /*getF*/first(e); return e; }
marci@158
   279
marci@174
   280
    template< typename It > It first(const Node& v) const { 
marci@174
   281
      It e; /*getF*/first(e, v); return e; }
marci@158
   282
marci@174
   283
    Node head(const Edge& e) const { return graph->head(e); }
marci@174
   284
    Node tail(const Edge& e) const { return graph->tail(e); }
marci@158
   285
marci@158
   286
    template<typename I> bool valid(const I& i) const 
marci@158
   287
      { return graph->valid(i); }
marci@158
   288
  
marci@158
   289
    //template<typename I> void setInvalid(const I &i);
marci@158
   290
    //{ return graph->setInvalid(i); }
marci@158
   291
marci@158
   292
    int nodeNum() const { return graph->nodeNum(); }
marci@158
   293
    int edgeNum() const { return graph->edgeNum(); }
marci@158
   294
  
marci@174
   295
//     template<typename I> Node aNode(const I& e) const { 
marci@158
   296
//       return graph->aNode(e); }
marci@174
   297
//     template<typename I> Node bNode(const I& e) const { 
marci@158
   298
//       return graph->bNode(e); }
marci@158
   299
  
marci@174
   300
    Node addNode() const { return graph->addNode(); }
marci@174
   301
    Edge addEdge(const Node& tail, const Node& head) const { 
marci@158
   302
      return graph->addEdge(tail, head); }
marci@158
   303
  
marci@158
   304
    template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@158
   305
  
marci@158
   306
    void clear() const { graph->clear(); }
marci@158
   307
    
marci@158
   308
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@158
   309
    public:
marci@158
   310
      NodeMap(const UndirGraphWrapper<Graph>& _G) : 
marci@158
   311
	Graph::NodeMap<T>(_G.getGraph()) { }
marci@158
   312
      NodeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
marci@158
   313
	Graph::NodeMap<T>(_G.getGraph(), a) { }
marci@158
   314
    };
marci@168
   315
marci@158
   316
    template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
marci@158
   317
    public:
marci@158
   318
      EdgeMap(const UndirGraphWrapper<Graph>& _G) : 
marci@158
   319
	Graph::EdgeMap<T>(_G.getGraph()) { }
marci@158
   320
      EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
marci@158
   321
	Graph::EdgeMap<T>(_G.getGraph(), a) { }
marci@158
   322
    };
marci@158
   323
  };
marci@158
   324
marci@158
   325
marci@158
   326
marci@155
   327
//   template<typename Graph>
marci@155
   328
//   class SymGraphWrapper
marci@155
   329
//   {
marci@155
   330
//     Graph* graph;
marci@76
   331
  
marci@155
   332
//   public:
marci@155
   333
//     typedef Graph BaseGraph;
marci@155
   334
marci@174
   335
//     typedef typename Graph::Node Node;
marci@174
   336
//     typedef typename Graph::Edge Edge;
marci@174
   337
  
marci@155
   338
//     typedef typename Graph::NodeIt NodeIt;
marci@155
   339
    
marci@155
   340
//     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
marci@155
   341
//     //iranyitatlant, ami van
marci@155
   342
//     //mert csak 1 dolgot lehet be typedef-elni
marci@155
   343
//     typedef typename Graph::OutEdgeIt SymEdgeIt;
marci@155
   344
//     //typedef typename Graph::InEdgeIt SymEdgeIt;
marci@155
   345
//     //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   346
//     typedef typename Graph::EdgeIt EdgeIt;
marci@155
   347
marci@155
   348
//     int nodeNum() const { return graph->nodeNum(); }
marci@155
   349
//     int edgeNum() const { return graph->edgeNum(); }
marci@155
   350
    
marci@174
   351
//     template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
marci@174
   352
//     template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
   353
//       return graph->/*getF*/first(i, p); }
marci@155
   354
//     //template<typename I> I next(const I i); { return graph->goNext(i); }
marci@155
   355
//     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
marci@155
   356
marci@155
   357
//     template< typename It > It first() const { 
marci@174
   358
//       It e; /*getF*/first(e); return e; }
marci@155
   359
marci@174
   360
//     template< typename It > It first(Node v) const { 
marci@174
   361
//       It e; /*getF*/first(e, v); return e; }
marci@155
   362
marci@174
   363
//     Node head(const Edge& e) const { return graph->head(e); }
marci@174
   364
//     Node tail(const Edge& e) const { return graph->tail(e); }
marci@155
   365
  
marci@174
   366
//     template<typename I> Node aNode(const I& e) const { 
marci@155
   367
//       return graph->aNode(e); }
marci@174
   368
//     template<typename I> Node bNode(const I& e) const { 
marci@155
   369
//       return graph->bNode(e); }
marci@155
   370
  
marci@155
   371
//     //template<typename I> bool valid(const I i);
marci@155
   372
//     //{ return graph->valid(i); }
marci@155
   373
  
marci@155
   374
//     //template<typename I> void setInvalid(const I &i);
marci@155
   375
//     //{ return graph->setInvalid(i); }
marci@155
   376
  
marci@174
   377
//     Node addNode() { return graph->addNode(); }
marci@174
   378
//     Edge addEdge(const Node& tail, const Node& head) { 
marci@155
   379
//       return graph->addEdge(tail, head); }
marci@155
   380
  
marci@155
   381
//     template<typename I> void erase(const I& i) { graph->erase(i); }
marci@155
   382
  
marci@155
   383
//     void clear() { graph->clear(); }
marci@155
   384
  
marci@155
   385
//     template<typename T> class NodeMap : public Graph::NodeMap<T> { };
marci@155
   386
//     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
marci@155
   387
  
marci@155
   388
//     void setGraph(Graph& _graph) { graph = &_graph; }
marci@155
   389
//     Graph& getGraph() { return (*graph); }
marci@155
   390
marci@155
   391
//     //SymGraphWrapper() : graph(0) { }
marci@155
   392
//     SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@155
   393
//   };
marci@155
   394
marci@155
   395
marci@155
   396
  template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
marci@155
   397
  class ResGraphWrapper {
marci@76
   398
  public:
marci@76
   399
    typedef Graph BaseGraph;
marci@174
   400
    typedef typename Graph::Node Node;
marci@155
   401
    typedef typename Graph::NodeIt NodeIt;
marci@155
   402
  private:
marci@155
   403
    typedef typename Graph::OutEdgeIt OldOutEdgeIt;
marci@155
   404
    typedef typename Graph::InEdgeIt OldInEdgeIt;
marci@199
   405
  protected:
marci@174
   406
    const Graph* graph;
marci@155
   407
    FlowMap* flow;
marci@155
   408
    const CapacityMap* capacity;
marci@155
   409
  public:
marci@168
   410
marci@155
   411
    ResGraphWrapper(const Graph& _G, FlowMap& _flow, 
marci@155
   412
	     const CapacityMap& _capacity) : 
marci@174
   413
      graph(&_G), flow(&_flow), capacity(&_capacity) { }
marci@168
   414
marci@168
   415
    void setGraph(const Graph& _graph) { graph = &_graph; }
marci@174
   416
    const Graph& getGraph() const { return (*graph); }
marci@168
   417
marci@174
   418
    class Edge; 
marci@155
   419
    class OutEdgeIt; 
marci@174
   420
    friend class Edge; 
marci@155
   421
    friend class OutEdgeIt; 
marci@76
   422
marci@174
   423
    class Edge {
marci@155
   424
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@155
   425
    protected:
marci@168
   426
      bool out_or_in; //true, iff out
marci@155
   427
      OldOutEdgeIt out;
marci@155
   428
      OldInEdgeIt in;
marci@155
   429
    public:
marci@174
   430
      Edge() : out_or_in(true) { } 
marci@174
   431
      Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
marci@168
   432
//       bool valid() const { 
marci@168
   433
// 	return out_or_in && out.valid() || in.valid(); }
marci@174
   434
      friend bool operator==(const Edge& u, const Edge& v) { 
marci@174
   435
	if (v.out_or_in) 
marci@174
   436
	  return (u.out_or_in && u.out==v.out);
marci@174
   437
	else
marci@174
   438
	  return (!u.out_or_in && u.in==v.in);
marci@174
   439
      } 
marci@174
   440
      friend bool operator!=(const Edge& u, const Edge& v) { 
marci@174
   441
	if (v.out_or_in) 
marci@174
   442
	  return (!u.out_or_in || u.out!=v.out);
marci@174
   443
	else
marci@174
   444
	  return (u.out_or_in || u.in!=v.in);
marci@174
   445
      } 
marci@155
   446
    };
marci@155
   447
marci@155
   448
marci@174
   449
    class OutEdgeIt : public Edge {
marci@155
   450
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@155
   451
    public:
marci@155
   452
      OutEdgeIt() { }
marci@168
   453
      //FIXME
marci@174
   454
      OutEdgeIt(const Edge& e) : Edge(e) { }
marci@174
   455
      OutEdgeIt(const Invalid& i) : Edge(i) { }
marci@155
   456
    private:
marci@174
   457
      OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() { 
marci@174
   458
	resG.graph->/*getF*/first(out, v);
marci@174
   459
	while( resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
marci@174
   460
	if (!resG.graph->valid(out)) {
marci@155
   461
	  out_or_in=0;
marci@174
   462
	  resG.graph->/*getF*/first(in, v);
marci@174
   463
	  while( resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
marci@155
   464
	}
marci@155
   465
      }
marci@168
   466
//     public:
marci@168
   467
//       OutEdgeIt& operator++() { 
marci@168
   468
// 	if (out_or_in) {
marci@174
   469
// 	  Node v=/*resG->*/G->aNode(out);
marci@168
   470
// 	  ++out;
marci@174
   471
// 	  while( out.valid() && !(Edge::free()>0) ) { ++out; }
marci@168
   472
// 	  if (!out.valid()) {
marci@168
   473
// 	    out_or_in=0;
marci@174
   474
// 	    G->/*getF*/first(in, v); 
marci@174
   475
// 	    while( in.valid() && !(Edge::free()>0) ) { ++in; }
marci@168
   476
// 	  }
marci@168
   477
// 	} else {
marci@168
   478
// 	  ++in;
marci@174
   479
// 	  while( in.valid() && !(Edge::free()>0) ) { ++in; } 
marci@168
   480
// 	}
marci@168
   481
// 	return *this; 
marci@168
   482
//       }
marci@155
   483
    };
marci@155
   484
marci@174
   485
    class EdgeIt : public Edge {
marci@155
   486
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@174
   487
      typename Graph::NodeIt v;
marci@155
   488
    public:
marci@174
   489
      EdgeIt() { }
marci@174
   490
      //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
marci@174
   491
      EdgeIt(const Invalid& i) : Edge(i) { }
marci@174
   492
      EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() { 
marci@174
   493
	resG.graph->/*getF*/first(v);
marci@174
   494
	if (resG.graph->valid(v)) resG.graph->/*getF*/first(out, v); else out=OldOutEdgeIt(INVALID);
marci@174
   495
	while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
marci@174
   496
	while (resG.graph->valid(v) && !resG.graph->valid(out)) { 
marci@174
   497
	  resG.graph->next(v); 
marci@174
   498
	  if (resG.graph->valid(v)) resG.graph->/*getF*/first(out, v); 
marci@174
   499
	  while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
marci@155
   500
	}
marci@174
   501
	if (!resG.graph->valid(out)) {
marci@155
   502
	  out_or_in=0;
marci@174
   503
	  resG.graph->/*getF*/first(v);
marci@174
   504
	  if (resG.graph->valid(v)) resG.graph->/*getF*/first(in, v); else in=OldInEdgeIt(INVALID);
marci@174
   505
	  while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
marci@174
   506
	  while (resG.graph->valid(v) && !resG.graph->valid(in)) { 
marci@174
   507
	    resG.graph->next(v); 
marci@174
   508
	    if (resG.graph->valid(v)) resG.graph->/*getF*/first(in, v); 
marci@174
   509
	    while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
marci@155
   510
	  }
marci@155
   511
	}
marci@155
   512
      }
marci@174
   513
//       EdgeIt& operator++() { 
marci@168
   514
// 	if (out_or_in) {
marci@168
   515
// 	  ++out;
marci@174
   516
// 	  while (out.valid() && !(Edge::free()>0) ) { ++out; }
marci@168
   517
// 	  while (v.valid() && !out.valid()) { 
marci@168
   518
// 	    ++v; 
marci@174
   519
// 	    if (v.valid()) G->/*getF*/first(out, v); 
marci@174
   520
// 	    while (out.valid() && !(Edge::free()>0) ) { ++out; }
marci@168
   521
// 	  }
marci@168
   522
// 	  if (!out.valid()) {
marci@168
   523
// 	    out_or_in=0;
marci@174
   524
// 	    G->/*getF*/first(v);
marci@174
   525
// 	    if (v.valid()) G->/*getF*/first(in, v); else in=OldInEdgeIt();
marci@174
   526
// 	    while (in.valid() && !(Edge::free()>0) ) { ++in; }
marci@168
   527
// 	    while (v.valid() && !in.valid()) { 
marci@168
   528
// 	      ++v; 
marci@174
   529
// 	      if (v.valid()) G->/*getF*/first(in, v); 
marci@174
   530
// 	      while (in.valid() && !(Edge::free()>0) ) { ++in; }
marci@168
   531
// 	    }  
marci@168
   532
// 	  }
marci@168
   533
// 	} else {
marci@168
   534
// 	  ++in;
marci@174
   535
// 	  while (in.valid() && !(Edge::free()>0) ) { ++in; }
marci@168
   536
// 	  while (v.valid() && !in.valid()) { 
marci@168
   537
// 	    ++v; 
marci@174
   538
// 	    if (v.valid()) G->/*getF*/first(in, v); 
marci@174
   539
// 	    while (in.valid() && !(Edge::free()>0) ) { ++in; }
marci@168
   540
// 	  }
marci@168
   541
// 	}
marci@168
   542
// 	return *this;
marci@168
   543
//       }
marci@155
   544
    };
marci@155
   545
marci@174
   546
    NodeIt& /*getF*/first(NodeIt& v) const { return graph->/*getF*/first(v); }
marci@174
   547
    OutEdgeIt& /*getF*/first(OutEdgeIt& e, Node v) const { 
marci@168
   548
      e=OutEdgeIt(*this, v); 
marci@174
   549
      return e;
marci@155
   550
    }
marci@174
   551
    EdgeIt& /*getF*/first(EdgeIt& e) const { 
marci@174
   552
      e=EdgeIt(*this); 
marci@174
   553
      return e;
marci@155
   554
    }
marci@155
   555
   
marci@174
   556
    NodeIt& next(NodeIt& n) const { return graph->next(n); }
marci@155
   557
marci@155
   558
    OutEdgeIt& next(OutEdgeIt& e) const { 
marci@155
   559
      if (e.out_or_in) {
marci@174
   560
	Node v=graph->aNode(e.out);
marci@174
   561
	graph->next(e.out);
marci@174
   562
	while( graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
marci@174
   563
	if (!graph->valid(e.out)) {
marci@155
   564
	  e.out_or_in=0;
marci@174
   565
	  graph->/*getF*/first(e.in, v); 
marci@174
   566
	  while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
marci@155
   567
	}
marci@155
   568
      } else {
marci@174
   569
	graph->next(e.in);
marci@174
   570
	while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } 
marci@155
   571
      }
marci@155
   572
      return e;
marci@155
   573
    }
marci@155
   574
marci@174
   575
    EdgeIt& next(EdgeIt& e) const { 
marci@155
   576
      if (e.out_or_in) {
marci@174
   577
	graph->next(e.out);
marci@174
   578
	while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
marci@174
   579
	  while (graph->valid(e.v) && !graph->valid(e.out)) { 
marci@174
   580
	    graph->next(e.v); 
marci@174
   581
	    if (graph->valid(e.v)) graph->/*getF*/first(e.out, e.v); 
marci@174
   582
	    while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
marci@155
   583
	  }
marci@174
   584
	  if (!graph->valid(e.out)) {
marci@155
   585
	    e.out_or_in=0;
marci@174
   586
	    graph->/*getF*/first(e.v);
marci@174
   587
	    if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v); else e.in=OldInEdgeIt(INVALID);
marci@174
   588
	    while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
marci@174
   589
	    while (graph->valid(e.v) && !graph->valid(e.in)) { 
marci@174
   590
	      graph->next(e.v); 
marci@174
   591
	      if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v); 
marci@174
   592
	      while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
marci@155
   593
	    }  
marci@155
   594
	  }
marci@155
   595
	} else {
marci@174
   596
	  graph->next(e.in);
marci@174
   597
	  while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
marci@174
   598
	  while (graph->valid(e.v) && !graph->valid(e.in)) { 
marci@174
   599
	    graph->next(e.v); 
marci@174
   600
	    if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v); 
marci@174
   601
	    while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
marci@155
   602
	  }
marci@155
   603
	}
marci@155
   604
	return e;
marci@155
   605
      }
marci@76
   606
    
marci@76
   607
marci@155
   608
    template< typename It >
marci@155
   609
    It first() const { 
marci@155
   610
      It e;
marci@174
   611
      /*getF*/first(e);
marci@155
   612
      return e; 
marci@155
   613
    }
marci@76
   614
marci@155
   615
    template< typename It >
marci@174
   616
    It first(Node v) const { 
marci@155
   617
      It e;
marci@174
   618
      /*getF*/first(e, v);
marci@155
   619
      return e; 
marci@155
   620
    }
marci@76
   621
marci@174
   622
    Node tail(Edge e) const { 
marci@174
   623
      return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
marci@174
   624
    Node head(Edge e) const { 
marci@174
   625
      return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
marci@76
   626
marci@174
   627
    Node aNode(OutEdgeIt e) const { 
marci@174
   628
      return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
marci@174
   629
    Node bNode(OutEdgeIt e) const { 
marci@174
   630
      return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
marci@76
   631
marci@174
   632
    int id(Node v) const { return graph->id(v); }
marci@155
   633
marci@174
   634
    bool valid(Node n) const { return graph->valid(n); }
marci@174
   635
    bool valid(Edge e) const { 
marci@174
   636
      return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
marci@155
   637
marci@174
   638
    void augment(const Edge& e, Number a) const {
marci@168
   639
      if (e.out_or_in)  
marci@168
   640
	flow->set(e.out, flow->get(e.out)+a);
marci@168
   641
      else  
marci@168
   642
	flow->set(e.in, flow->get(e.in)-a);
marci@168
   643
    }
marci@168
   644
marci@174
   645
    Number free(const Edge& e) const { 
marci@168
   646
      if (e.out_or_in) 
marci@168
   647
	return (capacity->get(e.out)-flow->get(e.out)); 
marci@168
   648
      else 
marci@168
   649
	return (flow->get(e.in)); 
marci@168
   650
    }
marci@168
   651
marci@168
   652
    Number free(OldOutEdgeIt out) const { 
marci@168
   653
      return (capacity->get(out)-flow->get(out)); 
marci@168
   654
    }
marci@168
   655
    
marci@168
   656
    Number free(OldInEdgeIt in) const { 
marci@168
   657
      return (flow->get(in)); 
marci@168
   658
    }
marci@168
   659
marci@155
   660
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@155
   661
    public:
marci@155
   662
      NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) 
marci@158
   663
	: Graph::NodeMap<T>(_G.getGraph()) { }
marci@155
   664
      NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, 
marci@158
   665
	      T a) : Graph::NodeMap<T>(_G.getGraph(), a) { }
marci@155
   666
    };
marci@155
   667
marci@155
   668
//     template <typename T>
marci@155
   669
//     class NodeMap {
marci@155
   670
//       typename Graph::NodeMap<T> node_map; 
marci@155
   671
//     public:
marci@174
   672
//       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
marci@174
   673
//       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
marci@174
   674
//       void set(Node nit, T a) { node_map.set(nit, a); }
marci@174
   675
//       T get(Node nit) const { return node_map.get(nit); }
marci@155
   676
//     };
marci@155
   677
marci@155
   678
    template <typename T>
marci@155
   679
    class EdgeMap {
marci@155
   680
      typename Graph::EdgeMap<T> forward_map, backward_map; 
marci@155
   681
    public:
marci@158
   682
      EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(_G.getGraph()), backward_map(_G.getGraph()) { }
marci@158
   683
      EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(_G.getGraph(), a), backward_map(_G.getGraph(), a) { }
marci@174
   684
      void set(Edge e, T a) { 
marci@155
   685
	if (e.out_or_in) 
marci@155
   686
	  forward_map.set(e.out, a); 
marci@155
   687
	else 
marci@155
   688
	  backward_map.set(e.in, a); 
marci@155
   689
      }
marci@174
   690
      T get(Edge e) { 
marci@155
   691
	if (e.out_or_in) 
marci@155
   692
	  return forward_map.get(e.out); 
marci@155
   693
	else 
marci@155
   694
	  return backward_map.get(e.in); 
marci@155
   695
      }
marci@155
   696
    };
marci@168
   697
  };
marci@168
   698
marci@168
   699
  template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
marci@168
   700
  class ErasingResGraphWrapper : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
marci@168
   701
  protected:
marci@168
   702
    ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
marci@168
   703
    //ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
marci@168
   704
  public:
marci@168
   705
    ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow, 
marci@168
   706
			   const CapacityMap& _capacity) : 
marci@168
   707
      ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), 
marci@168
   708
      first_out_edges(*this) /*, dist(*this)*/ { 
marci@174
   709
      for(NodeIt n=this->template first<NodeIt>(); this->valid(n); this->next(n)) {
marci@168
   710
	OutEdgeIt e;
marci@174
   711
	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(e, n);
marci@168
   712
	first_out_edges.set(n, e);
marci@168
   713
      }
marci@168
   714
    }
marci@168
   715
marci@168
   716
    //void setGraph(Graph& _graph) { graph = &_graph; }
marci@168
   717
    //Graph& getGraph() const { return (*graph); }
marci@168
   718
  
marci@168
   719
    //TrivGraphWrapper() : graph(0) { }
marci@168
   720
    //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@168
   721
marci@168
   722
    //typedef Graph BaseGraph;
marci@168
   723
marci@174
   724
    //typedef typename Graph::Node Node;
marci@168
   725
    //typedef typename Graph::NodeIt NodeIt;
marci@168
   726
marci@174
   727
    //typedef typename Graph::Edge Edge;
marci@168
   728
    //typedef typename Graph::OutEdgeIt OutEdgeIt;
marci@168
   729
    //typedef typename Graph::InEdgeIt InEdgeIt;
marci@168
   730
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   731
    //typedef typename Graph::EdgeIt EdgeIt;
marci@168
   732
marci@174
   733
    typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
marci@168
   734
    typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
marci@168
   735
marci@174
   736
    typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
marci@168
   737
    typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
marci@168
   738
    //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
marci@168
   739
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   740
    //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
marci@168
   741
marci@174
   742
    NodeIt& /*getF*/first(NodeIt& n) const { 
marci@174
   743
      return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(n);
marci@168
   744
    }
marci@168
   745
marci@174
   746
    OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const { 
marci@168
   747
      e=first_out_edges.get(n);
marci@168
   748
      return e;
marci@168
   749
    }
marci@168
   750
    
marci@174
   751
    //ROSSZ template<typename I> I& /*getF*/first(I& i) const { return /*getF*/first(i); }
marci@174
   752
    //ROSSZ template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
   753
    //  return /*getF*/first(i, p); }
marci@168
   754
    
marci@168
   755
    //template<typename I> I getNext(const I& i) const { 
marci@168
   756
    //  return graph->getNext(i); }
marci@168
   757
    //template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@168
   758
marci@168
   759
    template< typename It > It first() const { 
marci@174
   760
      It e; /*getF*/first(e); return e; }
marci@168
   761
marci@174
   762
    template< typename It > It first(const Node& v) const { 
marci@174
   763
      It e; /*getF*/first(e, v); return e; }
marci@168
   764
marci@174
   765
    //Node head(const Edge& e) const { return graph->head(e); }
marci@174
   766
    //Node tail(const Edge& e) const { return graph->tail(e); }
marci@168
   767
marci@168
   768
    //template<typename I> bool valid(const I& i) const 
marci@168
   769
    //  { return graph->valid(i); }
marci@168
   770
  
marci@168
   771
    //int nodeNum() const { return graph->nodeNum(); }
marci@168
   772
    //int edgeNum() const { return graph->edgeNum(); }
marci@168
   773
  
marci@174
   774
    //template<typename I> Node aNode(const I& e) const { 
marci@168
   775
    //  return graph->aNode(e); }
marci@174
   776
    //template<typename I> Node bNode(const I& e) const { 
marci@168
   777
    //  return graph->bNode(e); }
marci@168
   778
  
marci@174
   779
    //Node addNode() const { return graph->addNode(); }
marci@174
   780
    //Edge addEdge(const Node& tail, const Node& head) const { 
marci@168
   781
    //  return graph->addEdge(tail, head); }
marci@168
   782
  
marci@168
   783
    //void erase(const OutEdgeIt& e) {
marci@168
   784
    //  first_out_edge(this->tail(e))=e;
marci@168
   785
    //}
marci@174
   786
    void erase(const Edge& e) {
marci@168
   787
      OutEdgeIt f(e);
marci@168
   788
      next(f);
marci@168
   789
      first_out_edges.set(this->tail(e), f);
marci@168
   790
    }
marci@168
   791
    //template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@168
   792
  
marci@168
   793
    //void clear() const { graph->clear(); }
marci@168
   794
    
marci@168
   795
    template<typename T> class NodeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> { 
marci@168
   796
    public:
marci@168
   797
      NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : 
marci@168
   798
	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
marci@168
   799
      NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : 
marci@168
   800
	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
marci@168
   801
    };
marci@168
   802
marci@168
   803
    template<typename T> class EdgeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> { 
marci@168
   804
    public:
marci@168
   805
      EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : 
marci@168
   806
	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
marci@168
   807
      EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : 
marci@168
   808
	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
marci@168
   809
    };
marci@168
   810
  };
marci@168
   811
marci@168
   812
  template<typename GraphWrapper> 
marci@168
   813
  class FilterGraphWrapper {
marci@168
   814
  };
marci@168
   815
marci@168
   816
  template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
marci@168
   817
  class FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
marci@168
   818
marci@168
   819
    //Graph* graph;
marci@168
   820
  
marci@168
   821
  public:
marci@168
   822
    //typedef Graph BaseGraph;
marci@168
   823
marci@174
   824
    typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
marci@168
   825
    typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
marci@168
   826
marci@174
   827
    typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
marci@168
   828
    typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
marci@168
   829
    //typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
marci@168
   830
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   831
    typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
marci@168
   832
marci@168
   833
    //FilterGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
marci@168
   834
    
marci@168
   835
  public:
marci@168
   836
    FilterGraphWrapper(const Graph& _G, FlowMap& _flow, 
marci@168
   837
			   const CapacityMap& _capacity) : 
marci@199
   838
      ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), dist(*this, graph->nodeNum()) { 
marci@168
   839
    }
marci@168
   840
marci@174
   841
    OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const {
marci@174
   842
      ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(e, n);
marci@199
   843
      while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e)))) 
marci@168
   844
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
marci@168
   845
      return e;
marci@168
   846
    }
marci@168
   847
marci@174
   848
    NodeIt& next(NodeIt& e) const {
marci@168
   849
      return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
marci@168
   850
    }
marci@168
   851
marci@168
   852
    OutEdgeIt& next(OutEdgeIt& e) const {
marci@168
   853
      ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
marci@199
   854
      while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e)))) 
marci@168
   855
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
marci@168
   856
      return e;
marci@168
   857
    }
marci@168
   858
marci@174
   859
    NodeIt& /*getF*/first(NodeIt& n) const {
marci@174
   860
      return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(n);
marci@168
   861
    }
marci@168
   862
marci@174
   863
    void erase(const Edge& e) {
marci@168
   864
      OutEdgeIt f(e);
marci@168
   865
      ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
marci@199
   866
      while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f)))) 
marci@168
   867
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
marci@168
   868
      first_out_edges.set(this->tail(e), f);
marci@168
   869
    }
marci@168
   870
marci@168
   871
    //TrivGraphWrapper() : graph(0) { }
marci@168
   872
    //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@168
   873
marci@168
   874
    //void setGraph(Graph& _graph) { graph = &_graph; }
marci@168
   875
    //Graph& getGraph() const { return (*graph); }
marci@168
   876
    
marci@174
   877
    //template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
marci@174
   878
    //template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const { 
marci@174
   879
    //  return graph->/*getF*/first(i, p); }
marci@168
   880
    
marci@168
   881
    //template<typename I> I getNext(const I& i) const { 
marci@168
   882
    //  return graph->getNext(i); }
marci@168
   883
    //template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@168
   884
marci@168
   885
    template< typename It > It first() const { 
marci@174
   886
      It e; /*getF*/first(e); return e; }
marci@168
   887
marci@174
   888
    template< typename It > It first(const Node& v) const { 
marci@174
   889
      It e; /*getF*/first(e, v); return e; }
marci@168
   890
marci@174
   891
    //Node head(const Edge& e) const { return graph->head(e); }
marci@174
   892
    //Node tail(const Edge& e) const { return graph->tail(e); }
marci@168
   893
marci@168
   894
    //template<typename I> bool valid(const I& i) const 
marci@168
   895
    //  { return graph->valid(i); }
marci@168
   896
  
marci@168
   897
    //template<typename I> void setInvalid(const I &i);
marci@168
   898
    //{ return graph->setInvalid(i); }
marci@168
   899
marci@168
   900
    //int nodeNum() const { return graph->nodeNum(); }
marci@168
   901
    //int edgeNum() const { return graph->edgeNum(); }
marci@168
   902
  
marci@174
   903
    //template<typename I> Node aNode(const I& e) const { 
marci@168
   904
    //  return graph->aNode(e); }
marci@174
   905
    //template<typename I> Node bNode(const I& e) const { 
marci@168
   906
    //  return graph->bNode(e); }
marci@168
   907
  
marci@174
   908
    //Node addNode() const { return graph->addNode(); }
marci@174
   909
    //Edge addEdge(const Node& tail, const Node& head) const { 
marci@168
   910
    //  return graph->addEdge(tail, head); }
marci@168
   911
  
marci@168
   912
    //template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@168
   913
  
marci@168
   914
    //void clear() const { graph->clear(); }
marci@168
   915
    
marci@168
   916
    template<typename T> class NodeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> { 
marci@168
   917
    public:
marci@168
   918
      NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) : 
marci@168
   919
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
marci@168
   920
      NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) : 
marci@168
   921
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
marci@168
   922
    };
marci@168
   923
marci@168
   924
    template<typename T> class EdgeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> { 
marci@168
   925
    public:
marci@168
   926
      EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) : 
marci@168
   927
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
marci@168
   928
      EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) : 
marci@168
   929
	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
marci@168
   930
    };
marci@168
   931
marci@168
   932
  public:
marci@168
   933
    ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
marci@155
   934
marci@76
   935
  };
marci@76
   936
marci@76
   937
marci@148
   938
marci@148
   939
// // FIXME: comparison should be made better!!!
marci@148
   940
//   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
marci@148
   941
//   class ResGraphWrapper
marci@148
   942
//   {
marci@148
   943
//     Graph* graph;
marci@76
   944
  
marci@148
   945
//   public:
marci@148
   946
//     typedef Graph BaseGraph;
marci@76
   947
marci@174
   948
//     typedef typename Graph::Node Node;
marci@174
   949
//     typedef typename Graph::Edge Edge;
marci@174
   950
  
marci@148
   951
//     typedef typename Graph::NodeIt NodeIt;
marci@76
   952
   
marci@148
   953
//     class OutEdgeIt {
marci@148
   954
//     public:
marci@174
   955
//       //Graph::Node n;
marci@148
   956
//       bool out_or_in;
marci@148
   957
//       typename Graph::OutEdgeIt o;
marci@148
   958
//       typename Graph::InEdgeIt i;   
marci@148
   959
//     };
marci@148
   960
//     class InEdgeIt {
marci@148
   961
//     public:
marci@174
   962
//       //Graph::Node n;
marci@148
   963
//       bool out_or_in;
marci@148
   964
//       typename Graph::OutEdgeIt o;
marci@148
   965
//       typename Graph::InEdgeIt i;   
marci@148
   966
//     };
marci@148
   967
//     typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@174
   968
//     typedef typename Graph::EdgeIt EdgeIt;
marci@76
   969
marci@148
   970
//     int nodeNum() const { return graph->nodeNum(); }
marci@148
   971
//     int edgeNum() const { return graph->edgeNum(); }
marci@76
   972
marci@174
   973
//     Node& /*getF*/first(Node& n) const { return graph->/*getF*/first(n); }
marci@76
   974
marci@174
   975
//     // Edge and SymEdge  is missing!!!!
marci@174
   976
//     // Edge <-> In/OutEdgeIt conversion is missing!!!!
marci@76
   977
marci@148
   978
//     //FIXME
marci@174
   979
//     OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const 
marci@148
   980
//       {
marci@148
   981
// 	e.n=n;
marci@174
   982
// 	graph->/*getF*/first(e.o,n);
marci@148
   983
// 	while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
marci@148
   984
// 	  graph->goNext(e.o);
marci@148
   985
// 	if(!graph->valid(e.o)) {
marci@174
   986
// 	  graph->/*getF*/first(e.i,n);
marci@148
   987
// 	  while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
marci@148
   988
// 	    graph->goNext(e.i);
marci@148
   989
// 	}
marci@148
   990
// 	return e;
marci@148
   991
//       }
marci@148
   992
// /*
marci@148
   993
//   OutEdgeIt &goNext(OutEdgeIt &e)
marci@148
   994
//   {
marci@148
   995
//   if(graph->valid(e.o)) {
marci@148
   996
//   while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
marci@148
   997
//   graph->goNext(e.o);
marci@148
   998
//   if(graph->valid(e.o)) return e;
marci@174
   999
//   else graph->/*getF*/first(e.i,e.n);
marci@148
  1000
//   }
marci@148
  1001
//   else {
marci@148
  1002
//   while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
marci@148
  1003
//   graph->goNext(e.i);
marci@148
  1004
//   return e;
marci@148
  1005
//   }
marci@148
  1006
//   }
marci@148
  1007
//   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
marci@148
  1008
// */
marci@148
  1009
//     //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);}
marci@76
  1010
marci@148
  1011
//     //FIXME
marci@174
  1012
//     InEdgeIt& /*getF*/first(InEdgeIt& e, const Node& n) const 
marci@148
  1013
//       {
marci@148
  1014
// 	e.n=n;
marci@174
  1015
// 	graph->/*getF*/first(e.i,n);
marci@148
  1016
// 	while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
marci@148
  1017
// 	  graph->goNext(e.i);
marci@148
  1018
// 	if(!graph->valid(e.i)) {
marci@174
  1019
// 	  graph->/*getF*/first(e.o,n);
marci@148
  1020
// 	  while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
marci@148
  1021
// 	    graph->goNext(e.o);
marci@148
  1022
// 	}
marci@148
  1023
// 	return e;
marci@148
  1024
//       }
marci@148
  1025
// /*
marci@148
  1026
//   InEdgeIt &goNext(InEdgeIt &e)
marci@148
  1027
//   {
marci@148
  1028
//   if(graph->valid(e.i)) {
marci@148
  1029
//   while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
marci@148
  1030
//   graph->goNext(e.i);
marci@148
  1031
//   if(graph->valid(e.i)) return e;
marci@174
  1032
//   else graph->/*getF*/first(e.o,e.n);
marci@148
  1033
//   }
marci@148
  1034
//   else {
marci@148
  1035
//   while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
marci@148
  1036
//   graph->goNext(e.o);
marci@148
  1037
//   return e;
marci@148
  1038
//   }
marci@148
  1039
//   }
marci@148
  1040
//   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
marci@148
  1041
// */
marci@148
  1042
//     //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);}
marci@76
  1043
marci@148
  1044
//     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
marci@148
  1045
//     //template<typename I> I next(const I i); { return graph->goNext(i); }
marci@76
  1046
marci@148
  1047
//     template< typename It > It first() const { 
marci@174
  1048
//       It e; /*getF*/first(e); return e; }
marci@76
  1049
marci@174
  1050
//     template< typename It > It first(Node v) const { 
marci@174
  1051
//       It e; /*getF*/first(e, v); return e; }
marci@76
  1052
marci@174
  1053
//     Node head(const Edge& e) const { return graph->head(e); }
marci@174
  1054
//     Node tail(const Edge& e) const { return graph->tail(e); }
marci@76
  1055
  
marci@174
  1056
//     template<typename I> Node aNode(const I& e) const { 
marci@148
  1057
//       return graph->aNode(e); }
marci@174
  1058
//     template<typename I> Node bNode(const I& e) const { 
marci@148
  1059
//       return graph->bNode(e); }
marci@76
  1060
  
marci@148
  1061
//     //template<typename I> bool valid(const I i);
marci@148
  1062
//     //{ return graph->valid(i); }
marci@76
  1063
  
marci@148
  1064
//     //template<typename I> void setInvalid(const I &i);
marci@148
  1065
//     //{ return graph->setInvalid(i); }
marci@76
  1066
  
marci@174
  1067
//     Node addNode() { return graph->addNode(); }
marci@174
  1068
//     Edge addEdge(const Node& tail, const Node& head) { 
marci@148
  1069
//       return graph->addEdge(tail, head); }
marci@76
  1070
  
marci@148
  1071
//     template<typename I> void erase(const I& i) { graph->erase(i); }
marci@76
  1072
  
marci@148
  1073
//     void clear() { graph->clear(); }
marci@76
  1074
  
marci@148
  1075
//     template<typename S> class NodeMap : public Graph::NodeMap<S> { };
marci@148
  1076
//     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
marci@76
  1077
  
marci@148
  1078
//     void setGraph(Graph& _graph) { graph = &_graph; }
marci@148
  1079
//     Graph& getGraph() { return (*graph); }
marci@76
  1080
marci@148
  1081
//     //ResGraphWrapper() : graph(0) { }
marci@148
  1082
//     ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@148
  1083
//   };
marci@76
  1084
alpar@105
  1085
} //namespace hugo
marci@76
  1086
marci@76
  1087
#endif //GRAPH_WRAPPER_H
marci@76
  1088