lemon/core.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 893 d395358592df
child 966 c8fce9beb46a
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

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