alpar@209

1 
/* * mode: C++; indenttabsmode: nil; *

alpar@40

2 
*

alpar@209

3 
* This file is a part of LEMON, a generic C++ optimization library.

alpar@40

4 
*

alpar@463

5 
* Copyright (C) 20032009

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@422

19 
namespace lemon {

kpeter@422

20 

alpar@40

21 
/**

alpar@40

22 
@defgroup datas Data Structures

kpeter@606

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 nodeset

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@474

65 
@defgroup graph_adaptors Adaptor Classes for Graphs

deba@432

66 
@ingroup graphs

kpeter@474

67 
\brief Adaptor classes for digraphs and graphs

kpeter@474

68 

kpeter@474

69 
This group contains several useful adaptor classes for digraphs and graphs.

deba@432

70 

deba@432

71 
The main parts of LEMON are the different graph structures, generic

kpeter@474

72 
graph algorithms, graph concepts, which couple them, and graph

deba@432

73 
adaptors. While the previous notions are more or less clear, the

deba@432

74 
latter one needs further explanation. Graph adaptors are graph classes

deba@432

75 
which serve for considering graph structures in different ways.

deba@432

76 

deba@432

77 
A short example makes this much clearer. Suppose that we have an

kpeter@474

78 
instance \c g of a directed graph type, say ListDigraph and an algorithm

deba@432

79 
\code

deba@432

80 
template <typename Digraph>

deba@432

81 
int algorithm(const Digraph&);

deba@432

82 
\endcode

deba@432

83 
is needed to run on the reverse oriented graph. It may be expensive

deba@432

84 
(in time or in memory usage) to copy \c g with the reversed

deba@432

85 
arcs. In this case, an adaptor class is used, which (according

kpeter@474

86 
to LEMON \ref concepts::Digraph "digraph concepts") works as a digraph.

kpeter@474

87 
The adaptor uses the original digraph structure and digraph operations when

kpeter@474

88 
methods of the reversed oriented graph are called. This means that the adaptor

kpeter@474

89 
have minor memory usage, and do not perform sophisticated algorithmic

deba@432

90 
actions. The purpose of it is to give a tool for the cases when a

deba@432

91 
graph have to be used in a specific alteration. If this alteration is

kpeter@474

92 
obtained by a usual construction like filtering the node or the arc set or

deba@432

93 
considering a new orientation, then an adaptor is worthwhile to use.

deba@432

94 
To come back to the reverse oriented graph, in this situation

deba@432

95 
\code

deba@432

96 
template<typename Digraph> class ReverseDigraph;

deba@432

97 
\endcode

deba@432

98 
template class can be used. The code looks as follows

deba@432

99 
\code

deba@432

100 
ListDigraph g;

kpeter@474

101 
ReverseDigraph<ListDigraph> rg(g);

deba@432

102 
int result = algorithm(rg);

deba@432

103 
\endcode

kpeter@474

104 
During running the algorithm, the original digraph \c g is untouched.

kpeter@474

105 
This techniques give rise to an elegant code, and based on stable

deba@432

106 
graph adaptors, complex algorithms can be implemented easily.

deba@432

107 

kpeter@474

108 
In flow, circulation and matching problems, the residual

deba@432

109 
graph is of particular importance. Combining an adaptor implementing

kpeter@474

110 
this with shortest path algorithms or minimum mean cycle algorithms,

deba@432

111 
a range of weighted and cardinality optimization algorithms can be

deba@432

112 
obtained. For other examples, the interested user is referred to the

deba@432

113 
detailed documentation of particular adaptors.

deba@432

114 

deba@432

115 
The behavior of graph adaptors can be very different. Some of them keep

deba@432

116 
capabilities of the original graph while in other cases this would be

kpeter@474

117 
meaningless. This means that the concepts that they meet depend

kpeter@474

118 
on the graph adaptor, and the wrapped graph.

kpeter@474

119 
For example, if an arc of a reversed digraph is deleted, this is carried

kpeter@474

120 
out by deleting the corresponding arc of the original digraph, thus the

kpeter@474

121 
adaptor modifies the original digraph.

kpeter@474

122 
However in case of a residual digraph, this operation has no sense.

deba@432

123 

deba@432

124 
Let us stand one more example here to simplify your work.

kpeter@474

125 
ReverseDigraph has constructor

deba@432

126 
\code

deba@432

127 
ReverseDigraph(Digraph& digraph);

deba@432

128 
\endcode

kpeter@474

129 
This means that in a situation, when a <tt>const %ListDigraph&</tt>

deba@432

130 
reference to a graph is given, then it have to be instantiated with

kpeter@474

131 
<tt>Digraph=const %ListDigraph</tt>.

deba@432

132 
\code

deba@432

133 
int algorithm1(const ListDigraph& g) {

kpeter@474

134 
ReverseDigraph<const ListDigraph> rg(g);

deba@432

135 
return algorithm2(rg);

deba@432

136 
}

deba@432

137 
\endcode

deba@432

138 
*/

deba@432

139 

deba@432

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@606

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 graphrelated maps.

alpar@40

157 

kpeter@606

158 
This group contains maps that are specifically designed to assign

kpeter@422

159 
values to the nodes and arcs/edges of graphs.

kpeter@422

160 

kpeter@422

161 
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,

kpeter@422

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@606

170 
This group contains map adaptors that are used to create "implicit"

kpeter@50

171 
maps from other maps.

alpar@40

172 

kpeter@422

173 
Most of them are \ref concepts::ReadMap "readonly 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@606

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@606

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@606

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@606

263 
\brief This group contains the several algorithms

alpar@40

264 
implemented in LEMON.

alpar@40

265 

kpeter@606

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@606

275 
This group contains the common graph search algorithms, namely

kpeter@422

276 
\e breadthfirst \e search (BFS) and \e depthfirst \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@606

284 
This group contains the algorithms for finding shortest paths in digraphs.

kpeter@422

285 

kpeter@422

286 
 \ref Dijkstra algorithm for finding shortest paths from a source node

kpeter@422

287 
when all arc lengths are nonnegative.

kpeter@422

288 
 \ref BellmanFord "BellmanFord" algorithm for finding shortest paths

kpeter@422

289 
from a source node when arc lenghts can be either positive or negative,

kpeter@422

290 
but the digraph should not contain directed cycles with negative total

kpeter@422

291 
length.

kpeter@422

292 
 \ref FloydWarshall "FloydWarshall" and \ref Johnson "Johnson" algorithms

kpeter@422

293 
for solving the \e allpairs \e shortest \e paths \e problem when arc

kpeter@422

294 
lenghts can be either positive or negative, but the digraph should

kpeter@422

295 
not contain directed cycles with negative total length.

kpeter@422

296 
 \ref Suurballe A successive shortest path algorithm for finding

kpeter@422

297 
arcdisjoint 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@606

305 
This group contains the algorithms for finding maximum flows and

alpar@40

306 
feasible circulations.

alpar@40

307 

kpeter@422

308 
The \e maximum \e flow \e problem is to find a flow of maximum value between

kpeter@422

309 
a single source and a single target. Formally, there is a \f$G=(V,A)\f$

kpeter@656

310 
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and

kpeter@422

311 
\f$s, t \in V\f$ source and target nodes.

kpeter@656

312 
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the

kpeter@422

313 
following optimization problem.

alpar@40

314 

kpeter@656

315 
\f[ \max\sum_{sv\in A} f(sv)  \sum_{vs\in A} f(vs) \f]

kpeter@656

316 
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)

kpeter@656

317 
\quad \forall u\in V\setminus\{s,t\} \f]

kpeter@656

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@422

321 
 \ref EdmondsKarp EdmondsKarp algorithm.

kpeter@422

322 
 \ref Preflow GoldbergTarjan's preflow pushrelabel algorithm.

kpeter@422

323 
 \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.

kpeter@422

324 
 \ref GoldbergTarjan Preflow pushrelabel algorithm with dynamic trees.

alpar@40

325 

kpeter@422

326 
In most cases the \ref Preflow "Preflow" algorithm provides the

kpeter@422

327 
fastest method for computing a maximum flow. All implementations

kpeter@698

328 
also provide functions to query the minimum cut, which is the dual

kpeter@698

329 
problem of maximum flow.

kpeter@698

330 

kpeter@698

331 
\ref Circulation is a preflow pushrelabel algorithm implemented directly

kpeter@698

332 
for finding feasible circulations, which is a somewhat different problem,

kpeter@698

333 
but it is strongly related to maximum flow.

kpeter@698

334 
For more information, see \ref Circulation.

alpar@40

335 
*/

alpar@40

336 

alpar@40

337 
/**

kpeter@710

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@656

343 
This group contains the algorithms for finding minimum cost flows and

kpeter@710

344 
circulations. For more information about this problem and its dual

kpeter@710

345 
solution see \ref min_cost_flow "Minimum Cost Flow Problem".

kpeter@422

346 

kpeter@710

347 
LEMON contains several algorithms for this problem.

kpeter@656

348 
 \ref NetworkSimplex Primal Network Simplex algorithm with various

kpeter@656

349 
pivot strategies.

kpeter@656

350 
 \ref CostScaling PushRelabel and AugmentRelabel algorithms based on

kpeter@656

351 
cost scaling.

kpeter@656

352 
 \ref CapacityScaling Successive Shortest %Path algorithm with optional

kpeter@422

353 
capacity scaling.

kpeter@656

354 
 \ref CancelAndTighten The Cancel and Tighten algorithm.

kpeter@656

355 
 \ref CycleCanceling CycleCanceling algorithms.

kpeter@656

356 

kpeter@656

357 
In general NetworkSimplex is the most efficient implementation,

kpeter@656

358 
but in special cases other algorithms could be faster.

kpeter@656

359 
For example, if the total supply and/or capacities are rather small,

kpeter@656

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@606

369 
This group contains the algorithms for finding minimum cut in graphs.

alpar@40

370 

kpeter@422

371 
The \e minimum \e cut \e problem is to find a nonempty and noncomplete

kpeter@422

372 
\f$X\f$ subset of the nodes with minimum overall capacity on

kpeter@422

373 
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a

kpeter@422

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@422

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@422

382 
 \ref HaoOrlin "HaoOrlin algorithm" for calculating minimum cut

kpeter@422

383 
in directed graphs.

kpeter@422

384 
 \ref NagamochiIbaraki "NagamochiIbaraki algorithm" for

kpeter@422

385 
calculating minimum cut in undirected graphs.

kpeter@606

386 
 \ref GomoryHu "GomoryHu tree computation" for calculating

kpeter@422

387 
allpairs minimum cut in undirected graphs.

alpar@40

388 

alpar@40

389 
If you want to find minimum cut just between two distinict nodes,

kpeter@422

390 
see the \ref max_flow "maximum flow problem".

alpar@40

391 
*/

alpar@40

392 

alpar@40

393 
/**

kpeter@633

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@606

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 "biedgeconnected 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@606

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@637

422 
This group contains the algorithms for calculating

alpar@40

423 
matchings in graphs and bipartite graphs. The general matching problem is

kpeter@637

424 
finding a subset of the edges for which each node has at most one incident

kpeter@637

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@422

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@422

434 
The matching algorithms implemented in LEMON:

kpeter@422

435 
 \ref MaxBipartiteMatching HopcroftKarp augmenting path algorithm

kpeter@422

436 
for calculating maximum cardinality matching in bipartite graphs.

kpeter@422

437 
 \ref PrBipartiteMatching Pushrelabel algorithm

kpeter@422

438 
for calculating maximum cardinality matching in bipartite graphs.

kpeter@422

439 
 \ref MaxWeightedBipartiteMatching

kpeter@422

440 
Successive shortest path algorithm for calculating maximum weighted

kpeter@422

441 
matching and maximum weighted bipartite matching in bipartite graphs.

kpeter@422

442 
 \ref MinCostMaxBipartiteMatching

kpeter@422

443 
Successive shortest path algorithm for calculating minimum cost maximum

kpeter@422

444 
matching in bipartite graphs.

kpeter@422

445 
 \ref MaxMatching Edmond's blossom shrinking algorithm for calculating

kpeter@422

446 
maximum cardinality matching in general graphs.

kpeter@422

447 
 \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating

kpeter@422

448 
maximum weighted matching in general graphs.

kpeter@422

449 
 \ref MaxWeightedPerfectMatching

kpeter@422

450 
Edmond's blossom shrinking algorithm for calculating maximum weighted

kpeter@422

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@698

460 
\brief Algorithms for finding minimum cost spanning trees and arborescences.

alpar@40

461 

kpeter@698

462 
This group contains the algorithms for finding minimum cost spanning

kpeter@698

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@606

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@606

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@606

486 
\brief This group contains some general optimization frameworks

alpar@40

487 
implemented in LEMON.

alpar@40

488 

kpeter@606

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@606

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@606

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@606

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@606

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@606

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@606

558 
This group contains the exceptions defined in LEMON.

alpar@40

559 
*/

alpar@40

560 

alpar@40

561 
/**

alpar@40

562 
@defgroup io_group InputOutput

kpeter@50

563 
\brief Graph InputOutput methods

alpar@40

564 

kpeter@606

565 
This group contains the tools for importing and exporting graphs

kpeter@314

566 
and graph related data. Now it supports the \ref lgfformat

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@363

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@606

576 
This group contains methods for reading and writing

ladanyi@236

577 
\ref lgfformat "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@606

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@403

590 
@defgroup dimacs_group DIMACS format

kpeter@403

591 
@ingroup io_group

kpeter@403

592 
\brief Read and write files in DIMACS format

kpeter@403

593 

kpeter@403

594 
Tools to read a digraph from or write it to a file in DIMACS format data.

kpeter@403

595 
*/

kpeter@403

596 

kpeter@403

597 
/**

kpeter@363

598 
@defgroup nauty_group NAUTY Format

kpeter@363

599 
@ingroup io_group

kpeter@363

600 
\brief Read \e Nauty format

kpeter@403

601 

kpeter@363

602 
Tool to read graphs from \e Nauty format data.

kpeter@363

603 
*/

kpeter@363

604 

kpeter@363

605 
/**

alpar@40

606 
@defgroup concept Concepts

alpar@40

607 
\brief Skeleton classes and concept checking classes

alpar@40

608 

kpeter@606

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@606

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@606

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@422

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@611

659 
In order to compile them, use the <tt>make demo</tt> or the

ladanyi@611

660 
<tt>make check</tt> commands.

alpar@40

661 
*/

alpar@40

662 

alpar@40

663 
/**

kpeter@422

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@422

672 
}
