COIN-OR::LEMON - Graph Library

source: lemon-0.x/doc/graph-adaptors.dox @ 1555:48769ac7ec32

Last change on this file since 1555:48769ac7ec32 was 1401:9588dcef6793, checked in by Alpar Juttner, 15 years ago

wrapper -> adaptor

File size: 3.3 KB
RevLine 
[1172]1/**
[1401]2   @defgroup graph_adaptors Adaptor Classes for Graphs
3   \brief This group contains several adaptor classes for graphs
[1172]4   @ingroup graphs
[556]5   
[1172]6   The main parts of LEMON are the different graph structures,
7   generic graph algorithms, graph concepts which couple these, and
[1401]8   graph adaptors. While the previous notions are more or less clear, the
[1252]9   latter one needs further explanation.
[1401]10   Graph adaptors are graph classes which serve for considering graph
[1252]11   structures in different ways.
12
13   A short example makes this much
[1172]14   clearer.
15   Suppose that we have an instance \c g of a directed graph
[1252]16   type say ListGraph and an algorithm
[1172]17   \code template<typename Graph> int algorithm(const Graph&); \endcode
[1252]18   is needed to run on the reversed oriented graph.
[1172]19   It may be expensive (in time or in memory usage) to copy
[1252]20   \c g with the reversed orientation.
[1401]21   In this case, an adaptor class is used, which
[1252]22   (according to LEMON graph concepts) works as a graph.
[1401]23   The adaptor uses
[1252]24   the original graph structure and graph operations when methods of the
25   reversed oriented graph are called.
[1401]26   This means that the adaptor have minor memory usage,
[1252]27   and do not perform sophisticated algorithmic actions.
28   The purpose of it is to give a tool for the cases when
29   a graph have to be used in a specific alteration.
30   If this alteration is obtained by a usual construction
31   like filtering the edge-set or considering a new orientation, then
[1401]32   an adaptor is worthwhile to use.
[1252]33   To come back to the reversed oriented graph, in this situation
[1401]34   \code template<typename Graph> class RevGraphAdaptor; \endcode
[1252]35   template class can be used.
36   The code looks as follows
[1172]37   \code
38   ListGraph g;
[1401]39   RevGraphAdaptor<ListGraph> rgw(g);
[1172]40   int result=algorithm(rgw);
41   \endcode
42   After running the algorithm, the original graph \c g
[1252]43   is untouched.
[1172]44   This techniques gives rise to an elegant code, and
[1401]45   based on stable graph adaptors, complex algorithms can be
[1172]46   implemented easily.
[1252]47
[1172]48   In flow, circulation and bipartite matching problems, the residual
[1401]49   graph is of particular importance. Combining an adaptor implementing
[1172]50   this, shortest path algorithms and minimum mean cycle algorithms,
51   a range of weighted and cardinality optimization algorithms can be
[1252]52   obtained.
53   For other examples,
54   the interested user is referred to the detailed documentation of
[1401]55   particular adaptors.
[1252]56
[1401]57   The behavior of graph adaptors can be very different. Some of them keep
[1172]58   capabilities of the original graph while in other cases this would be
[1252]59   meaningless. This means that the concepts that they are models of depend
[1401]60   on the graph adaptor, and the wrapped graph(s).
[1172]61   If an edge of \c rgw is deleted, this is carried out by
[1401]62   deleting the corresponding edge of \c g, thus the adaptor modifies the
[1252]63   original graph.
64   But for a residual
[1172]65   graph, this operation has no sense.
[1252]66   Let us stand one more example here to simplify your work.
[1401]67   RevGraphAdaptor has constructor
[1252]68   \code
[1401]69   RevGraphAdaptor(Graph& _g);
[1252]70   \endcode
[1172]71   This means that in a situation,
72   when a <tt> const ListGraph& </tt> reference to a graph is given,
73   then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
74   \code
75   int algorithm1(const ListGraph& g) {
[1401]76   RevGraphAdaptor<const ListGraph> rgw(g);
[1172]77   return algorithm2(rgw);
78   }
79   \endcode
80*/
Note: See TracBrowser for help on using the repository browser.