lemon/digraph_adaptor.h
author Balazs Dezso <deba@inf.elte.hu>
Sun, 30 Nov 2008 19:00:30 +0100
changeset 415 4b6112235fad
parent 414 05357da973ce
permissions -rw-r--r--
Improvements in graph adaptors (#67)

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