| 1 | /** | 
|---|
| 2 | @defgroup gwrappers Wrapper Classes for Graphs | 
|---|
| 3 | \brief This group contains several wrapper classes for graphs | 
|---|
| 4 | @ingroup graphs | 
|---|
| 5 |  | 
|---|
| 6 | The main parts of LEMON are the different graph structures, | 
|---|
| 7 | generic graph algorithms, graph concepts which couple these, and | 
|---|
| 8 | graph wrappers. While the previous ones are more or less clear, the | 
|---|
| 9 | latter notion needs further explanation. | 
|---|
| 10 | Graph wrappers are graph classes which serve for considering graph | 
|---|
| 11 | structures in different ways. A short example makes the notion much | 
|---|
| 12 | clearer. | 
|---|
| 13 | Suppose that we have an instance \c g of a directed graph | 
|---|
| 14 | type say \c ListGraph and an algorithm | 
|---|
| 15 | \code template<typename Graph> int algorithm(const Graph&); \endcode | 
|---|
| 16 | is needed to run on the reversely oriented graph. | 
|---|
| 17 | It may be expensive (in time or in memory usage) to copy | 
|---|
| 18 | \c g with the reverse orientation. | 
|---|
| 19 | Thus, a wrapper class | 
|---|
| 20 | \code template<typename Graph> class RevGraphWrapper; \endcode is used. | 
|---|
| 21 | The code looks as follows | 
|---|
| 22 | \code | 
|---|
| 23 | ListGraph g; | 
|---|
| 24 | RevGraphWrapper<ListGraph> rgw(g); | 
|---|
| 25 | int result=algorithm(rgw); | 
|---|
| 26 | \endcode | 
|---|
| 27 | After running the algorithm, the original graph \c g | 
|---|
| 28 | remains untouched. Thus the graph wrapper used above is to consider the | 
|---|
| 29 | original graph with reverse orientation. | 
|---|
| 30 | This techniques gives rise to an elegant code, and | 
|---|
| 31 | based on stable graph wrappers, complex algorithms can be | 
|---|
| 32 | implemented easily. | 
|---|
| 33 | In flow, circulation and bipartite matching problems, the residual | 
|---|
| 34 | graph is of particular importance. Combining a wrapper implementing | 
|---|
| 35 | this, shortest path algorithms and minimum mean cycle algorithms, | 
|---|
| 36 | a range of weighted and cardinality optimization algorithms can be | 
|---|
| 37 | obtained. For lack of space, for other examples, | 
|---|
| 38 | the interested user is referred to the detailed documentation of graph | 
|---|
| 39 | wrappers. | 
|---|
| 40 | The behavior of graph wrappers can be very different. Some of them keep | 
|---|
| 41 | capabilities of the original graph while in other cases this would be | 
|---|
| 42 | meaningless. This means that the concepts that they are a model of depend | 
|---|
| 43 | on the graph wrapper, and the wrapped graph(s). | 
|---|
| 44 | If an edge of \c rgw is deleted, this is carried out by | 
|---|
| 45 | deleting the corresponding edge of \c g. But for a residual | 
|---|
| 46 | graph, this operation has no sense. | 
|---|
| 47 | Let we stand one more example here to simplify your work. | 
|---|
| 48 | wrapper class | 
|---|
| 49 | \code template<typename Graph> class RevGraphWrapper; \endcode | 
|---|
| 50 | has constructor | 
|---|
| 51 | <tt> RevGraphWrapper(Graph& _g)</tt>. | 
|---|
| 52 | This means that in a situation, | 
|---|
| 53 | when a <tt> const ListGraph& </tt> reference to a graph is given, | 
|---|
| 54 | then it have to be instantiated with <tt>Graph=const ListGraph</tt>. | 
|---|
| 55 | \code | 
|---|
| 56 | int algorithm1(const ListGraph& g) { | 
|---|
| 57 | RevGraphWrapper<const ListGraph> rgw(g); | 
|---|
| 58 | return algorithm2(rgw); | 
|---|
| 59 | } | 
|---|
| 60 | \endcode | 
|---|
| 61 | */ | 
|---|