doc/groups.dox
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 891 bb70ad62c95f
parent 660 d9cf3b5858ae
child 710 f1fe0ddad6f7
child 713 4ac30454f1c1
child 735 853fcddcf282
child 768 0a42883c8221
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.
alpar@209
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
alpar@40
     2
 *
alpar@209
     3
 * This file is a part of LEMON, a generic C++ optimization library.
alpar@40
     4
 *
alpar@440
     5
 * Copyright (C) 2003-2009
alpar@40
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@40
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@40
     8
 *
alpar@40
     9
 * Permission to use, modify and distribute this software is granted
alpar@40
    10
 * provided that this copyright notice appears in all copies. For
alpar@40
    11
 * precise terms see the accompanying LICENSE file.
alpar@40
    12
 *
alpar@40
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@40
    14
 * express or implied, and with no claim as to its suitability for any
alpar@40
    15
 * purpose.
alpar@40
    16
 *
alpar@40
    17
 */
alpar@40
    18
kpeter@406
    19
namespace lemon {
kpeter@406
    20
alpar@40
    21
/**
alpar@40
    22
@defgroup datas Data Structures
kpeter@559
    23
This group contains the several data structures implemented in LEMON.
alpar@40
    24
*/
alpar@40
    25
alpar@40
    26
/**
alpar@40
    27
@defgroup graphs Graph Structures
alpar@40
    28
@ingroup datas
alpar@40
    29
\brief Graph structures implemented in LEMON.
alpar@40
    30
alpar@209
    31
The implementation of combinatorial algorithms heavily relies on
alpar@209
    32
efficient graph implementations. LEMON offers data structures which are
alpar@209
    33
planned to be easily used in an experimental phase of implementation studies,
alpar@209
    34
and thereafter the program code can be made efficient by small modifications.
alpar@40
    35
alpar@40
    36
The most efficient implementation of diverse applications require the
alpar@40
    37
usage of different physical graph implementations. These differences
alpar@40
    38
appear in the size of graph we require to handle, memory or time usage
alpar@40
    39
limitations or in the set of operations through which the graph can be
alpar@40
    40
accessed.  LEMON provides several physical graph structures to meet
alpar@40
    41
the diverging requirements of the possible users.  In order to save on
alpar@40
    42
running time or on memory usage, some structures may fail to provide
kpeter@83
    43
some graph features like arc/edge or node deletion.
alpar@40
    44
alpar@209
    45
Alteration of standard containers need a very limited number of
alpar@209
    46
operations, these together satisfy the everyday requirements.
alpar@209
    47
In the case of graph structures, different operations are needed which do
alpar@209
    48
not alter the physical graph, but gives another view. If some nodes or
kpeter@83
    49
arcs have to be hidden or the reverse oriented graph have to be used, then
alpar@209
    50
this is the case. It also may happen that in a flow implementation
alpar@209
    51
the residual graph can be accessed by another algorithm, or a node-set
alpar@209
    52
is to be shrunk for another algorithm.
alpar@209
    53
LEMON also provides a variety of graphs for these requirements called
alpar@209
    54
\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
alpar@209
    55
in conjunction with other graph representations.
alpar@40
    56
alpar@40
    57
You are free to use the graph structure that fit your requirements
alpar@40
    58
the best, most graph algorithms and auxiliary data structures can be used
kpeter@314
    59
with any graph structure.
kpeter@314
    60
kpeter@314
    61
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
alpar@40
    62
*/
alpar@40
    63
alpar@40
    64
/**
kpeter@451
    65
@defgroup graph_adaptors Adaptor Classes for Graphs
deba@416
    66
@ingroup graphs
kpeter@451
    67
\brief Adaptor classes for digraphs and graphs
kpeter@451
    68
kpeter@451
    69
This group contains several useful adaptor classes for digraphs and graphs.
deba@416
    70
deba@416
    71
The main parts of LEMON are the different graph structures, generic
kpeter@451
    72
graph algorithms, graph concepts, which couple them, and graph
deba@416
    73
adaptors. While the previous notions are more or less clear, the
deba@416
    74
latter one needs further explanation. Graph adaptors are graph classes
deba@416
    75
which serve for considering graph structures in different ways.
deba@416
    76
deba@416
    77
A short example makes this much clearer.  Suppose that we have an
kpeter@451
    78
instance \c g of a directed graph type, say ListDigraph and an algorithm
deba@416
    79
\code
deba@416
    80
template <typename Digraph>
deba@416
    81
int algorithm(const Digraph&);
deba@416
    82
\endcode
deba@416
    83
is needed to run on the reverse oriented graph.  It may be expensive
deba@416
    84
(in time or in memory usage) to copy \c g with the reversed
deba@416
    85
arcs.  In this case, an adaptor class is used, which (according
kpeter@451
    86
to LEMON \ref concepts::Digraph "digraph concepts") works as a digraph.
kpeter@451
    87
The adaptor uses the original digraph structure and digraph operations when
kpeter@451
    88
methods of the reversed oriented graph are called.  This means that the adaptor
kpeter@451
    89
have minor memory usage, and do not perform sophisticated algorithmic
deba@416
    90
actions.  The purpose of it is to give a tool for the cases when a
deba@416
    91
graph have to be used in a specific alteration.  If this alteration is
kpeter@451
    92
obtained by a usual construction like filtering the node or the arc set or
deba@416
    93
considering a new orientation, then an adaptor is worthwhile to use.
deba@416
    94
To come back to the reverse oriented graph, in this situation
deba@416
    95
\code
deba@416
    96
template<typename Digraph> class ReverseDigraph;
deba@416
    97
\endcode
deba@416
    98
template class can be used. The code looks as follows
deba@416
    99
\code
deba@416
   100
ListDigraph g;
kpeter@451
   101
ReverseDigraph<ListDigraph> rg(g);
deba@416
   102
int result = algorithm(rg);
deba@416
   103
\endcode
kpeter@451
   104
During running the algorithm, the original digraph \c g is untouched.
kpeter@451
   105
This techniques give rise to an elegant code, and based on stable
deba@416
   106
graph adaptors, complex algorithms can be implemented easily.
deba@416
   107
kpeter@451
   108
In flow, circulation and matching problems, the residual
deba@416
   109
graph is of particular importance. Combining an adaptor implementing
kpeter@451
   110
this with shortest path algorithms or minimum mean cycle algorithms,
deba@416
   111
a range of weighted and cardinality optimization algorithms can be
deba@416
   112
obtained. For other examples, the interested user is referred to the
deba@416
   113
detailed documentation of particular adaptors.
deba@416
   114
deba@416
   115
The behavior of graph adaptors can be very different. Some of them keep
deba@416
   116
capabilities of the original graph while in other cases this would be
kpeter@451
   117
meaningless. This means that the concepts that they meet depend
kpeter@451
   118
on the graph adaptor, and the wrapped graph.
kpeter@451
   119
For example, if an arc of a reversed digraph is deleted, this is carried
kpeter@451
   120
out by deleting the corresponding arc of the original digraph, thus the
kpeter@451
   121
adaptor modifies the original digraph.
kpeter@451
   122
However in case of a residual digraph, this operation has no sense.
deba@416
   123
deba@416
   124
Let us stand one more example here to simplify your work.
kpeter@451
   125
ReverseDigraph has constructor
deba@416
   126
\code
deba@416
   127
ReverseDigraph(Digraph& digraph);
deba@416
   128
\endcode
kpeter@451
   129
This means that in a situation, when a <tt>const %ListDigraph&</tt>
deba@416
   130
reference to a graph is given, then it have to be instantiated with
kpeter@451
   131
<tt>Digraph=const %ListDigraph</tt>.
deba@416
   132
\code
deba@416
   133
int algorithm1(const ListDigraph& g) {
kpeter@451
   134
  ReverseDigraph<const ListDigraph> rg(g);
deba@416
   135
  return algorithm2(rg);
deba@416
   136
}
deba@416
   137
\endcode
deba@416
   138
*/
deba@416
   139
deba@416
   140
/**
alpar@209
   141
@defgroup maps Maps
alpar@40
   142
@ingroup datas
kpeter@50
   143
\brief Map structures implemented in LEMON.
alpar@40
   144
kpeter@559
   145
This group contains the map structures implemented in LEMON.
kpeter@50
   146
kpeter@314
   147
LEMON provides several special purpose maps and map adaptors that e.g. combine
alpar@40
   148
new maps from existing ones.
kpeter@314
   149
kpeter@314
   150
<b>See also:</b> \ref map_concepts "Map Concepts".
alpar@40
   151
*/
alpar@40
   152
alpar@40
   153
/**
alpar@209
   154
@defgroup graph_maps Graph Maps
alpar@40
   155
@ingroup maps
kpeter@83
   156
\brief Special graph-related maps.
alpar@40
   157
kpeter@559
   158
This group contains maps that are specifically designed to assign
kpeter@406
   159
values to the nodes and arcs/edges of graphs.
kpeter@406
   160
kpeter@406
   161
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
kpeter@406
   162
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
alpar@40
   163
*/
alpar@40
   164
alpar@40
   165
/**
alpar@40
   166
\defgroup map_adaptors Map Adaptors
alpar@40
   167
\ingroup maps
alpar@40
   168
\brief Tools to create new maps from existing ones
alpar@40
   169
kpeter@559
   170
This group contains map adaptors that are used to create "implicit"
kpeter@50
   171
maps from other maps.
alpar@40
   172
kpeter@406
   173
Most of them are \ref concepts::ReadMap "read-only maps".
kpeter@83
   174
They can make arithmetic and logical operations between one or two maps
kpeter@83
   175
(negation, shifting, addition, multiplication, logical 'and', 'or',
kpeter@83
   176
'not' etc.) or e.g. convert a map to another one of different Value type.
alpar@40
   177
kpeter@50
   178
The typical usage of this classes is passing implicit maps to
alpar@40
   179
algorithms.  If a function type algorithm is called then the function
alpar@40
   180
type map adaptors can be used comfortable. For example let's see the
kpeter@314
   181
usage of map adaptors with the \c graphToEps() function.
alpar@40
   182
\code
alpar@40
   183
  Color nodeColor(int deg) {
alpar@40
   184
    if (deg >= 2) {
alpar@40
   185
      return Color(0.5, 0.0, 0.5);
alpar@40
   186
    } else if (deg == 1) {
alpar@40
   187
      return Color(1.0, 0.5, 1.0);
alpar@40
   188
    } else {
alpar@40
   189
      return Color(0.0, 0.0, 0.0);
alpar@40
   190
    }
alpar@40
   191
  }
alpar@209
   192
kpeter@83
   193
  Digraph::NodeMap<int> degree_map(graph);
alpar@209
   194
kpeter@314
   195
  graphToEps(graph, "graph.eps")
alpar@40
   196
    .coords(coords).scaleToA4().undirected()
kpeter@83
   197
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
alpar@40
   198
    .run();
alpar@209
   199
\endcode
kpeter@83
   200
The \c functorToMap() function makes an \c int to \c Color map from the
kpeter@314
   201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
kpeter@83
   202
and the previously created map. The composed map is a proper function to
kpeter@83
   203
get the color of each node.
alpar@40
   204
alpar@40
   205
The usage with class type algorithms is little bit harder. In this
alpar@40
   206
case the function type map adaptors can not be used, because the
kpeter@50
   207
function map adaptors give back temporary objects.
alpar@40
   208
\code
kpeter@83
   209
  Digraph graph;
kpeter@83
   210
kpeter@83
   211
  typedef Digraph::ArcMap<double> DoubleArcMap;
kpeter@83
   212
  DoubleArcMap length(graph);
kpeter@83
   213
  DoubleArcMap speed(graph);
kpeter@83
   214
kpeter@83
   215
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
alpar@40
   216
  TimeMap time(length, speed);
alpar@209
   217
kpeter@83
   218
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
alpar@40
   219
  dijkstra.run(source, target);
alpar@40
   220
\endcode
kpeter@83
   221
We have a length map and a maximum speed map on the arcs of a digraph.
kpeter@83
   222
The minimum time to pass the arc can be calculated as the division of
kpeter@83
   223
the two maps which can be done implicitly with the \c DivMap template
alpar@40
   224
class. We use the implicit minimum time map as the length map of the
alpar@40
   225
\c Dijkstra algorithm.
alpar@40
   226
*/
alpar@40
   227
alpar@40
   228
/**
alpar@209
   229
@defgroup matrices Matrices
alpar@40
   230
@ingroup datas
kpeter@50
   231
\brief Two dimensional data storages implemented in LEMON.
alpar@40
   232
kpeter@559
   233
This group contains two dimensional data storages implemented in LEMON.
alpar@40
   234
*/
alpar@40
   235
alpar@40
   236
/**
alpar@40
   237
@defgroup paths Path Structures
alpar@40
   238
@ingroup datas
kpeter@318
   239
\brief %Path structures implemented in LEMON.
alpar@40
   240
kpeter@559
   241
This group contains the path structures implemented in LEMON.
alpar@40
   242
kpeter@50
   243
LEMON provides flexible data structures to work with paths.
kpeter@50
   244
All of them have similar interfaces and they can be copied easily with
kpeter@50
   245
assignment operators and copy constructors. This makes it easy and
alpar@40
   246
efficient to have e.g. the Dijkstra algorithm to store its result in
alpar@40
   247
any kind of path structure.
alpar@40
   248
alpar@40
   249
\sa lemon::concepts::Path
alpar@40
   250
*/
alpar@40
   251
alpar@40
   252
/**
alpar@40
   253
@defgroup auxdat Auxiliary Data Structures
alpar@40
   254
@ingroup datas
kpeter@50
   255
\brief Auxiliary data structures implemented in LEMON.
alpar@40
   256
kpeter@559
   257
This group contains some data structures implemented in LEMON in
alpar@40
   258
order to make it easier to implement combinatorial algorithms.
alpar@40
   259
*/
alpar@40
   260
alpar@40
   261
/**
alpar@40
   262
@defgroup algs Algorithms
kpeter@559
   263
\brief This group contains the several algorithms
alpar@40
   264
implemented in LEMON.
alpar@40
   265
kpeter@559
   266
This group contains the several algorithms
alpar@40
   267
implemented in LEMON.
alpar@40
   268
*/
alpar@40
   269
alpar@40
   270
/**
alpar@40
   271
@defgroup search Graph Search
alpar@40
   272
@ingroup algs
kpeter@50
   273
\brief Common graph search algorithms.
alpar@40
   274
kpeter@559
   275
This group contains the common graph search algorithms, namely
kpeter@406
   276
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
alpar@40
   277
*/
alpar@40
   278
alpar@40
   279
/**
kpeter@314
   280
@defgroup shortest_path Shortest Path Algorithms
alpar@40
   281
@ingroup algs
kpeter@50
   282
\brief Algorithms for finding shortest paths.
alpar@40
   283
kpeter@559
   284
This group contains the algorithms for finding shortest paths in digraphs.
kpeter@406
   285
kpeter@406
   286
 - \ref Dijkstra algorithm for finding shortest paths from a source node
kpeter@406
   287
   when all arc lengths are non-negative.
kpeter@406
   288
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
kpeter@406
   289
   from a source node when arc lenghts can be either positive or negative,
kpeter@406
   290
   but the digraph should not contain directed cycles with negative total
kpeter@406
   291
   length.
kpeter@406
   292
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
kpeter@406
   293
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
kpeter@406
   294
   lenghts can be either positive or negative, but the digraph should
kpeter@406
   295
   not contain directed cycles with negative total length.
kpeter@406
   296
 - \ref Suurballe A successive shortest path algorithm for finding
kpeter@406
   297
   arc-disjoint paths between two nodes having minimum total length.
alpar@40
   298
*/
alpar@40
   299
alpar@209
   300
/**
kpeter@314
   301
@defgroup max_flow Maximum Flow Algorithms
alpar@209
   302
@ingroup algs
kpeter@50
   303
\brief Algorithms for finding maximum flows.
alpar@40
   304
kpeter@559
   305
This group contains the algorithms for finding maximum flows and
alpar@40
   306
feasible circulations.
alpar@40
   307
kpeter@406
   308
The \e maximum \e flow \e problem is to find a flow of maximum value between
kpeter@406
   309
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
kpeter@609
   310
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
kpeter@406
   311
\f$s, t \in V\f$ source and target nodes.
kpeter@609
   312
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
kpeter@406
   313
following optimization problem.
alpar@40
   314
kpeter@609
   315
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
kpeter@609
   316
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
kpeter@609
   317
    \quad \forall u\in V\setminus\{s,t\} \f]
kpeter@609
   318
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
alpar@40
   319
kpeter@50
   320
LEMON contains several algorithms for solving maximum flow problems:
kpeter@406
   321
- \ref EdmondsKarp Edmonds-Karp algorithm.
kpeter@406
   322
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
kpeter@406
   323
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
kpeter@406
   324
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
alpar@40
   325
kpeter@406
   326
In most cases the \ref Preflow "Preflow" algorithm provides the
kpeter@406
   327
fastest method for computing a maximum flow. All implementations
kpeter@651
   328
also provide functions to query the minimum cut, which is the dual
kpeter@651
   329
problem of maximum flow.
kpeter@651
   330
kpeter@651
   331
\ref Circulation is a preflow push-relabel algorithm implemented directly 
kpeter@651
   332
for finding feasible circulations, which is a somewhat different problem,
kpeter@651
   333
but it is strongly related to maximum flow.
kpeter@651
   334
For more information, see \ref Circulation.
alpar@40
   335
*/
alpar@40
   336
alpar@40
   337
/**
kpeter@663
   338
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
alpar@40
   339
@ingroup algs
alpar@40
   340
kpeter@50
   341
\brief Algorithms for finding minimum cost flows and circulations.
alpar@40
   342
kpeter@609
   343
This group contains the algorithms for finding minimum cost flows and
kpeter@663
   344
circulations. For more information about this problem and its dual
kpeter@663
   345
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
kpeter@406
   346
kpeter@663
   347
LEMON contains several algorithms for this problem.
kpeter@609
   348
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
kpeter@609
   349
   pivot strategies.
kpeter@609
   350
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
kpeter@609
   351
   cost scaling.
kpeter@609
   352
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
kpeter@406
   353
   capacity scaling.
kpeter@609
   354
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
kpeter@609
   355
 - \ref CycleCanceling Cycle-Canceling algorithms.
kpeter@609
   356
kpeter@609
   357
In general NetworkSimplex is the most efficient implementation,
kpeter@609
   358
but in special cases other algorithms could be faster.
kpeter@609
   359
For example, if the total supply and/or capacities are rather small,
kpeter@609
   360
CapacityScaling is usually the fastest algorithm (without effective scaling).
alpar@40
   361
*/
alpar@40
   362
alpar@40
   363
/**
kpeter@314
   364
@defgroup min_cut Minimum Cut Algorithms
alpar@209
   365
@ingroup algs
alpar@40
   366
kpeter@50
   367
\brief Algorithms for finding minimum cut in graphs.
alpar@40
   368
kpeter@559
   369
This group contains the algorithms for finding minimum cut in graphs.
alpar@40
   370
kpeter@406
   371
The \e minimum \e cut \e problem is to find a non-empty and non-complete
kpeter@406
   372
\f$X\f$ subset of the nodes with minimum overall capacity on
kpeter@406
   373
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
kpeter@406
   374
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
kpeter@50
   375
cut is the \f$X\f$ solution of the next optimization problem:
alpar@40
   376
alpar@210
   377
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
kpeter@406
   378
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
alpar@40
   379
kpeter@50
   380
LEMON contains several algorithms related to minimum cut problems:
alpar@40
   381
kpeter@406
   382
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
kpeter@406
   383
  in directed graphs.
kpeter@406
   384
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
kpeter@406
   385
  calculating minimum cut in undirected graphs.
kpeter@559
   386
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
kpeter@406
   387
  all-pairs minimum cut in undirected graphs.
alpar@40
   388
alpar@40
   389
If you want to find minimum cut just between two distinict nodes,
kpeter@406
   390
see the \ref max_flow "maximum flow problem".
alpar@40
   391
*/
alpar@40
   392
alpar@40
   393
/**
kpeter@586
   394
@defgroup graph_properties Connectivity and Other Graph Properties
alpar@40
   395
@ingroup algs
kpeter@50
   396
\brief Algorithms for discovering the graph properties
alpar@40
   397
kpeter@559
   398
This group contains the algorithms for discovering the graph properties
kpeter@50
   399
like connectivity, bipartiteness, euler property, simplicity etc.
alpar@40
   400
alpar@40
   401
\image html edge_biconnected_components.png
alpar@40
   402
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
alpar@40
   403
*/
alpar@40
   404
alpar@40
   405
/**
kpeter@314
   406
@defgroup planar Planarity Embedding and Drawing
alpar@40
   407
@ingroup algs
kpeter@50
   408
\brief Algorithms for planarity checking, embedding and drawing
alpar@40
   409
kpeter@559
   410
This group contains the algorithms for planarity checking,
alpar@210
   411
embedding and drawing.
alpar@40
   412
alpar@40
   413
\image html planar.png
alpar@40
   414
\image latex planar.eps "Plane graph" width=\textwidth
alpar@40
   415
*/
alpar@40
   416
alpar@40
   417
/**
kpeter@314
   418
@defgroup matching Matching Algorithms
alpar@40
   419
@ingroup algs
kpeter@50
   420
\brief Algorithms for finding matchings in graphs and bipartite graphs.
alpar@40
   421
kpeter@590
   422
This group contains the algorithms for calculating
alpar@40
   423
matchings in graphs and bipartite graphs. The general matching problem is
kpeter@590
   424
finding a subset of the edges for which each node has at most one incident
kpeter@590
   425
edge.
alpar@209
   426
alpar@40
   427
There are several different algorithms for calculate matchings in
alpar@40
   428
graphs.  The matching problems in bipartite graphs are generally
alpar@40
   429
easier than in general graphs. The goal of the matching optimization
kpeter@406
   430
can be finding maximum cardinality, maximum weight or minimum cost
alpar@40
   431
matching. The search can be constrained to find perfect or
alpar@40
   432
maximum cardinality matching.
alpar@40
   433
kpeter@406
   434
The matching algorithms implemented in LEMON:
kpeter@406
   435
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
kpeter@406
   436
  for calculating maximum cardinality matching in bipartite graphs.
kpeter@406
   437
- \ref PrBipartiteMatching Push-relabel algorithm
kpeter@406
   438
  for calculating maximum cardinality matching in bipartite graphs.
kpeter@406
   439
- \ref MaxWeightedBipartiteMatching
kpeter@406
   440
  Successive shortest path algorithm for calculating maximum weighted
kpeter@406
   441
  matching and maximum weighted bipartite matching in bipartite graphs.
kpeter@406
   442
- \ref MinCostMaxBipartiteMatching
kpeter@406
   443
  Successive shortest path algorithm for calculating minimum cost maximum
kpeter@406
   444
  matching in bipartite graphs.
kpeter@406
   445
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
kpeter@406
   446
  maximum cardinality matching in general graphs.
kpeter@406
   447
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
kpeter@406
   448
  maximum weighted matching in general graphs.
kpeter@406
   449
- \ref MaxWeightedPerfectMatching
kpeter@406
   450
  Edmond's blossom shrinking algorithm for calculating maximum weighted
kpeter@406
   451
  perfect matching in general graphs.
alpar@40
   452
alpar@40
   453
\image html bipartite_matching.png
alpar@40
   454
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
alpar@40
   455
*/
alpar@40
   456
alpar@40
   457
/**
kpeter@314
   458
@defgroup spantree Minimum Spanning Tree Algorithms
alpar@40
   459
@ingroup algs
kpeter@651
   460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
alpar@40
   461
kpeter@651
   462
This group contains the algorithms for finding minimum cost spanning
kpeter@651
   463
trees and arborescences.
alpar@40
   464
*/
alpar@40
   465
alpar@40
   466
/**
kpeter@314
   467
@defgroup auxalg Auxiliary Algorithms
alpar@40
   468
@ingroup algs
kpeter@50
   469
\brief Auxiliary algorithms implemented in LEMON.
alpar@40
   470
kpeter@559
   471
This group contains some algorithms implemented in LEMON
kpeter@50
   472
in order to make it easier to implement complex algorithms.
alpar@40
   473
*/
alpar@40
   474
alpar@40
   475
/**
kpeter@314
   476
@defgroup approx Approximation Algorithms
kpeter@314
   477
@ingroup algs
kpeter@50
   478
\brief Approximation algorithms.
alpar@40
   479
kpeter@559
   480
This group contains the approximation and heuristic algorithms
kpeter@50
   481
implemented in LEMON.
alpar@40
   482
*/
alpar@40
   483
alpar@40
   484
/**
alpar@40
   485
@defgroup gen_opt_group General Optimization Tools
kpeter@559
   486
\brief This group contains some general optimization frameworks
alpar@40
   487
implemented in LEMON.
alpar@40
   488
kpeter@559
   489
This group contains some general optimization frameworks
alpar@40
   490
implemented in LEMON.
alpar@40
   491
*/
alpar@40
   492
alpar@40
   493
/**
kpeter@314
   494
@defgroup lp_group Lp and Mip Solvers
alpar@40
   495
@ingroup gen_opt_group
alpar@40
   496
\brief Lp and Mip solver interfaces for LEMON.
alpar@40
   497
kpeter@559
   498
This group contains Lp and Mip solver interfaces for LEMON. The
alpar@40
   499
various LP solvers could be used in the same manner with this
alpar@40
   500
interface.
alpar@40
   501
*/
alpar@40
   502
alpar@209
   503
/**
kpeter@314
   504
@defgroup lp_utils Tools for Lp and Mip Solvers
alpar@40
   505
@ingroup lp_group
kpeter@50
   506
\brief Helper tools to the Lp and Mip solvers.
alpar@40
   507
alpar@40
   508
This group adds some helper tools to general optimization framework
alpar@40
   509
implemented in LEMON.
alpar@40
   510
*/
alpar@40
   511
alpar@40
   512
/**
alpar@40
   513
@defgroup metah Metaheuristics
alpar@40
   514
@ingroup gen_opt_group
alpar@40
   515
\brief Metaheuristics for LEMON library.
alpar@40
   516
kpeter@559
   517
This group contains some metaheuristic optimization tools.
alpar@40
   518
*/
alpar@40
   519
alpar@40
   520
/**
alpar@209
   521
@defgroup utils Tools and Utilities
kpeter@50
   522
\brief Tools and utilities for programming in LEMON
alpar@40
   523
kpeter@50
   524
Tools and utilities for programming in LEMON.
alpar@40
   525
*/
alpar@40
   526
alpar@40
   527
/**
alpar@40
   528
@defgroup gutils Basic Graph Utilities
alpar@40
   529
@ingroup utils
kpeter@50
   530
\brief Simple basic graph utilities.
alpar@40
   531
kpeter@559
   532
This group contains some simple basic graph utilities.
alpar@40
   533
*/
alpar@40
   534
alpar@40
   535
/**
alpar@40
   536
@defgroup misc Miscellaneous Tools
alpar@40
   537
@ingroup utils
kpeter@50
   538
\brief Tools for development, debugging and testing.
kpeter@50
   539
kpeter@559
   540
This group contains several useful tools for development,
alpar@40
   541
debugging and testing.
alpar@40
   542
*/
alpar@40
   543
alpar@40
   544
/**
kpeter@314
   545
@defgroup timecount Time Measuring and Counting
alpar@40
   546
@ingroup misc
kpeter@50
   547
\brief Simple tools for measuring the performance of algorithms.
kpeter@50
   548
kpeter@559
   549
This group contains simple tools for measuring the performance
alpar@40
   550
of algorithms.
alpar@40
   551
*/
alpar@40
   552
alpar@40
   553
/**
alpar@40
   554
@defgroup exceptions Exceptions
alpar@40
   555
@ingroup utils
kpeter@50
   556
\brief Exceptions defined in LEMON.
kpeter@50
   557
kpeter@559
   558
This group contains the exceptions defined in LEMON.
alpar@40
   559
*/
alpar@40
   560
alpar@40
   561
/**
alpar@40
   562
@defgroup io_group Input-Output
kpeter@50
   563
\brief Graph Input-Output methods
alpar@40
   564
kpeter@559
   565
This group contains the tools for importing and exporting graphs
kpeter@314
   566
and graph related data. Now it supports the \ref lgf-format
kpeter@314
   567
"LEMON Graph Format", the \c DIMACS format and the encapsulated
kpeter@314
   568
postscript (EPS) format.
alpar@40
   569
*/
alpar@40
   570
alpar@40
   571
/**
kpeter@351
   572
@defgroup lemon_io LEMON Graph Format
alpar@40
   573
@ingroup io_group
kpeter@314
   574
\brief Reading and writing LEMON Graph Format.
alpar@40
   575
kpeter@559
   576
This group contains methods for reading and writing
ladanyi@236
   577
\ref lgf-format "LEMON Graph Format".
alpar@40
   578
*/
alpar@40
   579
alpar@40
   580
/**
kpeter@314
   581
@defgroup eps_io Postscript Exporting
alpar@40
   582
@ingroup io_group
alpar@40
   583
\brief General \c EPS drawer and graph exporter
alpar@40
   584
kpeter@559
   585
This group contains general \c EPS drawing methods and special
alpar@209
   586
graph exporting tools.
alpar@40
   587
*/
alpar@40
   588
alpar@40
   589
/**
kpeter@388
   590
@defgroup dimacs_group DIMACS format
kpeter@388
   591
@ingroup io_group
kpeter@388
   592
\brief Read and write files in DIMACS format
kpeter@388
   593
kpeter@388
   594
Tools to read a digraph from or write it to a file in DIMACS format data.
kpeter@388
   595
*/
kpeter@388
   596
kpeter@388
   597
/**
kpeter@351
   598
@defgroup nauty_group NAUTY Format
kpeter@351
   599
@ingroup io_group
kpeter@351
   600
\brief Read \e Nauty format
kpeter@388
   601
kpeter@351
   602
Tool to read graphs from \e Nauty format data.
kpeter@351
   603
*/
kpeter@351
   604
kpeter@351
   605
/**
alpar@40
   606
@defgroup concept Concepts
alpar@40
   607
\brief Skeleton classes and concept checking classes
alpar@40
   608
kpeter@559
   609
This group contains the data/algorithm skeletons and concept checking
alpar@40
   610
classes implemented in LEMON.
alpar@40
   611
alpar@40
   612
The purpose of the classes in this group is fourfold.
alpar@209
   613
kpeter@318
   614
- These classes contain the documentations of the %concepts. In order
alpar@40
   615
  to avoid document multiplications, an implementation of a concept
alpar@40
   616
  simply refers to the corresponding concept class.
alpar@40
   617
alpar@40
   618
- These classes declare every functions, <tt>typedef</tt>s etc. an
kpeter@318
   619
  implementation of the %concepts should provide, however completely
alpar@40
   620
  without implementations and real data structures behind the
alpar@40
   621
  interface. On the other hand they should provide nothing else. All
alpar@40
   622
  the algorithms working on a data structure meeting a certain concept
alpar@40
   623
  should compile with these classes. (Though it will not run properly,
alpar@40
   624
  of course.) In this way it is easily to check if an algorithm
alpar@40
   625
  doesn't use any extra feature of a certain implementation.
alpar@40
   626
alpar@40
   627
- The concept descriptor classes also provide a <em>checker class</em>
kpeter@50
   628
  that makes it possible to check whether a certain implementation of a
alpar@40
   629
  concept indeed provides all the required features.
alpar@40
   630
alpar@40
   631
- Finally, They can serve as a skeleton of a new implementation of a concept.
alpar@40
   632
*/
alpar@40
   633
alpar@40
   634
/**
alpar@40
   635
@defgroup graph_concepts Graph Structure Concepts
alpar@40
   636
@ingroup concept
alpar@40
   637
\brief Skeleton and concept checking classes for graph structures
alpar@40
   638
kpeter@559
   639
This group contains the skeletons and concept checking classes of LEMON's
alpar@40
   640
graph structures and helper classes used to implement these.
alpar@40
   641
*/
alpar@40
   642
kpeter@314
   643
/**
kpeter@314
   644
@defgroup map_concepts Map Concepts
kpeter@314
   645
@ingroup concept
kpeter@314
   646
\brief Skeleton and concept checking classes for maps
kpeter@314
   647
kpeter@559
   648
This group contains the skeletons and concept checking classes of maps.
alpar@40
   649
*/
alpar@40
   650
alpar@40
   651
/**
alpar@40
   652
\anchor demoprograms
alpar@40
   653
kpeter@406
   654
@defgroup demos Demo Programs
alpar@40
   655
alpar@40
   656
Some demo programs are listed here. Their full source codes can be found in
alpar@40
   657
the \c demo subdirectory of the source tree.
alpar@40
   658
ladanyi@564
   659
In order to compile them, use the <tt>make demo</tt> or the
ladanyi@564
   660
<tt>make check</tt> commands.
alpar@40
   661
*/
alpar@40
   662
alpar@40
   663
/**
kpeter@406
   664
@defgroup tools Standalone Utility Applications
alpar@40
   665
alpar@209
   666
Some utility applications are listed here.
alpar@40
   667
alpar@40
   668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
alpar@209
   669
them, as well.
alpar@40
   670
*/
alpar@40
   671
kpeter@406
   672
}