lemon/core.h
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 894 bb70ad62c95f
parent 639 72ac25ad276e
child 877 141f9c0db4a3
child 937 17e36e175725
permissions -rw-r--r--
Fix critical bug in preflow (#372)

The wrong transition between the bound decrease and highest active
heuristics caused the bug. The last node chosen in bound decrease mode
is used in the first iteration in highest active mode.
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@440
     5
 * Copyright (C) 2003-2009
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@501
    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) {
deba@220
   397
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
deba@220
   398
          nodeRefMap[it] = to.addNode();
deba@220
   399
        }
deba@220
   400
        for (typename From::ArcIt it(from); it != INVALID; ++it) {
deba@220
   401
          arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)],
deba@220
   402
                                    nodeRefMap[from.target(it)]);
deba@220
   403
        }
deba@220
   404
      }
deba@220
   405
    };
deba@220
   406
deba@220
   407
    template <typename Digraph>
deba@220
   408
    struct DigraphCopySelector<
deba@220
   409
      Digraph,
deba@220
   410
      typename enable_if<typename Digraph::BuildTag, void>::type>
deba@220
   411
    {
deba@220
   412
      template <typename From, typename NodeRefMap, typename ArcRefMap>
kpeter@282
   413
      static void copy(const From& from, Digraph &to,
deba@220
   414
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
deba@220
   415
        to.build(from, nodeRefMap, arcRefMap);
deba@220
   416
      }
deba@220
   417
    };
deba@220
   418
deba@220
   419
    template <typename Graph, typename Enable = void>
deba@220
   420
    struct GraphCopySelector {
deba@220
   421
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
kpeter@282
   422
      static void copy(const From& from, Graph &to,
deba@220
   423
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
deba@220
   424
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
deba@220
   425
          nodeRefMap[it] = to.addNode();
deba@220
   426
        }
deba@220
   427
        for (typename From::EdgeIt it(from); it != INVALID; ++it) {
deba@220
   428
          edgeRefMap[it] = to.addEdge(nodeRefMap[from.u(it)],
deba@220
   429
                                      nodeRefMap[from.v(it)]);
deba@220
   430
        }
deba@220
   431
      }
deba@220
   432
    };
deba@220
   433
deba@220
   434
    template <typename Graph>
deba@220
   435
    struct GraphCopySelector<
deba@220
   436
      Graph,
deba@220
   437
      typename enable_if<typename Graph::BuildTag, void>::type>
deba@220
   438
    {
deba@220
   439
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
kpeter@282
   440
      static void copy(const From& from, Graph &to,
deba@220
   441
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
deba@220
   442
        to.build(from, nodeRefMap, edgeRefMap);
deba@220
   443
      }
deba@220
   444
    };
deba@220
   445
deba@220
   446
  }
deba@220
   447
deba@220
   448
  /// \brief Class to copy a digraph.
deba@220
   449
  ///
deba@220
   450
  /// Class to copy a digraph to another digraph (duplicate a digraph). The
kpeter@282
   451
  /// simplest way of using it is through the \c digraphCopy() function.
deba@220
   452
  ///
kpeter@282
   453
  /// This class not only make a copy of a digraph, but it can create
deba@220
   454
  /// references and cross references between the nodes and arcs of
kpeter@282
   455
  /// the two digraphs, and it can copy maps to use with the newly created
kpeter@282
   456
  /// digraph.
deba@220
   457
  ///
kpeter@282
   458
  /// To make a copy from a digraph, first an instance of DigraphCopy
kpeter@282
   459
  /// should be created, then the data belongs to the digraph should
deba@220
   460
  /// assigned to copy. In the end, the \c run() member should be
deba@220
   461
  /// called.
deba@220
   462
  ///
kpeter@282
   463
  /// The next code copies a digraph with several data:
deba@220
   464
  ///\code
kpeter@282
   465
  ///  DigraphCopy<OrigGraph, NewGraph> cg(orig_graph, new_graph);
kpeter@282
   466
  ///  // Create references for the nodes
deba@220
   467
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
kpeter@282
   468
  ///  cg.nodeRef(nr);
kpeter@282
   469
  ///  // Create cross references (inverse) for the arcs
deba@220
   470
  ///  NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph);
kpeter@282
   471
  ///  cg.arcCrossRef(acr);
kpeter@282
   472
  ///  // Copy an arc map
deba@220
   473
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
deba@220
   474
  ///  NewGraph::ArcMap<double> namap(new_graph);
kpeter@282
   475
  ///  cg.arcMap(oamap, namap);
kpeter@282
   476
  ///  // Copy a node
deba@220
   477
  ///  OrigGraph::Node on;
deba@220
   478
  ///  NewGraph::Node nn;
kpeter@282
   479
  ///  cg.node(on, nn);
kpeter@282
   480
  ///  // Execute copying
kpeter@282
   481
  ///  cg.run();
deba@220
   482
  ///\endcode
kpeter@282
   483
  template <typename From, typename To>
deba@220
   484
  class DigraphCopy {
deba@220
   485
  private:
deba@220
   486
deba@220
   487
    typedef typename From::Node Node;
deba@220
   488
    typedef typename From::NodeIt NodeIt;
deba@220
   489
    typedef typename From::Arc Arc;
deba@220
   490
    typedef typename From::ArcIt ArcIt;
deba@220
   491
deba@220
   492
    typedef typename To::Node TNode;
deba@220
   493
    typedef typename To::Arc TArc;
deba@220
   494
deba@220
   495
    typedef typename From::template NodeMap<TNode> NodeRefMap;
deba@220
   496
    typedef typename From::template ArcMap<TArc> ArcRefMap;
deba@220
   497
deba@220
   498
  public:
deba@220
   499
kpeter@282
   500
    /// \brief Constructor of DigraphCopy.
deba@220
   501
    ///
kpeter@282
   502
    /// Constructor of DigraphCopy for copying the content of the
kpeter@282
   503
    /// \c from digraph into the \c to digraph.
kpeter@282
   504
    DigraphCopy(const From& from, To& to)
deba@220
   505
      : _from(from), _to(to) {}
deba@220
   506
kpeter@282
   507
    /// \brief Destructor of DigraphCopy
deba@220
   508
    ///
kpeter@282
   509
    /// Destructor of DigraphCopy.
deba@220
   510
    ~DigraphCopy() {
deba@220
   511
      for (int i = 0; i < int(_node_maps.size()); ++i) {
deba@220
   512
        delete _node_maps[i];
deba@220
   513
      }
deba@220
   514
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
deba@220
   515
        delete _arc_maps[i];
deba@220
   516
      }
deba@220
   517
deba@220
   518
    }
deba@220
   519
kpeter@282
   520
    /// \brief Copy the node references into the given map.
deba@220
   521
    ///
kpeter@282
   522
    /// This function copies the node references into the given map.
kpeter@282
   523
    /// The parameter should be a map, whose key type is the Node type of
kpeter@282
   524
    /// the source digraph, while the value type is the Node type of the
kpeter@282
   525
    /// destination digraph.
deba@220
   526
    template <typename NodeRef>
deba@220
   527
    DigraphCopy& nodeRef(NodeRef& map) {
deba@220
   528
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
deba@220
   529
                           NodeRefMap, NodeRef>(map));
deba@220
   530
      return *this;
deba@220
   531
    }
deba@220
   532
kpeter@282
   533
    /// \brief Copy the node cross references into the given map.
deba@220
   534
    ///
kpeter@282
   535
    /// This function copies the node cross references (reverse references)
kpeter@282
   536
    /// into the given map. The parameter should be a map, whose key type
kpeter@282
   537
    /// is the Node type of the destination digraph, while the value type is
kpeter@282
   538
    /// the Node type of the source digraph.
deba@220
   539
    template <typename NodeCrossRef>
deba@220
   540
    DigraphCopy& nodeCrossRef(NodeCrossRef& map) {
deba@220
   541
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
deba@220
   542
                           NodeRefMap, NodeCrossRef>(map));
deba@220
   543
      return *this;
deba@220
   544
    }
deba@220
   545
kpeter@282
   546
    /// \brief Make a copy of the given node map.
deba@220
   547
    ///
kpeter@282
   548
    /// This function makes a copy of the given node map for the newly
kpeter@282
   549
    /// created digraph.
kpeter@282
   550
    /// The key type of the new map \c tmap should be the Node type of the
kpeter@282
   551
    /// destination digraph, and the key type of the original map \c map
kpeter@282
   552
    /// should be the Node type of the source digraph.
kpeter@282
   553
    template <typename FromMap, typename ToMap>
kpeter@282
   554
    DigraphCopy& nodeMap(const FromMap& map, ToMap& tmap) {
deba@220
   555
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
kpeter@282
   556
                           NodeRefMap, FromMap, ToMap>(map, tmap));
deba@220
   557
      return *this;
deba@220
   558
    }
deba@220
   559
deba@220
   560
    /// \brief Make a copy of the given node.
deba@220
   561
    ///
kpeter@282
   562
    /// This function makes a copy of the given node.
kpeter@282
   563
    DigraphCopy& node(const Node& node, TNode& tnode) {
deba@220
   564
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
kpeter@282
   565
                           NodeRefMap, TNode>(node, tnode));
deba@220
   566
      return *this;
deba@220
   567
    }
deba@220
   568
kpeter@282
   569
    /// \brief Copy the arc references into the given map.
deba@220
   570
    ///
kpeter@282
   571
    /// This function copies the arc references into the given map.
kpeter@282
   572
    /// The parameter should be a map, whose key type is the Arc type of
kpeter@282
   573
    /// the source digraph, while the value type is the Arc type of the
kpeter@282
   574
    /// destination digraph.
deba@220
   575
    template <typename ArcRef>
deba@220
   576
    DigraphCopy& arcRef(ArcRef& map) {
deba@220
   577
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
deba@220
   578
                          ArcRefMap, ArcRef>(map));
deba@220
   579
      return *this;
deba@220
   580
    }
deba@220
   581
kpeter@282
   582
    /// \brief Copy the arc cross references into the given map.
deba@220
   583
    ///
kpeter@282
   584
    /// This function copies the arc cross references (reverse references)
kpeter@282
   585
    /// into the given map. The parameter should be a map, whose key type
kpeter@282
   586
    /// is the Arc type of the destination digraph, while the value type is
kpeter@282
   587
    /// the Arc type of the source digraph.
deba@220
   588
    template <typename ArcCrossRef>
deba@220
   589
    DigraphCopy& arcCrossRef(ArcCrossRef& map) {
deba@220
   590
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
deba@220
   591
                          ArcRefMap, ArcCrossRef>(map));
deba@220
   592
      return *this;
deba@220
   593
    }
deba@220
   594
kpeter@282
   595
    /// \brief Make a copy of the given arc map.
deba@220
   596
    ///
kpeter@282
   597
    /// This function makes a copy of the given arc map for the newly
kpeter@282
   598
    /// created digraph.
kpeter@282
   599
    /// The key type of the new map \c tmap should be the Arc type of the
kpeter@282
   600
    /// destination digraph, and the key type of the original map \c map
kpeter@282
   601
    /// should be the Arc type of the source digraph.
kpeter@282
   602
    template <typename FromMap, typename ToMap>
kpeter@282
   603
    DigraphCopy& arcMap(const FromMap& map, ToMap& tmap) {
deba@220
   604
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
kpeter@282
   605
                          ArcRefMap, FromMap, ToMap>(map, tmap));
deba@220
   606
      return *this;
deba@220
   607
    }
deba@220
   608
deba@220
   609
    /// \brief Make a copy of the given arc.
deba@220
   610
    ///
kpeter@282
   611
    /// This function makes a copy of the given arc.
kpeter@282
   612
    DigraphCopy& arc(const Arc& arc, TArc& tarc) {
deba@220
   613
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
kpeter@282
   614
                          ArcRefMap, TArc>(arc, tarc));
deba@220
   615
      return *this;
deba@220
   616
    }
deba@220
   617
kpeter@282
   618
    /// \brief Execute copying.
deba@220
   619
    ///
kpeter@282
   620
    /// This function executes the copying of the digraph along with the
kpeter@282
   621
    /// copying of the assigned data.
deba@220
   622
    void run() {
deba@220
   623
      NodeRefMap nodeRefMap(_from);
deba@220
   624
      ArcRefMap arcRefMap(_from);
deba@220
   625
      _core_bits::DigraphCopySelector<To>::
kpeter@282
   626
        copy(_from, _to, nodeRefMap, arcRefMap);
deba@220
   627
      for (int i = 0; i < int(_node_maps.size()); ++i) {
deba@220
   628
        _node_maps[i]->copy(_from, nodeRefMap);
deba@220
   629
      }
deba@220
   630
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
deba@220
   631
        _arc_maps[i]->copy(_from, arcRefMap);
deba@220
   632
      }
deba@220
   633
    }
deba@220
   634
deba@220
   635
  protected:
deba@220
   636
deba@220
   637
    const From& _from;
deba@220
   638
    To& _to;
deba@220
   639
deba@220
   640
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
kpeter@282
   641
      _node_maps;
deba@220
   642
deba@220
   643
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
kpeter@282
   644
      _arc_maps;
deba@220
   645
deba@220
   646
  };
deba@220
   647
deba@220
   648
  /// \brief Copy a digraph to another digraph.
deba@220
   649
  ///
kpeter@282
   650
  /// This function copies a digraph to another digraph.
kpeter@282
   651
  /// The complete usage of it is detailed in the DigraphCopy class, but
kpeter@282
   652
  /// a short example shows a basic work:
deba@220
   653
  ///\code
kpeter@282
   654
  /// digraphCopy(src, trg).nodeRef(nr).arcCrossRef(acr).run();
deba@220
   655
  ///\endcode
deba@220
   656
  ///
deba@220
   657
  /// After the copy the \c nr map will contain the mapping from the
deba@220
   658
  /// nodes of the \c from digraph to the nodes of the \c to digraph and
kpeter@282
   659
  /// \c acr will contain the mapping from the arcs of the \c to digraph
deba@220
   660
  /// to the arcs of the \c from digraph.
deba@220
   661
  ///
deba@220
   662
  /// \see DigraphCopy
kpeter@282
   663
  template <typename From, typename To>
kpeter@282
   664
  DigraphCopy<From, To> digraphCopy(const From& from, To& to) {
kpeter@282
   665
    return DigraphCopy<From, To>(from, to);
deba@220
   666
  }
deba@220
   667
deba@220
   668
  /// \brief Class to copy a graph.
deba@220
   669
  ///
deba@220
   670
  /// Class to copy a graph to another graph (duplicate a graph). The
kpeter@282
   671
  /// simplest way of using it is through the \c graphCopy() function.
deba@220
   672
  ///
kpeter@282
   673
  /// This class not only make a copy of a graph, but it can create
deba@220
   674
  /// references and cross references between the nodes, edges and arcs of
kpeter@282
   675
  /// the two graphs, and it can copy maps for using with the newly created
kpeter@282
   676
  /// graph.
deba@220
   677
  ///
deba@220
   678
  /// To make a copy from a graph, first an instance of GraphCopy
deba@220
   679
  /// should be created, then the data belongs to the graph should
deba@220
   680
  /// assigned to copy. In the end, the \c run() member should be
deba@220
   681
  /// called.
deba@220
   682
  ///
deba@220
   683
  /// The next code copies a graph with several data:
deba@220
   684
  ///\code
kpeter@282
   685
  ///  GraphCopy<OrigGraph, NewGraph> cg(orig_graph, new_graph);
kpeter@282
   686
  ///  // Create references for the nodes
deba@220
   687
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
kpeter@282
   688
  ///  cg.nodeRef(nr);
kpeter@282
   689
  ///  // Create cross references (inverse) for the edges
kpeter@282
   690
  ///  NewGraph::EdgeMap<OrigGraph::Edge> ecr(new_graph);
kpeter@282
   691
  ///  cg.edgeCrossRef(ecr);
kpeter@282
   692
  ///  // Copy an edge map
kpeter@282
   693
  ///  OrigGraph::EdgeMap<double> oemap(orig_graph);
kpeter@282
   694
  ///  NewGraph::EdgeMap<double> nemap(new_graph);
kpeter@282
   695
  ///  cg.edgeMap(oemap, nemap);
kpeter@282
   696
  ///  // Copy a node
deba@220
   697
  ///  OrigGraph::Node on;
deba@220
   698
  ///  NewGraph::Node nn;
kpeter@282
   699
  ///  cg.node(on, nn);
kpeter@282
   700
  ///  // Execute copying
kpeter@282
   701
  ///  cg.run();
deba@220
   702
  ///\endcode
kpeter@282
   703
  template <typename From, typename To>
deba@220
   704
  class GraphCopy {
deba@220
   705
  private:
deba@220
   706
deba@220
   707
    typedef typename From::Node Node;
deba@220
   708
    typedef typename From::NodeIt NodeIt;
deba@220
   709
    typedef typename From::Arc Arc;
deba@220
   710
    typedef typename From::ArcIt ArcIt;
deba@220
   711
    typedef typename From::Edge Edge;
deba@220
   712
    typedef typename From::EdgeIt EdgeIt;
deba@220
   713
deba@220
   714
    typedef typename To::Node TNode;
deba@220
   715
    typedef typename To::Arc TArc;
deba@220
   716
    typedef typename To::Edge TEdge;
deba@220
   717
deba@220
   718
    typedef typename From::template NodeMap<TNode> NodeRefMap;
deba@220
   719
    typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
deba@220
   720
deba@220
   721
    struct ArcRefMap {
kpeter@282
   722
      ArcRefMap(const From& from, const To& to,
deba@220
   723
                const EdgeRefMap& edge_ref, const NodeRefMap& node_ref)
kpeter@282
   724
        : _from(from), _to(to),
deba@220
   725
          _edge_ref(edge_ref), _node_ref(node_ref) {}
deba@220
   726
deba@220
   727
      typedef typename From::Arc Key;
deba@220
   728
      typedef typename To::Arc Value;
deba@220
   729
deba@220
   730
      Value operator[](const Key& key) const {
deba@220
   731
        bool forward = _from.u(key) != _from.v(key) ?
deba@220
   732
          _node_ref[_from.source(key)] ==
deba@220
   733
          _to.source(_to.direct(_edge_ref[key], true)) :
deba@220
   734
          _from.direction(key);
deba@220
   735
        return _to.direct(_edge_ref[key], forward);
deba@220
   736
      }
deba@220
   737
kpeter@282
   738
      const From& _from;
deba@220
   739
      const To& _to;
deba@220
   740
      const EdgeRefMap& _edge_ref;
deba@220
   741
      const NodeRefMap& _node_ref;
deba@220
   742
    };
deba@220
   743
deba@220
   744
  public:
deba@220
   745
kpeter@282
   746
    /// \brief Constructor of GraphCopy.
deba@220
   747
    ///
kpeter@282
   748
    /// Constructor of GraphCopy for copying the content of the
kpeter@282
   749
    /// \c from graph into the \c to graph.
kpeter@282
   750
    GraphCopy(const From& from, To& to)
deba@220
   751
      : _from(from), _to(to) {}
deba@220
   752
kpeter@282
   753
    /// \brief Destructor of GraphCopy
deba@220
   754
    ///
kpeter@282
   755
    /// Destructor of GraphCopy.
deba@220
   756
    ~GraphCopy() {
deba@220
   757
      for (int i = 0; i < int(_node_maps.size()); ++i) {
deba@220
   758
        delete _node_maps[i];
deba@220
   759
      }
deba@220
   760
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
deba@220
   761
        delete _arc_maps[i];
deba@220
   762
      }
deba@220
   763
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
deba@220
   764
        delete _edge_maps[i];
deba@220
   765
      }
deba@220
   766
    }
deba@220
   767
kpeter@282
   768
    /// \brief Copy the node references into the given map.
deba@220
   769
    ///
kpeter@282
   770
    /// This function copies the node references into the given map.
kpeter@282
   771
    /// The parameter should be a map, whose key type is the Node type of
kpeter@282
   772
    /// the source graph, while the value type is the Node type of the
kpeter@282
   773
    /// destination graph.
deba@220
   774
    template <typename NodeRef>
deba@220
   775
    GraphCopy& nodeRef(NodeRef& map) {
deba@220
   776
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
deba@220
   777
                           NodeRefMap, NodeRef>(map));
deba@220
   778
      return *this;
deba@220
   779
    }
deba@220
   780
kpeter@282
   781
    /// \brief Copy the node cross references into the given map.
deba@220
   782
    ///
kpeter@282
   783
    /// This function copies the node cross references (reverse references)
kpeter@282
   784
    /// into the given map. The parameter should be a map, whose key type
kpeter@282
   785
    /// is the Node type of the destination graph, while the value type is
kpeter@282
   786
    /// the Node type of the source graph.
deba@220
   787
    template <typename NodeCrossRef>
deba@220
   788
    GraphCopy& nodeCrossRef(NodeCrossRef& map) {
deba@220
   789
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
deba@220
   790
                           NodeRefMap, NodeCrossRef>(map));
deba@220
   791
      return *this;
deba@220
   792
    }
deba@220
   793
kpeter@282
   794
    /// \brief Make a copy of the given node map.
deba@220
   795
    ///
kpeter@282
   796
    /// This function makes a copy of the given node map for the newly
kpeter@282
   797
    /// created graph.
kpeter@282
   798
    /// The key type of the new map \c tmap should be the Node type of the
kpeter@282
   799
    /// destination graph, and the key type of the original map \c map
kpeter@282
   800
    /// should be the Node type of the source graph.
kpeter@282
   801
    template <typename FromMap, typename ToMap>
kpeter@282
   802
    GraphCopy& nodeMap(const FromMap& map, ToMap& tmap) {
deba@220
   803
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
kpeter@282
   804
                           NodeRefMap, FromMap, ToMap>(map, tmap));
deba@220
   805
      return *this;
deba@220
   806
    }
deba@220
   807
deba@220
   808
    /// \brief Make a copy of the given node.
deba@220
   809
    ///
kpeter@282
   810
    /// This function makes a copy of the given node.
kpeter@282
   811
    GraphCopy& node(const Node& node, TNode& tnode) {
deba@220
   812
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
kpeter@282
   813
                           NodeRefMap, TNode>(node, tnode));
deba@220
   814
      return *this;
deba@220
   815
    }
deba@220
   816
kpeter@282
   817
    /// \brief Copy the arc references into the given map.
deba@220
   818
    ///
kpeter@282
   819
    /// This function copies the arc references into the given map.
kpeter@282
   820
    /// The parameter should be a map, whose key type is the Arc type of
kpeter@282
   821
    /// the source graph, while the value type is the Arc type of the
kpeter@282
   822
    /// destination graph.
deba@220
   823
    template <typename ArcRef>
deba@220
   824
    GraphCopy& arcRef(ArcRef& map) {
deba@220
   825
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
deba@220
   826
                          ArcRefMap, ArcRef>(map));
deba@220
   827
      return *this;
deba@220
   828
    }
deba@220
   829
kpeter@282
   830
    /// \brief Copy the arc cross references into the given map.
deba@220
   831
    ///
kpeter@282
   832
    /// This function copies the arc cross references (reverse references)
kpeter@282
   833
    /// into the given map. The parameter should be a map, whose key type
kpeter@282
   834
    /// is the Arc type of the destination graph, while the value type is
kpeter@282
   835
    /// the Arc type of the source graph.
deba@220
   836
    template <typename ArcCrossRef>
deba@220
   837
    GraphCopy& arcCrossRef(ArcCrossRef& map) {
deba@220
   838
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
deba@220
   839
                          ArcRefMap, ArcCrossRef>(map));
deba@220
   840
      return *this;
deba@220
   841
    }
deba@220
   842
kpeter@282
   843
    /// \brief Make a copy of the given arc map.
deba@220
   844
    ///
kpeter@282
   845
    /// This function makes a copy of the given arc map for the newly
kpeter@282
   846
    /// created graph.
kpeter@282
   847
    /// The key type of the new map \c tmap should be the Arc type of the
kpeter@282
   848
    /// destination graph, and the key type of the original map \c map
kpeter@282
   849
    /// should be the Arc type of the source graph.
kpeter@282
   850
    template <typename FromMap, typename ToMap>
kpeter@282
   851
    GraphCopy& arcMap(const FromMap& map, ToMap& tmap) {
deba@220
   852
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
kpeter@282
   853
                          ArcRefMap, FromMap, ToMap>(map, tmap));
deba@220
   854
      return *this;
deba@220
   855
    }
deba@220
   856
deba@220
   857
    /// \brief Make a copy of the given arc.
deba@220
   858
    ///
kpeter@282
   859
    /// This function makes a copy of the given arc.
kpeter@282
   860
    GraphCopy& arc(const Arc& arc, TArc& tarc) {
deba@220
   861
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
kpeter@282
   862
                          ArcRefMap, TArc>(arc, tarc));
deba@220
   863
      return *this;
deba@220
   864
    }
deba@220
   865
kpeter@282
   866
    /// \brief Copy the edge references into the given map.
deba@220
   867
    ///
kpeter@282
   868
    /// This function copies the edge references into the given map.
kpeter@282
   869
    /// The parameter should be a map, whose key type is the Edge type of
kpeter@282
   870
    /// the source graph, while the value type is the Edge type of the
kpeter@282
   871
    /// destination graph.
deba@220
   872
    template <typename EdgeRef>
deba@220
   873
    GraphCopy& edgeRef(EdgeRef& map) {
deba@220
   874
      _edge_maps.push_back(new _core_bits::RefCopy<From, Edge,
deba@220
   875
                           EdgeRefMap, EdgeRef>(map));
deba@220
   876
      return *this;
deba@220
   877
    }
deba@220
   878
kpeter@282
   879
    /// \brief Copy the edge cross references into the given map.
deba@220
   880
    ///
kpeter@282
   881
    /// This function copies the edge cross references (reverse references)
kpeter@282
   882
    /// into the given map. The parameter should be a map, whose key type
kpeter@282
   883
    /// is the Edge type of the destination graph, while the value type is
kpeter@282
   884
    /// the Edge type of the source graph.
deba@220
   885
    template <typename EdgeCrossRef>
deba@220
   886
    GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
deba@220
   887
      _edge_maps.push_back(new _core_bits::CrossRefCopy<From,
deba@220
   888
                           Edge, EdgeRefMap, EdgeCrossRef>(map));
deba@220
   889
      return *this;
deba@220
   890
    }
deba@220
   891
kpeter@282
   892
    /// \brief Make a copy of the given edge map.
deba@220
   893
    ///
kpeter@282
   894
    /// This function makes a copy of the given edge map for the newly
kpeter@282
   895
    /// created graph.
kpeter@282
   896
    /// The key type of the new map \c tmap should be the Edge type of the
kpeter@282
   897
    /// destination graph, and the key type of the original map \c map
kpeter@282
   898
    /// should be the Edge type of the source graph.
kpeter@282
   899
    template <typename FromMap, typename ToMap>
kpeter@282
   900
    GraphCopy& edgeMap(const FromMap& map, ToMap& tmap) {
deba@220
   901
      _edge_maps.push_back(new _core_bits::MapCopy<From, Edge,
kpeter@282
   902
                           EdgeRefMap, FromMap, ToMap>(map, tmap));
deba@220
   903
      return *this;
deba@220
   904
    }
deba@220
   905
deba@220
   906
    /// \brief Make a copy of the given edge.
deba@220
   907
    ///
kpeter@282
   908
    /// This function makes a copy of the given edge.
kpeter@282
   909
    GraphCopy& edge(const Edge& edge, TEdge& tedge) {
deba@220
   910
      _edge_maps.push_back(new _core_bits::ItemCopy<From, Edge,
kpeter@282
   911
                           EdgeRefMap, TEdge>(edge, tedge));
deba@220
   912
      return *this;
deba@220
   913
    }
deba@220
   914
kpeter@282
   915
    /// \brief Execute copying.
deba@220
   916
    ///
kpeter@282
   917
    /// This function executes the copying of the graph along with the
kpeter@282
   918
    /// copying of the assigned data.
deba@220
   919
    void run() {
deba@220
   920
      NodeRefMap nodeRefMap(_from);
deba@220
   921
      EdgeRefMap edgeRefMap(_from);
kpeter@282
   922
      ArcRefMap arcRefMap(_from, _to, edgeRefMap, nodeRefMap);
deba@220
   923
      _core_bits::GraphCopySelector<To>::
kpeter@282
   924
        copy(_from, _to, nodeRefMap, edgeRefMap);
deba@220
   925
      for (int i = 0; i < int(_node_maps.size()); ++i) {
deba@220
   926
        _node_maps[i]->copy(_from, nodeRefMap);
deba@220
   927
      }
deba@220
   928
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
deba@220
   929
        _edge_maps[i]->copy(_from, edgeRefMap);
deba@220
   930
      }
deba@220
   931
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
deba@220
   932
        _arc_maps[i]->copy(_from, arcRefMap);
deba@220
   933
      }
deba@220
   934
    }
deba@220
   935
deba@220
   936
  private:
deba@220
   937
deba@220
   938
    const From& _from;
deba@220
   939
    To& _to;
deba@220
   940
deba@220
   941
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
kpeter@282
   942
      _node_maps;
deba@220
   943
deba@220
   944
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
kpeter@282
   945
      _arc_maps;
deba@220
   946
deba@220
   947
    std::vector<_core_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
kpeter@282
   948
      _edge_maps;
deba@220
   949
deba@220
   950
  };
deba@220
   951
deba@220
   952
  /// \brief Copy a graph to another graph.
deba@220
   953
  ///
kpeter@282
   954
  /// This function copies a graph to another graph.
kpeter@282
   955
  /// The complete usage of it is detailed in the GraphCopy class,
kpeter@282
   956
  /// but a short example shows a basic work:
deba@220
   957
  ///\code
kpeter@282
   958
  /// graphCopy(src, trg).nodeRef(nr).edgeCrossRef(ecr).run();
deba@220
   959
  ///\endcode
deba@220
   960
  ///
deba@220
   961
  /// After the copy the \c nr map will contain the mapping from the
deba@220
   962
  /// nodes of the \c from graph to the nodes of the \c to graph and
kpeter@282
   963
  /// \c ecr will contain the mapping from the edges of the \c to graph
kpeter@282
   964
  /// to the edges of the \c from graph.
deba@220
   965
  ///
deba@220
   966
  /// \see GraphCopy
kpeter@282
   967
  template <typename From, typename To>
kpeter@282
   968
  GraphCopy<From, To>
kpeter@282
   969
  graphCopy(const From& from, To& to) {
kpeter@282
   970
    return GraphCopy<From, To>(from, to);
deba@220
   971
  }
deba@220
   972
deba@220
   973
  namespace _core_bits {
deba@220
   974
deba@220
   975
    template <typename Graph, typename Enable = void>
deba@220
   976
    struct FindArcSelector {
deba@220
   977
      typedef typename Graph::Node Node;
deba@220
   978
      typedef typename Graph::Arc Arc;
deba@220
   979
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
deba@220
   980
        if (e == INVALID) {
deba@220
   981
          g.firstOut(e, u);
deba@220
   982
        } else {
deba@220
   983
          g.nextOut(e);
deba@220
   984
        }
deba@220
   985
        while (e != INVALID && g.target(e) != v) {
deba@220
   986
          g.nextOut(e);
deba@220
   987
        }
deba@220
   988
        return e;
deba@220
   989
      }
deba@220
   990
    };
deba@220
   991
deba@220
   992
    template <typename Graph>
deba@220
   993
    struct FindArcSelector<
deba@220
   994
      Graph,
kpeter@282
   995
      typename enable_if<typename Graph::FindArcTag, void>::type>
deba@220
   996
    {
deba@220
   997
      typedef typename Graph::Node Node;
deba@220
   998
      typedef typename Graph::Arc Arc;
deba@220
   999
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
deba@220
  1000
        return g.findArc(u, v, prev);
deba@220
  1001
      }
deba@220
  1002
    };
deba@220
  1003
  }
deba@220
  1004
kpeter@282
  1005
  /// \brief Find an arc between two nodes of a digraph.
deba@220
  1006
  ///
kpeter@282
  1007
  /// This function finds an arc from node \c u to node \c v in the
kpeter@282
  1008
  /// digraph \c g.
deba@220
  1009
  ///
deba@220
  1010
  /// If \c prev is \ref INVALID (this is the default value), then
deba@220
  1011
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
deba@220
  1012
  /// the next arc from \c u to \c v after \c prev.
deba@220
  1013
  /// \return The found arc or \ref INVALID if there is no such an arc.
deba@220
  1014
  ///
deba@220
  1015
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
deba@220
  1016
  ///\code
kpeter@282
  1017
  /// for(Arc e = findArc(g,u,v); e != INVALID; e = findArc(g,u,v,e)) {
deba@220
  1018
  ///   ...
deba@220
  1019
  /// }
deba@220
  1020
  ///\endcode
deba@220
  1021
  ///
kpeter@282
  1022
  /// \note \ref ConArcIt provides iterator interface for the same
kpeter@282
  1023
  /// functionality.
kpeter@282
  1024
  ///
deba@220
  1025
  ///\sa ConArcIt
kpeter@282
  1026
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
deba@220
  1027
  template <typename Graph>
deba@220
  1028
  inline typename Graph::Arc
deba@220
  1029
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
deba@220
  1030
          typename Graph::Arc prev = INVALID) {
deba@220
  1031
    return _core_bits::FindArcSelector<Graph>::find(g, u, v, prev);
deba@220
  1032
  }
deba@220
  1033
kpeter@282
  1034
  /// \brief Iterator for iterating on parallel arcs connecting the same nodes.
deba@220
  1035
  ///
kpeter@282
  1036
  /// Iterator for iterating on parallel arcs connecting the same nodes. It is
kpeter@282
  1037
  /// a higher level interface for the \ref findArc() function. You can
deba@220
  1038
  /// use it the following way:
deba@220
  1039
  ///\code
deba@220
  1040
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
deba@220
  1041
  ///   ...
deba@220
  1042
  /// }
deba@220
  1043
  ///\endcode
deba@220
  1044
  ///
deba@220
  1045
  ///\sa findArc()
kpeter@282
  1046
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
kpeter@559
  1047
  template <typename GR>
kpeter@559
  1048
  class ConArcIt : public GR::Arc {
kpeter@617
  1049
    typedef typename GR::Arc Parent;
kpeter@617
  1050
deba@220
  1051
  public:
deba@220
  1052
kpeter@617
  1053
    typedef typename GR::Arc Arc;
kpeter@617
  1054
    typedef typename GR::Node Node;
deba@220
  1055
deba@220
  1056
    /// \brief Constructor.
deba@220
  1057
    ///
kpeter@282
  1058
    /// Construct a new ConArcIt iterating on the arcs that
kpeter@282
  1059
    /// connects nodes \c u and \c v.
kpeter@617
  1060
    ConArcIt(const GR& g, Node u, Node v) : _graph(g) {
deba@220
  1061
      Parent::operator=(findArc(_graph, u, v));
deba@220
  1062
    }
deba@220
  1063
deba@220
  1064
    /// \brief Constructor.
deba@220
  1065
    ///
kpeter@282
  1066
    /// Construct a new ConArcIt that continues the iterating from arc \c a.
kpeter@617
  1067
    ConArcIt(const GR& g, Arc a) : Parent(a), _graph(g) {}
deba@220
  1068
deba@220
  1069
    /// \brief Increment operator.
deba@220
  1070
    ///
deba@220
  1071
    /// It increments the iterator and gives back the next arc.
deba@220
  1072
    ConArcIt& operator++() {
deba@220
  1073
      Parent::operator=(findArc(_graph, _graph.source(*this),
deba@220
  1074
                                _graph.target(*this), *this));
deba@220
  1075
      return *this;
deba@220
  1076
    }
deba@220
  1077
  private:
kpeter@617
  1078
    const GR& _graph;
deba@220
  1079
  };
deba@220
  1080
deba@220
  1081
  namespace _core_bits {
deba@220
  1082
deba@220
  1083
    template <typename Graph, typename Enable = void>
deba@220
  1084
    struct FindEdgeSelector {
deba@220
  1085
      typedef typename Graph::Node Node;
deba@220
  1086
      typedef typename Graph::Edge Edge;
deba@220
  1087
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
deba@220
  1088
        bool b;
deba@220
  1089
        if (u != v) {
deba@220
  1090
          if (e == INVALID) {
deba@220
  1091
            g.firstInc(e, b, u);
deba@220
  1092
          } else {
deba@220
  1093
            b = g.u(e) == u;
deba@220
  1094
            g.nextInc(e, b);
deba@220
  1095
          }
deba@220
  1096
          while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) {
deba@220
  1097
            g.nextInc(e, b);
deba@220
  1098
          }
deba@220
  1099
        } else {
deba@220
  1100
          if (e == INVALID) {
deba@220
  1101
            g.firstInc(e, b, u);
deba@220
  1102
          } else {
deba@220
  1103
            b = true;
deba@220
  1104
            g.nextInc(e, b);
deba@220
  1105
          }
deba@220
  1106
          while (e != INVALID && (!b || g.v(e) != v)) {
deba@220
  1107
            g.nextInc(e, b);
deba@220
  1108
          }
deba@220
  1109
        }
deba@220
  1110
        return e;
deba@220
  1111
      }
deba@220
  1112
    };
deba@220
  1113
deba@220
  1114
    template <typename Graph>
deba@220
  1115
    struct FindEdgeSelector<
deba@220
  1116
      Graph,
deba@220
  1117
      typename enable_if<typename Graph::FindEdgeTag, void>::type>
deba@220
  1118
    {
deba@220
  1119
      typedef typename Graph::Node Node;
deba@220
  1120
      typedef typename Graph::Edge Edge;
deba@220
  1121
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
deba@220
  1122
        return g.findEdge(u, v, prev);
deba@220
  1123
      }
deba@220
  1124
    };
deba@220
  1125
  }
deba@220
  1126
kpeter@282
  1127
  /// \brief Find an edge between two nodes of a graph.
deba@220
  1128
  ///
kpeter@282
  1129
  /// This function finds an edge from node \c u to node \c v in graph \c g.
kpeter@282
  1130
  /// If node \c u and node \c v is equal then each loop edge
deba@220
  1131
  /// will be enumerated once.
deba@220
  1132
  ///
deba@220
  1133
  /// If \c prev is \ref INVALID (this is the default value), then
kpeter@282
  1134
  /// it finds the first edge from \c u to \c v. Otherwise it looks for
kpeter@282
  1135
  /// the next edge from \c u to \c v after \c prev.
kpeter@282
  1136
  /// \return The found edge or \ref INVALID if there is no such an edge.
deba@220
  1137
  ///
kpeter@282
  1138
  /// Thus you can iterate through each edge between \c u and \c v
kpeter@282
  1139
  /// as it follows.
deba@220
  1140
  ///\code
kpeter@282
  1141
  /// for(Edge e = findEdge(g,u,v); e != INVALID; e = findEdge(g,u,v,e)) {
deba@220
  1142
  ///   ...
deba@220
  1143
  /// }
deba@220
  1144
  ///\endcode
deba@220
  1145
  ///
kpeter@282
  1146
  /// \note \ref ConEdgeIt provides iterator interface for the same
kpeter@282
  1147
  /// functionality.
kpeter@282
  1148
  ///
deba@220
  1149
  ///\sa ConEdgeIt
deba@220
  1150
  template <typename Graph>
deba@220
  1151
  inline typename Graph::Edge
deba@220
  1152
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
deba@220
  1153
            typename Graph::Edge p = INVALID) {
deba@220
  1154
    return _core_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
deba@220
  1155
  }
deba@220
  1156
kpeter@282
  1157
  /// \brief Iterator for iterating on parallel edges connecting the same nodes.
deba@220
  1158
  ///
kpeter@282
  1159
  /// Iterator for iterating on parallel edges connecting the same nodes.
kpeter@282
  1160
  /// It is a higher level interface for the findEdge() function. You can
deba@220
  1161
  /// use it the following way:
deba@220
  1162
  ///\code
kpeter@282
  1163
  /// for (ConEdgeIt<Graph> it(g, u, v); it != INVALID; ++it) {
deba@220
  1164
  ///   ...
deba@220
  1165
  /// }
deba@220
  1166
  ///\endcode
deba@220
  1167
  ///
deba@220
  1168
  ///\sa findEdge()
kpeter@559
  1169
  template <typename GR>
kpeter@559
  1170
  class ConEdgeIt : public GR::Edge {
kpeter@617
  1171
    typedef typename GR::Edge Parent;
kpeter@617
  1172
deba@220
  1173
  public:
deba@220
  1174
kpeter@617
  1175
    typedef typename GR::Edge Edge;
kpeter@617
  1176
    typedef typename GR::Node Node;
deba@220
  1177
deba@220
  1178
    /// \brief Constructor.
deba@220
  1179
    ///
kpeter@282
  1180
    /// Construct a new ConEdgeIt iterating on the edges that
kpeter@282
  1181
    /// connects nodes \c u and \c v.
kpeter@617
  1182
    ConEdgeIt(const GR& g, Node u, Node v) : _graph(g), _u(u), _v(v) {
kpeter@429
  1183
      Parent::operator=(findEdge(_graph, _u, _v));
deba@220
  1184
    }
deba@220
  1185
deba@220
  1186
    /// \brief Constructor.
deba@220
  1187
    ///
kpeter@282
  1188
    /// Construct a new ConEdgeIt that continues iterating from edge \c e.
kpeter@617
  1189
    ConEdgeIt(const GR& g, Edge e) : Parent(e), _graph(g) {}
deba@220
  1190
deba@220
  1191
    /// \brief Increment operator.
deba@220
  1192
    ///
deba@220
  1193
    /// It increments the iterator and gives back the next edge.
deba@220
  1194
    ConEdgeIt& operator++() {
kpeter@429
  1195
      Parent::operator=(findEdge(_graph, _u, _v, *this));
deba@220
  1196
      return *this;
deba@220
  1197
    }
deba@220
  1198
  private:
kpeter@617
  1199
    const GR& _graph;
kpeter@429
  1200
    Node _u, _v;
deba@220
  1201
  };
deba@220
  1202
deba@220
  1203
kpeter@282
  1204
  ///Dynamic arc look-up between given endpoints.
deba@220
  1205
deba@220
  1206
  ///Using this class, you can find an arc in a digraph from a given
kpeter@282
  1207
  ///source to a given target in amortized time <em>O</em>(log<em>d</em>),
deba@220
  1208
  ///where <em>d</em> is the out-degree of the source node.
deba@220
  1209
  ///
deba@220
  1210
  ///It is possible to find \e all parallel arcs between two nodes with
deba@233
  1211
  ///the \c operator() member.
deba@220
  1212
  ///
kpeter@282
  1213
  ///This is a dynamic data structure. Consider to use \ref ArcLookUp or
kpeter@282
  1214
  ///\ref AllArcLookUp if your digraph is not changed so frequently.
deba@220
  1215
  ///
kpeter@282
  1216
  ///This class uses a self-adjusting binary search tree, the Splay tree
kpeter@282
  1217
  ///of Sleator and Tarjan to guarantee the logarithmic amortized
kpeter@282
  1218
  ///time bound for arc look-ups. This class also guarantees the
deba@220
  1219
  ///optimal time bound in a constant factor for any distribution of
deba@220
  1220
  ///queries.
deba@220
  1221
  ///
kpeter@559
  1222
  ///\tparam GR The type of the underlying digraph.
deba@220
  1223
  ///
deba@220
  1224
  ///\sa ArcLookUp
deba@220
  1225
  ///\sa AllArcLookUp
kpeter@559
  1226
  template <typename GR>
deba@220
  1227
  class DynArcLookUp
kpeter@559
  1228
    : protected ItemSetTraits<GR, typename GR::Arc>::ItemNotifier::ObserverBase
deba@220
  1229
  {
kpeter@559
  1230
    typedef typename ItemSetTraits<GR, typename GR::Arc>
deba@220
  1231
    ::ItemNotifier::ObserverBase Parent;
deba@220
  1232
kpeter@559
  1233
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
kpeter@617
  1234
kpeter@617
  1235
  public:
kpeter@617
  1236
kpeter@617
  1237
    /// The Digraph type
kpeter@559
  1238
    typedef GR Digraph;
deba@220
  1239
deba@220
  1240
  protected:
deba@220
  1241
kpeter@559
  1242
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
kpeter@617
  1243
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
kpeter@617
  1244
deba@220
  1245
    public:
deba@220
  1246
kpeter@559
  1247
      AutoNodeMap(const GR& digraph) : Parent(digraph, INVALID) {}
deba@220
  1248
deba@220
  1249
      virtual void add(const Node& node) {
deba@220
  1250
        Parent::add(node);
deba@220
  1251
        Parent::set(node, INVALID);
deba@220
  1252
      }
deba@220
  1253
deba@220
  1254
      virtual void add(const std::vector<Node>& nodes) {
deba@220
  1255
        Parent::add(nodes);
deba@220
  1256
        for (int i = 0; i < int(nodes.size()); ++i) {
deba@220
  1257
          Parent::set(nodes[i], INVALID);
deba@220
  1258
        }
deba@220
  1259
      }
deba@220
  1260
deba@220
  1261
      virtual void build() {
deba@220
  1262
        Parent::build();
deba@220
  1263
        Node it;
deba@220
  1264
        typename Parent::Notifier* nf = Parent::notifier();
deba@220
  1265
        for (nf->first(it); it != INVALID; nf->next(it)) {
deba@220
  1266
          Parent::set(it, INVALID);
deba@220
  1267
        }
deba@220
  1268
      }
deba@220
  1269
    };
deba@220
  1270
deba@220
  1271
    class ArcLess {
deba@220
  1272
      const Digraph &g;
deba@220
  1273
    public:
deba@220
  1274
      ArcLess(const Digraph &_g) : g(_g) {}
deba@220
  1275
      bool operator()(Arc a,Arc b) const
deba@220
  1276
      {
deba@220
  1277
        return g.target(a)<g.target(b);
deba@220
  1278
      }
deba@220
  1279
    };
deba@220
  1280
kpeter@617
  1281
  protected: 
kpeter@617
  1282
kpeter@617
  1283
    const Digraph &_g;
kpeter@617
  1284
    AutoNodeMap _head;
kpeter@617
  1285
    typename Digraph::template ArcMap<Arc> _parent;
kpeter@617
  1286
    typename Digraph::template ArcMap<Arc> _left;
kpeter@617
  1287
    typename Digraph::template ArcMap<Arc> _right;
kpeter@617
  1288
deba@220
  1289
  public:
deba@220
  1290
deba@220
  1291
    ///Constructor
deba@220
  1292
deba@220
  1293
    ///Constructor.
deba@220
  1294
    ///
deba@220
  1295
    ///It builds up the search database.
deba@220
  1296
    DynArcLookUp(const Digraph &g)
deba@220
  1297
      : _g(g),_head(g),_parent(g),_left(g),_right(g)
deba@220
  1298
    {
deba@220
  1299
      Parent::attach(_g.notifier(typename Digraph::Arc()));
deba@220
  1300
      refresh();
deba@220
  1301
    }
deba@220
  1302
deba@220
  1303
  protected:
deba@220
  1304
deba@220
  1305
    virtual void add(const Arc& arc) {
deba@220
  1306
      insert(arc);
deba@220
  1307
    }
deba@220
  1308
deba@220
  1309
    virtual void add(const std::vector<Arc>& arcs) {
deba@220
  1310
      for (int i = 0; i < int(arcs.size()); ++i) {
deba@220
  1311
        insert(arcs[i]);
deba@220
  1312
      }
deba@220
  1313
    }
deba@220
  1314
deba@220
  1315
    virtual void erase(const Arc& arc) {
deba@220
  1316
      remove(arc);
deba@220
  1317
    }
deba@220
  1318
deba@220
  1319
    virtual void erase(const std::vector<Arc>& arcs) {
deba@220
  1320
      for (int i = 0; i < int(arcs.size()); ++i) {
deba@220
  1321
        remove(arcs[i]);
deba@220
  1322
      }
deba@220
  1323
    }
deba@220
  1324
deba@220
  1325
    virtual void build() {
deba@220
  1326
      refresh();
deba@220
  1327
    }
deba@220
  1328
deba@220
  1329
    virtual void clear() {
deba@220
  1330
      for(NodeIt n(_g);n!=INVALID;++n) {
kpeter@581
  1331
        _head[n] = INVALID;
deba@220
  1332
      }
deba@220
  1333
    }
deba@220
  1334
deba@220
  1335
    void insert(Arc arc) {
deba@220
  1336
      Node s = _g.source(arc);
deba@220
  1337
      Node t = _g.target(arc);
kpeter@581
  1338
      _left[arc] = INVALID;
kpeter@581
  1339
      _right[arc] = INVALID;
deba@220
  1340
deba@220
  1341
      Arc e = _head[s];
deba@220
  1342
      if (e == INVALID) {
kpeter@581
  1343
        _head[s] = arc;
kpeter@581
  1344
        _parent[arc] = INVALID;
deba@220
  1345
        return;
deba@220
  1346
      }
deba@220
  1347
      while (true) {
deba@220
  1348
        if (t < _g.target(e)) {
deba@220
  1349
          if (_left[e] == INVALID) {
kpeter@581
  1350
            _left[e] = arc;
kpeter@581
  1351
            _parent[arc] = e;
deba@220
  1352
            splay(arc);
deba@220
  1353
            return;
deba@220
  1354
          } else {
deba@220
  1355
            e = _left[e];
deba@220
  1356
          }
deba@220
  1357
        } else {
deba@220
  1358
          if (_right[e] == INVALID) {
kpeter@581
  1359
            _right[e] = arc;
kpeter@581
  1360
            _parent[arc] = e;
deba@220
  1361
            splay(arc);
deba@220
  1362
            return;
deba@220
  1363
          } else {
deba@220
  1364
            e = _right[e];
deba@220
  1365
          }
deba@220
  1366
        }
deba@220
  1367
      }
deba@220
  1368
    }
deba@220
  1369
deba@220
  1370
    void remove(Arc arc) {
deba@220
  1371
      if (_left[arc] == INVALID) {
deba@220
  1372
        if (_right[arc] != INVALID) {
kpeter@581
  1373
          _parent[_right[arc]] = _parent[arc];
deba@220
  1374
        }
deba@220
  1375
        if (_parent[arc] != INVALID) {
deba@220
  1376
          if (_left[_parent[arc]] == arc) {
kpeter@581
  1377
            _left[_parent[arc]] = _right[arc];
deba@220
  1378
          } else {
kpeter@581
  1379
            _right[_parent[arc]] = _right[arc];
deba@220
  1380
          }
deba@220
  1381
        } else {
kpeter@581
  1382
          _head[_g.source(arc)] = _right[arc];
deba@220
  1383
        }
deba@220
  1384
      } else if (_right[arc] == INVALID) {
kpeter@581
  1385
        _parent[_left[arc]] = _parent[arc];
deba@220
  1386
        if (_parent[arc] != INVALID) {
deba@220
  1387
          if (_left[_parent[arc]] == arc) {
kpeter@581
  1388
            _left[_parent[arc]] = _left[arc];
deba@220
  1389
          } else {
kpeter@581
  1390
            _right[_parent[arc]] = _left[arc];
deba@220
  1391
          }
deba@220
  1392
        } else {
kpeter@581
  1393
          _head[_g.source(arc)] = _left[arc];
deba@220
  1394
        }
deba@220
  1395
      } else {
deba@220
  1396
        Arc e = _left[arc];
deba@220
  1397
        if (_right[e] != INVALID) {
deba@220
  1398
          e = _right[e];
deba@220
  1399
          while (_right[e] != INVALID) {
deba@220
  1400
            e = _right[e];
deba@220
  1401
          }
deba@220
  1402
          Arc s = _parent[e];
kpeter@581
  1403
          _right[_parent[e]] = _left[e];
deba@220
  1404
          if (_left[e] != INVALID) {
kpeter@581
  1405
            _parent[_left[e]] = _parent[e];
deba@220
  1406
          }
deba@220
  1407
kpeter@581
  1408
          _left[e] = _left[arc];
kpeter@581
  1409
          _parent[_left[arc]] = e;
kpeter@581
  1410
          _right[e] = _right[arc];
kpeter@581
  1411
          _parent[_right[arc]] = e;
deba@220
  1412
kpeter@581
  1413
          _parent[e] = _parent[arc];
deba@220
  1414
          if (_parent[arc] != INVALID) {
deba@220
  1415
            if (_left[_parent[arc]] == arc) {
kpeter@581
  1416
              _left[_parent[arc]] = e;
deba@220
  1417
            } else {
kpeter@581
  1418
              _right[_parent[arc]] = e;
deba@220
  1419
            }
deba@220
  1420
          }
deba@220
  1421
          splay(s);
deba@220
  1422
        } else {
kpeter@581
  1423
          _right[e] = _right[arc];
kpeter@581
  1424
          _parent[_right[arc]] = e;
kpeter@581
  1425
          _parent[e] = _parent[arc];
deba@220
  1426
deba@220
  1427
          if (_parent[arc] != INVALID) {
deba@220
  1428
            if (_left[_parent[arc]] == arc) {
kpeter@581
  1429
              _left[_parent[arc]] = e;
deba@220
  1430
            } else {
kpeter@581
  1431
              _right[_parent[arc]] = e;
deba@220
  1432
            }
deba@220
  1433
          } else {
kpeter@581
  1434
            _head[_g.source(arc)] = e;
deba@220
  1435
          }
deba@220
  1436
        }
deba@220
  1437
      }
deba@220
  1438
    }
deba@220
  1439
deba@220
  1440
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
deba@220
  1441
    {
deba@220
  1442
      int m=(a+b)/2;
deba@220
  1443
      Arc me=v[m];
deba@220
  1444
      if (a < m) {
deba@220
  1445
        Arc left = refreshRec(v,a,m-1);
kpeter@581
  1446
        _left[me] = left;
kpeter@581
  1447
        _parent[left] = me;
deba@220
  1448
      } else {
kpeter@581
  1449
        _left[me] = INVALID;
deba@220
  1450
      }
deba@220
  1451
      if (m < b) {
deba@220
  1452
        Arc right = refreshRec(v,m+1,b);
kpeter@581
  1453
        _right[me] = right;
kpeter@581
  1454
        _parent[right] = me;
deba@220
  1455
      } else {
kpeter@581
  1456
        _right[me] = INVALID;
deba@220
  1457
      }
deba@220
  1458
      return me;
deba@220
  1459
    }
deba@220
  1460
deba@220
  1461
    void refresh() {
deba@220
  1462
      for(NodeIt n(_g);n!=INVALID;++n) {
deba@220
  1463
        std::vector<Arc> v;
deba@233
  1464
        for(OutArcIt a(_g,n);a!=INVALID;++a) v.push_back(a);
deba@233
  1465
        if (!v.empty()) {
deba@220
  1466
          std::sort(v.begin(),v.end(),ArcLess(_g));
deba@220
  1467
          Arc head = refreshRec(v,0,v.size()-1);
kpeter@581
  1468
          _head[n] = head;
kpeter@581
  1469
          _parent[head] = INVALID;
deba@220
  1470
        }
kpeter@581
  1471
        else _head[n] = INVALID;
deba@220
  1472
      }
deba@220
  1473
    }
deba@220
  1474
deba@220
  1475
    void zig(Arc v) {
deba@220
  1476
      Arc w = _parent[v];
kpeter@581
  1477
      _parent[v] = _parent[w];
kpeter@581
  1478
      _parent[w] = v;
kpeter@581
  1479
      _left[w] = _right[v];
kpeter@581
  1480
      _right[v] = w;
deba@220
  1481
      if (_parent[v] != INVALID) {
deba@220
  1482
        if (_right[_parent[v]] == w) {
kpeter@581
  1483
          _right[_parent[v]] = v;
deba@220
  1484
        } else {
kpeter@581
  1485
          _left[_parent[v]] = v;
deba@220
  1486
        }
deba@220
  1487
      }
deba@220
  1488
      if (_left[w] != INVALID){
kpeter@581
  1489
        _parent[_left[w]] = w;
deba@220
  1490
      }
deba@220
  1491
    }
deba@220
  1492
deba@220
  1493
    void zag(Arc v) {
deba@220
  1494
      Arc w = _parent[v];
kpeter@581
  1495
      _parent[v] = _parent[w];
kpeter@581
  1496
      _parent[w] = v;
kpeter@581
  1497
      _right[w] = _left[v];
kpeter@581
  1498
      _left[v] = w;
deba@220
  1499
      if (_parent[v] != INVALID){
deba@220
  1500
        if (_left[_parent[v]] == w) {
kpeter@581
  1501
          _left[_parent[v]] = v;
deba@220
  1502
        } else {
kpeter@581
  1503
          _right[_parent[v]] = v;
deba@220
  1504
        }
deba@220
  1505
      }
deba@220
  1506
      if (_right[w] != INVALID){
kpeter@581
  1507
        _parent[_right[w]] = w;
deba@220
  1508
      }
deba@220
  1509
    }
deba@220
  1510
deba@220
  1511
    void splay(Arc v) {
deba@220
  1512
      while (_parent[v] != INVALID) {
deba@220
  1513
        if (v == _left[_parent[v]]) {
deba@220
  1514
          if (_parent[_parent[v]] == INVALID) {
deba@220
  1515
            zig(v);
deba@220
  1516
          } else {
deba@220
  1517
            if (_parent[v] == _left[_parent[_parent[v]]]) {
deba@220
  1518
              zig(_parent[v]);
deba@220
  1519
              zig(v);
deba@220
  1520
            } else {
deba@220
  1521
              zig(v);
deba@220
  1522
              zag(v);
deba@220
  1523
            }
deba@220
  1524
          }
deba@220
  1525
        } else {
deba@220
  1526
          if (_parent[_parent[v]] == INVALID) {
deba@220
  1527
            zag(v);
deba@220
  1528
          } else {
deba@220
  1529
            if (_parent[v] == _left[_parent[_parent[v]]]) {
deba@220
  1530
              zag(v);
deba@220
  1531
              zig(v);
deba@220
  1532
            } else {
deba@220
  1533
              zag(_parent[v]);
deba@220
  1534
              zag(v);
deba@220
  1535
            }
deba@220
  1536
          }
deba@220
  1537
        }
deba@220
  1538
      }
deba@220
  1539
      _head[_g.source(v)] = v;
deba@220
  1540
    }
deba@220
  1541
deba@220
  1542
deba@220
  1543
  public:
deba@220
  1544
deba@220
  1545
    ///Find an arc between two nodes.
deba@220
  1546
deba@233
  1547
    ///Find an arc between two nodes.
kpeter@282
  1548
    ///\param s The source node.
kpeter@282
  1549
    ///\param t The target node.
deba@233
  1550
    ///\param p The previous arc between \c s and \c t. It it is INVALID or
deba@233
  1551
    ///not given, the operator finds the first appropriate arc.
deba@233
  1552
    ///\return An arc from \c s to \c t after \c p or
deba@233
  1553
    ///\ref INVALID if there is no more.
deba@233
  1554
    ///
deba@233
  1555
    ///For example, you can count the number of arcs from \c u to \c v in the
deba@233
  1556
    ///following way.
deba@233
  1557
    ///\code
deba@233
  1558
    ///DynArcLookUp<ListDigraph> ae(g);
deba@233
  1559
    ///...
kpeter@282
  1560
    ///int n = 0;
kpeter@282
  1561
    ///for(Arc a = ae(u,v); a != INVALID; a = ae(u,v,a)) n++;
deba@233
  1562
    ///\endcode
deba@233
  1563
    ///
kpeter@282
  1564
    ///Finding the arcs take at most <em>O</em>(log<em>d</em>)
deba@233
  1565
    ///amortized time, specifically, the time complexity of the lookups
deba@233
  1566
    ///is equal to the optimal search tree implementation for the
deba@233
  1567
    ///current query distribution in a constant factor.
deba@233
  1568
    ///
deba@233
  1569
    ///\note This is a dynamic data structure, therefore the data
kpeter@282
  1570
    ///structure is updated after each graph alteration. Thus although
kpeter@282
  1571
    ///this data structure is theoretically faster than \ref ArcLookUp
kpeter@313
  1572
    ///and \ref AllArcLookUp, it often provides worse performance than
deba@233
  1573
    ///them.
deba@233
  1574
    Arc operator()(Node s, Node t, Arc p = INVALID) const  {
deba@233
  1575
      if (p == INVALID) {
deba@233
  1576
        Arc a = _head[s];
deba@233
  1577
        if (a == INVALID) return INVALID;
deba@233
  1578
        Arc r = INVALID;
deba@233
  1579
        while (true) {
deba@233
  1580
          if (_g.target(a) < t) {
deba@233
  1581
            if (_right[a] == INVALID) {
deba@233
  1582
              const_cast<DynArcLookUp&>(*this).splay(a);
deba@233
  1583
              return r;
deba@233
  1584
            } else {
deba@233
  1585
              a = _right[a];
deba@233
  1586
            }
deba@233
  1587
          } else {
deba@233
  1588
            if (_g.target(a) == t) {
deba@233
  1589
              r = a;
deba@233
  1590
            }
deba@233
  1591
            if (_left[a] == INVALID) {
deba@233
  1592
              const_cast<DynArcLookUp&>(*this).splay(a);
deba@233
  1593
              return r;
deba@233
  1594
            } else {
deba@233
  1595
              a = _left[a];
deba@233
  1596
            }
deba@233
  1597
          }
deba@233
  1598
        }
deba@233
  1599
      } else {
deba@233
  1600
        Arc a = p;
deba@233
  1601
        if (_right[a] != INVALID) {
deba@233
  1602
          a = _right[a];
deba@233
  1603
          while (_left[a] != INVALID) {
deba@233
  1604
            a = _left[a];
deba@233
  1605
          }
deba@220
  1606
          const_cast<DynArcLookUp&>(*this).splay(a);
deba@233
  1607
        } else {
deba@233
  1608
          while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
deba@233
  1609
            a = _parent[a];
deba@233
  1610
          }
deba@233
  1611
          if (_parent[a] == INVALID) {
deba@220
  1612
            return INVALID;
deba@220
  1613
          } else {
deba@233
  1614
            a = _parent[a];
deba@220
  1615
            const_cast<DynArcLookUp&>(*this).splay(a);
deba@220
  1616
          }
deba@220
  1617
        }
deba@233
  1618
        if (_g.target(a) == t) return a;
deba@233
  1619
        else return INVALID;
deba@220
  1620
      }
deba@220
  1621
    }
deba@220
  1622
deba@220
  1623
  };
deba@220
  1624
kpeter@282
  1625
  ///Fast arc look-up between given endpoints.
deba@220
  1626
deba@220
  1627
  ///Using this class, you can find an arc in a digraph from a given
kpeter@282
  1628
  ///source to a given target in time <em>O</em>(log<em>d</em>),
deba@220
  1629
  ///where <em>d</em> is the out-degree of the source node.
deba@220
  1630
  ///
deba@220
  1631
  ///It is not possible to find \e all parallel arcs between two nodes.
deba@220
  1632
  ///Use \ref AllArcLookUp for this purpose.
deba@220
  1633
  ///
kpeter@282
  1634
  ///\warning This class is static, so you should call refresh() (or at
kpeter@282
  1635
  ///least refresh(Node)) to refresh this data structure whenever the
kpeter@282
  1636
  ///digraph changes. This is a time consuming (superlinearly proportional
kpeter@282
  1637
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
deba@220
  1638
  ///
kpeter@559
  1639
  ///\tparam GR The type of the underlying digraph.
deba@220
  1640
  ///
deba@220
  1641
  ///\sa DynArcLookUp
deba@220
  1642
  ///\sa AllArcLookUp
kpeter@559
  1643
  template<class GR>
deba@220
  1644
  class ArcLookUp
deba@220
  1645
  {
kpeter@617
  1646
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
kpeter@617
  1647
deba@220
  1648
  public:
kpeter@617
  1649
kpeter@617
  1650
    /// The Digraph type
kpeter@559
  1651
    typedef GR Digraph;
deba@220
  1652
deba@220
  1653
  protected:
deba@220
  1654
    const Digraph &_g;
deba@220
  1655
    typename Digraph::template NodeMap<Arc> _head;
deba@220
  1656
    typename Digraph::template ArcMap<Arc> _left;
deba@220
  1657
    typename Digraph::template ArcMap<Arc> _right;
deba@220
  1658
deba@220
  1659
    class ArcLess {
deba@220
  1660
      const Digraph &g;
deba@220
  1661
    public:
deba@220
  1662
      ArcLess(const Digraph &_g) : g(_g) {}
deba@220
  1663
      bool operator()(Arc a,Arc b) const
deba@220
  1664
      {
deba@220
  1665
        return g.target(a)<g.target(b);
deba@220
  1666
      }
deba@220
  1667
    };
deba@220
  1668
deba@220
  1669
  public:
deba@220
  1670
deba@220
  1671
    ///Constructor
deba@220
  1672
deba@220
  1673
    ///Constructor.
deba@220
  1674
    ///
deba@220
  1675
    ///It builds up the search database, which remains valid until the digraph
deba@220
  1676
    ///changes.
deba@220
  1677
    ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
deba@220
  1678
deba@220
  1679
  private:
deba@220
  1680
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
deba@220
  1681
    {
deba@220
  1682
      int m=(a+b)/2;
deba@220
  1683
      Arc me=v[m];
deba@220
  1684
      _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
deba@220
  1685
      _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
deba@220
  1686
      return me;
deba@220
  1687
    }
deba@220
  1688
  public:
kpeter@282
  1689
    ///Refresh the search data structure at a node.
deba@220
  1690
deba@220
  1691
    ///Build up the search database of node \c n.
deba@220
  1692
    ///
kpeter@282
  1693
    ///It runs in time <em>O</em>(<em>d</em> log<em>d</em>), where <em>d</em>
kpeter@282
  1694
    ///is the number of the outgoing arcs of \c n.
deba@220
  1695
    void refresh(Node n)
deba@220
  1696
    {
deba@220
  1697
      std::vector<Arc> v;
deba@220
  1698
      for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
deba@220
  1699
      if(v.size()) {
deba@220
  1700
        std::sort(v.begin(),v.end(),ArcLess(_g));
deba@220
  1701
        _head[n]=refreshRec(v,0,v.size()-1);
deba@220
  1702
      }
deba@220
  1703
      else _head[n]=INVALID;
deba@220
  1704
    }
deba@220
  1705
    ///Refresh the full data structure.
deba@220
  1706
deba@220
  1707
    ///Build up the full search database. In fact, it simply calls
deba@220
  1708
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
deba@220
  1709
    ///
kpeter@282
  1710
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
kpeter@282
  1711
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
deba@220
  1712
    ///out-degree of the digraph.
deba@220
  1713
    void refresh()
deba@220
  1714
    {
deba@220
  1715
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
deba@220
  1716
    }
deba@220
  1717
deba@220
  1718
    ///Find an arc between two nodes.
deba@220
  1719
kpeter@313
  1720
    ///Find an arc between two nodes in time <em>O</em>(log<em>d</em>),
kpeter@313
  1721
    ///where <em>d</em> is the number of outgoing arcs of \c s.
kpeter@282
  1722
    ///\param s The source node.
kpeter@282
  1723
    ///\param t The target node.
deba@220
  1724
    ///\return An arc from \c s to \c t if there exists,
deba@220
  1725
    ///\ref INVALID otherwise.
deba@220
  1726
    ///
deba@220
  1727
    ///\warning If you change the digraph, refresh() must be called before using
deba@220
  1728
    ///this operator. If you change the outgoing arcs of
kpeter@282
  1729
    ///a single node \c n, then \ref refresh(Node) "refresh(n)" is enough.
deba@220
  1730
    Arc operator()(Node s, Node t) const
deba@220
  1731
    {
deba@220
  1732
      Arc e;
deba@220
  1733
      for(e=_head[s];
deba@220
  1734
          e!=INVALID&&_g.target(e)!=t;
deba@220
  1735
          e = t < _g.target(e)?_left[e]:_right[e]) ;
deba@220
  1736
      return e;
deba@220
  1737
    }
deba@220
  1738
deba@220
  1739
  };
deba@220
  1740
kpeter@282
  1741
  ///Fast look-up of all arcs between given endpoints.
deba@220
  1742
deba@220
  1743
  ///This class is the same as \ref ArcLookUp, with the addition
kpeter@282
  1744
  ///that it makes it possible to find all parallel arcs between given
kpeter@282
  1745
  ///endpoints.
deba@220
  1746
  ///
kpeter@282
  1747
  ///\warning This class is static, so you should call refresh() (or at
kpeter@282
  1748
  ///least refresh(Node)) to refresh this data structure whenever the
kpeter@282
  1749
  ///digraph changes. This is a time consuming (superlinearly proportional
kpeter@282
  1750
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
deba@220
  1751
  ///
kpeter@559
  1752
  ///\tparam GR The type of the underlying digraph.
deba@220
  1753
  ///
deba@220
  1754
  ///\sa DynArcLookUp
deba@220
  1755
  ///\sa ArcLookUp
kpeter@559
  1756
  template<class GR>
kpeter@559
  1757
  class AllArcLookUp : public ArcLookUp<GR>
deba@220
  1758
  {
kpeter@559
  1759
    using ArcLookUp<GR>::_g;
kpeter@559
  1760
    using ArcLookUp<GR>::_right;
kpeter@559
  1761
    using ArcLookUp<GR>::_left;
kpeter@559
  1762
    using ArcLookUp<GR>::_head;
deba@220
  1763
kpeter@559
  1764
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
deba@220
  1765
kpeter@617
  1766
    typename GR::template ArcMap<Arc> _next;
deba@220
  1767
deba@220
  1768
    Arc refreshNext(Arc head,Arc next=INVALID)
deba@220
  1769
    {
deba@220
  1770
      if(head==INVALID) return next;
deba@220
  1771
      else {
deba@220
  1772
        next=refreshNext(_right[head],next);
deba@220
  1773
        _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
deba@220
  1774
          ? next : INVALID;
deba@220
  1775
        return refreshNext(_left[head],head);
deba@220
  1776
      }
deba@220
  1777
    }
deba@220
  1778
deba@220
  1779
    void refreshNext()
deba@220
  1780
    {
deba@220
  1781
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
deba@220
  1782
    }
deba@220
  1783
deba@220
  1784
  public:
kpeter@617
  1785
kpeter@617
  1786
    /// The Digraph type
kpeter@617
  1787
    typedef GR Digraph;
kpeter@617
  1788
deba@220
  1789
    ///Constructor
deba@220
  1790
deba@220
  1791
    ///Constructor.
deba@220
  1792
    ///
deba@220
  1793
    ///It builds up the search database, which remains valid until the digraph
deba@220
  1794
    ///changes.
kpeter@559
  1795
    AllArcLookUp(const Digraph &g) : ArcLookUp<GR>(g), _next(g) {refreshNext();}
deba@220
  1796
deba@220
  1797
    ///Refresh the data structure at a node.
deba@220
  1798
deba@220
  1799
    ///Build up the search database of node \c n.
deba@220
  1800
    ///
kpeter@282
  1801
    ///It runs in time <em>O</em>(<em>d</em> log<em>d</em>), where <em>d</em> is
deba@220
  1802
    ///the number of the outgoing arcs of \c n.
deba@220
  1803
    void refresh(Node n)
deba@220
  1804
    {
kpeter@559
  1805
      ArcLookUp<GR>::refresh(n);
deba@220
  1806
      refreshNext(_head[n]);
deba@220
  1807
    }
deba@220
  1808
deba@220
  1809
    ///Refresh the full data structure.
deba@220
  1810
deba@220
  1811
    ///Build up the full search database. In fact, it simply calls
deba@220
  1812
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
deba@220
  1813
    ///
kpeter@282
  1814
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
kpeter@282
  1815
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
deba@220
  1816
    ///out-degree of the digraph.
deba@220
  1817
    void refresh()
deba@220
  1818
    {
deba@220
  1819
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
deba@220
  1820
    }
deba@220
  1821
deba@220
  1822
    ///Find an arc between two nodes.
deba@220
  1823
deba@220
  1824
    ///Find an arc between two nodes.
kpeter@282
  1825
    ///\param s The source node.
kpeter@282
  1826
    ///\param t The target node.
deba@220
  1827
    ///\param prev The previous arc between \c s and \c t. It it is INVALID or
deba@220
  1828
    ///not given, the operator finds the first appropriate arc.
deba@220
  1829
    ///\return An arc from \c s to \c t after \c prev or
deba@220
  1830
    ///\ref INVALID if there is no more.
deba@220
  1831
    ///
deba@220
  1832
    ///For example, you can count the number of arcs from \c u to \c v in the
deba@220
  1833
    ///following way.
deba@220
  1834
    ///\code
deba@220
  1835
    ///AllArcLookUp<ListDigraph> ae(g);
deba@220
  1836
    ///...
kpeter@282
  1837
    ///int n = 0;
kpeter@282
  1838
    ///for(Arc a = ae(u,v); a != INVALID; a=ae(u,v,a)) n++;
deba@220
  1839
    ///\endcode
deba@220
  1840
    ///
kpeter@313
  1841
    ///Finding the first arc take <em>O</em>(log<em>d</em>) time,
kpeter@313
  1842
    ///where <em>d</em> is the number of outgoing arcs of \c s. Then the
deba@220
  1843
    ///consecutive arcs are found in constant time.
deba@220
  1844
    ///
deba@220
  1845
    ///\warning If you change the digraph, refresh() must be called before using
deba@220
  1846
    ///this operator. If you change the outgoing arcs of
kpeter@282
  1847
    ///a single node \c n, then \ref refresh(Node) "refresh(n)" is enough.
deba@220
  1848
    ///
deba@220
  1849
#ifdef DOXYGEN
deba@220
  1850
    Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
deba@220
  1851
#else
kpeter@559
  1852
    using ArcLookUp<GR>::operator() ;
deba@220
  1853
    Arc operator()(Node s, Node t, Arc prev) const
deba@220
  1854
    {
deba@220
  1855
      return prev==INVALID?(*this)(s,t):_next[prev];
deba@220
  1856
    }
deba@220
  1857
#endif
deba@220
  1858
deba@220
  1859
  };
deba@220
  1860
deba@220
  1861
  /// @}
deba@220
  1862
deba@220
  1863
} //namespace lemon
deba@220
  1864
deba@220
  1865
#endif