lemon/sub_graph.h
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1979 c2992fd74dad
child 2006 00d59f733817
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
deba@1866
     1
/* -*- C++ -*-
deba@1866
     2
 *
alpar@1956
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@1956
     4
 *
alpar@1956
     5
 * Copyright (C) 2003-2006
alpar@1956
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@1866
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@1866
     8
 *
deba@1866
     9
 * Permission to use, modify and distribute this software is granted
deba@1866
    10
 * provided that this copyright notice appears in all copies. For
deba@1866
    11
 * precise terms see the accompanying LICENSE file.
deba@1866
    12
 *
deba@1866
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@1866
    14
 * express or implied, and with no claim as to its suitability for any
deba@1866
    15
 * purpose.
deba@1866
    16
 *
deba@1866
    17
 */
deba@1866
    18
deba@1866
    19
#ifndef LEMON_SUB_GRAPH_H
deba@1866
    20
#define LEMON_SUB_GRAPH_H
deba@1866
    21
deba@1866
    22
#include <lemon/graph_adaptor.h>
deba@1990
    23
#include <lemon/bits/graph_adaptor_extender.h>
deba@1990
    24
#include <lemon/bits/default_map.h>
deba@1866
    25
deba@1866
    26
namespace lemon {
deba@1866
    27
deba@1866
    28
  /// \brief Base for the SubGraph.
deba@1866
    29
  ///
deba@1866
    30
  /// Base for the SubGraph.
deba@1866
    31
  template <typename _Graph>
deba@1866
    32
  class SubGraphBase : public GraphAdaptorBase<const _Graph> {
deba@1866
    33
  public:
deba@1866
    34
    typedef _Graph Graph;
deba@1866
    35
    typedef SubGraphBase<_Graph> SubGraph;
deba@1866
    36
    typedef GraphAdaptorBase<const _Graph> Parent;
deba@1866
    37
    typedef Parent Base;
deba@1866
    38
deba@1866
    39
    typedef typename Parent::Node Node;
deba@1866
    40
    typedef typename Parent::Edge Edge;
deba@1866
    41
deba@1866
    42
deba@1866
    43
  protected:
deba@1866
    44
deba@1866
    45
    class NodesImpl;
deba@1866
    46
    class EdgesImpl;
deba@1866
    47
deba@1866
    48
    SubGraphBase() {}
deba@1866
    49
deba@1866
    50
    void construct(const Graph& _graph, NodesImpl& _nodes, EdgesImpl& _edges) {
deba@1866
    51
      Parent::setGraph(_graph);
deba@1866
    52
      nodes = &_nodes;
deba@1866
    53
      edges = &_edges;
deba@1866
    54
      firstNode = INVALID;
deba@1866
    55
deba@1866
    56
      Node node;
deba@1866
    57
      Parent::first(node);
deba@1866
    58
      while (node != INVALID) {
deba@1866
    59
	(*nodes)[node].prev = node;
deba@1866
    60
	(*nodes)[node].firstIn = INVALID;
deba@1866
    61
	(*nodes)[node].firstOut = INVALID;
deba@1866
    62
	Parent::next(node);
deba@1866
    63
      }
deba@1866
    64
deba@1866
    65
      Edge edge;
deba@1866
    66
      Parent::first(edge);
deba@1866
    67
      while (edge != INVALID) {
deba@1866
    68
	(*edges)[edge].prevOut = edge;
deba@1866
    69
	Parent::next(edge);
deba@1866
    70
      }
deba@1866
    71
    }
deba@1866
    72
deba@1866
    73
  public:
deba@1866
    74
deba@1866
    75
    void first(Node& node) const {
deba@1866
    76
      node = firstNode;
deba@1866
    77
    }
deba@1866
    78
    void next(Node& node) const {
deba@1866
    79
      node = (*nodes)[node].next;
deba@1866
    80
    }
deba@1866
    81
deba@1866
    82
    void first(Edge& edge) const {
deba@1866
    83
      Node node = firstNode;
deba@1866
    84
      while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
deba@1866
    85
	node = (*nodes)[node].next;
deba@1866
    86
      }
deba@1866
    87
      if (node == INVALID) {
deba@1866
    88
	edge = INVALID;
deba@1866
    89
      } else {
deba@1866
    90
	edge = (*nodes)[node].firstOut;
deba@1866
    91
      }
deba@1866
    92
    }
deba@1866
    93
    void next(Edge& edge) const {
deba@1866
    94
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
    95
	edge = (*edges)[edge].nextOut;
deba@1866
    96
      } else {
deba@1866
    97
	Node node = (*nodes)[source(edge)].next;
deba@1866
    98
	while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
deba@1866
    99
	  node = (*nodes)[node].next;
deba@1866
   100
	}
deba@1866
   101
	if (node == INVALID) {
deba@1866
   102
	  edge = INVALID;
deba@1866
   103
	} else {
deba@1866
   104
	  edge = (*nodes)[node].firstOut;
deba@1866
   105
	}
deba@1866
   106
      }
deba@1866
   107
    }
deba@1866
   108
deba@1866
   109
    void firstOut(Edge& edge, const Node& node) const {
deba@1866
   110
      edge = (*nodes)[node].firstOut;
deba@1866
   111
    }
deba@1866
   112
    void nextOut(Edge& edge) const {
deba@1866
   113
      edge = (*edges)[edge].nextOut;
deba@1866
   114
    }
deba@1866
   115
deba@1866
   116
    void firstIn(Edge& edge, const Node& node) const {
deba@1866
   117
      edge = (*nodes)[node].firstIn;
deba@1866
   118
    }
deba@1866
   119
    void nextIn(Edge& edge) const {
deba@1866
   120
      edge = (*edges)[edge].nextIn;
deba@1866
   121
    }
deba@1866
   122
deba@1866
   123
    /// \brief Returns true when the given node is hidden.
deba@1866
   124
    ///
deba@1866
   125
    /// Returns true when the given node is hidden.
deba@1866
   126
    bool hidden(const Node& node) const {
deba@1866
   127
      return (*nodes)[node].prev == node;
deba@1866
   128
    }
deba@1866
   129
deba@1866
   130
    /// \brief Hide the given node in the sub-graph.
deba@1866
   131
    ///
deba@1866
   132
    /// Hide the given node in the sub graph. It just lace out from
deba@1866
   133
    /// the linked lists the given node. If there are incoming or outgoing
deba@1866
   134
    /// edges into or from this node then all of these will be hidden.
deba@1866
   135
    void hide(const Node& node) {
deba@1866
   136
      if (hidden(node)) return;
deba@1866
   137
      Edge edge;
deba@1866
   138
      firstOut(edge, node);
deba@1866
   139
      while (edge != INVALID) {
deba@1866
   140
	hide(edge);
deba@1866
   141
	firstOut(edge, node);
deba@1866
   142
      }
deba@1866
   143
deba@1866
   144
      firstOut(edge, node);
deba@1866
   145
      while (edge != INVALID) {
deba@1866
   146
	hide(edge);
deba@1866
   147
	firstOut(edge, node);
deba@1866
   148
      }
deba@1866
   149
      if ((*nodes)[node].prev != INVALID) {
deba@1866
   150
	(*nodes)[(*nodes)[node].prev].next = (*nodes)[node].next;
deba@1866
   151
      } else {
deba@1866
   152
	firstNode = (*nodes)[node].next;
deba@1866
   153
      }
deba@1866
   154
      if ((*nodes)[node].next != INVALID) {
deba@1866
   155
	(*nodes)[(*nodes)[node].next].prev = (*nodes)[node].prev;
deba@1866
   156
      }
deba@1866
   157
      (*nodes)[node].prev = node;
deba@1866
   158
      (*nodes)[node].firstIn = INVALID;
deba@1866
   159
      (*nodes)[node].firstOut = INVALID;
deba@1866
   160
    }
deba@1866
   161
deba@1866
   162
    /// \brief Unhide the given node in the sub-graph.
deba@1866
   163
    ///
deba@1866
   164
    /// Unhide the given node in the sub graph. It just lace in the given
deba@1866
   165
    /// node into the linked lists.
deba@1866
   166
    void unHide(const Node& node) {
deba@1866
   167
      if (!hidden(node)) return;
deba@1866
   168
      (*nodes)[node].next = firstNode;
deba@1866
   169
      (*nodes)[node].prev = INVALID;
deba@1866
   170
      if ((*nodes)[node].next != INVALID) {
deba@1866
   171
	(*nodes)[(*nodes)[node].next].prev = node;
deba@1866
   172
      }
deba@1866
   173
      firstNode = node;
deba@1866
   174
    }
deba@1866
   175
deba@1866
   176
    /// \brief Returns true when the given edge is hidden.
deba@1866
   177
    ///
deba@1866
   178
    /// Returns true when the given edge is hidden.
deba@1866
   179
    bool hidden(const Edge& edge) const {
deba@1866
   180
      return (*edges)[edge].prevOut == edge;
deba@1866
   181
    }
deba@1866
   182
deba@1866
   183
    /// \brief Hide the given edge in the sub-graph.
deba@1866
   184
    ///
deba@1866
   185
    /// Hide the given edge in the sub graph. It just lace out from
deba@1866
   186
    /// the linked lists the given edge.
deba@1866
   187
    void hide(const Edge& edge) {
deba@1866
   188
      if (hidden(edge)) return;
deba@1866
   189
      if ((*edges)[edge].prevOut == edge) return;
deba@1866
   190
      if ((*edges)[edge].prevOut != INVALID) {
deba@1866
   191
	(*edges)[(*edges)[edge].prevOut].nextOut = (*edges)[edge].nextOut;
deba@1866
   192
      } else {
deba@1866
   193
	(*nodes)[source(edge)].firstOut = (*edges)[edge].nextOut;
deba@1866
   194
      }
deba@1866
   195
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
   196
	(*edges)[(*edges)[edge].nextOut].prevOut = (*edges)[edge].prevOut;
deba@1866
   197
      }
deba@1866
   198
deba@1866
   199
      if ((*edges)[edge].prevIn != INVALID) {
deba@1866
   200
	(*edges)[(*edges)[edge].prevIn].nextIn = (*edges)[edge].nextIn;
deba@1866
   201
      } else {
deba@1866
   202
	(*nodes)[target(edge)].firstIn = (*edges)[edge].nextIn;
deba@1866
   203
      }
deba@1866
   204
      if ((*edges)[edge].nextIn != INVALID) {
deba@1866
   205
	(*edges)[(*edges)[edge].nextIn].prevIn = (*edges)[edge].prevIn;
deba@1866
   206
      }
deba@1866
   207
      (*edges)[edge].next = edge;
deba@1866
   208
    }
deba@1866
   209
deba@1866
   210
    /// \brief Unhide the given edge in the sub-graph.
deba@1866
   211
    ///
deba@1866
   212
    /// Unhide the given edge in the sub graph. It just lace in the given
deba@1866
   213
    /// edge into the linked lists. If the source or the target of the
deba@1866
   214
    /// node is hidden then it will unhide it.
deba@1866
   215
    void unHide(const Edge& edge) {
deba@1866
   216
      if (!hidden(edge)) return;
deba@1866
   217
deba@1866
   218
      Node node;
deba@1866
   219
deba@1866
   220
      node = Parent::source(edge);
deba@1866
   221
      unHide(node);
deba@1866
   222
      (*edges)[edge].nextOut = (*nodes)[node].firstOut;
deba@1866
   223
      (*edges)[edge].prevOut = INVALID;
deba@1866
   224
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
   225
	(*edges)[(*edges)[edge].nextOut].prevOut = edge;
deba@1866
   226
      }
deba@1866
   227
      (*nodes)[node].firstOut = edge;
deba@1866
   228
deba@1866
   229
      node = Parent::target(edge);
deba@1866
   230
      unHide(node);
deba@1866
   231
      (*edges)[edge].nextIn = (*nodes)[node].firstIn;
deba@1866
   232
      (*edges)[edge].prevIn = INVALID;
deba@1866
   233
      if ((*edges)[edge].nextIn != INVALID) {
deba@1866
   234
	(*edges)[(*edges)[edge].nextIn].prevIn = edge;
deba@1866
   235
      }
deba@1866
   236
      (*nodes)[node].firstIn = edge;      
deba@1866
   237
    }
deba@1866
   238
    
deba@1866
   239
    typedef False NodeNumTag;
deba@1866
   240
    typedef False EdgeNumTag;
deba@1866
   241
deba@1866
   242
  protected:
deba@1866
   243
    struct NodeT {
deba@1866
   244
      Node prev, next;
deba@1866
   245
      Edge firstIn, firstOut;
deba@1866
   246
    };
deba@1990
   247
    class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
deba@1866
   248
      friend class SubGraphBase;
deba@1866
   249
    public:
deba@1990
   250
      typedef DefaultMap<Graph, Node, NodeT> Parent;
deba@1866
   251
deba@1866
   252
      NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
deba@1866
   253
	: Parent(_graph), adaptor(_adaptor) {}
deba@1866
   254
deba@1866
   255
      virtual ~NodesImpl() {}
deba@1866
   256
deba@1866
   257
      virtual void build() {
deba@1866
   258
	Parent::build();
deba@1866
   259
	Node node;
deba@1866
   260
	adaptor.Base::first(node);
deba@1866
   261
	while (node != INVALID) {
deba@1866
   262
	  Parent::operator[](node).prev = node;
deba@1866
   263
	  Parent::operator[](node).firstIn = INVALID;
deba@1866
   264
	  Parent::operator[](node).firstOut = INVALID;
deba@1866
   265
	  adaptor.Base::next(node);
deba@1866
   266
	}
deba@1866
   267
      }
deba@1866
   268
deba@1866
   269
      virtual void clear() {
deba@1866
   270
	adaptor.firstNode = INVALID;
deba@1866
   271
	Parent::clear();
deba@1866
   272
      }
deba@1866
   273
deba@1866
   274
      virtual void add(const Node& node) {
deba@1866
   275
	Parent::add(node);
deba@1866
   276
	Parent::operator[](node).prev = node;
deba@1866
   277
	Parent::operator[](node).firstIn = INVALID;
deba@1866
   278
	Parent::operator[](node).firstOut = INVALID;
deba@1866
   279
      }
deba@1964
   280
deba@1866
   281
      virtual void add(const std::vector<Node>& nodes) {
deba@1866
   282
	Parent::add(nodes);
deba@1866
   283
	for (int i = 0; i < (int)nodes.size(); ++i) {
deba@1866
   284
	  Parent::operator[](nodes[i]).prev = nodes[i];
deba@1866
   285
	  Parent::operator[](nodes[i]).firstIn = INVALID;
deba@1866
   286
	  Parent::operator[](nodes[i]).firstOut = INVALID;
deba@1866
   287
	}
deba@1866
   288
      } 
deba@1866
   289
deba@1866
   290
      virtual void erase(const Node& node) {
deba@1866
   291
	adaptor.hide(node);
deba@1866
   292
	Parent::erase(node);
deba@1866
   293
      }
deba@1866
   294
deba@1866
   295
      virtual void erase(const std::vector<Node>& nodes) {
deba@1866
   296
	for (int i = 0; i < (int)nodes.size(); ++i) {
deba@1866
   297
	  adaptor.hide(nodes[i]);
deba@1866
   298
	}
deba@1866
   299
	Parent::erase(nodes);
deba@1866
   300
      }
deba@1866
   301
deba@1866
   302
    private:
deba@1866
   303
      SubGraph& adaptor;
deba@1866
   304
    };
deba@1866
   305
deba@1866
   306
    struct EdgeT {
deba@1866
   307
      Edge prevOut, nextOut;
deba@1866
   308
      Edge prevIn, nextIn;
deba@1866
   309
    };
deba@1990
   310
    class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
deba@1866
   311
      friend class SubGraphBase;
deba@1866
   312
    public:
deba@1990
   313
      typedef DefaultMap<Graph, Edge, EdgeT> Parent;
deba@1866
   314
deba@1866
   315
      EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
deba@1866
   316
	: Parent(_graph), adaptor(_adaptor) {}
deba@1866
   317
deba@1866
   318
      virtual ~EdgesImpl() {}
deba@1866
   319
deba@1866
   320
      virtual void build() {
deba@1866
   321
	Parent::build();
deba@1866
   322
	Edge edge;
deba@1866
   323
	adaptor.Base::first(edge);
deba@1866
   324
	while (edge != INVALID) {
deba@1866
   325
	  Parent::operator[](edge).prevOut = edge;
deba@1866
   326
	  adaptor.Base::next(edge);
deba@1866
   327
	}
deba@1866
   328
      }
deba@1866
   329
deba@1866
   330
      virtual void clear() {
deba@1866
   331
	Node node;
deba@1866
   332
	adaptor.first(node);
deba@1866
   333
	while (node != INVALID) {
deba@1866
   334
	  (*adaptor.nodes).firstIn = INVALID;
deba@1866
   335
	  (*adaptor.nodes).firstOut = INVALID;
deba@1866
   336
	  adaptor.next(node);
deba@1866
   337
	}
deba@1866
   338
	Parent::clear();
deba@1866
   339
      }
deba@1866
   340
deba@1866
   341
      virtual void add(const Edge& edge) {
deba@1866
   342
	Parent::add(edge);
deba@1866
   343
	Parent::operator[](edge).prevOut = edge;
deba@1866
   344
      }
deba@1866
   345
deba@1866
   346
      virtual void add(const std::vector<Edge>& edges) {
deba@1866
   347
	Parent::add(edges);
deba@1866
   348
	for (int i = 0; i < (int)edges.size(); ++i) {
deba@1866
   349
	  Parent::operator[](edges[i]).prevOut = edges[i];
deba@1866
   350
	}
deba@1866
   351
      }
deba@1866
   352
deba@1866
   353
      virtual void erase(const Edge& edge) {
deba@1866
   354
	adaptor.hide(edge);
deba@1866
   355
	Parent::erase(edge);
deba@1866
   356
      }
deba@1866
   357
deba@1866
   358
      virtual void erase(const std::vector<Edge>& edges) {
deba@1866
   359
	for (int i = 0; i < (int)edges.size(); ++i) {
deba@1866
   360
	  adaptor.hide(edges[i]);
deba@1866
   361
	}
deba@1964
   362
	Parent::erase(edges);
deba@1866
   363
      }
deba@1866
   364
deba@1866
   365
    private:
deba@1866
   366
      SubGraph& adaptor;
deba@1866
   367
    };
deba@1866
   368
deba@1866
   369
    NodesImpl* nodes;
deba@1866
   370
    EdgesImpl* edges;
deba@1866
   371
    Node firstNode;
deba@1866
   372
  };
deba@1866
   373
deba@1866
   374
  /// \ingroup semi_adaptors
deba@1866
   375
  ///
deba@1866
   376
  /// \brief Graph which uses a subset of an other graph's nodes and edges.
deba@1866
   377
  ///
deba@1866
   378
  /// Graph which uses a subset of an other graph's nodes and edges. This class
deba@1866
   379
  /// is an alternative to the SubGraphAdaptor which is created for the
deba@1866
   380
  /// same reason. The main difference between the two class that it
deba@1866
   381
  /// makes linked lists on the unhidden nodes and edges what cause that
deba@1866
   382
  /// on sparse subgraphs the algorithms can be more efficient and some times
deba@1866
   383
  /// provide better time complexity. On other way this implemetation is
deba@1866
   384
  /// less efficient in most case when the subgraph filters out only
deba@1866
   385
  /// a few nodes or edges.
deba@1866
   386
  /// 
deba@1866
   387
  /// \see SubGraphAdaptor
deba@1866
   388
  /// \see EdgeSubGraphBase
deba@1866
   389
  template <typename Graph>
deba@1866
   390
  class SubGraph 
deba@1979
   391
    : public GraphAdaptorExtender< SubGraphBase<Graph> > {
deba@1866
   392
  public:
deba@1979
   393
    typedef GraphAdaptorExtender< SubGraphBase<Graph> > Parent;
deba@1866
   394
  public:
deba@1866
   395
    /// \brief Constructor for sub-graph.
deba@1866
   396
    ///
deba@1866
   397
    /// Constructor for sub-graph. Initially all the edges and nodes
deba@1866
   398
    /// are hidden in the graph.
deba@1866
   399
    SubGraph(const Graph& _graph) 
deba@1866
   400
      : Parent(), nodes(*this, _graph), edges(*this, _graph) { 
deba@1866
   401
      Parent::construct(_graph, nodes, edges);
deba@1866
   402
    }
deba@1866
   403
  private:
deba@1866
   404
    typename Parent::NodesImpl nodes;
deba@1866
   405
    typename Parent::EdgesImpl edges;
deba@1866
   406
  };
deba@1866
   407
deba@1866
   408
  /// \brief Base for the EdgeSubGraph.
deba@1866
   409
  ///
deba@1866
   410
  /// Base for the EdgeSubGraph.
deba@1866
   411
  template <typename _Graph>
deba@1866
   412
  class EdgeSubGraphBase : public GraphAdaptorBase<const _Graph> {
deba@1866
   413
  public:
deba@1866
   414
    typedef _Graph Graph;
deba@1866
   415
    typedef EdgeSubGraphBase<_Graph> SubGraph;
deba@1866
   416
    typedef GraphAdaptorBase<const _Graph> Parent;
deba@1866
   417
    typedef Parent Base;
deba@1866
   418
deba@1866
   419
    typedef typename Parent::Node Node;
deba@1866
   420
    typedef typename Parent::Edge Edge;
deba@1866
   421
deba@1866
   422
deba@1866
   423
  protected:
deba@1866
   424
deba@1866
   425
    class NodesImpl;
deba@1866
   426
    class EdgesImpl;
deba@1866
   427
deba@1866
   428
    EdgeSubGraphBase() {}
deba@1866
   429
deba@1866
   430
    void construct(const Graph& _graph, NodesImpl& _nodes, EdgesImpl& _edges) {
deba@1866
   431
      Parent::setGraph(_graph);
deba@1866
   432
      nodes = &_nodes;
deba@1866
   433
      edges = &_edges;
deba@1866
   434
deba@1866
   435
      Node node;
deba@1866
   436
      Parent::first(node);
deba@1866
   437
      while (node != INVALID) {
deba@1866
   438
	(*nodes)[node].firstIn = INVALID;
deba@1866
   439
	(*nodes)[node].firstOut = INVALID;
deba@1866
   440
	Parent::next(node);
deba@1866
   441
      }
deba@1866
   442
deba@1866
   443
      Edge edge;
deba@1866
   444
      Parent::first(edge);
deba@1866
   445
      while (edge != INVALID) {
deba@1866
   446
	(*edges)[edge].prevOut = edge;
deba@1866
   447
	Parent::next(edge);
deba@1866
   448
      }
deba@1866
   449
    }
deba@1866
   450
deba@1866
   451
  public:
deba@1866
   452
deba@1866
   453
    void first(Node& node) const {
deba@1866
   454
      Parent::first(node);
deba@1866
   455
    }
deba@1866
   456
    void next(Node& node) const {
deba@1866
   457
      Parent::next(node);
deba@1866
   458
    }
deba@1866
   459
deba@1866
   460
    void first(Edge& edge) const {
deba@1866
   461
      Node node;
deba@1866
   462
      Parent::first(node);
deba@1866
   463
      while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
deba@1866
   464
	Parent::next(node);
deba@1866
   465
      }
deba@1866
   466
      if (node == INVALID) {
deba@1866
   467
	edge = INVALID;
deba@1866
   468
      } else {
deba@1866
   469
	edge = (*nodes)[node].firstOut;
deba@1866
   470
      }
deba@1866
   471
    }
deba@1866
   472
    void next(Edge& edge) const {
deba@1866
   473
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
   474
	edge = (*edges)[edge].nextOut;
deba@1866
   475
      } else {
deba@1866
   476
	Node node = source(edge);
deba@1866
   477
	Parent::next(node);
deba@1866
   478
	while (node != INVALID && (*nodes)[node].firstOut == INVALID) {
deba@1866
   479
	  Parent::next(node);
deba@1866
   480
	}
deba@1866
   481
	if (node == INVALID) {
deba@1866
   482
	  edge = INVALID;
deba@1866
   483
	} else {
deba@1866
   484
	  edge = (*nodes)[node].firstOut;
deba@1866
   485
	}
deba@1866
   486
      }
deba@1866
   487
    }
deba@1866
   488
deba@1866
   489
    void firstOut(Edge& edge, const Node& node) const {
deba@1866
   490
      edge = (*nodes)[node].firstOut;
deba@1866
   491
    }
deba@1866
   492
    void nextOut(Edge& edge) const {
deba@1866
   493
      edge = (*edges)[edge].nextOut;
deba@1866
   494
    }
deba@1866
   495
deba@1866
   496
    void firstIn(Edge& edge, const Node& node) const {
deba@1866
   497
      edge = (*nodes)[node].firstIn;
deba@1866
   498
    }
deba@1866
   499
    void nextIn(Edge& edge) const {
deba@1866
   500
      edge = (*edges)[edge].nextIn;
deba@1866
   501
    }
deba@1866
   502
deba@1866
   503
    /// \brief Returns true when the given edge is hidden.
deba@1866
   504
    ///
deba@1866
   505
    /// Returns true when the given edge is hidden.
deba@1866
   506
    bool hidden(const Edge& edge) const {
deba@1866
   507
      return (*edges)[edge].prevOut == edge;
deba@1866
   508
    }
deba@1866
   509
deba@1866
   510
    /// \brief Hide the given edge in the sub-graph.
deba@1866
   511
    ///
deba@1866
   512
    /// Hide the given edge in the sub graph. It just lace out from
deba@1866
   513
    /// the linked lists the given edge.
deba@1866
   514
    void hide(const Edge& edge) {
deba@1866
   515
      if (hidden(edge)) return;
deba@1866
   516
      if ((*edges)[edge].prevOut != INVALID) {
deba@1866
   517
	(*edges)[(*edges)[edge].prevOut].nextOut = (*edges)[edge].nextOut;
deba@1866
   518
      } else {
deba@1866
   519
	(*nodes)[source(edge)].firstOut = (*edges)[edge].nextOut;
deba@1866
   520
      }
deba@1866
   521
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
   522
	(*edges)[(*edges)[edge].nextOut].prevOut = (*edges)[edge].prevOut;
deba@1866
   523
      }
deba@1866
   524
deba@1866
   525
      if ((*edges)[edge].prevIn != INVALID) {
deba@1866
   526
	(*edges)[(*edges)[edge].prevIn].nextIn = (*edges)[edge].nextIn;
deba@1866
   527
      } else {
deba@1866
   528
	(*nodes)[target(edge)].firstIn = (*edges)[edge].nextIn;
deba@1866
   529
      }
deba@1866
   530
      if ((*edges)[edge].nextIn != INVALID) {
deba@1866
   531
	(*edges)[(*edges)[edge].nextIn].prevIn = (*edges)[edge].prevIn;
deba@1866
   532
      }
deba@1866
   533
      (*edges)[edge].prevOut = edge;
deba@1866
   534
    }
deba@1866
   535
deba@1866
   536
    /// \brief Unhide the given edge in the sub-graph.
deba@1866
   537
    ///
deba@1866
   538
    /// Unhide the given edge in the sub graph. It just lace in the given
deba@1866
   539
    /// edge into the linked lists.
deba@1866
   540
    void unHide(const Edge& edge) {
deba@1866
   541
      if (!hidden(edge)) return;
deba@1866
   542
      Node node;
deba@1866
   543
deba@1866
   544
      node = Parent::source(edge);
deba@1866
   545
      (*edges)[edge].nextOut = (*nodes)[node].firstOut;
deba@1866
   546
      (*edges)[edge].prevOut = INVALID;
deba@1866
   547
      if ((*edges)[edge].nextOut != INVALID) {
deba@1866
   548
	(*edges)[(*edges)[edge].nextOut].prevOut = edge;
deba@1866
   549
      }
deba@1866
   550
      (*nodes)[node].firstOut = edge;
deba@1866
   551
deba@1866
   552
      node = Parent::target(edge);
deba@1866
   553
      (*edges)[edge].nextIn = (*nodes)[node].firstIn;
deba@1866
   554
      (*edges)[edge].prevIn = INVALID;
deba@1866
   555
      if ((*edges)[edge].nextIn != INVALID) {
deba@1866
   556
	(*edges)[(*edges)[edge].nextIn].prevIn = edge;
deba@1866
   557
      }
deba@1866
   558
      (*nodes)[node].firstIn = edge;      
deba@1866
   559
    }
deba@1866
   560
    
deba@1866
   561
  protected:
deba@1866
   562
    struct NodeT {
deba@1866
   563
      Edge firstIn, firstOut;
deba@1866
   564
    };
deba@1990
   565
    class NodesImpl : public DefaultMap<Graph, Node, NodeT> {
deba@1866
   566
      friend class EdgeSubGraphBase;
deba@1866
   567
    public:
deba@1990
   568
      typedef DefaultMap<Graph, Node, NodeT> Parent;
deba@1866
   569
deba@1866
   570
      NodesImpl(SubGraph& _adaptor, const Graph& _graph) 
deba@1866
   571
	: Parent(_graph), adaptor(_adaptor) {}
deba@1866
   572
deba@1866
   573
      virtual ~NodesImpl() {}
deba@1866
   574
deba@1866
   575
      virtual void build() {
deba@1866
   576
	Parent::build();
deba@1866
   577
	Node node;
deba@1866
   578
	adaptor.Base::first(node);
deba@1866
   579
	while (node != INVALID) {
deba@1866
   580
	  Parent::operator[](node).firstIn = INVALID;
deba@1866
   581
	  Parent::operator[](node).firstOut = INVALID;
deba@1866
   582
	  adaptor.Base::next(node);
deba@1866
   583
	}
deba@1866
   584
      }
deba@1866
   585
deba@1866
   586
      virtual void add(const Node& node) {
deba@1866
   587
	Parent::add(node);
deba@1866
   588
	Parent::operator[](node).firstIn = INVALID;
deba@1866
   589
	Parent::operator[](node).firstOut = INVALID;
deba@1866
   590
      }
deba@1866
   591
deba@1964
   592
      virtual void add(const std::vector<Node>& nodes) {
deba@1964
   593
        Parent::add(nodes);
deba@1964
   594
        for (int i = 0; i < (int)nodes.size(); ++i) {
deba@1964
   595
          Parent::operator[](nodes[i]).firstIn = INVALID;
deba@1964
   596
          Parent::operator[](nodes[i]).firstOut = INVALID;
deba@1964
   597
        }
deba@1964
   598
      }
deba@1964
   599
deba@1866
   600
    private:
deba@1866
   601
      SubGraph& adaptor;
deba@1866
   602
    };
deba@1866
   603
deba@1866
   604
    struct EdgeT {
deba@1866
   605
      Edge prevOut, nextOut;
deba@1866
   606
      Edge prevIn, nextIn;
deba@1866
   607
    };
deba@1990
   608
    class EdgesImpl : public DefaultMap<Graph, Edge, EdgeT> {
deba@1866
   609
      friend class EdgeSubGraphBase;
deba@1866
   610
    public:
deba@1990
   611
      typedef DefaultMap<Graph, Edge, EdgeT> Parent;
deba@1866
   612
deba@1866
   613
      EdgesImpl(SubGraph& _adaptor, const Graph& _graph) 
deba@1866
   614
	: Parent(_graph), adaptor(_adaptor) {}
deba@1866
   615
deba@1866
   616
      virtual ~EdgesImpl() {}
deba@1866
   617
deba@1866
   618
      virtual void build() {
deba@1866
   619
	Parent::build();
deba@1866
   620
	Edge edge;
deba@1866
   621
	adaptor.Base::first(edge);
deba@1866
   622
	while (edge != INVALID) {
deba@1866
   623
	  Parent::operator[](edge).prevOut = edge;
deba@1866
   624
	  adaptor.Base::next(edge);
deba@1866
   625
	}
deba@1866
   626
      }
deba@1866
   627
deba@1866
   628
      virtual void clear() {
deba@1866
   629
	Node node;
deba@1866
   630
	adaptor.Base::first(node);
deba@1866
   631
	while (node != INVALID) {
deba@1866
   632
	  (*adaptor.nodes)[node].firstIn = INVALID;
deba@1866
   633
	  (*adaptor.nodes)[node].firstOut = INVALID;
deba@1866
   634
	  adaptor.Base::next(node);
deba@1866
   635
	}
deba@1866
   636
	Parent::clear();
deba@1866
   637
      }
deba@1866
   638
deba@1866
   639
      virtual void add(const Edge& edge) {
deba@1866
   640
	Parent::add(edge);
deba@1866
   641
	Parent::operator[](edge).prevOut = edge;
deba@1866
   642
      }
deba@1866
   643
deba@1866
   644
      virtual void add(const std::vector<Edge>& edges) {
deba@1866
   645
	Parent::add(edges);
deba@1866
   646
	for (int i = 0; i < (int)edges.size(); ++i) {
deba@1866
   647
	  Parent::operator[](edges[i]).prevOut = edges[i];
deba@1866
   648
	}
deba@1866
   649
      }
deba@1866
   650
deba@1866
   651
      virtual void erase(const Edge& edge) {
deba@1866
   652
	adaptor.hide(edge);
deba@1866
   653
	Parent::erase(edge);
deba@1866
   654
      }
deba@1866
   655
deba@1866
   656
      virtual void erase(const std::vector<Edge>& edges) {
deba@1866
   657
	for (int i = 0; i < (int)edges.size(); ++i) {
deba@1866
   658
	  adaptor.hide(edges[i]);
deba@1866
   659
	}
deba@1964
   660
	Parent::erase(edges);
deba@1866
   661
      }
deba@1866
   662
deba@1866
   663
    private:
deba@1866
   664
      SubGraph& adaptor;
deba@1866
   665
    };
deba@1866
   666
deba@1866
   667
    NodesImpl* nodes;
deba@1866
   668
    EdgesImpl* edges;
deba@1866
   669
  };
deba@1866
   670
deba@1866
   671
  /// \ingroup semi_adaptors
deba@1866
   672
  ///
deba@1866
   673
  /// \brief Graph which uses a subset of an other graph's edges.
deba@1866
   674
  ///
deba@1866
   675
  /// Graph which uses a subset of an other graph's edges. This class
deba@1866
   676
  /// is an alternative to the EdgeSubGraphAdaptor which is created for the
deba@1866
   677
  /// same reason. The main difference between the two class that it
deba@1866
   678
  /// makes linked lists on the unhidden edges what cause that
deba@1866
   679
  /// on sparse subgraphs the algorithms can be more efficient and some times
deba@1866
   680
  /// provide better time complexity. On other way this implemetation is
deba@1866
   681
  /// less efficient in most case when the subgraph filters out only
deba@1866
   682
  /// a few edges.
deba@1866
   683
  /// 
deba@1866
   684
  /// \see EdgeSubGraphAdaptor
deba@1866
   685
  /// \see EdgeSubGraphBase
deba@1866
   686
  template <typename Graph>
deba@1866
   687
  class EdgeSubGraph 
deba@1979
   688
    : public GraphAdaptorExtender< EdgeSubGraphBase<Graph> > {
deba@1866
   689
  public:
deba@1979
   690
    typedef GraphAdaptorExtender< EdgeSubGraphBase<Graph> > Parent;
deba@1866
   691
  public:
deba@1866
   692
    /// \brief Constructor for sub-graph.
deba@1866
   693
    ///
deba@1866
   694
    /// Constructor for sub-graph. Initially all the edges are hidden in the 
deba@1866
   695
    /// graph.
deba@1866
   696
    EdgeSubGraph(const Graph& _graph) 
deba@1866
   697
      : Parent(), nodes(*this, _graph), edges(*this, _graph) { 
deba@1866
   698
      Parent::construct(_graph, nodes, edges);
deba@1866
   699
    }
deba@1866
   700
  private:
deba@1866
   701
    typename Parent::NodesImpl nodes;
deba@1866
   702
    typename Parent::EdgesImpl edges;
deba@1866
   703
  };
deba@1866
   704
deba@1866
   705
deba@1866
   706
//   template<typename Graph, typename Number, 
deba@1866
   707
// 	   typename CapacityMap, typename FlowMap>
deba@1866
   708
//   class ResGraph
deba@1866
   709
//     : public IterableGraphExtender<EdgeSubGraphBase<
klao@1909
   710
//     UGraphAdaptor<Graph> > > {
deba@1866
   711
//   public:
deba@1866
   712
//     typedef IterableGraphExtender<EdgeSubGraphBase<
klao@1909
   713
//       UGraphAdaptor<Graph> > > Parent;
deba@1866
   714
deba@1866
   715
//   protected:
klao@1909
   716
//     UGraphAdaptor<Graph> u;
deba@1866
   717
deba@1866
   718
//     const CapacityMap* capacity;
deba@1866
   719
//     FlowMap* flow;
deba@1866
   720
deba@1866
   721
//     typename Parent::NodesImpl nodes;
deba@1866
   722
//     typename Parent::EdgesImpl edges;
deba@1866
   723
deba@1866
   724
//     void setCapacityMap(const CapacityMap& _capacity) {
deba@1866
   725
//       capacity=&_capacity;
deba@1866
   726
//     }
deba@1866
   727
deba@1866
   728
//     void setFlowMap(FlowMap& _flow) {
deba@1866
   729
//       flow=&_flow;
deba@1866
   730
//     }
deba@1866
   731
deba@1866
   732
//   public:
deba@1866
   733
klao@1909
   734
//     typedef typename UGraphAdaptor<Graph>::Node Node;
klao@1909
   735
//     typedef typename UGraphAdaptor<Graph>::Edge Edge;
klao@1909
   736
//     typedef typename UGraphAdaptor<Graph>::UEdge UEdge;
deba@1866
   737
deba@1866
   738
//     ResGraphAdaptor(Graph& _graph, 
deba@1866
   739
// 		    const CapacityMap& _capacity, FlowMap& _flow) 
klao@1909
   740
//       : Parent(), u(_graph), capacity(&_capacity), flow(&_flow),
deba@1866
   741
// 	nodes(*this, _graph), edges(*this, _graph) {
klao@1909
   742
//       Parent::construct(u, nodes, edges);
deba@1866
   743
//       setFlowMap(_flow);
deba@1866
   744
//       setCapacityMap(_capacity);
deba@1866
   745
//       typename Graph::Edge edge; 
deba@1866
   746
//       for (_graph.first(edge); edge != INVALID; _graph.next(edge)) {
deba@1866
   747
// 	if ((*flow)[edge] != (*capacity)[edge]) {
deba@1866
   748
// 	  Parent::unHide(direct(edge, true));
deba@1866
   749
// 	}
deba@1866
   750
// 	if ((*flow)[edge] != 0) {
deba@1866
   751
// 	  Parent::unHide(direct(edge, false));
deba@1866
   752
// 	}
deba@1866
   753
//       }
deba@1866
   754
//     }
deba@1866
   755
deba@1866
   756
//     void augment(const Edge& e, Number a) {
deba@1866
   757
//       if (direction(e)) {
deba@1866
   758
// 	flow->set(e, (*flow)[e]+a);
deba@1866
   759
//       } else { 
deba@1866
   760
// 	flow->set(e, (*flow)[e]-a);
deba@1866
   761
//       }
deba@1866
   762
//       if ((*flow)[e] == (*capacity)[e]) {
deba@1866
   763
// 	Parent::hide(e);
deba@1866
   764
//       } else {
deba@1866
   765
// 	Parent::unHide(e);
deba@1866
   766
//       }
deba@1866
   767
//       if ((*flow)[e] == 0) {
deba@1866
   768
// 	Parent::hide(oppositeEdge(e));
deba@1866
   769
//       } else {
deba@1866
   770
// 	Parent::unHide(oppositeEdge(e));
deba@1866
   771
//       }
deba@1866
   772
//     }
deba@1866
   773
deba@1866
   774
//     Number resCap(const Edge& e) {
deba@1866
   775
//       if (direction(e)) { 
deba@1866
   776
// 	return (*capacity)[e]-(*flow)[e]; 
deba@1866
   777
//       } else { 
deba@1866
   778
// 	return (*flow)[e];
deba@1866
   779
//       }
deba@1866
   780
//     }
deba@1866
   781
    
deba@1866
   782
//     bool direction(const Edge& edge) const {
deba@1866
   783
//       return Parent::getGraph().direction(edge);
deba@1866
   784
//     }
deba@1866
   785
klao@1909
   786
//     Edge direct(const UEdge& edge, bool direction) const {
deba@1866
   787
//       return Parent::getGraph().direct(edge, direction);
deba@1866
   788
//     }
deba@1866
   789
klao@1909
   790
//     Edge direct(const UEdge& edge, const Node& node) const {
deba@1866
   791
//       return Parent::getGraph().direct(edge, node);
deba@1866
   792
//     }
deba@1866
   793
deba@1866
   794
//     Edge oppositeEdge(const Edge& edge) const {
deba@1866
   795
//       return Parent::getGraph().oppositeEdge(edge);
deba@1866
   796
//     }
deba@1866
   797
deba@1866
   798
//     /// \brief Residual capacity map.
deba@1866
   799
//     ///
deba@1866
   800
//     /// In generic residual graphs the residual capacity can be obtained 
deba@1866
   801
//     /// as a map. 
deba@1866
   802
//     class ResCap {
deba@1866
   803
//     protected:
deba@1866
   804
//       const ResGraphAdaptor* res_graph;
deba@1866
   805
//     public:
deba@1866
   806
//       typedef Number Value;
deba@1866
   807
//       typedef Edge Key;
deba@1866
   808
//       ResCap(const ResGraphAdaptor& _res_graph) 
deba@1866
   809
// 	: res_graph(&_res_graph) {}
deba@1866
   810
//       Number operator[](const Edge& e) const {
deba@1866
   811
// 	return res_graph->resCap(e);
deba@1866
   812
//       }
deba@1866
   813
//     };
deba@1866
   814
//   };
deba@1866
   815
deba@1866
   816
}
deba@1866
   817
deba@1866
   818
#endif