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

229 
@defgroup paths Path Structures

alpar@40

230 
@ingroup datas

kpeter@318

231 
\brief %Path structures implemented in LEMON.

alpar@40

232 

kpeter@606

233 
This group contains the path structures implemented in LEMON.

alpar@40

234 

kpeter@50

235 
LEMON provides flexible data structures to work with paths.

kpeter@50

236 
All of them have similar interfaces and they can be copied easily with

kpeter@50

237 
assignment operators and copy constructors. This makes it easy and

alpar@40

238 
efficient to have e.g. the Dijkstra algorithm to store its result in

alpar@40

239 
any kind of path structure.

alpar@40

240 

alpar@40

241 
\sa lemon::concepts::Path

alpar@40

242 
*/

alpar@40

243 

alpar@40

244 
/**

alpar@40

245 
@defgroup auxdat Auxiliary Data Structures

alpar@40

246 
@ingroup datas

kpeter@50

247 
\brief Auxiliary data structures implemented in LEMON.

alpar@40

248 

kpeter@606

249 
This group contains some data structures implemented in LEMON in

alpar@40

250 
order to make it easier to implement combinatorial algorithms.

alpar@40

251 
*/

alpar@40

252 

alpar@40

253 
/**

kpeter@761

254 
@defgroup geomdat Geometric Data Structures

kpeter@761

255 
@ingroup auxdat

kpeter@761

256 
\brief Geometric data structures implemented in LEMON.

kpeter@761

257 

kpeter@761

258 
This group contains geometric data structures implemented in LEMON.

kpeter@761

259 

kpeter@761

260 
 \ref lemon::dim2::Point "dim2::Point" implements a two dimensional

kpeter@761

261 
vector with the usual operations.

kpeter@761

262 
 \ref lemon::dim2::Box "dim2::Box" can be used to determine the

kpeter@761

263 
rectangular bounding box of a set of \ref lemon::dim2::Point

kpeter@761

264 
"dim2::Point"'s.

kpeter@761

265 
*/

kpeter@761

266 

kpeter@761

267 
/**

kpeter@761

268 
@defgroup matrices Matrices

kpeter@761

269 
@ingroup auxdat

kpeter@761

270 
\brief Two dimensional data storages implemented in LEMON.

kpeter@761

271 

kpeter@761

272 
This group contains two dimensional data storages implemented in LEMON.

kpeter@761

273 
*/

kpeter@761

274 

kpeter@761

275 
/**

alpar@40

276 
@defgroup algs Algorithms

kpeter@606

277 
\brief This group contains the several algorithms

alpar@40

278 
implemented in LEMON.

alpar@40

279 

kpeter@606

280 
This group contains the several algorithms

alpar@40

281 
implemented in LEMON.

alpar@40

282 
*/

alpar@40

283 

alpar@40

284 
/**

alpar@40

285 
@defgroup search Graph Search

alpar@40

286 
@ingroup algs

kpeter@50

287 
\brief Common graph search algorithms.

alpar@40

288 

kpeter@606

289 
This group contains the common graph search algorithms, namely

kpeter@422

290 
\e breadthfirst \e search (BFS) and \e depthfirst \e search (DFS).

alpar@40

291 
*/

alpar@40

292 

alpar@40

293 
/**

kpeter@314

294 
@defgroup shortest_path Shortest Path Algorithms

alpar@40

295 
@ingroup algs

kpeter@50

296 
\brief Algorithms for finding shortest paths.

alpar@40

297 

kpeter@606

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

kpeter@422

299 

kpeter@422

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

kpeter@422

301 
when all arc lengths are nonnegative.

kpeter@422

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

kpeter@422

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

kpeter@422

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

kpeter@422

305 
length.

kpeter@422

306 
 \ref FloydWarshall "FloydWarshall" and \ref Johnson "Johnson" algorithms

kpeter@422

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

kpeter@422

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

kpeter@422

309 
not contain directed cycles with negative total length.

kpeter@422

310 
 \ref Suurballe A successive shortest path algorithm for finding

kpeter@422

311 
arcdisjoint paths between two nodes having minimum total length.

alpar@40

312 
*/

alpar@40

313 

alpar@209

314 
/**

kpeter@761

315 
@defgroup spantree Minimum Spanning Tree Algorithms

kpeter@761

316 
@ingroup algs

kpeter@761

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

kpeter@761

318 

kpeter@761

319 
This group contains the algorithms for finding minimum cost spanning

kpeter@761

320 
trees and arborescences.

kpeter@761

321 
*/

kpeter@761

322 

kpeter@761

323 
/**

kpeter@314

324 
@defgroup max_flow Maximum Flow Algorithms

alpar@209

325 
@ingroup algs

kpeter@50

326 
\brief Algorithms for finding maximum flows.

alpar@40

327 

kpeter@606

328 
This group contains the algorithms for finding maximum flows and

alpar@40

329 
feasible circulations.

alpar@40

330 

kpeter@422

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

kpeter@422

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

kpeter@656

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

kpeter@422

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

kpeter@656

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

kpeter@422

336 
following optimization problem.

alpar@40

337 

kpeter@656

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

kpeter@656

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

kpeter@656

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

kpeter@656

341 
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]

alpar@40

342 

kpeter@50

343 
LEMON contains several algorithms for solving maximum flow problems:

kpeter@422

344 
 \ref EdmondsKarp EdmondsKarp algorithm.

kpeter@422

345 
 \ref Preflow GoldbergTarjan's preflow pushrelabel algorithm.

kpeter@422

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

kpeter@422

347 
 \ref GoldbergTarjan Preflow pushrelabel algorithm with dynamic trees.

alpar@40

348 

kpeter@422

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

kpeter@422

350 
fastest method for computing a maximum flow. All implementations

kpeter@698

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

kpeter@698

352 
problem of maximum flow.

kpeter@698

353 

kpeter@698

354 
\ref Circulation is a preflow pushrelabel algorithm implemented directly

kpeter@698

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

kpeter@698

356 
but it is strongly related to maximum flow.

kpeter@698

357 
For more information, see \ref Circulation.

alpar@40

358 
*/

alpar@40

359 

alpar@40

360 
/**

kpeter@710

361 
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms

alpar@40

362 
@ingroup algs

alpar@40

363 

kpeter@50

364 
\brief Algorithms for finding minimum cost flows and circulations.

alpar@40

365 

kpeter@656

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

kpeter@710

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

kpeter@710

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

kpeter@422

369 

kpeter@710

370 
LEMON contains several algorithms for this problem.

kpeter@656

371 
 \ref NetworkSimplex Primal Network Simplex algorithm with various

kpeter@656

372 
pivot strategies.

kpeter@656

373 
 \ref CostScaling PushRelabel and AugmentRelabel algorithms based on

kpeter@656

374 
cost scaling.

kpeter@656

375 
 \ref CapacityScaling Successive Shortest %Path algorithm with optional

kpeter@422

376 
capacity scaling.

kpeter@656

377 
 \ref CancelAndTighten The Cancel and Tighten algorithm.

kpeter@656

378 
 \ref CycleCanceling CycleCanceling algorithms.

kpeter@656

379 

kpeter@656

380 
In general NetworkSimplex is the most efficient implementation,

kpeter@656

381 
but in special cases other algorithms could be faster.

kpeter@656

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

kpeter@656

383 
CapacityScaling is usually the fastest algorithm (without effective scaling).

alpar@40

384 
*/

alpar@40

385 

alpar@40

386 
/**

kpeter@314

387 
@defgroup min_cut Minimum Cut Algorithms

alpar@209

388 
@ingroup algs

alpar@40

389 

kpeter@50

390 
\brief Algorithms for finding minimum cut in graphs.

alpar@40

391 

kpeter@606

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

alpar@40

393 

kpeter@422

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

kpeter@422

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

kpeter@422

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

kpeter@422

397 
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum

kpeter@50

398 
cut is the \f$X\f$ solution of the next optimization problem:

alpar@40

399 

alpar@210

400 
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}

kpeter@760

401 
\sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]

alpar@40

402 

kpeter@50

403 
LEMON contains several algorithms related to minimum cut problems:

alpar@40

404 

kpeter@422

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

kpeter@422

406 
in directed graphs.

kpeter@422

407 
 \ref NagamochiIbaraki "NagamochiIbaraki algorithm" for

kpeter@422

408 
calculating minimum cut in undirected graphs.

kpeter@606

409 
 \ref GomoryHu "GomoryHu tree computation" for calculating

kpeter@422

410 
allpairs minimum cut in undirected graphs.

alpar@40

411 

alpar@40

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

kpeter@422

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

alpar@40

414 
*/

alpar@40

415 

alpar@40

416 
/**

kpeter@314

417 
@defgroup matching Matching Algorithms

alpar@40

418 
@ingroup algs

kpeter@50

419 
\brief Algorithms for finding matchings in graphs and bipartite graphs.

alpar@40

420 

kpeter@637

421 
This group contains the algorithms for calculating

alpar@40

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

kpeter@637

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

kpeter@637

424 
edge.

alpar@209

425 

alpar@40

426 
There are several different algorithms for calculate matchings in

alpar@40

427 
graphs. The matching problems in bipartite graphs are generally

alpar@40

428 
easier than in general graphs. The goal of the matching optimization

kpeter@422

429 
can be finding maximum cardinality, maximum weight or minimum cost

alpar@40

430 
matching. The search can be constrained to find perfect or

alpar@40

431 
maximum cardinality matching.

alpar@40

432 

kpeter@422

433 
The matching algorithms implemented in LEMON:

kpeter@422

434 
 \ref MaxBipartiteMatching HopcroftKarp augmenting path algorithm

kpeter@422

435 
for calculating maximum cardinality matching in bipartite graphs.

kpeter@422

436 
 \ref PrBipartiteMatching Pushrelabel algorithm

kpeter@422

437 
for calculating maximum cardinality matching in bipartite graphs.

kpeter@422

438 
 \ref MaxWeightedBipartiteMatching

kpeter@422

439 
Successive shortest path algorithm for calculating maximum weighted

kpeter@422

440 
matching and maximum weighted bipartite matching in bipartite graphs.

kpeter@422

441 
 \ref MinCostMaxBipartiteMatching

kpeter@422

442 
Successive shortest path algorithm for calculating minimum cost maximum

kpeter@422

443 
matching in bipartite graphs.

kpeter@422

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

kpeter@422

445 
maximum cardinality matching in general graphs.

kpeter@422

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

kpeter@422

447 
maximum weighted matching in general graphs.

kpeter@422

448 
 \ref MaxWeightedPerfectMatching

kpeter@422

449 
Edmond's blossom shrinking algorithm for calculating maximum weighted

kpeter@422

450 
perfect matching in general graphs.

alpar@40

451 

alpar@40

452 
\image html bipartite_matching.png

alpar@40

453 
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth

alpar@40

454 
*/

alpar@40

455 

alpar@40

456 
/**

kpeter@761

457 
@defgroup graph_properties Connectivity and Other Graph Properties

alpar@40

458 
@ingroup algs

kpeter@761

459 
\brief Algorithms for discovering the graph properties

alpar@40

460 

kpeter@761

461 
This group contains the algorithms for discovering the graph properties

kpeter@761

462 
like connectivity, bipartiteness, euler property, simplicity etc.

kpeter@761

463 

kpeter@761

464 
\image html connected_components.png

kpeter@761

465 
\image latex connected_components.eps "Connected components" width=\textwidth

kpeter@761

466 
*/

kpeter@761

467 

kpeter@761

468 
/**

kpeter@761

469 
@defgroup planar Planarity Embedding and Drawing

kpeter@761

470 
@ingroup algs

kpeter@761

471 
\brief Algorithms for planarity checking, embedding and drawing

kpeter@761

472 

kpeter@761

473 
This group contains the algorithms for planarity checking,

kpeter@761

474 
embedding and drawing.

kpeter@761

475 

kpeter@761

476 
\image html planar.png

kpeter@761

477 
\image latex planar.eps "Plane graph" width=\textwidth

kpeter@761

478 
*/

kpeter@761

479 

kpeter@761

480 
/**

kpeter@761

481 
@defgroup approx Approximation Algorithms

kpeter@761

482 
@ingroup algs

kpeter@761

483 
\brief Approximation algorithms.

kpeter@761

484 

kpeter@761

485 
This group contains the approximation and heuristic algorithms

kpeter@761

486 
implemented in LEMON.

alpar@40

487 
*/

alpar@40

488 

alpar@40

489 
/**

kpeter@314

490 
@defgroup auxalg Auxiliary Algorithms

alpar@40

491 
@ingroup algs

kpeter@50

492 
\brief Auxiliary algorithms implemented in LEMON.

alpar@40

493 

kpeter@606

494 
This group contains some algorithms implemented in LEMON

kpeter@50

495 
in order to make it easier to implement complex algorithms.

alpar@40

496 
*/

alpar@40

497 

alpar@40

498 
/**

alpar@40

499 
@defgroup gen_opt_group General Optimization Tools

kpeter@606

500 
\brief This group contains some general optimization frameworks

alpar@40

501 
implemented in LEMON.

alpar@40

502 

kpeter@606

503 
This group contains some general optimization frameworks

alpar@40

504 
implemented in LEMON.

alpar@40

505 
*/

alpar@40

506 

alpar@40

507 
/**

kpeter@314

508 
@defgroup lp_group Lp and Mip Solvers

alpar@40

509 
@ingroup gen_opt_group

alpar@40

510 
\brief Lp and Mip solver interfaces for LEMON.

alpar@40

511 

kpeter@606

512 
This group contains Lp and Mip solver interfaces for LEMON. The

alpar@40

513 
various LP solvers could be used in the same manner with this

alpar@40

514 
interface.

alpar@40

515 
*/

alpar@40

516 

alpar@209

517 
/**

kpeter@314

518 
@defgroup lp_utils Tools for Lp and Mip Solvers

alpar@40

519 
@ingroup lp_group

kpeter@50

520 
\brief Helper tools to the Lp and Mip solvers.

alpar@40

521 

alpar@40

522 
This group adds some helper tools to general optimization framework

alpar@40

523 
implemented in LEMON.

alpar@40

524 
*/

alpar@40

525 

alpar@40

526 
/**

alpar@40

527 
@defgroup metah Metaheuristics

alpar@40

528 
@ingroup gen_opt_group

alpar@40

529 
\brief Metaheuristics for LEMON library.

alpar@40

530 

kpeter@606

531 
This group contains some metaheuristic optimization tools.

alpar@40

532 
*/

alpar@40

533 

alpar@40

534 
/**

alpar@209

535 
@defgroup utils Tools and Utilities

kpeter@50

536 
\brief Tools and utilities for programming in LEMON

alpar@40

537 

kpeter@50

538 
Tools and utilities for programming in LEMON.

alpar@40

539 
*/

alpar@40

540 

alpar@40

541 
/**

alpar@40

542 
@defgroup gutils Basic Graph Utilities

alpar@40

543 
@ingroup utils

kpeter@50

544 
\brief Simple basic graph utilities.

alpar@40

545 

kpeter@606

546 
This group contains some simple basic graph utilities.

alpar@40

547 
*/

alpar@40

548 

alpar@40

549 
/**

alpar@40

550 
@defgroup misc Miscellaneous Tools

alpar@40

551 
@ingroup utils

kpeter@50

552 
\brief Tools for development, debugging and testing.

kpeter@50

553 

kpeter@606

554 
This group contains several useful tools for development,

alpar@40

555 
debugging and testing.

alpar@40

556 
*/

alpar@40

557 

alpar@40

558 
/**

kpeter@314

559 
@defgroup timecount Time Measuring and Counting

alpar@40

560 
@ingroup misc

kpeter@50

561 
\brief Simple tools for measuring the performance of algorithms.

kpeter@50

562 

kpeter@606

563 
This group contains simple tools for measuring the performance

alpar@40

564 
of algorithms.

alpar@40

565 
*/

alpar@40

566 

alpar@40

567 
/**

alpar@40

568 
@defgroup exceptions Exceptions

alpar@40

569 
@ingroup utils

kpeter@50

570 
\brief Exceptions defined in LEMON.

kpeter@50

571 

kpeter@606

572 
This group contains the exceptions defined in LEMON.

alpar@40

573 
*/

alpar@40

574 

alpar@40

575 
/**

alpar@40

576 
@defgroup io_group InputOutput

kpeter@50

577 
\brief Graph InputOutput methods

alpar@40

578 

kpeter@606

579 
This group contains the tools for importing and exporting graphs

kpeter@314

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

kpeter@314

581 
"LEMON Graph Format", the \c DIMACS format and the encapsulated

kpeter@314

582 
postscript (EPS) format.

alpar@40

583 
*/

alpar@40

584 

alpar@40

585 
/**

kpeter@363

586 
@defgroup lemon_io LEMON Graph Format

alpar@40

587 
@ingroup io_group

kpeter@314

588 
\brief Reading and writing LEMON Graph Format.

alpar@40

589 

kpeter@606

590 
This group contains methods for reading and writing

ladanyi@236

591 
\ref lgfformat "LEMON Graph Format".

alpar@40

592 
*/

alpar@40

593 

alpar@40

594 
/**

kpeter@314

595 
@defgroup eps_io Postscript Exporting

alpar@40

596 
@ingroup io_group

alpar@40

597 
\brief General \c EPS drawer and graph exporter

alpar@40

598 

kpeter@606

599 
This group contains general \c EPS drawing methods and special

alpar@209

600 
graph exporting tools.

alpar@40

601 
*/

alpar@40

602 

alpar@40

603 
/**

kpeter@761

604 
@defgroup dimacs_group DIMACS Format

kpeter@403

605 
@ingroup io_group

kpeter@403

606 
\brief Read and write files in DIMACS format

kpeter@403

607 

kpeter@403

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

kpeter@403

609 
*/

kpeter@403

610 

kpeter@403

611 
/**

kpeter@363

612 
@defgroup nauty_group NAUTY Format

kpeter@363

613 
@ingroup io_group

kpeter@363

614 
\brief Read \e Nauty format

kpeter@403

615 

kpeter@363

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

kpeter@363

617 
*/

kpeter@363

618 

kpeter@363

619 
/**

alpar@40

620 
@defgroup concept Concepts

alpar@40

621 
\brief Skeleton classes and concept checking classes

alpar@40

622 

kpeter@606

623 
This group contains the data/algorithm skeletons and concept checking

alpar@40

624 
classes implemented in LEMON.

alpar@40

625 

alpar@40

626 
The purpose of the classes in this group is fourfold.

alpar@209

627 

kpeter@318

628 
 These classes contain the documentations of the %concepts. In order

alpar@40

629 
to avoid document multiplications, an implementation of a concept

alpar@40

630 
simply refers to the corresponding concept class.

alpar@40

631 

alpar@40

632 
 These classes declare every functions, <tt>typedef</tt>s etc. an

kpeter@318

633 
implementation of the %concepts should provide, however completely

alpar@40

634 
without implementations and real data structures behind the

alpar@40

635 
interface. On the other hand they should provide nothing else. All

alpar@40

636 
the algorithms working on a data structure meeting a certain concept

alpar@40

637 
should compile with these classes. (Though it will not run properly,

alpar@40

638 
of course.) In this way it is easily to check if an algorithm

alpar@40

639 
doesn't use any extra feature of a certain implementation.

alpar@40

640 

alpar@40

641 
 The concept descriptor classes also provide a <em>checker class</em>

kpeter@50

642 
that makes it possible to check whether a certain implementation of a

alpar@40

643 
concept indeed provides all the required features.

alpar@40

644 

alpar@40

645 
 Finally, They can serve as a skeleton of a new implementation of a concept.

alpar@40

646 
*/

alpar@40

647 

alpar@40

648 
/**

alpar@40

649 
@defgroup graph_concepts Graph Structure Concepts

alpar@40

650 
@ingroup concept

alpar@40

651 
\brief Skeleton and concept checking classes for graph structures

alpar@40

652 

kpeter@606

653 
This group contains the skeletons and concept checking classes of LEMON's

alpar@40

654 
graph structures and helper classes used to implement these.

alpar@40

655 
*/

alpar@40

656 

kpeter@314

657 
/**

kpeter@314

658 
@defgroup map_concepts Map Concepts

kpeter@314

659 
@ingroup concept

kpeter@314

660 
\brief Skeleton and concept checking classes for maps

kpeter@314

661 

kpeter@606

662 
This group contains the skeletons and concept checking classes of maps.

alpar@40

663 
*/

alpar@40

664 

alpar@40

665 
/**

kpeter@761

666 
@defgroup tools Standalone Utility Applications

kpeter@761

667 

kpeter@761

668 
Some utility applications are listed here.

kpeter@761

669 

kpeter@761

670 
The standard compilation procedure (<tt>./configure;make</tt>) will compile

kpeter@761

671 
them, as well.

kpeter@761

672 
*/

kpeter@761

673 

kpeter@761

674 
/**

alpar@40

675 
\anchor demoprograms

alpar@40

676 

kpeter@422

677 
@defgroup demos Demo Programs

alpar@40

678 

alpar@40

679 
Some demo programs are listed here. Their full source codes can be found in

alpar@40

680 
the \c demo subdirectory of the source tree.

alpar@40

681 

ladanyi@611

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

ladanyi@611

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

alpar@40

684 
*/

alpar@40

685 

kpeter@422

686 
}
