COIN-OR::LEMON - Graph Library

Ignore:
Files:
13 deleted
64 edited

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    r791 r727  
    3535CHECK_TYPE_SIZE("long long" LONG_LONG)
    3636SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
    37 
    38 INCLUDE(FindPythonInterp)
    3937
    4038ENABLE_TESTING()
  • Makefile.am

    r799 r676  
    1818        cmake/FindGLPK.cmake \
    1919        cmake/FindCOIN.cmake \
    20         cmake/LEMONConfig.cmake.in \
    2120        cmake/version.cmake.in \
    2221        cmake/version.cmake \
  • configure.ac

    r791 r727  
    4242
    4343AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
    44 AC_CHECK_PROG([python_found],[python],[yes],[no])
    4544AC_CHECK_PROG([gs_found],[gs],[yes],[no])
    4645
  • doc/CMakeLists.txt

    r791 r726  
    1010)
    1111
    12 IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
     12IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
    1313  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
    1414  SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)
     
    2929    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
    3030    COMMAND ${CMAKE_COMMAND} -E remove_directory html
    31     COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
    3231    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
    3332    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  • doc/Doxyfile.in

    r803 r379  
    1 # Doxyfile 1.5.9
     1# Doxyfile 1.5.7.1
    22
    33#---------------------------------------------------------------------------
     
    2222QT_AUTOBRIEF           = NO
    2323MULTILINE_CPP_IS_BRIEF = NO
     24DETAILS_AT_TOP         = YES
    2425INHERIT_DOCS           = NO
    2526SEPARATE_MEMBER_PAGES  = NO
     
    9192                         "@abs_top_srcdir@/demo" \
    9293                         "@abs_top_srcdir@/tools" \
    93                          "@abs_top_srcdir@/test/test_tools.h" \
    94                          "@abs_top_builddir@/doc/references.dox"
     94                         "@abs_top_srcdir@/test/test_tools.h"
    9595INPUT_ENCODING         = UTF-8
    9696FILE_PATTERNS          = *.h \
     
    224224SKIP_FUNCTION_MACROS   = YES
    225225#---------------------------------------------------------------------------
    226 # Options related to the search engine   
     226# Configuration::additions related to external references   
    227227#---------------------------------------------------------------------------
    228228TAGFILES               = "@abs_top_srcdir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/  "
  • doc/Makefile.am

    r791 r720  
    6767        fi
    6868
    69 references.dox: doc/references.bib
    70         if test ${python_found} = yes; then \
    71           cd doc; \
    72           python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \
    73           cd ..; \
    74         else \
    75           echo; \
    76           echo "Python not found."; \
    77           echo; \
    78           exit 1; \
    79         fi
    80 
    81 html-local: $(DOC_PNG_IMAGES) references.dox
     69html-local: $(DOC_PNG_IMAGES)
    8270        if test ${doxygen_found} = yes; then \
    8371          cd doc; \
  • doc/groups.dox

    r818 r710  
    227227
    228228/**
     229@defgroup matrices Matrices
     230@ingroup datas
     231\brief Two dimensional data storages implemented in LEMON.
     232
     233This group contains two dimensional data storages implemented in LEMON.
     234*/
     235
     236/**
    229237@defgroup paths Path Structures
    230238@ingroup datas
     
    239247any kind of path structure.
    240248
    241 \sa \ref concepts::Path "Path concept"
    242 */
    243 
    244 /**
    245 @defgroup heaps Heap Structures
    246 @ingroup datas
    247 \brief %Heap structures implemented in LEMON.
    248 
    249 This group contains the heap structures implemented in LEMON.
    250 
    251 LEMON provides several heap classes. They are efficient implementations
    252 of the abstract data type \e priority \e queue. They store items with
    253 specified values called \e priorities in such a way that finding and
    254 removing the item with minimum priority are efficient.
    255 The basic operations are adding and erasing items, changing the priority
    256 of an item, etc.
    257 
    258 Heaps are crucial in several algorithms, such as Dijkstra and Prim.
    259 The heap implementations have the same interface, thus any of them can be
    260 used easily in such algorithms.
    261 
    262 \sa \ref concepts::Heap "Heap concept"
    263 */
    264 
    265 /**
    266 @defgroup matrices Matrices
    267 @ingroup datas
    268 \brief Two dimensional data storages implemented in LEMON.
    269 
    270 This group contains two dimensional data storages implemented in LEMON.
     249\sa lemon::concepts::Path
    271250*/
    272251
     
    281260
    282261/**
    283 @defgroup geomdat Geometric Data Structures
    284 @ingroup auxdat
    285 \brief Geometric data structures implemented in LEMON.
    286 
    287 This group contains geometric data structures implemented in LEMON.
    288 
    289  - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
    290    vector with the usual operations.
    291  - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
    292    rectangular bounding box of a set of \ref lemon::dim2::Point
    293    "dim2::Point"'s.
    294 */
    295 
    296 /**
    297 @defgroup matrices Matrices
    298 @ingroup auxdat
    299 \brief Two dimensional data storages implemented in LEMON.
    300 
    301 This group contains two dimensional data storages implemented in LEMON.
    302 */
    303 
    304 /**
    305262@defgroup algs Algorithms
    306263\brief This group contains the several algorithms
     
    317274
    318275This group contains the common graph search algorithms, namely
    319 \e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
    320 \ref clrs01algorithms.
     276\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
    321277*/
    322278
     
    326282\brief Algorithms for finding shortest paths.
    327283
    328 This group contains the algorithms for finding shortest paths in digraphs
    329 \ref clrs01algorithms.
     284This group contains the algorithms for finding shortest paths in digraphs.
    330285
    331286 - \ref Dijkstra algorithm for finding shortest paths from a source node
     
    344299
    345300/**
    346 @defgroup spantree Minimum Spanning Tree Algorithms
    347 @ingroup algs
    348 \brief Algorithms for finding minimum cost spanning trees and arborescences.
    349 
    350 This group contains the algorithms for finding minimum cost spanning
    351 trees and arborescences \ref clrs01algorithms.
    352 */
    353 
    354 /**
    355301@defgroup max_flow Maximum Flow Algorithms
    356302@ingroup algs
     
    358304
    359305This group contains the algorithms for finding maximum flows and
    360 feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
     306feasible circulations.
    361307
    362308The \e maximum \e flow \e problem is to find a flow of maximum value between
     
    373319
    374320LEMON contains several algorithms for solving maximum flow problems:
    375 - \ref EdmondsKarp Edmonds-Karp algorithm
    376   \ref edmondskarp72theoretical.
    377 - \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm
    378   \ref goldberg88newapproach.
    379 - \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees
    380   \ref dinic70algorithm, \ref sleator83dynamic.
    381 - \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees
    382   \ref goldberg88newapproach, \ref sleator83dynamic.
    383 
    384 In most cases the \ref Preflow algorithm provides the
     321- \ref EdmondsKarp Edmonds-Karp algorithm.
     322- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
     323- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
     324- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
     325
     326In most cases the \ref Preflow "Preflow" algorithm provides the
    385327fastest method for computing a maximum flow. All implementations
    386328also provide functions to query the minimum cut, which is the dual
     
    400342
    401343This group contains the algorithms for finding minimum cost flows and
    402 circulations \ref amo93networkflows. For more information about this
    403 problem and its dual solution, see \ref min_cost_flow
    404 "Minimum Cost Flow Problem".
     344circulations. For more information about this problem and its dual
     345solution see \ref min_cost_flow "Minimum Cost Flow Problem".
    405346
    406347LEMON contains several algorithms for this problem.
    407348 - \ref NetworkSimplex Primal Network Simplex algorithm with various
    408    pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
     349   pivot strategies.
    409350 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
    410    cost scaling \ref goldberg90approximation, \ref goldberg97efficient,
    411    \ref bunnagel98efficient.
     351   cost scaling.
    412352 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
    413    capacity scaling \ref edmondskarp72theoretical.
    414  - \ref CancelAndTighten The Cancel and Tighten algorithm
    415    \ref goldberg89cyclecanceling.
    416  - \ref CycleCanceling Cycle-Canceling algorithms
    417    \ref klein67primal, \ref goldberg89cyclecanceling.
     353   capacity scaling.
     354 - \ref CancelAndTighten The Cancel and Tighten algorithm.
     355 - \ref CycleCanceling Cycle-Canceling algorithms.
    418356
    419357In general NetworkSimplex is the most efficient implementation,
     
    438376
    439377\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
    440     \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
     378    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
    441379
    442380LEMON contains several algorithms related to minimum cut problems:
     
    454392
    455393/**
    456 @defgroup min_mean_cycle Minimum Mean Cycle Algorithms
    457 @ingroup algs
    458 \brief Algorithms for finding minimum mean cycles.
    459 
    460 This group contains the algorithms for finding minimum mean cycles
    461 \ref clrs01algorithms, \ref amo93networkflows.
    462 
    463 The \e minimum \e mean \e cycle \e problem is to find a directed cycle
    464 of minimum mean length (cost) in a digraph.
    465 The mean length of a cycle is the average length of its arcs, i.e. the
    466 ratio between the total length of the cycle and the number of arcs on it.
    467 
    468 This problem has an important connection to \e conservative \e length
    469 \e functions, too. A length function on the arcs of a digraph is called
    470 conservative if and only if there is no directed cycle of negative total
    471 length. For an arbitrary length function, the negative of the minimum
    472 cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
    473 arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
    474 function.
    475 
    476 LEMON contains three algorithms for solving the minimum mean cycle problem:
    477 - \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
    478   \ref dasdan98minmeancycle.
    479 - \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
    480   version of Karp's algorithm \ref dasdan98minmeancycle.
    481 - \ref Howard "Howard"'s policy iteration algorithm
    482   \ref dasdan98minmeancycle.
    483 
    484 In practice, the Howard algorithm proved to be by far the most efficient
    485 one, though the best known theoretical bound on its running time is
    486 exponential.
    487 Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
    488 O(n<sup>2</sup>+e), but the latter one is typically faster due to the
    489 applied early termination scheme.
     394@defgroup graph_properties Connectivity and Other Graph Properties
     395@ingroup algs
     396\brief Algorithms for discovering the graph properties
     397
     398This group contains the algorithms for discovering the graph properties
     399like connectivity, bipartiteness, euler property, simplicity etc.
     400
     401\image html edge_biconnected_components.png
     402\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
     403*/
     404
     405/**
     406@defgroup planar Planarity Embedding and Drawing
     407@ingroup algs
     408\brief Algorithms for planarity checking, embedding and drawing
     409
     410This group contains the algorithms for planarity checking,
     411embedding and drawing.
     412
     413\image html planar.png
     414\image latex planar.eps "Plane graph" width=\textwidth
    490415*/
    491416
     
    531456
    532457/**
    533 @defgroup graph_properties Connectivity and Other Graph Properties
    534 @ingroup algs
    535 \brief Algorithms for discovering the graph properties
    536 
    537 This group contains the algorithms for discovering the graph properties
    538 like connectivity, bipartiteness, euler property, simplicity etc.
    539 
    540 \image html connected_components.png
    541 \image latex connected_components.eps "Connected components" width=\textwidth
    542 */
    543 
    544 /**
    545 @defgroup planar Planarity Embedding and Drawing
    546 @ingroup algs
    547 \brief Algorithms for planarity checking, embedding and drawing
    548 
    549 This group contains the algorithms for planarity checking,
    550 embedding and drawing.
    551 
    552 \image html planar.png
    553 \image latex planar.eps "Plane graph" width=\textwidth
     458@defgroup spantree Minimum Spanning Tree Algorithms
     459@ingroup algs
     460\brief Algorithms for finding minimum cost spanning trees and arborescences.
     461
     462This group contains the algorithms for finding minimum cost spanning
     463trees and arborescences.
     464*/
     465
     466/**
     467@defgroup auxalg Auxiliary Algorithms
     468@ingroup algs
     469\brief Auxiliary algorithms implemented in LEMON.
     470
     471This group contains some algorithms implemented in LEMON
     472in order to make it easier to implement complex algorithms.
    554473*/
    555474
     
    561480This group contains the approximation and heuristic algorithms
    562481implemented in LEMON.
    563 */
    564 
    565 /**
    566 @defgroup auxalg Auxiliary Algorithms
    567 @ingroup algs
    568 \brief Auxiliary algorithms implemented in LEMON.
    569 
    570 This group contains some algorithms implemented in LEMON
    571 in order to make it easier to implement complex algorithms.
    572482*/
    573483
     
    582492
    583493/**
    584 @defgroup lp_group LP and MIP Solvers
     494@defgroup lp_group Lp and Mip Solvers
    585495@ingroup gen_opt_group
    586 \brief LP and MIP solver interfaces for LEMON.
    587 
    588 This group contains LP and MIP solver interfaces for LEMON.
    589 Various LP solvers could be used in the same manner with this
    590 high-level interface.
    591 
    592 The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
    593 \ref cplex, \ref soplex.
     496\brief Lp and Mip solver interfaces for LEMON.
     497
     498This group contains Lp and Mip solver interfaces for LEMON. The
     499various LP solvers could be used in the same manner with this
     500interface.
    594501*/
    595502
     
    681588
    682589/**
    683 @defgroup dimacs_group DIMACS Format
     590@defgroup dimacs_group DIMACS format
    684591@ingroup io_group
    685592\brief Read and write files in DIMACS format
     
    730637\brief Skeleton and concept checking classes for graph structures
    731638
    732 This group contains the skeletons and concept checking classes of
    733 graph structures.
     639This group contains the skeletons and concept checking classes of LEMON's
     640graph structures and helper classes used to implement these.
    734641*/
    735642
     
    743650
    744651/**
     652\anchor demoprograms
     653
     654@defgroup demos Demo Programs
     655
     656Some demo programs are listed here. Their full source codes can be found in
     657the \c demo subdirectory of the source tree.
     658
     659In order to compile them, use the <tt>make demo</tt> or the
     660<tt>make check</tt> commands.
     661*/
     662
     663/**
    745664@defgroup tools Standalone Utility Applications
    746665
     
    751670*/
    752671
    753 /**
    754 \anchor demoprograms
    755 
    756 @defgroup demos Demo Programs
    757 
    758 Some demo programs are listed here. Their full source codes can be found in
    759 the \c demo subdirectory of the source tree.
    760 
    761 In order to compile them, use the <tt>make demo</tt> or the
    762 <tt>make check</tt> commands.
    763 */
    764 
    765672}
  • doc/mainpage.dox

    r802 r705  
    2222\section intro Introduction
    2323
    24 <b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
    25 and <b>O</b>ptimization in <b>N</b>etworks</i>.
    26 It is a C++ template library providing efficient implementation of common
    27 data structures and algorithms with focus on combinatorial optimization
    28 problems in graphs and networks.
     24\subsection whatis What is LEMON
     25
     26LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
     27and <b>O</b>ptimization in <b>N</b>etworks.
     28It is a C++ template
     29library aimed at combinatorial optimization tasks which
     30often involve in working
     31with graphs.
    2932
    3033<b>
     
    3639</b>
    3740
    38 The project is maintained by the
    39 <a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
    40 Combinatorial Optimization</a> \ref egres
    41 at the Operations Research Department of the
    42 <a href="http://www.elte.hu/">E&ouml;tv&ouml;s Lor&aacute;nd University,
    43 Budapest</a>, Hungary.
    44 LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
    45 initiative \ref coinor.
    46 
    47 \section howtoread How to Read the Documentation
     41\subsection howtoread How to read the documentation
    4842
    4943If you would like to get to know the library, see
  • doc/min_cost_flow.dox

    r802 r710  
    2727minimum total cost from a set of supply nodes to a set of demand nodes
    2828in a network with capacity constraints (lower and upper bounds)
    29 and arc costs \ref amo93networkflows.
     29and arc costs.
    3030
    3131Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
  • lemon/Makefile.am

    r827 r820  
    5858        lemon/arg_parser.h \
    5959        lemon/assert.h \
    60         lemon/bellman_ford.h \
    6160        lemon/bfs.h \
    6261        lemon/bin_heap.h \
    63         lemon/binom_heap.h \
    6462        lemon/bucket_heap.h \
    6563        lemon/cbc.h \
     
    8179        lemon/euler.h \
    8280        lemon/fib_heap.h \
    83         lemon/fourary_heap.h \
    8481        lemon/full_graph.h \
    8582        lemon/glpk.h \
     
    8784        lemon/graph_to_eps.h \
    8885        lemon/grid_graph.h \
    89         lemon/hartmann_orlin.h \
    90         lemon/howard.h \
    9186        lemon/hypercube_graph.h \
    92         lemon/karp.h \
    93         lemon/kary_heap.h \
    9487        lemon/kruskal.h \
    9588        lemon/hao_orlin.h \
     
    10699        lemon/nauty_reader.h \
    107100        lemon/network_simplex.h \
    108         lemon/pairing_heap.h \
    109101        lemon/path.h \
    110102        lemon/preflow.h \
  • lemon/bfs.h

    r764 r525  
    4848    ///The type of the map that stores the predecessor
    4949    ///arcs of the shortest paths.
    50     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     50    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    5151    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    5252    ///Instantiates a \c PredMap.
     
    6363
    6464    ///The type of the map that indicates which nodes are processed.
    65     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
    66     ///By default it is a NullMap.
     65    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    6766    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
    6867    ///Instantiates a \c ProcessedMap.
     
    8382
    8483    ///The type of the map that indicates which nodes are reached.
    85     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     84    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    8685    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    8786    ///Instantiates a \c ReachedMap.
     
    9897
    9998    ///The type of the map that stores the distances of the nodes.
    100     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     99    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    101100    typedef typename Digraph::template NodeMap<int> DistMap;
    102101    ///Instantiates a \c DistMap.
     
    227226    ///\ref named-templ-param "Named parameter" for setting
    228227    ///\c PredMap type.
    229     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     228    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    230229    template <class T>
    231230    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
     
    247246    ///\ref named-templ-param "Named parameter" for setting
    248247    ///\c DistMap type.
    249     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     248    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    250249    template <class T>
    251250    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
     
    267266    ///\ref named-templ-param "Named parameter" for setting
    268267    ///\c ReachedMap type.
    269     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     268    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    270269    template <class T>
    271270    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
     
    287286    ///\ref named-templ-param "Named parameter" for setting
    288287    ///\c ProcessedMap type.
    289     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     288    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    290289    template <class T>
    291290    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
     
    415414    ///The simplest way to execute the BFS algorithm is to use one of the
    416415    ///member functions called \ref run(Node) "run()".\n
    417     ///If you need better control on the execution, you have to call
    418     ///\ref init() first, then you can add several source nodes with
     416    ///If you need more control on the execution, first you have to call
     417    ///\ref init(), then you can add several source nodes with
    419418    ///\ref addSource(). Finally the actual path computation can be
    420419    ///performed with one of the \ref start() functions.
     
    739738    ///@{
    740739
    741     ///The shortest path to the given node.
    742 
    743     ///Returns the shortest path to the given node from the root(s).
     740    ///The shortest path to a node.
     741
     742    ///Returns the shortest path to a node.
    744743    ///
    745744    ///\warning \c t should be reached from the root(s).
     
    749748    Path path(Node t) const { return Path(*G, *_pred, t); }
    750749
    751     ///The distance of the given node from the root(s).
    752 
    753     ///Returns the distance of the given node from the root(s).
     750    ///The distance of a node from the root(s).
     751
     752    ///Returns the distance of a node from the root(s).
    754753    ///
    755754    ///\warning If node \c v is not reached from the root(s), then
     
    760759    int dist(Node v) const { return (*_dist)[v]; }
    761760
    762     ///\brief Returns the 'previous arc' of the shortest path tree for
    763     ///the given node.
    764     ///
     761    ///Returns the 'previous arc' of the shortest path tree for a node.
     762
    765763    ///This function returns the 'previous arc' of the shortest path
    766764    ///tree for the node \c v, i.e. it returns the last arc of a
     
    769767    ///
    770768    ///The shortest path tree used here is equal to the shortest path
    771     ///tree used in \ref predNode() and \ref predMap().
     769    ///tree used in \ref predNode().
    772770    ///
    773771    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    775773    Arc predArc(Node v) const { return (*_pred)[v];}
    776774
    777     ///\brief Returns the 'previous node' of the shortest path tree for
    778     ///the given node.
    779     ///
     775    ///Returns the 'previous node' of the shortest path tree for a node.
     776
    780777    ///This function returns the 'previous node' of the shortest path
    781778    ///tree for the node \c v, i.e. it returns the last but one node
    782     ///of a shortest path from a root to \c v. It is \c INVALID
     779    ///from a shortest path from a root to \c v. It is \c INVALID
    783780    ///if \c v is not reached from the root(s) or if \c v is a root.
    784781    ///
    785782    ///The shortest path tree used here is equal to the shortest path
    786     ///tree used in \ref predArc() and \ref predMap().
     783    ///tree used in \ref predArc().
    787784    ///
    788785    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    805802    ///
    806803    ///Returns a const reference to the node map that stores the predecessor
    807     ///arcs, which form the shortest path tree (forest).
     804    ///arcs, which form the shortest path tree.
    808805    ///
    809806    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    811808    const PredMap &predMap() const { return *_pred;}
    812809
    813     ///Checks if the given node is reached from the root(s).
     810    ///Checks if a node is reached from the root(s).
    814811
    815812    ///Returns \c true if \c v is reached from the root(s).
     
    837834    ///The type of the map that stores the predecessor
    838835    ///arcs of the shortest paths.
    839     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     836    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    840837    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    841838    ///Instantiates a PredMap.
     
    852849
    853850    ///The type of the map that indicates which nodes are processed.
    854     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     851    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    855852    ///By default it is a NullMap.
    856853    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     
    872869
    873870    ///The type of the map that indicates which nodes are reached.
    874     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     871    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    875872    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    876873    ///Instantiates a ReachedMap.
     
    887884
    888885    ///The type of the map that stores the distances of the nodes.
    889     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     886    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    890887    typedef typename Digraph::template NodeMap<int> DistMap;
    891888    ///Instantiates a DistMap.
     
    902899
    903900    ///The type of the shortest paths.
    904     ///It must conform to the \ref concepts::Path "Path" concept.
     901    ///It must meet the \ref concepts::Path "Path" concept.
    905902    typedef lemon::Path<Digraph> Path;
    906903  };
     
    908905  /// Default traits class used by BfsWizard
    909906
    910   /// Default traits class used by BfsWizard.
    911   /// \tparam GR The type of the digraph.
     907  /// To make it easier to use Bfs algorithm
     908  /// we have created a wizard class.
     909  /// This \ref BfsWizard class needs default traits,
     910  /// as well as the \ref Bfs class.
     911  /// The \ref BfsWizardBase is a class to be the default traits of the
     912  /// \ref BfsWizard class.
    912913  template<class GR>
    913914  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
     
    937938    /// Constructor.
    938939
    939     /// This constructor does not require parameters, it initiates
     940    /// This constructor does not require parameters, therefore it initiates
    940941    /// all of the attributes to \c 0.
    941942    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
     
    967968    typedef TR Base;
    968969
     970    ///The type of the digraph the algorithm runs on.
    969971    typedef typename TR::Digraph Digraph;
    970972
     
    974976    typedef typename Digraph::OutArcIt OutArcIt;
    975977
     978    ///\brief The type of the map that stores the predecessor
     979    ///arcs of the shortest paths.
    976980    typedef typename TR::PredMap PredMap;
     981    ///\brief The type of the map that stores the distances of the nodes.
    977982    typedef typename TR::DistMap DistMap;
     983    ///\brief The type of the map that indicates which nodes are reached.
    978984    typedef typename TR::ReachedMap ReachedMap;
     985    ///\brief The type of the map that indicates which nodes are processed.
    979986    typedef typename TR::ProcessedMap ProcessedMap;
     987    ///The type of the shortest paths
    980988    typedef typename TR::Path Path;
    981989
     
    10601068      SetPredMapBase(const TR &b) : TR(b) {}
    10611069    };
    1062 
    1063     ///\brief \ref named-templ-param "Named parameter" for setting
    1064     ///the predecessor map.
    1065     ///
    1066     ///\ref named-templ-param "Named parameter" function for setting
    1067     ///the map that stores the predecessor arcs of the nodes.
     1070    ///\brief \ref named-func-param "Named parameter"
     1071    ///for setting PredMap object.
     1072    ///
     1073    ///\ref named-func-param "Named parameter"
     1074    ///for setting PredMap object.
    10681075    template<class T>
    10691076    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
     
    10791086      SetReachedMapBase(const TR &b) : TR(b) {}
    10801087    };
    1081 
    1082     ///\brief \ref named-templ-param "Named parameter" for setting
    1083     ///the reached map.
    1084     ///
    1085     ///\ref named-templ-param "Named parameter" function for setting
    1086     ///the map that indicates which nodes are reached.
     1088    ///\brief \ref named-func-param "Named parameter"
     1089    ///for setting ReachedMap object.
     1090    ///
     1091    /// \ref named-func-param "Named parameter"
     1092    ///for setting ReachedMap object.
    10871093    template<class T>
    10881094    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
     
    10981104      SetDistMapBase(const TR &b) : TR(b) {}
    10991105    };
    1100 
    1101     ///\brief \ref named-templ-param "Named parameter" for setting
    1102     ///the distance map.
    1103     ///
    1104     ///\ref named-templ-param "Named parameter" function for setting
    1105     ///the map that stores the distances of the nodes calculated
    1106     ///by the algorithm.
     1106    ///\brief \ref named-func-param "Named parameter"
     1107    ///for setting DistMap object.
     1108    ///
     1109    /// \ref named-func-param "Named parameter"
     1110    ///for setting DistMap object.
    11071111    template<class T>
    11081112    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
     
    11181122      SetProcessedMapBase(const TR &b) : TR(b) {}
    11191123    };
    1120 
    1121     ///\brief \ref named-func-param "Named parameter" for setting
    1122     ///the processed map.
    1123     ///
    1124     ///\ref named-templ-param "Named parameter" function for setting
    1125     ///the map that indicates which nodes are processed.
     1124    ///\brief \ref named-func-param "Named parameter"
     1125    ///for setting ProcessedMap object.
     1126    ///
     1127    /// \ref named-func-param "Named parameter"
     1128    ///for setting ProcessedMap object.
    11261129    template<class T>
    11271130    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
     
    12621265    ///
    12631266    /// The type of the map that indicates which nodes are reached.
    1264     /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     1267    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    12651268    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    12661269
     
    14231426    /// The simplest way to execute the BFS algorithm is to use one of the
    14241427    /// member functions called \ref run(Node) "run()".\n
    1425     /// If you need better control on the execution, you have to call
    1426     /// \ref init() first, then you can add several source nodes with
     1428    /// If you need more control on the execution, first you have to call
     1429    /// \ref init(), then you can add several source nodes with
    14271430    /// \ref addSource(). Finally the actual path computation can be
    14281431    /// performed with one of the \ref start() functions.
     
    17331736    ///@{
    17341737
    1735     /// \brief Checks if the given node is reached from the root(s).
     1738    /// \brief Checks if a node is reached from the root(s).
    17361739    ///
    17371740    /// Returns \c true if \c v is reached from the root(s).
  • lemon/bin_heap.h

    r758 r730  
    2020#define LEMON_BIN_HEAP_H
    2121
    22 ///\ingroup heaps
     22///\ingroup auxdat
    2323///\file
    24 ///\brief Binary heap implementation.
     24///\brief Binary Heap implementation.
    2525
    2626#include <vector>
     
    3030namespace lemon {
    3131
    32   /// \ingroup heaps
    33   ///
    34   /// \brief Binary heap data structure.
    35   ///
    36   /// This class implements the \e binary \e heap data structure.
    37   /// It fully conforms to the \ref concepts::Heap "heap concept".
    38   ///
    39   /// \tparam PR Type of the priorities of the items.
    40   /// \tparam IM A read-writable item map with \c int values, used
    41   /// internally to handle the cross references.
    42   /// \tparam CMP A functor class for comparing the priorities.
    43   /// The default is \c std::less<PR>.
    44 #ifdef DOXYGEN
    45   template <typename PR, typename IM, typename CMP>
    46 #else
     32  ///\ingroup auxdat
     33  ///
     34  ///\brief A Binary Heap implementation.
     35  ///
     36  ///This class implements the \e binary \e heap data structure.
     37  ///
     38  ///A \e heap is a data structure for storing items with specified values
     39  ///called \e priorities in such a way that finding the item with minimum
     40  ///priority is efficient. \c CMP specifies the ordering of the priorities.
     41  ///In a heap one can change the priority of an item, add or erase an
     42  ///item, etc.
     43  ///
     44  ///\tparam PR Type of the priority of the items.
     45  ///\tparam IM A read and writable item map with int values, used internally
     46  ///to handle the cross references.
     47  ///\tparam CMP A functor class for the ordering of the priorities.
     48  ///The default is \c std::less<PR>.
     49  ///
     50  ///\sa FibHeap
     51  ///\sa Dijkstra
    4752  template <typename PR, typename IM, typename CMP = std::less<PR> >
    48 #endif
    4953  class BinHeap {
     54
    5055  public:
    51 
    52     /// Type of the item-int map.
     56    ///\e
    5357    typedef IM ItemIntMap;
    54     /// Type of the priorities.
     58    ///\e
    5559    typedef PR Prio;
    56     /// Type of the items stored in the heap.
     60    ///\e
    5761    typedef typename ItemIntMap::Key Item;
    58     /// Type of the item-priority pairs.
     62    ///\e
    5963    typedef std::pair<Item,Prio> Pair;
    60     /// Functor type for comparing the priorities.
     64    ///\e
    6165    typedef CMP Compare;
    6266
    63     /// \brief Type to represent the states of the items.
    64     ///
    65     /// Each item has a state associated to it. It can be "in heap",
    66     /// "pre-heap" or "post-heap". The latter two are indifferent from the
     67    /// \brief Type to represent the items states.
     68    ///
     69    /// Each Item element have a state associated to it. It may be "in heap",
     70    /// "pre heap" or "post heap". The latter two are indifferent from the
    6771    /// heap's point of view, but may be useful to the user.
    6872    ///
     
    8185
    8286  public:
    83 
    84     /// \brief Constructor.
    85     ///
    86     /// Constructor.
    87     /// \param map A map that assigns \c int values to the items.
    88     /// It is used internally to handle the cross references.
    89     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
     87    /// \brief The constructor.
     88    ///
     89    /// The constructor.
     90    /// \param map should be given to the constructor, since it is used
     91    /// internally to handle the cross references. The value of the map
     92    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
    9093    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
    9194
    92     /// \brief Constructor.
    93     ///
    94     /// Constructor.
    95     /// \param map A map that assigns \c int values to the items.
    96     /// It is used internally to handle the cross references.
    97     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
    98     /// \param comp The function object used for comparing the priorities.
     95    /// \brief The constructor.
     96    ///
     97    /// The constructor.
     98    /// \param map should be given to the constructor, since it is used
     99    /// internally to handle the cross references. The value of the map
     100    /// should be PRE_HEAP (-1) for each element.
     101    ///
     102    /// \param comp The comparator function object.
    99103    BinHeap(ItemIntMap &map, const Compare &comp)
    100104      : _iim(map), _comp(comp) {}
    101105
    102106
    103     /// \brief The number of items stored in the heap.
    104     ///
    105     /// This function returns the number of items stored in the heap.
     107    /// The number of items stored in the heap.
     108    ///
     109    /// \brief Returns the number of items stored in the heap.
    106110    int size() const { return _data.size(); }
    107111
    108     /// \brief Check if the heap is empty.
    109     ///
    110     /// This function returns \c true if the heap is empty.
     112    /// \brief Checks if the heap stores no items.
     113    ///
     114    /// Returns \c true if and only if the heap stores no items.
    111115    bool empty() const { return _data.empty(); }
    112116
    113     /// \brief Make the heap empty.
    114     ///
    115     /// This functon makes the heap empty.
    116     /// It does not change the cross reference map. If you want to reuse
    117     /// a heap that is not surely empty, you should first clear it and
    118     /// then you should set the cross reference map to \c PRE_HEAP
    119     /// for each item.
     117    /// \brief Make empty this heap.
     118    ///
     119    /// Make empty this heap. It does not change the cross reference map.
     120    /// If you want to reuse what is not surely empty you should first clear
     121    /// the heap and after that you should set the cross reference map for
     122    /// each item to \c PRE_HEAP.
    120123    void clear() {
    121124      _data.clear();
     
    125128    static int parent(int i) { return (i-1)/2; }
    126129
    127     static int secondChild(int i) { return 2*i+2; }
     130    static int second_child(int i) { return 2*i+2; }
    128131    bool less(const Pair &p1, const Pair &p2) const {
    129132      return _comp(p1.second, p2.second);
    130133    }
    131134
    132     int bubbleUp(int hole, Pair p) {
     135    int bubble_up(int hole, Pair p) {
    133136      int par = parent(hole);
    134137      while( hole>0 && less(p,_data[par]) ) {
     
    141144    }
    142145
    143     int bubbleDown(int hole, Pair p, int length) {
    144       int child = secondChild(hole);
     146    int bubble_down(int hole, Pair p, int length) {
     147      int child = second_child(hole);
    145148      while(child < length) {
    146149        if( less(_data[child-1], _data[child]) ) {
     
    151154        move(_data[child], hole);
    152155        hole = child;
    153         child = secondChild(hole);
     156        child = second_child(hole);
    154157      }
    155158      child--;
     
    169172
    170173  public:
    171 
    172174    /// \brief Insert a pair of item and priority into the heap.
    173175    ///
    174     /// This function inserts \c p.first to the heap with priority
    175     /// \c p.second.
     176    /// Adds \c p.first to the heap with priority \c p.second.
    176177    /// \param p The pair to insert.
    177     /// \pre \c p.first must not be stored in the heap.
    178178    void push(const Pair &p) {
    179179      int n = _data.size();
    180180      _data.resize(n+1);
    181       bubbleUp(n, p);
    182     }
    183 
    184     /// \brief Insert an item into the heap with the given priority.
    185     ///
    186     /// This function inserts the given item into the heap with the
    187     /// given priority.
     181      bubble_up(n, p);
     182    }
     183
     184    /// \brief Insert an item into the heap with the given heap.
     185    ///
     186    /// Adds \c i to the heap with priority \c p.
    188187    /// \param i The item to insert.
    189188    /// \param p The priority of the item.
    190     /// \pre \e i must not be stored in the heap.
    191189    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
    192190
    193     /// \brief Return the item having minimum priority.
    194     ///
    195     /// This function returns the item having minimum priority.
    196     /// \pre The heap must be non-empty.
     191    /// \brief Returns the item with minimum priority relative to \c Compare.
     192    ///
     193    /// This method returns the item with minimum priority relative to \c
     194    /// Compare.
     195    /// \pre The heap must be nonempty.
    197196    Item top() const {
    198197      return _data[0].first;
    199198    }
    200199
    201     /// \brief The minimum priority.
    202     ///
    203     /// This function returns the minimum priority.
    204     /// \pre The heap must be non-empty.
     200    /// \brief Returns the minimum priority relative to \c Compare.
     201    ///
     202    /// It returns the minimum priority relative to \c Compare.
     203    /// \pre The heap must be nonempty.
    205204    Prio prio() const {
    206205      return _data[0].second;
    207206    }
    208207
    209     /// \brief Remove the item having minimum priority.
    210     ///
    211     /// This function removes the item having minimum priority.
     208    /// \brief Deletes the item with minimum priority relative to \c Compare.
     209    ///
     210    /// This method deletes the item with minimum priority relative to \c
     211    /// Compare from the heap.
    212212    /// \pre The heap must be non-empty.
    213213    void pop() {
     
    215215      _iim.set(_data[0].first, POST_HEAP);
    216216      if (n > 0) {
    217         bubbleDown(0, _data[n], n);
     217        bubble_down(0, _data[n], n);
    218218      }
    219219      _data.pop_back();
    220220    }
    221221
    222     /// \brief Remove the given item from the heap.
    223     ///
    224     /// This function removes the given item from the heap if it is
    225     /// already stored.
    226     /// \param i The item to delete.
    227     /// \pre \e i must be in the heap.
     222    /// \brief Deletes \c i from the heap.
     223    ///
     224    /// This method deletes item \c i from the heap.
     225    /// \param i The item to erase.
     226    /// \pre The item should be in the heap.
    228227    void erase(const Item &i) {
    229228      int h = _iim[i];
     
    231230      _iim.set(_data[h].first, POST_HEAP);
    232231      if( h < n ) {
    233         if ( bubbleUp(h, _data[n]) == h) {
    234           bubbleDown(h, _data[n], n);
     232        if ( bubble_up(h, _data[n]) == h) {
     233          bubble_down(h, _data[n], n);
    235234        }
    236235      }
     
    238237    }
    239238
    240     /// \brief The priority of the given item.
    241     ///
    242     /// This function returns the priority of the given item.
    243     /// \param i The item.
    244     /// \pre \e i must be in the heap.
     239
     240    /// \brief Returns the priority of \c i.
     241    ///
     242    /// This function returns the priority of item \c i.
     243    /// \param i The item.
     244    /// \pre \c i must be in the heap.
    245245    Prio operator[](const Item &i) const {
    246246      int idx = _iim[i];
     
    248248    }
    249249
    250     /// \brief Set the priority of an item or insert it, if it is
    251     /// not stored in the heap.
    252     ///
    253     /// This method sets the priority of the given item if it is
    254     /// already stored in the heap. Otherwise it inserts the given
    255     /// item into the heap with the given priority.
     250    /// \brief \c i gets to the heap with priority \c p independently
     251    /// if \c i was already there.
     252    ///
     253    /// This method calls \ref push(\c i, \c p) if \c i is not stored
     254    /// in the heap and sets the priority of \c i to \c p otherwise.
    256255    /// \param i The item.
    257256    /// \param p The priority.
     
    262261      }
    263262      else if( _comp(p, _data[idx].second) ) {
    264         bubbleUp(idx, Pair(i,p));
     263        bubble_up(idx, Pair(i,p));
    265264      }
    266265      else {
    267         bubbleDown(idx, Pair(i,p), _data.size());
    268       }
    269     }
    270 
    271     /// \brief Decrease the priority of an item to the given value.
    272     ///
    273     /// This function decreases the priority of an item to the given value.
     266        bubble_down(idx, Pair(i,p), _data.size());
     267      }
     268    }
     269
     270    /// \brief Decreases the priority of \c i to \c p.
     271    ///
     272    /// This method decreases the priority of item \c i to \c p.
    274273    /// \param i The item.
    275274    /// \param p The priority.
    276     /// \pre \e i must be stored in the heap with priority at least \e p.
     275    /// \pre \c i must be stored in the heap with priority at least \c
     276    /// p relative to \c Compare.
    277277    void decrease(const Item &i, const Prio &p) {
    278278      int idx = _iim[i];
    279       bubbleUp(idx, Pair(i,p));
    280     }
    281 
    282     /// \brief Increase the priority of an item to the given value.
    283     ///
    284     /// This function increases the priority of an item to the given value.
     279      bubble_up(idx, Pair(i,p));
     280    }
     281
     282    /// \brief Increases the priority of \c i to \c p.
     283    ///
     284    /// This method sets the priority of item \c i to \c p.
    285285    /// \param i The item.
    286286    /// \param p The priority.
    287     /// \pre \e i must be stored in the heap with priority at most \e p.
     287    /// \pre \c i must be stored in the heap with priority at most \c
     288    /// p relative to \c Compare.
    288289    void increase(const Item &i, const Prio &p) {
    289290      int idx = _iim[i];
    290       bubbleDown(idx, Pair(i,p), _data.size());
    291     }
    292 
    293     /// \brief Return the state of an item.
    294     ///
    295     /// This method returns \c PRE_HEAP if the given item has never
    296     /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
    297     /// and \c POST_HEAP otherwise.
    298     /// In the latter case it is possible that the item will get back
    299     /// to the heap again.
     291      bubble_down(idx, Pair(i,p), _data.size());
     292    }
     293
     294    /// \brief Returns if \c item is in, has already been in, or has
     295    /// never been in the heap.
     296    ///
     297    /// This method returns PRE_HEAP if \c item has never been in the
     298    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
     299    /// otherwise. In the latter case it is possible that \c item will
     300    /// get back to the heap again.
    300301    /// \param i The item.
    301302    State state(const Item &i) const {
     
    306307    }
    307308
    308     /// \brief Set the state of an item in the heap.
    309     ///
    310     /// This function sets the state of the given item in the heap.
    311     /// It can be used to manually clear the heap when it is important
    312     /// to achive better time complexity.
     309    /// \brief Sets the state of the \c item in the heap.
     310    ///
     311    /// Sets the state of the \c item in the heap. It can be used to
     312    /// manually clear the heap when it is important to achive the
     313    /// better time complexity.
    313314    /// \param i The item.
    314315    /// \param st The state. It should not be \c IN_HEAP.
     
    327328    }
    328329
    329     /// \brief Replace an item in the heap.
    330     ///
    331     /// This function replaces item \c i with item \c j.
    332     /// Item \c i must be in the heap, while \c j must be out of the heap.
    333     /// After calling this method, item \c i will be out of the
    334     /// heap and \c j will be in the heap with the same prioriority
    335     /// as item \c i had before.
     330    /// \brief Replaces an item in the heap.
     331    ///
     332    /// The \c i item is replaced with \c j item. The \c i item should
     333    /// be in the heap, while the \c j should be out of the heap. The
     334    /// \c i item will out of the heap and \c j will be in the heap
     335    /// with the same prioriority as prevoiusly the \c i item.
    336336    void replace(const Item& i, const Item& j) {
    337337      int idx = _iim[i];
  • lemon/bits/map_extender.h

    r765 r664  
    5050    typedef typename Parent::ConstReference ConstReference;
    5151
    52     typedef typename Parent::ReferenceMapTag ReferenceMapTag;
    53 
    5452    class MapIt;
    5553    class ConstMapIt;
     
    194192    typedef typename Parent::ConstReference ConstReference;
    195193
    196     typedef typename Parent::ReferenceMapTag ReferenceMapTag;
    197 
    198194    class MapIt;
    199195    class ConstMapIt;
  • lemon/bucket_heap.h

    r758 r730  
    2020#define LEMON_BUCKET_HEAP_H
    2121
    22 ///\ingroup heaps
     22///\ingroup auxdat
    2323///\file
    24 ///\brief Bucket heap implementation.
     24///\brief Bucket Heap implementation.
    2525
    2626#include <vector>
     
    5454  }
    5555
    56   /// \ingroup heaps
    57   ///
    58   /// \brief Bucket heap data structure.
    59   ///
    60   /// This class implements the \e bucket \e heap data structure.
    61   /// It practically conforms to the \ref concepts::Heap "heap concept",
    62   /// but it has some limitations.
    63   ///
    64   /// The bucket heap is a very simple structure. It can store only
    65   /// \c int priorities and it maintains a list of items for each priority
    66   /// in the range <tt>[0..C)</tt>. So it should only be used when the
    67   /// priorities are small. It is not intended to use as a Dijkstra heap.
    68   ///
    69   /// \tparam IM A read-writable item map with \c int values, used
    70   /// internally to handle the cross references.
    71   /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
    72   /// The default is \e min-heap. If this parameter is set to \c false,
    73   /// then the comparison is reversed, so the top(), prio() and pop()
    74   /// functions deal with the item having maximum priority instead of the
    75   /// minimum.
    76   ///
    77   /// \sa SimpleBucketHeap
     56  /// \ingroup auxdat
     57  ///
     58  /// \brief A Bucket Heap implementation.
     59  ///
     60  /// This class implements the \e bucket \e heap data structure. A \e heap
     61  /// is a data structure for storing items with specified values called \e
     62  /// priorities in such a way that finding the item with minimum priority is
     63  /// efficient. The bucket heap is very simple implementation, it can store
     64  /// only integer priorities and it stores for each priority in the
     65  /// \f$ [0..C) \f$ range a list of items. So it should be used only when
     66  /// the priorities are small. It is not intended to use as dijkstra heap.
     67  ///
     68  /// \param IM A read and write Item int map, used internally
     69  /// to handle the cross references.
     70  /// \param MIN If the given parameter is false then instead of the
     71  /// minimum value the maximum can be retrivied with the top() and
     72  /// prio() member functions.
    7873  template <typename IM, bool MIN = true>
    7974  class BucketHeap {
    8075
    8176  public:
    82 
    83     /// Type of the item-int map.
     77    /// \e
     78    typedef typename IM::Key Item;
     79    /// \e
     80    typedef int Prio;
     81    /// \e
     82    typedef std::pair<Item, Prio> Pair;
     83    /// \e
    8484    typedef IM ItemIntMap;
    85     /// Type of the priorities.
    86     typedef int Prio;
    87     /// Type of the items stored in the heap.
    88     typedef typename ItemIntMap::Key Item;
    89     /// Type of the item-priority pairs.
    90     typedef std::pair<Item,Prio> Pair;
    9185
    9286  private:
     
    9690  public:
    9791
    98     /// \brief Type to represent the states of the items.
    99     ///
    100     /// Each item has a state associated to it. It can be "in heap",
    101     /// "pre-heap" or "post-heap". The latter two are indifferent from the
     92    /// \brief Type to represent the items states.
     93    ///
     94    /// Each Item element have a state associated to it. It may be "in heap",
     95    /// "pre heap" or "post heap". The latter two are indifferent from the
    10296    /// heap's point of view, but may be useful to the user.
    10397    ///
     
    111105
    112106  public:
    113 
    114     /// \brief Constructor.
    115     ///
    116     /// Constructor.
    117     /// \param map A map that assigns \c int values to the items.
    118     /// It is used internally to handle the cross references.
    119     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
     107    /// \brief The constructor.
     108    ///
     109    /// The constructor.
     110    /// \param map should be given to the constructor, since it is used
     111    /// internally to handle the cross references. The value of the map
     112    /// should be PRE_HEAP (-1) for each element.
    120113    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
    121114
    122     /// \brief The number of items stored in the heap.
    123     ///
    124     /// This function returns the number of items stored in the heap.
     115    /// The number of items stored in the heap.
     116    ///
     117    /// \brief Returns the number of items stored in the heap.
    125118    int size() const { return _data.size(); }
    126119
    127     /// \brief Check if the heap is empty.
    128     ///
    129     /// This function returns \c true if the heap is empty.
     120    /// \brief Checks if the heap stores no items.
     121    ///
     122    /// Returns \c true if and only if the heap stores no items.
    130123    bool empty() const { return _data.empty(); }
    131124
    132     /// \brief Make the heap empty.
    133     ///
    134     /// This functon makes the heap empty.
    135     /// It does not change the cross reference map. If you want to reuse
    136     /// a heap that is not surely empty, you should first clear it and
    137     /// then you should set the cross reference map to \c PRE_HEAP
    138     /// for each item.
     125    /// \brief Make empty this heap.
     126    ///
     127    /// Make empty this heap. It does not change the cross reference
     128    /// map.  If you want to reuse a heap what is not surely empty you
     129    /// should first clear the heap and after that you should set the
     130    /// cross reference map for each item to \c PRE_HEAP.
    139131    void clear() {
    140132      _data.clear(); _first.clear(); _minimum = 0;
     
    143135  private:
    144136
    145     void relocateLast(int idx) {
     137    void relocate_last(int idx) {
    146138      if (idx + 1 < int(_data.size())) {
    147139        _data[idx] = _data.back();
     
    183175
    184176  public:
    185 
    186177    /// \brief Insert a pair of item and priority into the heap.
    187178    ///
    188     /// This function inserts \c p.first to the heap with priority
    189     /// \c p.second.
     179    /// Adds \c p.first to the heap with priority \c p.second.
    190180    /// \param p The pair to insert.
    191     /// \pre \c p.first must not be stored in the heap.
    192181    void push(const Pair& p) {
    193182      push(p.first, p.second);
     
    196185    /// \brief Insert an item into the heap with the given priority.
    197186    ///
    198     /// This function inserts the given item into the heap with the
    199     /// given priority.
     187    /// Adds \c i to the heap with priority \c p.
    200188    /// \param i The item to insert.
    201189    /// \param p The priority of the item.
    202     /// \pre \e i must not be stored in the heap.
    203190    void push(const Item &i, const Prio &p) {
    204191      int idx = _data.size();
     
    211198    }
    212199
    213     /// \brief Return the item having minimum priority.
    214     ///
    215     /// This function returns the item having minimum priority.
    216     /// \pre The heap must be non-empty.
     200    /// \brief Returns the item with minimum priority.
     201    ///
     202    /// This method returns the item with minimum priority.
     203    /// \pre The heap must be nonempty.
    217204    Item top() const {
    218205      while (_first[_minimum] == -1) {
     
    222209    }
    223210
    224     /// \brief The minimum priority.
    225     ///
    226     /// This function returns the minimum priority.
    227     /// \pre The heap must be non-empty.
     211    /// \brief Returns the minimum priority.
     212    ///
     213    /// It returns the minimum priority.
     214    /// \pre The heap must be nonempty.
    228215    Prio prio() const {
    229216      while (_first[_minimum] == -1) {
     
    233220    }
    234221
    235     /// \brief Remove the item having minimum priority.
    236     ///
    237     /// This function removes the item having minimum priority.
     222    /// \brief Deletes the item with minimum priority.
     223    ///
     224    /// This method deletes the item with minimum priority from the heap.
    238225    /// \pre The heap must be non-empty.
    239226    void pop() {
     
    244231      _iim[_data[idx].item] = -2;
    245232      unlace(idx);
    246       relocateLast(idx);
    247     }
    248 
    249     /// \brief Remove the given item from the heap.
    250     ///
    251     /// This function removes the given item from the heap if it is
    252     /// already stored.
    253     /// \param i The item to delete.
    254     /// \pre \e i must be in the heap.
     233      relocate_last(idx);
     234    }
     235
     236    /// \brief Deletes \c i from the heap.
     237    ///
     238    /// This method deletes item \c i from the heap, if \c i was
     239    /// already stored in the heap.
     240    /// \param i The item to erase.
    255241    void erase(const Item &i) {
    256242      int idx = _iim[i];
    257243      _iim[_data[idx].item] = -2;
    258244      unlace(idx);
    259       relocateLast(idx);
    260     }
    261 
    262     /// \brief The priority of the given item.
    263     ///
    264     /// This function returns the priority of the given item.
    265     /// \param i The item.
    266     /// \pre \e i must be in the heap.
     245      relocate_last(idx);
     246    }
     247
     248
     249    /// \brief Returns the priority of \c i.
     250    ///
     251    /// This function returns the priority of item \c i.
     252    /// \pre \c i must be in the heap.
     253    /// \param i The item.
    267254    Prio operator[](const Item &i) const {
    268255      int idx = _iim[i];
     
    270257    }
    271258
    272     /// \brief Set the priority of an item or insert it, if it is
    273     /// not stored in the heap.
    274     ///
    275     /// This method sets the priority of the given item if it is
    276     /// already stored in the heap. Otherwise it inserts the given
    277     /// item into the heap with the given priority.
     259    /// \brief \c i gets to the heap with priority \c p independently
     260    /// if \c i was already there.
     261    ///
     262    /// This method calls \ref push(\c i, \c p) if \c i is not stored
     263    /// in the heap and sets the priority of \c i to \c p otherwise.
    278264    /// \param i The item.
    279265    /// \param p The priority.
     
    289275    }
    290276
    291     /// \brief Decrease the priority of an item to the given value.
    292     ///
    293     /// This function decreases the priority of an item to the given value.
     277    /// \brief Decreases the priority of \c i to \c p.
     278    ///
     279    /// This method decreases the priority of item \c i to \c p.
     280    /// \pre \c i must be stored in the heap with priority at least \c
     281    /// p relative to \c Compare.
    294282    /// \param i The item.
    295283    /// \param p The priority.
    296     /// \pre \e i must be stored in the heap with priority at least \e p.
    297284    void decrease(const Item &i, const Prio &p) {
    298285      int idx = _iim[i];
     
    305292    }
    306293
    307     /// \brief Increase the priority of an item to the given value.
    308     ///
    309     /// This function increases the priority of an item to the given value.
     294    /// \brief Increases the priority of \c i to \c p.
     295    ///
     296    /// This method sets the priority of item \c i to \c p.
     297    /// \pre \c i must be stored in the heap with priority at most \c
     298    /// p relative to \c Compare.
    310299    /// \param i The item.
    311300    /// \param p The priority.
    312     /// \pre \e i must be stored in the heap with priority at most \e p.
    313301    void increase(const Item &i, const Prio &p) {
    314302      int idx = _iim[i];
     
    318306    }
    319307
    320     /// \brief Return the state of an item.
    321     ///
    322     /// This method returns \c PRE_HEAP if the given item has never
    323     /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
    324     /// and \c POST_HEAP otherwise.
    325     /// In the latter case it is possible that the item will get back
    326     /// to the heap again.
     308    /// \brief Returns if \c item is in, has already been in, or has
     309    /// never been in the heap.
     310    ///
     311    /// This method returns PRE_HEAP if \c item has never been in the
     312    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
     313    /// otherwise. In the latter case it is possible that \c item will
     314    /// get back to the heap again.
    327315    /// \param i The item.
    328316    State state(const Item &i) const {
     
    332320    }
    333321
    334     /// \brief Set the state of an item in the heap.
    335     ///
    336     /// This function sets the state of the given item in the heap.
    337     /// It can be used to manually clear the heap when it is important
    338     /// to achive better time complexity.
     322    /// \brief Sets the state of the \c item in the heap.
     323    ///
     324    /// Sets the state of the \c item in the heap. It can be used to
     325    /// manually clear the heap when it is important to achive the
     326    /// better time complexity.
    339327    /// \param i The item.
    340328    /// \param st The state. It should not be \c IN_HEAP.
     
    372360  }; // class BucketHeap
    373361
    374   /// \ingroup heaps
    375   ///
    376   /// \brief Simplified bucket heap data structure.
     362  /// \ingroup auxdat
     363  ///
     364  /// \brief A Simplified Bucket Heap implementation.
    377365  ///
    378366  /// This class implements a simplified \e bucket \e heap data
    379   /// structure. It does not provide some functionality, but it is
    380   /// faster and simpler than BucketHeap. The main difference is
    381   /// that BucketHeap stores a doubly-linked list for each key while
    382   /// this class stores only simply-linked lists. It supports erasing
    383   /// only for the item having minimum priority and it does not support
    384   /// key increasing and decreasing.
    385   ///
    386   /// Note that this implementation does not conform to the
    387   /// \ref concepts::Heap "heap concept" due to the lack of some
    388   /// functionality.
    389   ///
    390   /// \tparam IM A read-writable item map with \c int values, used
    391   /// internally to handle the cross references.
    392   /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
    393   /// The default is \e min-heap. If this parameter is set to \c false,
    394   /// then the comparison is reversed, so the top(), prio() and pop()
    395   /// functions deal with the item having maximum priority instead of the
    396   /// minimum.
     367  /// structure.  It does not provide some functionality but it faster
     368  /// and simplier data structure than the BucketHeap. The main
     369  /// difference is that the BucketHeap stores for every key a double
     370  /// linked list while this class stores just simple lists. In the
     371  /// other way it does not support erasing each elements just the
     372  /// minimal and it does not supports key increasing, decreasing.
     373  ///
     374  /// \param IM A read and write Item int map, used internally
     375  /// to handle the cross references.
     376  /// \param MIN If the given parameter is false then instead of the
     377  /// minimum value the maximum can be retrivied with the top() and
     378  /// prio() member functions.
    397379  ///
    398380  /// \sa BucketHeap
     
    401383
    402384  public:
    403 
    404     /// Type of the item-int map.
     385    typedef typename IM::Key Item;
     386    typedef int Prio;
     387    typedef std::pair<Item, Prio> Pair;
    405388    typedef IM ItemIntMap;
    406     /// Type of the priorities.
    407     typedef int Prio;
    408     /// Type of the items stored in the heap.
    409     typedef typename ItemIntMap::Key Item;
    410     /// Type of the item-priority pairs.
    411     typedef std::pair<Item,Prio> Pair;
    412389
    413390  private:
     
    417394  public:
    418395
    419     /// \brief Type to represent the states of the items.
    420     ///
    421     /// Each item has a state associated to it. It can be "in heap",
    422     /// "pre-heap" or "post-heap". The latter two are indifferent from the
     396    /// \brief Type to represent the items states.
     397    ///
     398    /// Each Item element have a state associated to it. It may be "in heap",
     399    /// "pre heap" or "post heap". The latter two are indifferent from the
    423400    /// heap's point of view, but may be useful to the user.
    424401    ///
     
    433410  public:
    434411
    435     /// \brief Constructor.
    436     ///
    437     /// Constructor.
    438     /// \param map A map that assigns \c int values to the items.
    439     /// It is used internally to handle the cross references.
    440     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
     412    /// \brief The constructor.
     413    ///
     414    /// The constructor.
     415    /// \param map should be given to the constructor, since it is used
     416    /// internally to handle the cross references. The value of the map
     417    /// should be PRE_HEAP (-1) for each element.
    441418    explicit SimpleBucketHeap(ItemIntMap &map)
    442419      : _iim(map), _free(-1), _num(0), _minimum(0) {}
    443420
    444     /// \brief The number of items stored in the heap.
    445     ///
    446     /// This function returns the number of items stored in the heap.
     421    /// \brief Returns the number of items stored in the heap.
     422    ///
     423    /// The number of items stored in the heap.
    447424    int size() const { return _num; }
    448425
    449     /// \brief Check if the heap is empty.
    450     ///
    451     /// This function returns \c true if the heap is empty.
     426    /// \brief Checks if the heap stores no items.
     427    ///
     428    /// Returns \c true if and only if the heap stores no items.
    452429    bool empty() const { return _num == 0; }
    453430
    454     /// \brief Make the heap empty.
    455     ///
    456     /// This functon makes the heap empty.
    457     /// It does not change the cross reference map. If you want to reuse
    458     /// a heap that is not surely empty, you should first clear it and
    459     /// then you should set the cross reference map to \c PRE_HEAP
    460     /// for each item.
     431    /// \brief Make empty this heap.
     432    ///
     433    /// Make empty this heap. It does not change the cross reference
     434    /// map.  If you want to reuse a heap what is not surely empty you
     435    /// should first clear the heap and after that you should set the
     436    /// cross reference map for each item to \c PRE_HEAP.
    461437    void clear() {
    462438      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
     
    465441    /// \brief Insert a pair of item and priority into the heap.
    466442    ///
    467     /// This function inserts \c p.first to the heap with priority
    468     /// \c p.second.
     443    /// Adds \c p.first to the heap with priority \c p.second.
    469444    /// \param p The pair to insert.
    470     /// \pre \c p.first must not be stored in the heap.
    471445    void push(const Pair& p) {
    472446      push(p.first, p.second);
     
    475449    /// \brief Insert an item into the heap with the given priority.
    476450    ///
    477     /// This function inserts the given item into the heap with the
    478     /// given priority.
     451    /// Adds \c i to the heap with priority \c p.
    479452    /// \param i The item to insert.
    480453    /// \param p The priority of the item.
    481     /// \pre \e i must not be stored in the heap.
    482454    void push(const Item &i, const Prio &p) {
    483455      int idx;
     
    500472    }
    501473
    502     /// \brief Return the item having minimum priority.
    503     ///
    504     /// This function returns the item having minimum priority.
    505     /// \pre The heap must be non-empty.
     474    /// \brief Returns the item with minimum priority.
     475    ///
     476    /// This method returns the item with minimum priority.
     477    /// \pre The heap must be nonempty.
    506478    Item top() const {
    507479      while (_first[_minimum] == -1) {
     
    511483    }
    512484
    513     /// \brief The minimum priority.
    514     ///
    515     /// This function returns the minimum priority.
    516     /// \pre The heap must be non-empty.
     485    /// \brief Returns the minimum priority.
     486    ///
     487    /// It returns the minimum priority.
     488    /// \pre The heap must be nonempty.
    517489    Prio prio() const {
    518490      while (_first[_minimum] == -1) {
     
    522494    }
    523495
    524     /// \brief Remove the item having minimum priority.
    525     ///
    526     /// This function removes the item having minimum priority.
     496    /// \brief Deletes the item with minimum priority.
     497    ///
     498    /// This method deletes the item with minimum priority from the heap.
    527499    /// \pre The heap must be non-empty.
    528500    void pop() {
     
    538510    }
    539511
    540     /// \brief The priority of the given item.
    541     ///
    542     /// This function returns the priority of the given item.
    543     /// \param i The item.
    544     /// \pre \e i must be in the heap.
    545     /// \warning This operator is not a constant time function because
    546     /// it scans the whole data structure to find the proper value.
     512    /// \brief Returns the priority of \c i.
     513    ///
     514    /// This function returns the priority of item \c i.
     515    /// \warning This operator is not a constant time function
     516    /// because it scans the whole data structure to find the proper
     517    /// value.
     518    /// \pre \c i must be in the heap.
     519    /// \param i The item.
    547520    Prio operator[](const Item &i) const {
    548       for (int k = 0; k < int(_first.size()); ++k) {
     521      for (int k = 0; k < _first.size(); ++k) {
    549522        int idx = _first[k];
    550523        while (idx != -1) {
     
    558531    }
    559532
    560     /// \brief Return the state of an item.
    561     ///
    562     /// This method returns \c PRE_HEAP if the given item has never
    563     /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
    564     /// and \c POST_HEAP otherwise.
    565     /// In the latter case it is possible that the item will get back
    566     /// to the heap again.
     533    /// \brief Returns if \c item is in, has already been in, or has
     534    /// never been in the heap.
     535    ///
     536    /// This method returns PRE_HEAP if \c item has never been in the
     537    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
     538    /// otherwise. In the latter case it is possible that \c item will
     539    /// get back to the heap again.
    567540    /// \param i The item.
    568541    State state(const Item &i) const {
  • lemon/cbc.cc

    r793 r623  
    9595  }
    9696
    97   int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
    98     std::vector<int> indexes;
    99     std::vector<Value> values;
    100 
    101     for(ExprIterator it = b; it != e; ++it) {
    102       indexes.push_back(it->first);
    103       values.push_back(it->second);
    104     }
    105 
    106     _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
    107     return _prob->numberRows() - 1;
    108   }
    10997
    11098  void CbcMip::_eraseCol(int i) {
  • lemon/cbc.h

    r793 r623  
    6363    virtual int _addCol();
    6464    virtual int _addRow();
    65     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    6665
    6766    virtual void _eraseCol(int i);
  • lemon/circulation.h

    r762 r688  
    7373    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
    7474    /// concept.
    75 #ifdef DOXYGEN
    76     typedef GR::ArcMap<Value> FlowMap;
    77 #else
    7875    typedef typename Digraph::template ArcMap<Value> FlowMap;
    79 #endif
    8076
    8177    /// \brief Instantiates a FlowMap.
     
    9288    /// The elevator type used by the algorithm.
    9389    ///
    94     /// \sa Elevator, LinkedElevator
    95 #ifdef DOXYGEN
    96     typedef lemon::Elevator<GR, GR::Node> Elevator;
    97 #else
     90    /// \sa Elevator
     91    /// \sa LinkedElevator
    9892    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
    99 #endif
    10093
    10194    /// \brief Instantiates an Elevator.
     
    458451    }
    459452
    460     /// \brief Sets the tolerance used by the algorithm.
    461     ///
    462     /// Sets the tolerance object used by the algorithm.
    463     /// \return <tt>(*this)</tt>
    464     Circulation& tolerance(const Tolerance& tolerance) {
     453    /// \brief Sets the tolerance used by algorithm.
     454    ///
     455    /// Sets the tolerance used by algorithm.
     456    Circulation& tolerance(const Tolerance& tolerance) const {
    465457      _tol = tolerance;
    466458      return *this;
     
    469461    /// \brief Returns a const reference to the tolerance.
    470462    ///
    471     /// Returns a const reference to the tolerance object used by
    472     /// the algorithm.
     463    /// Returns a const reference to the tolerance.
    473464    const Tolerance& tolerance() const {
    474       return _tol;
     465      return tolerance;
    475466    }
    476467
    477468    /// \name Execution Control
    478469    /// The simplest way to execute the algorithm is to call \ref run().\n
    479     /// If you need better control on the initial solution or the execution,
    480     /// you have to call one of the \ref init() functions first, then
     470    /// If you need more control on the initial solution or the execution,
     471    /// first you have to call one of the \ref init() functions, then
    481472    /// the \ref start() function.
    482473
  • lemon/clp.cc

    r793 r623  
    7979  }
    8080
    81   int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
    82     std::vector<int> indexes;
    83     std::vector<Value> values;
    84 
    85     for(ExprIterator it = b; it != e; ++it) {
    86       indexes.push_back(it->first);
    87       values.push_back(it->second);
    88     }
    89 
    90     _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
    91     return _prob->numberRows() - 1;
    92   }
    93 
    9481
    9582  void ClpLp::_eraseCol(int c) {
  • lemon/clp.h

    r793 r623  
    7676    virtual int _addCol();
    7777    virtual int _addRow();
    78     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    7978
    8079    virtual void _eraseCol(int i);
  • lemon/concepts/digraph.h

    r781 r627  
    3636    /// \brief Class describing the concept of directed graphs.
    3737    ///
    38     /// This class describes the common interface of all directed
    39     /// graphs (digraphs).
     38    /// This class describes the \ref concept "concept" of the
     39    /// immutable directed digraphs.
    4040    ///
    41     /// Like all concept classes, it only provides an interface
    42     /// without any sensible implementation. So any general algorithm for
    43     /// directed graphs should compile with this class, but it will not
    44     /// run properly, of course.
    45     /// An actual digraph implementation like \ref ListDigraph or
    46     /// \ref SmartDigraph may have additional functionality.
     41    /// Note that actual digraph implementation like @ref ListDigraph or
     42    /// @ref SmartDigraph may have several additional functionality.
    4743    ///
    48     /// \sa Graph
     44    /// \sa concept
    4945    class Digraph {
    5046    private:
    51       /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
    52       Digraph(const Digraph &) {}
    53       /// \brief Assignment of a digraph to another one is \e not allowed.
    54       /// Use DigraphCopy instead.
     47      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
     48
     49      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
     50      ///
     51      Digraph(const Digraph &) {};
     52      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
     53      ///\e not allowed. Use DigraphCopy() instead.
     54
     55      ///Assignment of \ref Digraph "Digraph"s to another ones are
     56      ///\e not allowed.  Use DigraphCopy() instead.
     57
    5558      void operator=(const Digraph &) {}
    56 
    5759    public:
    58       /// Default constructor.
     60      ///\e
     61
     62      /// Defalult constructor.
     63
     64      /// Defalult constructor.
     65      ///
    5966      Digraph() { }
    60 
    61       /// The node type of the digraph
     67      /// Class for identifying a node of the digraph
    6268
    6369      /// This class identifies a node of the digraph. It also serves
    6470      /// as a base class of the node iterators,
    65       /// thus they convert to this type.
     71      /// thus they will convert to this type.
    6672      class Node {
    6773      public:
    6874        /// Default constructor
    6975
    70         /// Default constructor.
    71         /// \warning It sets the object to an undefined value.
     76        /// @warning The default constructor sets the iterator
     77        /// to an undefined value.
    7278        Node() { }
    7379        /// Copy constructor.
     
    7783        Node(const Node&) { }
    7884
    79         /// %Invalid constructor \& conversion.
    80 
    81         /// Initializes the object to be invalid.
     85        /// Invalid constructor \& conversion.
     86
     87        /// This constructor initializes the iterator to be invalid.
    8288        /// \sa Invalid for more details.
    8389        Node(Invalid) { }
    8490        /// Equality operator
    8591
    86         /// Equality operator.
    87         ///
    8892        /// Two iterators are equal if and only if they point to the
    89         /// same object or both are \c INVALID.
     93        /// same object or both are invalid.
    9094        bool operator==(Node) const { return true; }
    9195
    9296        /// Inequality operator
    9397
    94         /// Inequality operator.
     98        /// \sa operator==(Node n)
     99        ///
    95100        bool operator!=(Node) const { return true; }
    96101
    97102        /// Artificial ordering operator.
    98103
    99         /// Artificial ordering operator.
    100         ///
    101         /// \note This operator only has to define some strict ordering of
    102         /// the nodes; this order has nothing to do with the iteration
    103         /// ordering of the nodes.
     104        /// To allow the use of digraph descriptors as key type in std::map or
     105        /// similar associative container we require this.
     106        ///
     107        /// \note This operator only have to define some strict ordering of
     108        /// the items; this order has nothing to do with the iteration
     109        /// ordering of the items.
    104110        bool operator<(Node) const { return false; }
    105       };
    106 
    107       /// Iterator class for the nodes.
    108 
    109       /// This iterator goes through each node of the digraph.
     111
     112      };
     113
     114      /// This iterator goes through each node.
     115
     116      /// This iterator goes through each node.
    110117      /// Its usage is quite simple, for example you can count the number
    111       /// of nodes in a digraph \c g of type \c %Digraph like this:
     118      /// of nodes in digraph \c g of type \c Digraph like this:
    112119      ///\code
    113120      /// int count=0;
     
    118125        /// Default constructor
    119126
    120         /// Default constructor.
    121         /// \warning It sets the iterator to an undefined value.
     127        /// @warning The default constructor sets the iterator
     128        /// to an undefined value.
    122129        NodeIt() { }
    123130        /// Copy constructor.
     
    126133        ///
    127134        NodeIt(const NodeIt& n) : Node(n) { }
    128         /// %Invalid constructor \& conversion.
    129 
    130         /// Initializes the iterator to be invalid.
     135        /// Invalid constructor \& conversion.
     136
     137        /// Initialize the iterator to be invalid.
    131138        /// \sa Invalid for more details.
    132139        NodeIt(Invalid) { }
    133140        /// Sets the iterator to the first node.
    134141
    135         /// Sets the iterator to the first node of the given digraph.
    136         ///
    137         explicit NodeIt(const Digraph&) { }
    138         /// Sets the iterator to the given node.
    139 
    140         /// Sets the iterator to the given node of the given digraph.
    141         ///
     142        /// Sets the iterator to the first node of \c g.
     143        ///
     144        NodeIt(const Digraph&) { }
     145        /// Node -> NodeIt conversion.
     146
     147        /// Sets the iterator to the node of \c the digraph pointed by
     148        /// the trivial iterator.
     149        /// This feature necessitates that each time we
     150        /// iterate the arc-set, the iteration order is the same.
    142151        NodeIt(const Digraph&, const Node&) { }
    143152        /// Next node.
     
    149158
    150159
    151       /// The arc type of the digraph
     160      /// Class for identifying an arc of the digraph
    152161
    153162      /// This class identifies an arc of the digraph. It also serves
     
    158167        /// Default constructor
    159168
    160         /// Default constructor.
    161         /// \warning It sets the object to an undefined value.
     169        /// @warning The default constructor sets the iterator
     170        /// to an undefined value.
    162171        Arc() { }
    163172        /// Copy constructor.
     
    166175        ///
    167176        Arc(const Arc&) { }
    168         /// %Invalid constructor \& conversion.
    169 
    170         /// Initializes the object to be invalid.
    171         /// \sa Invalid for more details.
     177        /// Initialize the iterator to be invalid.
     178
     179        /// Initialize the iterator to be invalid.
     180        ///
    172181        Arc(Invalid) { }
    173182        /// Equality operator
    174183
    175         /// Equality operator.
    176         ///
    177184        /// Two iterators are equal if and only if they point to the
    178         /// same object or both are \c INVALID.
     185        /// same object or both are invalid.
    179186        bool operator==(Arc) const { return true; }
    180187        /// Inequality operator
    181188
    182         /// Inequality operator.
     189        /// \sa operator==(Arc n)
     190        ///
    183191        bool operator!=(Arc) const { return true; }
    184192
    185193        /// Artificial ordering operator.
    186194
    187         /// Artificial ordering operator.
    188         ///
    189         /// \note This operator only has to define some strict ordering of
    190         /// the arcs; this order has nothing to do with the iteration
    191         /// ordering of the arcs.
     195        /// To allow the use of digraph descriptors as key type in std::map or
     196        /// similar associative container we require this.
     197        ///
     198        /// \note This operator only have to define some strict ordering of
     199        /// the items; this order has nothing to do with the iteration
     200        /// ordering of the items.
    192201        bool operator<(Arc) const { return false; }
    193202      };
    194203
    195       /// Iterator class for the outgoing arcs of a node.
     204      /// This iterator goes trough the outgoing arcs of a node.
    196205
    197206      /// This iterator goes trough the \e outgoing arcs of a certain node
     
    199208      /// Its usage is quite simple, for example you can count the number
    200209      /// of outgoing arcs of a node \c n
    201       /// in a digraph \c g of type \c %Digraph as follows.
     210      /// in digraph \c g of type \c Digraph as follows.
    202211      ///\code
    203212      /// int count=0;
    204       /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
     213      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
    205214      ///\endcode
     215
    206216      class OutArcIt : public Arc {
    207217      public:
    208218        /// Default constructor
    209219
    210         /// Default constructor.
    211         /// \warning It sets the iterator to an undefined value.
     220        /// @warning The default constructor sets the iterator
     221        /// to an undefined value.
    212222        OutArcIt() { }
    213223        /// Copy constructor.
     
    216226        ///
    217227        OutArcIt(const OutArcIt& e) : Arc(e) { }
    218         /// %Invalid constructor \& conversion.
    219 
    220         /// Initializes the iterator to be invalid.
    221         /// \sa Invalid for more details.
     228        /// Initialize the iterator to be invalid.
     229
     230        /// Initialize the iterator to be invalid.
     231        ///
    222232        OutArcIt(Invalid) { }
    223         /// Sets the iterator to the first outgoing arc.
    224 
    225         /// Sets the iterator to the first outgoing arc of the given node.
    226         ///
     233        /// This constructor sets the iterator to the first outgoing arc.
     234
     235        /// This constructor sets the iterator to the first outgoing arc of
     236        /// the node.
    227237        OutArcIt(const Digraph&, const Node&) { }
    228         /// Sets the iterator to the given arc.
    229 
    230         /// Sets the iterator to the given arc of the given digraph.
    231         ///
     238        /// Arc -> OutArcIt conversion
     239
     240        /// Sets the iterator to the value of the trivial iterator.
     241        /// This feature necessitates that each time we
     242        /// iterate the arc-set, the iteration order is the same.
    232243        OutArcIt(const Digraph&, const Arc&) { }
    233         /// Next outgoing arc
     244        ///Next outgoing arc
    234245
    235246        /// Assign the iterator to the next
     
    238249      };
    239250
    240       /// Iterator class for the incoming arcs of a node.
     251      /// This iterator goes trough the incoming arcs of a node.
    241252
    242253      /// This iterator goes trough the \e incoming arcs of a certain node
    243254      /// of a digraph.
    244255      /// Its usage is quite simple, for example you can count the number
    245       /// of incoming arcs of a node \c n
    246       /// in a digraph \c g of type \c %Digraph as follows.
     256      /// of outgoing arcs of a node \c n
     257      /// in digraph \c g of type \c Digraph as follows.
    247258      ///\code
    248259      /// int count=0;
    249       /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
     260      /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
    250261      ///\endcode
     262
    251263      class InArcIt : public Arc {
    252264      public:
    253265        /// Default constructor
    254266
    255         /// Default constructor.
    256         /// \warning It sets the iterator to an undefined value.
     267        /// @warning The default constructor sets the iterator
     268        /// to an undefined value.
    257269        InArcIt() { }
    258270        /// Copy constructor.
     
    261273        ///
    262274        InArcIt(const InArcIt& e) : Arc(e) { }
    263         /// %Invalid constructor \& conversion.
    264 
    265         /// Initializes the iterator to be invalid.
    266         /// \sa Invalid for more details.
     275        /// Initialize the iterator to be invalid.
     276
     277        /// Initialize the iterator to be invalid.
     278        ///
    267279        InArcIt(Invalid) { }
    268         /// Sets the iterator to the first incoming arc.
    269 
    270         /// Sets the iterator to the first incoming arc of the given node.
    271         ///
     280        /// This constructor sets the iterator to first incoming arc.
     281
     282        /// This constructor set the iterator to the first incoming arc of
     283        /// the node.
    272284        InArcIt(const Digraph&, const Node&) { }
    273         /// Sets the iterator to the given arc.
    274 
    275         /// Sets the iterator to the given arc of the given digraph.
    276         ///
     285        /// Arc -> InArcIt conversion
     286
     287        /// Sets the iterator to the value of the trivial iterator \c e.
     288        /// This feature necessitates that each time we
     289        /// iterate the arc-set, the iteration order is the same.
    277290        InArcIt(const Digraph&, const Arc&) { }
    278291        /// Next incoming arc
    279292
    280         /// Assign the iterator to the next
    281         /// incoming arc of the corresponding node.
     293        /// Assign the iterator to the next inarc of the corresponding node.
     294        ///
    282295        InArcIt& operator++() { return *this; }
    283296      };
    284 
    285       /// Iterator class for the arcs.
    286 
    287       /// This iterator goes through each arc of the digraph.
     297      /// This iterator goes through each arc.
     298
     299      /// This iterator goes through each arc of a digraph.
    288300      /// Its usage is quite simple, for example you can count the number
    289       /// of arcs in a digraph \c g of type \c %Digraph as follows:
     301      /// of arcs in a digraph \c g of type \c Digraph as follows:
    290302      ///\code
    291303      /// int count=0;
    292       /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
     304      /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
    293305      ///\endcode
    294306      class ArcIt : public Arc {
     
    296308        /// Default constructor
    297309
    298         /// Default constructor.
    299         /// \warning It sets the iterator to an undefined value.
     310        /// @warning The default constructor sets the iterator
     311        /// to an undefined value.
    300312        ArcIt() { }
    301313        /// Copy constructor.
     
    304316        ///
    305317        ArcIt(const ArcIt& e) : Arc(e) { }
    306         /// %Invalid constructor \& conversion.
    307 
    308         /// Initializes the iterator to be invalid.
    309         /// \sa Invalid for more details.
     318        /// Initialize the iterator to be invalid.
     319
     320        /// Initialize the iterator to be invalid.
     321        ///
    310322        ArcIt(Invalid) { }
    311         /// Sets the iterator to the first arc.
    312 
    313         /// Sets the iterator to the first arc of the given digraph.
    314         ///
    315         explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
    316         /// Sets the iterator to the given arc.
    317 
    318         /// Sets the iterator to the given arc of the given digraph.
    319         ///
     323        /// This constructor sets the iterator to the first arc.
     324
     325        /// This constructor sets the iterator to the first arc of \c g.
     326        ///@param g the digraph
     327        ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
     328        /// Arc -> ArcIt conversion
     329
     330        /// Sets the iterator to the value of the trivial iterator \c e.
     331        /// This feature necessitates that each time we
     332        /// iterate the arc-set, the iteration order is the same.
    320333        ArcIt(const Digraph&, const Arc&) { }
    321         /// Next arc
     334        ///Next arc
    322335
    323336        /// Assign the iterator to the next arc.
    324         ///
    325337        ArcIt& operator++() { return *this; }
    326338      };
    327 
    328       /// \brief The source node of the arc.
    329       ///
    330       /// Returns the source node of the given arc.
     339      ///Gives back the target node of an arc.
     340
     341      ///Gives back the target node of an arc.
     342      ///
     343      Node target(Arc) const { return INVALID; }
     344      ///Gives back the source node of an arc.
     345
     346      ///Gives back the source node of an arc.
     347      ///
    331348      Node source(Arc) const { return INVALID; }
    332349
    333       /// \brief The target node of the arc.
    334       ///
    335       /// Returns the target node of the given arc.
    336       Node target(Arc) const { return INVALID; }
    337 
    338       /// \brief The ID of the node.
    339       ///
    340       /// Returns the ID of the given node.
     350      /// \brief Returns the ID of the node.
    341351      int id(Node) const { return -1; }
    342352
    343       /// \brief The ID of the arc.
    344       ///
    345       /// Returns the ID of the given arc.
     353      /// \brief Returns the ID of the arc.
    346354      int id(Arc) const { return -1; }
    347355
    348       /// \brief The node with the given ID.
    349       ///
    350       /// Returns the node with the given ID.
    351       /// \pre The argument should be a valid node ID in the digraph.
     356      /// \brief Returns the node with the given ID.
     357      ///
     358      /// \pre The argument should be a valid node ID in the graph.
    352359      Node nodeFromId(int) const { return INVALID; }
    353360
    354       /// \brief The arc with the given ID.
    355       ///
    356       /// Returns the arc with the given ID.
    357       /// \pre The argument should be a valid arc ID in the digraph.
     361      /// \brief Returns the arc with the given ID.
     362      ///
     363      /// \pre The argument should be a valid arc ID in the graph.
    358364      Arc arcFromId(int) const { return INVALID; }
    359365
    360       /// \brief An upper bound on the node IDs.
    361       ///
    362       /// Returns an upper bound on the node IDs.
     366      /// \brief Returns an upper bound on the node IDs.
    363367      int maxNodeId() const { return -1; }
    364368
    365       /// \brief An upper bound on the arc IDs.
    366       ///
    367       /// Returns an upper bound on the arc IDs.
     369      /// \brief Returns an upper bound on the arc IDs.
    368370      int maxArcId() const { return -1; }
    369371
     
    391393      int maxId(Arc) const { return -1; }
    392394
    393       /// \brief The opposite node on the arc.
    394       ///
    395       /// Returns the opposite node on the given arc.
    396       Node oppositeNode(Node, Arc) const { return INVALID; }
    397 
    398395      /// \brief The base node of the iterator.
    399396      ///
    400       /// Returns the base node of the given outgoing arc iterator
    401       /// (i.e. the source node of the corresponding arc).
    402       Node baseNode(OutArcIt) const { return INVALID; }
     397      /// Gives back the base node of the iterator.
     398      /// It is always the target of the pointed arc.
     399      Node baseNode(const InArcIt&) const { return INVALID; }
    403400
    404401      /// \brief The running node of the iterator.
    405402      ///
    406       /// Returns the running node of the given outgoing arc iterator
    407       /// (i.e. the target node of the corresponding arc).
    408       Node runningNode(OutArcIt) const { return INVALID; }
     403      /// Gives back the running node of the iterator.
     404      /// It is always the source of the pointed arc.
     405      Node runningNode(const InArcIt&) const { return INVALID; }
    409406
    410407      /// \brief The base node of the iterator.
    411408      ///
    412       /// Returns the base node of the given incomming arc iterator
    413       /// (i.e. the target node of the corresponding arc).
    414       Node baseNode(InArcIt) const { return INVALID; }
     409      /// Gives back the base node of the iterator.
     410      /// It is always the source of the pointed arc.
     411      Node baseNode(const OutArcIt&) const { return INVALID; }
    415412
    416413      /// \brief The running node of the iterator.
    417414      ///
    418       /// Returns the running node of the given incomming arc iterator
    419       /// (i.e. the source node of the corresponding arc).
    420       Node runningNode(InArcIt) const { return INVALID; }
    421 
    422       /// \brief Standard graph map type for the nodes.
    423       ///
    424       /// Standard graph map type for the nodes.
    425       /// It conforms to the ReferenceMap concept.
     415      /// Gives back the running node of the iterator.
     416      /// It is always the target of the pointed arc.
     417      Node runningNode(const OutArcIt&) const { return INVALID; }
     418
     419      /// \brief The opposite node on the given arc.
     420      ///
     421      /// Gives back the opposite node on the given arc.
     422      Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
     423
     424      /// \brief Reference map of the nodes to type \c T.
     425      ///
     426      /// Reference map of the nodes to type \c T.
    426427      template<class T>
    427428      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
    428429      public:
    429430
    430         /// Constructor
    431         explicit NodeMap(const Digraph&) { }
    432         /// Constructor with given initial value
     431        ///\e
     432        NodeMap(const Digraph&) { }
     433        ///\e
    433434        NodeMap(const Digraph&, T) { }
    434435
     
    445446      };
    446447
    447       /// \brief Standard graph map type for the arcs.
    448       ///
    449       /// Standard graph map type for the arcs.
    450       /// It conforms to the ReferenceMap concept.
     448      /// \brief Reference map of the arcs to type \c T.
     449      ///
     450      /// Reference map of the arcs to type \c T.
    451451      template<class T>
    452452      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
    453453      public:
    454454
    455         /// Constructor
    456         explicit ArcMap(const Digraph&) { }
    457         /// Constructor with given initial value
     455        ///\e
     456        ArcMap(const Digraph&) { }
     457        ///\e
    458458        ArcMap(const Digraph&, T) { }
    459 
    460459      private:
    461460        ///Copy constructor
  • lemon/concepts/graph.h

    r781 r704  
    1919///\ingroup graph_concepts
    2020///\file
    21 ///\brief The concept of undirected graphs.
     21///\brief The concept of Undirected Graphs.
    2222
    2323#ifndef LEMON_CONCEPTS_GRAPH_H
     
    2525
    2626#include <lemon/concepts/graph_components.h>
    27 #include <lemon/concepts/maps.h>
    28 #include <lemon/concept_check.h>
    2927#include <lemon/core.h>
    3028
     
    3432    /// \ingroup graph_concepts
    3533    ///
    36     /// \brief Class describing the concept of undirected graphs.
     34    /// \brief Class describing the concept of Undirected Graphs.
    3735    ///
    38     /// This class describes the common interface of all undirected
    39     /// graphs.
     36    /// This class describes the common interface of all Undirected
     37    /// Graphs.
    4038    ///
    41     /// Like all concept classes, it only provides an interface
    42     /// without any sensible implementation. So any general algorithm for
    43     /// undirected graphs should compile with this class, but it will not
     39    /// As all concept describing classes it provides only interface
     40    /// without any sensible implementation. So any algorithm for
     41    /// undirected graph should compile with this class, but it will not
    4442    /// run properly, of course.
    45     /// An actual graph implementation like \ref ListGraph or
    46     /// \ref SmartGraph may have additional functionality.   
    4743    ///
    48     /// The undirected graphs also fulfill the concept of \ref Digraph
    49     /// "directed graphs", since each edge can also be regarded as two
    50     /// oppositely directed arcs.
    51     /// Undirected graphs provide an Edge type for the undirected edges and
    52     /// an Arc type for the directed arcs. The Arc type is convertible to
    53     /// Edge or inherited from it, i.e. the corresponding edge can be
    54     /// obtained from an arc.
    55     /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
    56     /// and ArcMap classes can be used for the arcs (just like in digraphs).
    57     /// Both InArcIt and OutArcIt iterates on the same edges but with
    58     /// opposite direction. IncEdgeIt also iterates on the same edges
    59     /// as OutArcIt and InArcIt, but it is not convertible to Arc,
    60     /// only to Edge.
     44    /// The LEMON undirected graphs also fulfill the concept of
     45    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
     46    /// Concept"). Each edges can be seen as two opposite
     47    /// directed arc and consequently the undirected graph can be
     48    /// seen as the direceted graph of these directed arcs. The
     49    /// Graph has the Edge inner class for the edges and
     50    /// the Arc type for the directed arcs. The Arc type is
     51    /// convertible to Edge or inherited from it so from a directed
     52    /// arc we can get the represented edge.
    6153    ///
    62     /// In LEMON, each undirected edge has an inherent orientation.
    63     /// Thus it can defined if an arc is forward or backward oriented in
    64     /// an undirected graph with respect to this default oriantation of
    65     /// the represented edge.
    66     /// With the direction() and direct() functions the direction
    67     /// of an arc can be obtained and set, respectively.
     54    /// In the sense of the LEMON each edge has a default
     55    /// direction (it should be in every computer implementation,
     56    /// because the order of edge's nodes defines an
     57    /// orientation). With the default orientation we can define that
     58    /// the directed arc is forward or backward directed. With the \c
     59    /// direction() and \c direct() function we can get the direction
     60    /// of the directed arc and we can direct an edge.
    6861    ///
    69     /// Only nodes and edges can be added to or removed from an undirected
    70     /// graph and the corresponding arcs are added or removed automatically.
    71     ///
    72     /// \sa Digraph
     62    /// The EdgeIt is an iterator for the edges. We can use
     63    /// the EdgeMap to map values for the edges. The InArcIt and
     64    /// OutArcIt iterates on the same edges but with opposite
     65    /// direction. The IncEdgeIt iterates also on the same edges
     66    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
     67    /// to Edge.
    7368    class Graph {
    74     private:
    75       /// Graphs are \e not copy constructible. Use DigraphCopy instead.
    76       Graph(const Graph&) {}
    77       /// \brief Assignment of a graph to another one is \e not allowed.
    78       /// Use DigraphCopy instead.
    79       void operator=(const Graph&) {}
    80 
    8169    public:
    82       /// Default constructor.
    83       Graph() {}
    84 
    85       /// \brief Undirected graphs should be tagged with \c UndirectedTag.
    86       ///
    87       /// Undirected graphs should be tagged with \c UndirectedTag.
    88       ///
    89       /// This tag helps the \c enable_if technics to make compile time
     70      /// \brief The undirected graph should be tagged by the
     71      /// UndirectedTag.
     72      ///
     73      /// The undirected graph should be tagged by the UndirectedTag. This
     74      /// tag helps the enable_if technics to make compile time
    9075      /// specializations for undirected graphs.
    9176      typedef True UndirectedTag;
    9277
    93       /// The node type of the graph
    94 
    95       /// This class identifies a node of the graph. It also serves
    96       /// as a base class of the node iterators,
    97       /// thus they convert to this type.
     78      /// \brief The base type of node iterators,
     79      /// or in other words, the trivial node iterator.
     80      ///
     81      /// This is the base type of each node iterator,
     82      /// thus each kind of node iterator converts to this.
     83      /// More precisely each kind of node iterator should be inherited
     84      /// from the trivial node iterator.
    9885      class Node {
    9986      public:
    10087        /// Default constructor
    10188
    102         /// Default constructor.
    103         /// \warning It sets the object to an undefined value.
     89        /// @warning The default constructor sets the iterator
     90        /// to an undefined value.
    10491        Node() { }
    10592        /// Copy constructor.
     
    10996        Node(const Node&) { }
    11097
    111         /// %Invalid constructor \& conversion.
    112 
    113         /// Initializes the object to be invalid.
     98        /// Invalid constructor \& conversion.
     99
     100        /// This constructor initializes the iterator to be invalid.
    114101        /// \sa Invalid for more details.
    115102        Node(Invalid) { }
    116103        /// Equality operator
    117104
    118         /// Equality operator.
    119         ///
    120105        /// Two iterators are equal if and only if they point to the
    121         /// same object or both are \c INVALID.
     106        /// same object or both are invalid.
    122107        bool operator==(Node) const { return true; }
    123108
    124109        /// Inequality operator
    125110
    126         /// Inequality operator.
     111        /// \sa operator==(Node n)
     112        ///
    127113        bool operator!=(Node) const { return true; }
    128114
    129115        /// Artificial ordering operator.
    130116
    131         /// Artificial ordering operator.
    132         ///
    133         /// \note This operator only has to define some strict ordering of
     117        /// To allow the use of graph descriptors as key type in std::map or
     118        /// similar associative container we require this.
     119        ///
     120        /// \note This operator only have to define some strict ordering of
    134121        /// the items; this order has nothing to do with the iteration
    135122        /// ordering of the items.
     
    138125      };
    139126
    140       /// Iterator class for the nodes.
    141 
    142       /// This iterator goes through each node of the graph.
     127      /// This iterator goes through each node.
     128
     129      /// This iterator goes through each node.
    143130      /// Its usage is quite simple, for example you can count the number
    144       /// of nodes in a graph \c g of type \c %Graph like this:
     131      /// of nodes in graph \c g of type \c Graph like this:
    145132      ///\code
    146133      /// int count=0;
     
    151138        /// Default constructor
    152139
    153         /// Default constructor.
    154         /// \warning It sets the iterator to an undefined value.
     140        /// @warning The default constructor sets the iterator
     141        /// to an undefined value.
    155142        NodeIt() { }
    156143        /// Copy constructor.
     
    159146        ///
    160147        NodeIt(const NodeIt& n) : Node(n) { }
    161         /// %Invalid constructor \& conversion.
    162 
    163         /// Initializes the iterator to be invalid.
     148        /// Invalid constructor \& conversion.
     149
     150        /// Initialize the iterator to be invalid.
    164151        /// \sa Invalid for more details.
    165152        NodeIt(Invalid) { }
    166153        /// Sets the iterator to the first node.
    167154
    168         /// Sets the iterator to the first node of the given digraph.
    169         ///
    170         explicit NodeIt(const Graph&) { }
    171         /// Sets the iterator to the given node.
    172 
    173         /// Sets the iterator to the given node of the given digraph.
    174         ///
     155        /// Sets the iterator to the first node of \c g.
     156        ///
     157        NodeIt(const Graph&) { }
     158        /// Node -> NodeIt conversion.
     159
     160        /// Sets the iterator to the node of \c the graph pointed by
     161        /// the trivial iterator.
     162        /// This feature necessitates that each time we
     163        /// iterate the arc-set, the iteration order is the same.
    175164        NodeIt(const Graph&, const Node&) { }
    176165        /// Next node.
     
    182171
    183172
    184       /// The edge type of the graph
    185 
    186       /// This class identifies an edge of the graph. It also serves
    187       /// as a base class of the edge iterators,
    188       /// thus they will convert to this type.
     173      /// The base type of the edge iterators.
     174
     175      /// The base type of the edge iterators.
     176      ///
    189177      class Edge {
    190178      public:
    191179        /// Default constructor
    192180
    193         /// Default constructor.
    194         /// \warning It sets the object to an undefined value.
     181        /// @warning The default constructor sets the iterator
     182        /// to an undefined value.
    195183        Edge() { }
    196184        /// Copy constructor.
     
    199187        ///
    200188        Edge(const Edge&) { }
    201         /// %Invalid constructor \& conversion.
    202 
    203         /// Initializes the object to be invalid.
    204         /// \sa Invalid for more details.
     189        /// Initialize the iterator to be invalid.
     190
     191        /// Initialize the iterator to be invalid.
     192        ///
    205193        Edge(Invalid) { }
    206194        /// Equality operator
    207195
    208         /// Equality operator.
    209         ///
    210196        /// Two iterators are equal if and only if they point to the
    211         /// same object or both are \c INVALID.
     197        /// same object or both are invalid.
    212198        bool operator==(Edge) const { return true; }
    213199        /// Inequality operator
    214200
    215         /// Inequality operator.
     201        /// \sa operator==(Edge n)
     202        ///
    216203        bool operator!=(Edge) const { return true; }
    217204
    218205        /// Artificial ordering operator.
    219206
    220         /// Artificial ordering operator.
    221         ///
    222         /// \note This operator only has to define some strict ordering of
    223         /// the edges; this order has nothing to do with the iteration
    224         /// ordering of the edges.
     207        /// To allow the use of graph descriptors as key type in std::map or
     208        /// similar associative container we require this.
     209        ///
     210        /// \note This operator only have to define some strict ordering of
     211        /// the items; this order has nothing to do with the iteration
     212        /// ordering of the items.
    225213        bool operator<(Edge) const { return false; }
    226214      };
    227215
    228       /// Iterator class for the edges.
    229 
    230       /// This iterator goes through each edge of the graph.
     216      /// This iterator goes through each edge.
     217
     218      /// This iterator goes through each edge of a graph.
    231219      /// Its usage is quite simple, for example you can count the number
    232       /// of edges in a graph \c g of type \c %Graph as follows:
     220      /// of edges in a graph \c g of type \c Graph as follows:
    233221      ///\code
    234222      /// int count=0;
     
    239227        /// Default constructor
    240228
    241         /// Default constructor.
    242         /// \warning It sets the iterator to an undefined value.
     229        /// @warning The default constructor sets the iterator
     230        /// to an undefined value.
    243231        EdgeIt() { }
    244232        /// Copy constructor.
     
    247235        ///
    248236        EdgeIt(const EdgeIt& e) : Edge(e) { }
    249         /// %Invalid constructor \& conversion.
    250 
    251         /// Initializes the iterator to be invalid.
    252         /// \sa Invalid for more details.
     237        /// Initialize the iterator to be invalid.
     238
     239        /// Initialize the iterator to be invalid.
     240        ///
    253241        EdgeIt(Invalid) { }
    254         /// Sets the iterator to the first edge.
    255 
    256         /// Sets the iterator to the first edge of the given graph.
    257         ///
    258         explicit EdgeIt(const Graph&) { }
    259         /// Sets the iterator to the given edge.
    260 
    261         /// Sets the iterator to the given edge of the given graph.
    262         ///
     242        /// This constructor sets the iterator to the first edge.
     243
     244        /// This constructor sets the iterator to the first edge.
     245        EdgeIt(const Graph&) { }
     246        /// Edge -> EdgeIt conversion
     247
     248        /// Sets the iterator to the value of the trivial iterator.
     249        /// This feature necessitates that each time we
     250        /// iterate the edge-set, the iteration order is the
     251        /// same.
    263252        EdgeIt(const Graph&, const Edge&) { }
    264253        /// Next edge
    265254
    266255        /// Assign the iterator to the next edge.
    267         ///
    268256        EdgeIt& operator++() { return *this; }
    269257      };
    270258
    271       /// Iterator class for the incident edges of a node.
    272 
    273       /// This iterator goes trough the incident undirected edges
    274       /// of a certain node of a graph.
     259      /// \brief This iterator goes trough the incident undirected
     260      /// arcs of a node.
     261      ///
     262      /// This iterator goes trough the incident edges
     263      /// of a certain node of a graph. You should assume that the
     264      /// loop arcs will be iterated twice.
     265      ///
    275266      /// Its usage is quite simple, for example you can compute the
    276       /// degree (i.e. the number of incident edges) of a node \c n
    277       /// in a graph \c g of type \c %Graph as follows.
     267      /// degree (i.e. count the number of incident arcs of a node \c n
     268      /// in graph \c g of type \c Graph as follows.
    278269      ///
    279270      ///\code
     
    281272      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
    282273      ///\endcode
    283       ///
    284       /// \warning Loop edges will be iterated twice.
    285274      class IncEdgeIt : public Edge {
    286275      public:
    287276        /// Default constructor
    288277
    289         /// Default constructor.
    290         /// \warning It sets the iterator to an undefined value.
     278        /// @warning The default constructor sets the iterator
     279        /// to an undefined value.
    291280        IncEdgeIt() { }
    292281        /// Copy constructor.
     
    295284        ///
    296285        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
    297         /// %Invalid constructor \& conversion.
    298 
    299         /// Initializes the iterator to be invalid.
    300         /// \sa Invalid for more details.
     286        /// Initialize the iterator to be invalid.
     287
     288        /// Initialize the iterator to be invalid.
     289        ///
    301290        IncEdgeIt(Invalid) { }
    302         /// Sets the iterator to the first incident edge.
    303 
    304         /// Sets the iterator to the first incident edge of the given node.
    305         ///
     291        /// This constructor sets the iterator to first incident arc.
     292
     293        /// This constructor set the iterator to the first incident arc of
     294        /// the node.
    306295        IncEdgeIt(const Graph&, const Node&) { }
    307         /// Sets the iterator to the given edge.
    308 
    309         /// Sets the iterator to the given edge of the given graph.
    310         ///
     296        /// Edge -> IncEdgeIt conversion
     297
     298        /// Sets the iterator to the value of the trivial iterator \c e.
     299        /// This feature necessitates that each time we
     300        /// iterate the arc-set, the iteration order is the same.
    311301        IncEdgeIt(const Graph&, const Edge&) { }
    312         /// Next incident edge
    313 
    314         /// Assign the iterator to the next incident edge
     302        /// Next incident arc
     303
     304        /// Assign the iterator to the next incident arc
    315305        /// of the corresponding node.
    316306        IncEdgeIt& operator++() { return *this; }
    317307      };
    318308
    319       /// The arc type of the graph
    320 
    321       /// This class identifies a directed arc of the graph. It also serves
    322       /// as a base class of the arc iterators,
    323       /// thus they will convert to this type.
     309      /// The directed arc type.
     310
     311      /// The directed arc type. It can be converted to the
     312      /// edge or it should be inherited from the undirected
     313      /// edge.
    324314      class Arc {
    325315      public:
    326316        /// Default constructor
    327317
    328         /// Default constructor.
    329         /// \warning It sets the object to an undefined value.
     318        /// @warning The default constructor sets the iterator
     319        /// to an undefined value.
    330320        Arc() { }
    331321        /// Copy constructor.
     
    334324        ///
    335325        Arc(const Arc&) { }
    336         /// %Invalid constructor \& conversion.
    337 
    338         /// Initializes the object to be invalid.
    339         /// \sa Invalid for more details.
     326        /// Initialize the iterator to be invalid.
     327
     328        /// Initialize the iterator to be invalid.
     329        ///
    340330        Arc(Invalid) { }
    341331        /// Equality operator
    342332
    343         /// Equality operator.
    344         ///
    345333        /// Two iterators are equal if and only if they point to the
    346         /// same object or both are \c INVALID.
     334        /// same object or both are invalid.
    347335        bool operator==(Arc) const { return true; }
    348336        /// Inequality operator
    349337
    350         /// Inequality operator.
     338        /// \sa operator==(Arc n)
     339        ///
    351340        bool operator!=(Arc) const { return true; }
    352341
    353342        /// Artificial ordering operator.
    354343
    355         /// Artificial ordering operator.
    356         ///
    357         /// \note This operator only has to define some strict ordering of
    358         /// the arcs; this order has nothing to do with the iteration
    359         /// ordering of the arcs.
     344        /// To allow the use of graph descriptors as key type in std::map or
     345        /// similar associative container we require this.
     346        ///
     347        /// \note This operator only have to define some strict ordering of
     348        /// the items; this order has nothing to do with the iteration
     349        /// ordering of the items.
    360350        bool operator<(Arc) const { return false; }
    361351
    362         /// Converison to \c Edge
    363        
    364         /// Converison to \c Edge.
    365         ///
     352        /// Converison to Edge
    366353        operator Edge() const { return Edge(); }
    367354      };
    368 
    369       /// Iterator class for the arcs.
    370 
    371       /// This iterator goes through each directed arc of the graph.
     355      /// This iterator goes through each directed arc.
     356
     357      /// This iterator goes through each arc of a graph.
    372358      /// Its usage is quite simple, for example you can count the number
    373       /// of arcs in a graph \c g of type \c %Graph as follows:
     359      /// of arcs in a graph \c g of type \c Graph as follows:
    374360      ///\code
    375361      /// int count=0;
    376       /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
     362      /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;
    377363      ///\endcode
    378364      class ArcIt : public Arc {
     
    380366        /// Default constructor
    381367
    382         /// Default constructor.
    383         /// \warning It sets the iterator to an undefined value.
     368        /// @warning The default constructor sets the iterator
     369        /// to an undefined value.
    384370        ArcIt() { }
    385371        /// Copy constructor.
     
    388374        ///
    389375        ArcIt(const ArcIt& e) : Arc(e) { }
    390         /// %Invalid constructor \& conversion.
    391 
    392         /// Initializes the iterator to be invalid.
    393         /// \sa Invalid for more details.
     376        /// Initialize the iterator to be invalid.
     377
     378        /// Initialize the iterator to be invalid.
     379        ///
    394380        ArcIt(Invalid) { }
    395         /// Sets the iterator to the first arc.
    396 
    397         /// Sets the iterator to the first arc of the given graph.
    398         ///
    399         explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
    400         /// Sets the iterator to the given arc.
    401 
    402         /// Sets the iterator to the given arc of the given graph.
    403         ///
     381        /// This constructor sets the iterator to the first arc.
     382
     383        /// This constructor sets the iterator to the first arc of \c g.
     384        ///@param g the graph
     385        ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
     386        /// Arc -> ArcIt conversion
     387
     388        /// Sets the iterator to the value of the trivial iterator \c e.
     389        /// This feature necessitates that each time we
     390        /// iterate the arc-set, the iteration order is the same.
    404391        ArcIt(const Graph&, const Arc&) { }
    405         /// Next arc
     392        ///Next arc
    406393
    407394        /// Assign the iterator to the next arc.
    408         ///
    409395        ArcIt& operator++() { return *this; }
    410396      };
    411397
    412       /// Iterator class for the outgoing arcs of a node.
    413 
    414       /// This iterator goes trough the \e outgoing directed arcs of a
    415       /// certain node of a graph.
     398      /// This iterator goes trough the outgoing directed arcs of a node.
     399
     400      /// This iterator goes trough the \e outgoing arcs of a certain node
     401      /// of a graph.
    416402      /// Its usage is quite simple, for example you can count the number
    417403      /// of outgoing arcs of a node \c n
    418       /// in a graph \c g of type \c %Graph as follows.
     404      /// in graph \c g of type \c Graph as follows.
    419405      ///\code
    420406      /// int count=0;
    421       /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
     407      /// for (Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
    422408      ///\endcode
     409
    423410      class OutArcIt : public Arc {
    424411      public:
    425412        /// Default constructor
    426413
    427         /// Default constructor.
    428         /// \warning It sets the iterator to an undefined value.
     414        /// @warning The default constructor sets the iterator
     415        /// to an undefined value.
    429416        OutArcIt() { }
    430417        /// Copy constructor.
     
    433420        ///
    434421        OutArcIt(const OutArcIt& e) : Arc(e) { }
    435         /// %Invalid constructor \& conversion.
    436 
    437         /// Initializes the iterator to be invalid.
    438         /// \sa Invalid for more details.
     422        /// Initialize the iterator to be invalid.
     423
     424        /// Initialize the iterator to be invalid.
     425        ///
    439426        OutArcIt(Invalid) { }
    440         /// Sets the iterator to the first outgoing arc.
    441 
    442         /// Sets the iterator to the first outgoing arc of the given node.
    443         ///
     427        /// This constructor sets the iterator to the first outgoing arc.
     428
     429        /// This constructor sets the iterator to the first outgoing arc of
     430        /// the node.
     431        ///@param n the node
     432        ///@param g the graph
    444433        OutArcIt(const Graph& n, const Node& g) {
    445434          ignore_unused_variable_warning(n);
    446435          ignore_unused_variable_warning(g);
    447436        }
    448         /// Sets the iterator to the given arc.
    449 
    450         /// Sets the iterator to the given arc of the given graph.
    451         ///
     437        /// Arc -> OutArcIt conversion
     438
     439        /// Sets the iterator to the value of the trivial iterator.
     440        /// This feature necessitates that each time we
     441        /// iterate the arc-set, the iteration order is the same.
    452442        OutArcIt(const Graph&, const Arc&) { }
    453         /// Next outgoing arc
     443        ///Next outgoing arc
    454444
    455445        /// Assign the iterator to the next
     
    458448      };
    459449
    460       /// Iterator class for the incoming arcs of a node.
    461 
    462       /// This iterator goes trough the \e incoming directed arcs of a
    463       /// certain node of a graph.
     450      /// This iterator goes trough the incoming directed arcs of a node.
     451
     452      /// This iterator goes trough the \e incoming arcs of a certain node
     453      /// of a graph.
    464454      /// Its usage is quite simple, for example you can count the number
    465       /// of incoming arcs of a node \c n
    466       /// in a graph \c g of type \c %Graph as follows.
     455      /// of outgoing arcs of a node \c n
     456      /// in graph \c g of type \c Graph as follows.
    467457      ///\code
    468458      /// int count=0;
    469       /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
     459      /// for(Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
    470460      ///\endcode
     461
    471462      class InArcIt : public Arc {
    472463      public:
    473464        /// Default constructor
    474465
    475         /// Default constructor.
    476         /// \warning It sets the iterator to an undefined value.
     466        /// @warning The default constructor sets the iterator
     467        /// to an undefined value.
    477468        InArcIt() { }
    478469        /// Copy constructor.
     
    481472        ///
    482473        InArcIt(const InArcIt& e) : Arc(e) { }
    483         /// %Invalid constructor \& conversion.
    484 
    485         /// Initializes the iterator to be invalid.
    486         /// \sa Invalid for more details.
     474        /// Initialize the iterator to be invalid.
     475
     476        /// Initialize the iterator to be invalid.
     477        ///
    487478        InArcIt(Invalid) { }
    488         /// Sets the iterator to the first incoming arc.
    489 
    490         /// Sets the iterator to the first incoming arc of the given node.
    491         ///
     479        /// This constructor sets the iterator to first incoming arc.
     480
     481        /// This constructor set the iterator to the first incoming arc of
     482        /// the node.
     483        ///@param n the node
     484        ///@param g the graph
    492485        InArcIt(const Graph& g, const Node& n) {
    493486          ignore_unused_variable_warning(n);
    494487          ignore_unused_variable_warning(g);
    495488        }
    496         /// Sets the iterator to the given arc.
    497 
    498         /// Sets the iterator to the given arc of the given graph.
    499         ///
     489        /// Arc -> InArcIt conversion
     490
     491        /// Sets the iterator to the value of the trivial iterator \c e.
     492        /// This feature necessitates that each time we
     493        /// iterate the arc-set, the iteration order is the same.
    500494        InArcIt(const Graph&, const Arc&) { }
    501495        /// Next incoming arc
    502496
    503         /// Assign the iterator to the next
    504         /// incoming arc of the corresponding node.
     497        /// Assign the iterator to the next inarc of the corresponding node.
     498        ///
    505499        InArcIt& operator++() { return *this; }
    506500      };
    507501
    508       /// \brief Standard graph map type for the nodes.
    509       ///
    510       /// Standard graph map type for the nodes.
    511       /// It conforms to the ReferenceMap concept.
     502      /// \brief Reference map of the nodes to type \c T.
     503      ///
     504      /// Reference map of the nodes to type \c T.
    512505      template<class T>
    513506      class NodeMap : public ReferenceMap<Node, T, T&, const T&>
     
    515508      public:
    516509
    517         /// Constructor
    518         explicit NodeMap(const Graph&) { }
    519         /// Constructor with given initial value
     510        ///\e
     511        NodeMap(const Graph&) { }
     512        ///\e
    520513        NodeMap(const Graph&, T) { }
    521514
     
    532525      };
    533526
    534       /// \brief Standard graph map type for the arcs.
    535       ///
    536       /// Standard graph map type for the arcs.
    537       /// It conforms to the ReferenceMap concept.
     527      /// \brief Reference map of the arcs to type \c T.
     528      ///
     529      /// Reference map of the arcs to type \c T.
    538530      template<class T>
    539531      class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
     
    541533      public:
    542534
    543         /// Constructor
    544         explicit ArcMap(const Graph&) { }
    545         /// Constructor with given initial value
     535        ///\e
     536        ArcMap(const Graph&) { }
     537        ///\e
    546538        ArcMap(const Graph&, T) { }
    547 
    548539      private:
    549540        ///Copy constructor
     
    558549      };
    559550
    560       /// \brief Standard graph map type for the edges.
    561       ///
    562       /// Standard graph map type for the edges.
    563       /// It conforms to the ReferenceMap concept.
     551      /// Reference map of the edges to type \c T.
     552
     553      /// Reference map of the edges to type \c T.
    564554      template<class T>
    565555      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
     
    567557      public:
    568558
    569         /// Constructor
    570         explicit EdgeMap(const Graph&) { }
    571         /// Constructor with given initial value
     559        ///\e
     560        EdgeMap(const Graph&) { }
     561        ///\e
    572562        EdgeMap(const Graph&, T) { }
    573 
    574563      private:
    575564        ///Copy constructor
     
    584573      };
    585574
    586       /// \brief The first node of the edge.
    587       ///
    588       /// Returns the first node of the given edge.
    589       ///
    590       /// Edges don't have source and target nodes, however methods
    591       /// u() and v() are used to query the two end-nodes of an edge.
    592       /// The orientation of an edge that arises this way is called
    593       /// the inherent direction, it is used to define the default
    594       /// direction for the corresponding arcs.
     575      /// \brief Direct the given edge.
     576      ///
     577      /// Direct the given edge. The returned arc source
     578      /// will be the given node.
     579      Arc direct(const Edge&, const Node&) const {
     580        return INVALID;
     581      }
     582
     583      /// \brief Direct the given edge.
     584      ///
     585      /// Direct the given edge. The returned arc
     586      /// represents the given edge and the direction comes
     587      /// from the bool parameter. The source of the edge and
     588      /// the directed arc is the same when the given bool is true.
     589      Arc direct(const Edge&, bool) const {
     590        return INVALID;
     591      }
     592
     593      /// \brief Returns true if the arc has default orientation.
     594      ///
     595      /// Returns whether the given directed arc is same orientation as
     596      /// the corresponding edge's default orientation.
     597      bool direction(Arc) const { return true; }
     598
     599      /// \brief Returns the opposite directed arc.
     600      ///
     601      /// Returns the opposite directed arc.
     602      Arc oppositeArc(Arc) const { return INVALID; }
     603
     604      /// \brief Opposite node on an arc
     605      ///
     606      /// \return The opposite of the given node on the given edge.
     607      Node oppositeNode(Node, Edge) const { return INVALID; }
     608
     609      /// \brief First node of the edge.
     610      ///
     611      /// \return The first node of the given edge.
     612      ///
     613      /// Naturally edges don't have direction and thus
     614      /// don't have source and target node. However we use \c u() and \c v()
     615      /// methods to query the two nodes of the arc. The direction of the
     616      /// arc which arises this way is called the inherent direction of the
     617      /// edge, and is used to define the "default" direction
     618      /// of the directed versions of the arcs.
    595619      /// \sa v()
    596620      /// \sa direction()
    597621      Node u(Edge) const { return INVALID; }
    598622
    599       /// \brief The second node of the edge.
    600       ///
    601       /// Returns the second node of the given edge.
    602       ///
    603       /// Edges don't have source and target nodes, however methods
    604       /// u() and v() are used to query the two end-nodes of an edge.
    605       /// The orientation of an edge that arises this way is called
    606       /// the inherent direction, it is used to define the default
    607       /// direction for the corresponding arcs.
     623      /// \brief Second node of the edge.
     624      ///
     625      /// \return The second node of the given edge.
     626      ///
     627      /// Naturally edges don't have direction and thus
     628      /// don't have source and target node. However we use \c u() and \c v()
     629      /// methods to query the two nodes of the arc. The direction of the
     630      /// arc which arises this way is called the inherent direction of the
     631      /// edge, and is used to define the "default" direction
     632      /// of the directed versions of the arcs.
    608633      /// \sa u()
    609634      /// \sa direction()
    610635      Node v(Edge) const { return INVALID; }
    611636
    612       /// \brief The source node of the arc.
    613       ///
    614       /// Returns the source node of the given arc.
     637      /// \brief Source node of the directed arc.
    615638      Node source(Arc) const { return INVALID; }
    616639
    617       /// \brief The target node of the arc.
    618       ///
    619       /// Returns the target node of the given arc.
     640      /// \brief Target node of the directed arc.
    620641      Node target(Arc) const { return INVALID; }
    621642
    622       /// \brief The ID of the node.
    623       ///
    624       /// Returns the ID of the given node.
     643      /// \brief Returns the id of the node.
    625644      int id(Node) const { return -1; }
    626645
    627       /// \brief The ID of the edge.
    628       ///
    629       /// Returns the ID of the given edge.
     646      /// \brief Returns the id of the edge.
    630647      int id(Edge) const { return -1; }
    631648
    632       /// \brief The ID of the arc.
    633       ///
    634       /// Returns the ID of the given arc.
     649      /// \brief Returns the id of the arc.
    635650      int id(Arc) const { return -1; }
    636651
    637       /// \brief The node with the given ID.
    638       ///
    639       /// Returns the node with the given ID.
    640       /// \pre The argument should be a valid node ID in the graph.
     652      /// \brief Returns the node with the given id.
     653      ///
     654      /// \pre The argument should be a valid node id in the graph.
    641655      Node nodeFromId(int) const { return INVALID; }
    642656
    643       /// \brief The edge with the given ID.
    644       ///
    645       /// Returns the edge with the given ID.
    646       /// \pre The argument should be a valid edge ID in the graph.
     657      /// \brief Returns the edge with the given id.
     658      ///
     659      /// \pre The argument should be a valid edge id in the graph.
    647660      Edge edgeFromId(int) const { return INVALID; }
    648661
    649       /// \brief The arc with the given ID.
    650       ///
    651       /// Returns the arc with the given ID.
    652       /// \pre The argument should be a valid arc ID in the graph.
     662      /// \brief Returns the arc with the given id.
     663      ///
     664      /// \pre The argument should be a valid arc id in the graph.
    653665      Arc arcFromId(int) const { return INVALID; }
    654666
    655       /// \brief An upper bound on the node IDs.
    656       ///
    657       /// Returns an upper bound on the node IDs.
     667      /// \brief Returns an upper bound on the node IDs.
    658668      int maxNodeId() const { return -1; }
    659669
    660       /// \brief An upper bound on the edge IDs.
    661       ///
    662       /// Returns an upper bound on the edge IDs.
     670      /// \brief Returns an upper bound on the edge IDs.
    663671      int maxEdgeId() const { return -1; }
    664672
    665       /// \brief An upper bound on the arc IDs.
    666       ///
    667       /// Returns an upper bound on the arc IDs.
     673      /// \brief Returns an upper bound on the arc IDs.
    668674      int maxArcId() const { return -1; }
    669 
    670       /// \brief The direction of the arc.
    671       ///
    672       /// Returns \c true if the direction of the given arc is the same as
    673       /// the inherent orientation of the represented edge.
    674       bool direction(Arc) const { return true; }
    675 
    676       /// \brief Direct the edge.
    677       ///
    678       /// Direct the given edge. The returned arc
    679       /// represents the given edge and its direction comes
    680       /// from the bool parameter. If it is \c true, then the direction
    681       /// of the arc is the same as the inherent orientation of the edge.
    682       Arc direct(Edge, bool) const {
    683         return INVALID;
    684       }
    685 
    686       /// \brief Direct the edge.
    687       ///
    688       /// Direct the given edge. The returned arc represents the given
    689       /// edge and its source node is the given node.
    690       Arc direct(Edge, Node) const {
    691         return INVALID;
    692       }
    693 
    694       /// \brief The oppositely directed arc.
    695       ///
    696       /// Returns the oppositely directed arc representing the same edge.
    697       Arc oppositeArc(Arc) const { return INVALID; }
    698 
    699       /// \brief The opposite node on the edge.
    700       ///
    701       /// Returns the opposite node on the given edge.
    702       Node oppositeNode(Node, Edge) const { return INVALID; }
    703675
    704676      void first(Node&) const {}
     
    734706      int maxId(Arc) const { return -1; }
    735707
    736       /// \brief The base node of the iterator.
    737       ///
    738       /// Returns the base node of the given incident edge iterator.
    739       Node baseNode(IncEdgeIt) const { return INVALID; }
    740 
    741       /// \brief The running node of the iterator.
    742       ///
    743       /// Returns the running node of the given incident edge iterator.
    744       Node runningNode(IncEdgeIt) const { return INVALID; }
    745 
    746       /// \brief The base node of the iterator.
    747       ///
    748       /// Returns the base node of the given outgoing arc iterator
    749       /// (i.e. the source node of the corresponding arc).
    750       Node baseNode(OutArcIt) const { return INVALID; }
    751 
    752       /// \brief The running node of the iterator.
    753       ///
    754       /// Returns the running node of the given outgoing arc iterator
    755       /// (i.e. the target node of the corresponding arc).
    756       Node runningNode(OutArcIt) const { return INVALID; }
    757 
    758       /// \brief The base node of the iterator.
    759       ///
    760       /// Returns the base node of the given incomming arc iterator
    761       /// (i.e. the target node of the corresponding arc).
    762       Node baseNode(InArcIt) const { return INVALID; }
    763 
    764       /// \brief The running node of the iterator.
    765       ///
    766       /// Returns the running node of the given incomming arc iterator
    767       /// (i.e. the source node of the corresponding arc).
    768       Node runningNode(InArcIt) const { return INVALID; }
     708      /// \brief Base node of the iterator
     709      ///
     710      /// Returns the base node (the source in this case) of the iterator
     711      Node baseNode(OutArcIt e) const {
     712        return source(e);
     713      }
     714      /// \brief Running node of the iterator
     715      ///
     716      /// Returns the running node (the target in this case) of the
     717      /// iterator
     718      Node runningNode(OutArcIt e) const {
     719        return target(e);
     720      }
     721
     722      /// \brief Base node of the iterator
     723      ///
     724      /// Returns the base node (the target in this case) of the iterator
     725      Node baseNode(InArcIt e) const {
     726        return target(e);
     727      }
     728      /// \brief Running node of the iterator
     729      ///
     730      /// Returns the running node (the source in this case) of the
     731      /// iterator
     732      Node runningNode(InArcIt e) const {
     733        return source(e);
     734      }
     735
     736      /// \brief Base node of the iterator
     737      ///
     738      /// Returns the base node of the iterator
     739      Node baseNode(IncEdgeIt) const {
     740        return INVALID;
     741      }
     742
     743      /// \brief Running node of the iterator
     744      ///
     745      /// Returns the running node of the iterator
     746      Node runningNode(IncEdgeIt) const {
     747        return INVALID;
     748      }
    769749
    770750      template <typename _Graph>
  • lemon/concepts/graph_components.h

    r781 r713  
    9393      /// associative containers (e.g. \c std::map).
    9494      ///
    95       /// \note This operator only has to define some strict ordering of
     95      /// \note This operator only have to define some strict ordering of
    9696      /// the items; this order has nothing to do with the iteration
    9797      /// ordering of the items.
  • lemon/concepts/heap.h

    r757 r631  
    1717 */
    1818
    19 #ifndef LEMON_CONCEPTS_HEAP_H
    20 #define LEMON_CONCEPTS_HEAP_H
    21 
    2219///\ingroup concept
    2320///\file
    2421///\brief The concept of heaps.
    2522
     23#ifndef LEMON_CONCEPTS_HEAP_H
     24#define LEMON_CONCEPTS_HEAP_H
     25
    2626#include <lemon/core.h>
    2727#include <lemon/concept_check.h>
     
    3636    /// \brief The heap concept.
    3737    ///
    38     /// This concept class describes the main interface of heaps.
    39     /// The various \ref heaps "heap structures" are efficient
    40     /// implementations of the abstract data type \e priority \e queue.
    41     /// They store items with specified values called \e priorities
    42     /// in such a way that finding and removing the item with minimum
    43     /// priority are efficient. The basic operations are adding and
    44     /// erasing items, changing the priority of an item, etc.
     38    /// Concept class describing the main interface of heaps. A \e heap
     39    /// is a data structure for storing items with specified values called
     40    /// \e priorities in such a way that finding the item with minimum
     41    /// priority is efficient. In a heap one can change the priority of an
     42    /// item, add or erase an item, etc.
    4543    ///
    46     /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
    47     /// Any class that conforms to this concept can be used easily in such
    48     /// algorithms.
    49     ///
    50     /// \tparam PR Type of the priorities of the items.
    51     /// \tparam IM A read-writable item map with \c int values, used
     44    /// \tparam PR Type of the priority of the items.
     45    /// \tparam IM A read and writable item map with int values, used
    5246    /// internally to handle the cross references.
    53     /// \tparam CMP A functor class for comparing the priorities.
     47    /// \tparam Comp A functor class for the ordering of the priorities.
    5448    /// The default is \c std::less<PR>.
    5549#ifdef DOXYGEN
    56     template <typename PR, typename IM, typename CMP>
     50    template <typename PR, typename IM, typename Comp = std::less<PR> >
    5751#else
    58     template <typename PR, typename IM, typename CMP = std::less<PR> >
     52    template <typename PR, typename IM>
    5953#endif
    6054    class Heap {
     
    7165      ///
    7266      /// Each item has a state associated to it. It can be "in heap",
    73       /// "pre-heap" or "post-heap". The latter two are indifferent from the
    74       /// heap's point of view, but may be useful to the user.
     67      /// "pre heap" or "post heap". The later two are indifferent
     68      /// from the point of view of the heap, but may be useful for
     69      /// the user.
    7570      ///
    7671      /// The item-int map must be initialized in such way that it assigns
     
    7873      enum State {
    7974        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
    80         PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
    81         POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
     75        PRE_HEAP = -1,  ///< = -1. The "pre heap" state constant.
     76        POST_HEAP = -2  ///< = -2. The "post heap" state constant.
    8277      };
    8378
    84       /// \brief Constructor.
    85       ///
    86       /// Constructor.
     79      /// \brief The constructor.
     80      ///
     81      /// The constructor.
    8782      /// \param map A map that assigns \c int values to keys of type
    8883      /// \c Item. It is used internally by the heap implementations to
    8984      /// handle the cross references. The assigned value must be
    90       /// \c PRE_HEAP (<tt>-1</tt>) for each item.
     85      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
    9186      explicit Heap(ItemIntMap &map) {}
    9287
    93       /// \brief Constructor.
    94       ///
    95       /// Constructor.
    96       /// \param map A map that assigns \c int values to keys of type
    97       /// \c Item. It is used internally by the heap implementations to
    98       /// handle the cross references. The assigned value must be
    99       /// \c PRE_HEAP (<tt>-1</tt>) for each item.
    100       /// \param comp The function object used for comparing the priorities.
    101       explicit Heap(ItemIntMap &map, const CMP &comp) {}
    102 
    10388      /// \brief The number of items stored in the heap.
    10489      ///
    105       /// This function returns the number of items stored in the heap.
     90      /// Returns the number of items stored in the heap.
    10691      int size() const { return 0; }
    10792
    108       /// \brief Check if the heap is empty.
    109       ///
    110       /// This function returns \c true if the heap is empty.
     93      /// \brief Checks if the heap is empty.
     94      ///
     95      /// Returns \c true if the heap is empty.
    11196      bool empty() const { return false; }
    11297
    113       /// \brief Make the heap empty.
    114       ///
    115       /// This functon makes the heap empty.
    116       /// It does not change the cross reference map. If you want to reuse
    117       /// a heap that is not surely empty, you should first clear it and
    118       /// then you should set the cross reference map to \c PRE_HEAP
    119       /// for each item.
    120       void clear() {}
    121 
    122       /// \brief Insert an item into the heap with the given priority.
    123       ///
    124       /// This function inserts the given item into the heap with the
    125       /// given priority.
     98      /// \brief Makes the heap empty.
     99      ///
     100      /// Makes the heap empty.
     101      void clear();
     102
     103      /// \brief Inserts an item into the heap with the given priority.
     104      ///
     105      /// Inserts the given item into the heap with the given priority.
    126106      /// \param i The item to insert.
    127107      /// \param p The priority of the item.
    128       /// \pre \e i must not be stored in the heap.
    129108      void push(const Item &i, const Prio &p) {}
    130109
    131       /// \brief Return the item having minimum priority.
    132       ///
    133       /// This function returns the item having minimum priority.
     110      /// \brief Returns the item having minimum priority.
     111      ///
     112      /// Returns the item having minimum priority.
    134113      /// \pre The heap must be non-empty.
    135114      Item top() const {}
     
    137116      /// \brief The minimum priority.
    138117      ///
    139       /// This function returns the minimum priority.
     118      /// Returns the minimum priority.
    140119      /// \pre The heap must be non-empty.
    141120      Prio prio() const {}
    142121
    143       /// \brief Remove the item having minimum priority.
    144       ///
    145       /// This function removes the item having minimum priority.
     122      /// \brief Removes the item having minimum priority.
     123      ///
     124      /// Removes the item having minimum priority.
    146125      /// \pre The heap must be non-empty.
    147126      void pop() {}
    148127
    149       /// \brief Remove the given item from the heap.
    150       ///
    151       /// This function removes the given item from the heap if it is
    152       /// already stored.
     128      /// \brief Removes an item from the heap.
     129      ///
     130      /// Removes the given item from the heap if it is already stored.
    153131      /// \param i The item to delete.
    154       /// \pre \e i must be in the heap.
    155132      void erase(const Item &i) {}
    156133
    157       /// \brief The priority of the given item.
    158       ///
    159       /// This function returns the priority of the given item.
    160       /// \param i The item.
    161       /// \pre \e i must be in the heap.
     134      /// \brief The priority of an item.
     135      ///
     136      /// Returns the priority of the given item.
     137      /// \param i The item.
     138      /// \pre \c i must be in the heap.
    162139      Prio operator[](const Item &i) const {}
    163140
    164       /// \brief Set the priority of an item or insert it, if it is
     141      /// \brief Sets the priority of an item or inserts it, if it is
    165142      /// not stored in the heap.
    166143      ///
    167144      /// This method sets the priority of the given item if it is
    168       /// already stored in the heap. Otherwise it inserts the given
    169       /// item into the heap with the given priority.
     145      /// already stored in the heap.
     146      /// Otherwise it inserts the given item with the given priority.
    170147      ///
    171148      /// \param i The item.
     
    173150      void set(const Item &i, const Prio &p) {}
    174151
    175       /// \brief Decrease the priority of an item to the given value.
    176       ///
    177       /// This function decreases the priority of an item to the given value.
     152      /// \brief Decreases the priority of an item to the given value.
     153      ///
     154      /// Decreases the priority of an item to the given value.
    178155      /// \param i The item.
    179156      /// \param p The priority.
    180       /// \pre \e i must be stored in the heap with priority at least \e p.
     157      /// \pre \c i must be stored in the heap with priority at least \c p.
    181158      void decrease(const Item &i, const Prio &p) {}
    182159
    183       /// \brief Increase the priority of an item to the given value.
    184       ///
    185       /// This function increases the priority of an item to the given value.
     160      /// \brief Increases the priority of an item to the given value.
     161      ///
     162      /// Increases the priority of an item to the given value.
    186163      /// \param i The item.
    187164      /// \param p The priority.
    188       /// \pre \e i must be stored in the heap with priority at most \e p.
     165      /// \pre \c i must be stored in the heap with priority at most \c p.
    189166      void increase(const Item &i, const Prio &p) {}
    190167
    191       /// \brief Return the state of an item.
     168      /// \brief Returns if an item is in, has already been in, or has
     169      /// never been in the heap.
    192170      ///
    193171      /// This method returns \c PRE_HEAP if the given item has never
     
    199177      State state(const Item &i) const {}
    200178
    201       /// \brief Set the state of an item in the heap.
    202       ///
    203       /// This function sets the state of the given item in the heap.
    204       /// It can be used to manually clear the heap when it is important
    205       /// to achive better time complexity.
     179      /// \brief Sets the state of an item in the heap.
     180      ///
     181      /// Sets the state of the given item in the heap. It can be used
     182      /// to manually clear the heap when it is important to achive the
     183      /// better time complexity.
    206184      /// \param i The item.
    207185      /// \param st The state. It should not be \c IN_HEAP.
  • lemon/concepts/maps.h

    r765 r576  
    183183      template<typename _ReferenceMap>
    184184      struct Constraints {
    185         typename enable_if<typename _ReferenceMap::ReferenceMapTag, void>::type
    186         constraints() {
     185        void constraints() {
    187186          checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
    188187          ref = m[key];
  • lemon/cplex.cc

    r793 r623  
    112112  }
    113113
    114   int CplexBase::_addRow(Value lb, ExprIterator b,
    115                          ExprIterator e, Value ub) {
    116     int i = CPXgetnumrows(cplexEnv(), _prob);
    117     if (lb == -INF) {
    118       const char s = 'L';
    119       CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
    120     } else if (ub == INF) {
    121       const char s = 'G';
    122       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
    123     } else if (lb == ub){
    124       const char s = 'E';
    125       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
    126     } else {
    127       const char s = 'R';
    128       double len = ub - lb;
    129       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
    130     }
    131 
    132     std::vector<int> indices;
    133     std::vector<int> rowlist;
    134     std::vector<Value> values;
    135 
    136     for(ExprIterator it=b; it!=e; ++it) {
    137       indices.push_back(it->first);
    138       values.push_back(it->second);
    139       rowlist.push_back(i);
    140     }
    141 
    142     CPXchgcoeflist(cplexEnv(), _prob, values.size(),
    143                    &rowlist.front(), &indices.front(), &values.front());
    144 
    145     return i;
    146   }
    147114
    148115  void CplexBase::_eraseCol(int i) {
  • lemon/cplex.h

    r793 r623  
    9494    virtual int _addCol();
    9595    virtual int _addRow();
    96     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    9796
    9897    virtual void _eraseCol(int i);
  • lemon/dfs.h

    r764 r631  
    4848    ///The type of the map that stores the predecessor
    4949    ///arcs of the %DFS paths.
    50     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     50    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    5151    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    5252    ///Instantiates a \c PredMap.
     
    6363
    6464    ///The type of the map that indicates which nodes are processed.
    65     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
    66     ///By default it is a NullMap.
     65    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    6766    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
    6867    ///Instantiates a \c ProcessedMap.
     
    8382
    8483    ///The type of the map that indicates which nodes are reached.
    85     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     84    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    8685    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    8786    ///Instantiates a \c ReachedMap.
     
    9897
    9998    ///The type of the map that stores the distances of the nodes.
    100     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     99    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    101100    typedef typename Digraph::template NodeMap<int> DistMap;
    102101    ///Instantiates a \c DistMap.
     
    226225    ///\ref named-templ-param "Named parameter" for setting
    227226    ///\c PredMap type.
    228     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     227    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    229228    template <class T>
    230229    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
     
    246245    ///\ref named-templ-param "Named parameter" for setting
    247246    ///\c DistMap type.
    248     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     247    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    249248    template <class T>
    250249    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
     
    266265    ///\ref named-templ-param "Named parameter" for setting
    267266    ///\c ReachedMap type.
    268     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     267    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    269268    template <class T>
    270269    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
     
    286285    ///\ref named-templ-param "Named parameter" for setting
    287286    ///\c ProcessedMap type.
    288     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     287    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    289288    template <class T>
    290289    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
     
    413412    ///The simplest way to execute the DFS algorithm is to use one of the
    414413    ///member functions called \ref run(Node) "run()".\n
    415     ///If you need better control on the execution, you have to call
    416     ///\ref init() first, then you can add a source node with \ref addSource()
     414    ///If you need more control on the execution, first you have to call
     415    ///\ref init(), then you can add a source node with \ref addSource()
    417416    ///and perform the actual computation with \ref start().
    418417    ///This procedure can be repeated if there are nodes that have not
     
    671670    ///@{
    672671
    673     ///The DFS path to the given node.
    674 
    675     ///Returns the DFS path to the given node from the root(s).
     672    ///The DFS path to a node.
     673
     674    ///Returns the DFS path to a node.
    676675    ///
    677676    ///\warning \c t should be reached from the root(s).
     
    681680    Path path(Node t) const { return Path(*G, *_pred, t); }
    682681
    683     ///The distance of the given node from the root(s).
    684 
    685     ///Returns the distance of the given node from the root(s).
     682    ///The distance of a node from the root(s).
     683
     684    ///Returns the distance of a node from the root(s).
    686685    ///
    687686    ///\warning If node \c v is not reached from the root(s), then
     
    692691    int dist(Node v) const { return (*_dist)[v]; }
    693692
    694     ///Returns the 'previous arc' of the %DFS tree for the given node.
     693    ///Returns the 'previous arc' of the %DFS tree for a node.
    695694
    696695    ///This function returns the 'previous arc' of the %DFS tree for the
     
    700699    ///
    701700    ///The %DFS tree used here is equal to the %DFS tree used in
    702     ///\ref predNode() and \ref predMap().
     701    ///\ref predNode().
    703702    ///
    704703    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    706705    Arc predArc(Node v) const { return (*_pred)[v];}
    707706
    708     ///Returns the 'previous node' of the %DFS tree for the given node.
     707    ///Returns the 'previous node' of the %DFS tree.
    709708
    710709    ///This function returns the 'previous node' of the %DFS
    711710    ///tree for the node \c v, i.e. it returns the last but one node
    712     ///of a %DFS path from a root to \c v. It is \c INVALID
     711    ///from a %DFS path from a root to \c v. It is \c INVALID
    713712    ///if \c v is not reached from the root(s) or if \c v is a root.
    714713    ///
    715714    ///The %DFS tree used here is equal to the %DFS tree used in
    716     ///\ref predArc() and \ref predMap().
     715    ///\ref predArc().
    717716    ///
    718717    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    735734    ///
    736735    ///Returns a const reference to the node map that stores the predecessor
    737     ///arcs, which form the DFS tree (forest).
     736    ///arcs, which form the DFS tree.
    738737    ///
    739738    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    741740    const PredMap &predMap() const { return *_pred;}
    742741
    743     ///Checks if the given node. node is reached from the root(s).
     742    ///Checks if a node is reached from the root(s).
    744743
    745744    ///Returns \c true if \c v is reached from the root(s).
     
    767766    ///The type of the map that stores the predecessor
    768767    ///arcs of the %DFS paths.
    769     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     768    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    770769    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    771770    ///Instantiates a PredMap.
     
    782781
    783782    ///The type of the map that indicates which nodes are processed.
    784     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     783    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    785784    ///By default it is a NullMap.
    786785    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     
    802801
    803802    ///The type of the map that indicates which nodes are reached.
    804     ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     803    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    805804    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    806805    ///Instantiates a ReachedMap.
     
    817816
    818817    ///The type of the map that stores the distances of the nodes.
    819     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     818    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    820819    typedef typename Digraph::template NodeMap<int> DistMap;
    821820    ///Instantiates a DistMap.
     
    832831
    833832    ///The type of the DFS paths.
    834     ///It must conform to the \ref concepts::Path "Path" concept.
     833    ///It must meet the \ref concepts::Path "Path" concept.
    835834    typedef lemon::Path<Digraph> Path;
    836835  };
     
    838837  /// Default traits class used by DfsWizard
    839838
    840   /// Default traits class used by DfsWizard.
    841   /// \tparam GR The type of the digraph.
     839  /// To make it easier to use Dfs algorithm
     840  /// we have created a wizard class.
     841  /// This \ref DfsWizard class needs default traits,
     842  /// as well as the \ref Dfs class.
     843  /// The \ref DfsWizardBase is a class to be the default traits of the
     844  /// \ref DfsWizard class.
    842845  template<class GR>
    843846  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
     
    867870    /// Constructor.
    868871
    869     /// This constructor does not require parameters, it initiates
     872    /// This constructor does not require parameters, therefore it initiates
    870873    /// all of the attributes to \c 0.
    871874    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
     
    897900    typedef TR Base;
    898901
     902    ///The type of the digraph the algorithm runs on.
    899903    typedef typename TR::Digraph Digraph;
    900904
     
    904908    typedef typename Digraph::OutArcIt OutArcIt;
    905909
     910    ///\brief The type of the map that stores the predecessor
     911    ///arcs of the DFS paths.
    906912    typedef typename TR::PredMap PredMap;
     913    ///\brief The type of the map that stores the distances of the nodes.
    907914    typedef typename TR::DistMap DistMap;
     915    ///\brief The type of the map that indicates which nodes are reached.
    908916    typedef typename TR::ReachedMap ReachedMap;
     917    ///\brief The type of the map that indicates which nodes are processed.
    909918    typedef typename TR::ProcessedMap ProcessedMap;
     919    ///The type of the DFS paths
    910920    typedef typename TR::Path Path;
    911921
     
    9901000      SetPredMapBase(const TR &b) : TR(b) {}
    9911001    };
    992 
    993     ///\brief \ref named-templ-param "Named parameter" for setting
    994     ///the predecessor map.
    995     ///
    996     ///\ref named-templ-param "Named parameter" function for setting
    997     ///the map that stores the predecessor arcs of the nodes.
     1002    ///\brief \ref named-func-param "Named parameter"
     1003    ///for setting PredMap object.
     1004    ///
     1005    ///\ref named-func-param "Named parameter"
     1006    ///for setting PredMap object.
    9981007    template<class T>
    9991008    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
     
    10091018      SetReachedMapBase(const TR &b) : TR(b) {}
    10101019    };
    1011 
    1012     ///\brief \ref named-templ-param "Named parameter" for setting
    1013     ///the reached map.
    1014     ///
    1015     ///\ref named-templ-param "Named parameter" function for setting
    1016     ///the map that indicates which nodes are reached.
     1020    ///\brief \ref named-func-param "Named parameter"
     1021    ///for setting ReachedMap object.
     1022    ///
     1023    /// \ref named-func-param "Named parameter"
     1024    ///for setting ReachedMap object.
    10171025    template<class T>
    10181026    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
     
    10281036      SetDistMapBase(const TR &b) : TR(b) {}
    10291037    };
    1030 
    1031     ///\brief \ref named-templ-param "Named parameter" for setting
    1032     ///the distance map.
    1033     ///
    1034     ///\ref named-templ-param "Named parameter" function for setting
    1035     ///the map that stores the distances of the nodes calculated
    1036     ///by the algorithm.
     1038    ///\brief \ref named-func-param "Named parameter"
     1039    ///for setting DistMap object.
     1040    ///
     1041    /// \ref named-func-param "Named parameter"
     1042    ///for setting DistMap object.
    10371043    template<class T>
    10381044    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
     
    10481054      SetProcessedMapBase(const TR &b) : TR(b) {}
    10491055    };
    1050 
    1051     ///\brief \ref named-func-param "Named parameter" for setting
    1052     ///the processed map.
    1053     ///
    1054     ///\ref named-templ-param "Named parameter" function for setting
    1055     ///the map that indicates which nodes are processed.
     1056    ///\brief \ref named-func-param "Named parameter"
     1057    ///for setting ProcessedMap object.
     1058    ///
     1059    /// \ref named-func-param "Named parameter"
     1060    ///for setting ProcessedMap object.
    10561061    template<class T>
    10571062    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
     
    12041209    ///
    12051210    /// The type of the map that indicates which nodes are reached.
    1206     /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     1211    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    12071212    typedef typename Digraph::template NodeMap<bool> ReachedMap;
    12081213
     
    13651370    /// The simplest way to execute the DFS algorithm is to use one of the
    13661371    /// member functions called \ref run(Node) "run()".\n
    1367     /// If you need better control on the execution, you have to call
    1368     /// \ref init() first, then you can add a source node with \ref addSource()
     1372    /// If you need more control on the execution, first you have to call
     1373    /// \ref init(), then you can add a source node with \ref addSource()
    13691374    /// and perform the actual computation with \ref start().
    13701375    /// This procedure can be repeated if there are nodes that have not
     
    16161621    ///@{
    16171622
    1618     /// \brief Checks if the given node is reached from the root(s).
     1623    /// \brief Checks if a node is reached from the root(s).
    16191624    ///
    16201625    /// Returns \c true if \c v is reached from the root(s).
  • lemon/dijkstra.h

    r764 r631  
    7171
    7272    ///The type of the map that stores the arc lengths.
    73     ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
     73    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
    7474    typedef LEN LengthMap;
    75     ///The type of the arc lengths.
     75    ///The type of the length of the arcs.
    7676    typedef typename LEN::Value Value;
    7777
     
    117117    ///The type of the map that stores the predecessor
    118118    ///arcs of the shortest paths.
    119     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     119    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    120120    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    121121    ///Instantiates a \c PredMap.
     
    132132
    133133    ///The type of the map that indicates which nodes are processed.
    134     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     134    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    135135    ///By default it is a NullMap.
    136136    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     
    152152
    153153    ///The type of the map that stores the distances of the nodes.
    154     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     154    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    155155    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
    156156    ///Instantiates a \c DistMap.
     
    169169  /// \ingroup shortest_path
    170170  ///This class provides an efficient implementation of the %Dijkstra algorithm.
    171   ///
    172   ///The %Dijkstra algorithm solves the single-source shortest path problem
    173   ///when all arc lengths are non-negative. If there are negative lengths,
    174   ///the BellmanFord algorithm should be used instead.
    175171  ///
    176172  ///The arc lengths are passed to the algorithm using a
     
    206202    typedef typename TR::Digraph Digraph;
    207203
    208     ///The type of the arc lengths.
     204    ///The type of the length of the arcs.
    209205    typedef typename TR::LengthMap::Value Value;
    210206    ///The type of the map that stores the arc lengths.
     
    309305    ///\ref named-templ-param "Named parameter" for setting
    310306    ///\c PredMap type.
    311     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     307    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    312308    template <class T>
    313309    struct SetPredMap
     
    330326    ///\ref named-templ-param "Named parameter" for setting
    331327    ///\c DistMap type.
    332     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     328    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    333329    template <class T>
    334330    struct SetDistMap
     
    351347    ///\ref named-templ-param "Named parameter" for setting
    352348    ///\c ProcessedMap type.
    353     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     349    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    354350    template <class T>
    355351    struct SetProcessedMap
     
    448444    ///\ref named-templ-param "Named parameter" for setting
    449445    ///\c OperationTraits type.
    450     /// For more information see \ref DijkstraDefaultOperationTraits.
    451446    template <class T>
    452447    struct SetOperationTraits
     
    590585    ///The simplest way to execute the %Dijkstra algorithm is to use
    591586    ///one of the member functions called \ref run(Node) "run()".\n
    592     ///If you need better control on the execution, you have to call
    593     ///\ref init() first, then you can add several source nodes with
     587    ///If you need more control on the execution, first you have to call
     588    ///\ref init(), then you can add several source nodes with
    594589    ///\ref addSource(). Finally the actual path computation can be
    595590    ///performed with one of the \ref start() functions.
     
    807802    ///The results of the %Dijkstra algorithm can be obtained using these
    808803    ///functions.\n
    809     ///Either \ref run(Node) "run()" or \ref init() should be called
     804    ///Either \ref run(Node) "run()" or \ref start() should be called
    810805    ///before using them.
    811806
    812807    ///@{
    813808
    814     ///The shortest path to the given node.
    815 
    816     ///Returns the shortest path to the given node from the root(s).
     809    ///The shortest path to a node.
     810
     811    ///Returns the shortest path to a node.
    817812    ///
    818813    ///\warning \c t should be reached from the root(s).
     
    822817    Path path(Node t) const { return Path(*G, *_pred, t); }
    823818
    824     ///The distance of the given node from the root(s).
    825 
    826     ///Returns the distance of the given node from the root(s).
     819    ///The distance of a node from the root(s).
     820
     821    ///Returns the distance of a node from the root(s).
    827822    ///
    828823    ///\warning If node \c v is not reached from the root(s), then
     
    833828    Value dist(Node v) const { return (*_dist)[v]; }
    834829
    835     ///\brief Returns the 'previous arc' of the shortest path tree for
    836     ///the given node.
    837     ///
     830    ///Returns the 'previous arc' of the shortest path tree for a node.
     831
    838832    ///This function returns the 'previous arc' of the shortest path
    839833    ///tree for the node \c v, i.e. it returns the last arc of a
     
    842836    ///
    843837    ///The shortest path tree used here is equal to the shortest path
    844     ///tree used in \ref predNode() and \ref predMap().
     838    ///tree used in \ref predNode().
    845839    ///
    846840    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    848842    Arc predArc(Node v) const { return (*_pred)[v]; }
    849843
    850     ///\brief Returns the 'previous node' of the shortest path tree for
    851     ///the given node.
    852     ///
     844    ///Returns the 'previous node' of the shortest path tree for a node.
     845
    853846    ///This function returns the 'previous node' of the shortest path
    854847    ///tree for the node \c v, i.e. it returns the last but one node
    855     ///of a shortest path from a root to \c v. It is \c INVALID
     848    ///from a shortest path from a root to \c v. It is \c INVALID
    856849    ///if \c v is not reached from the root(s) or if \c v is a root.
    857850    ///
    858851    ///The shortest path tree used here is equal to the shortest path
    859     ///tree used in \ref predArc() and \ref predMap().
     852    ///tree used in \ref predArc().
    860853    ///
    861854    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    878871    ///
    879872    ///Returns a const reference to the node map that stores the predecessor
    880     ///arcs, which form the shortest path tree (forest).
     873    ///arcs, which form the shortest path tree.
    881874    ///
    882875    ///\pre Either \ref run(Node) "run()" or \ref init()
     
    884877    const PredMap &predMap() const { return *_pred;}
    885878
    886     ///Checks if the given node is reached from the root(s).
     879    ///Checks if a node is reached from the root(s).
    887880
    888881    ///Returns \c true if \c v is reached from the root(s).
     
    903896                                          Heap::POST_HEAP; }
    904897
    905     ///The current distance of the given node from the root(s).
    906 
    907     ///Returns the current distance of the given node from the root(s).
     898    ///The current distance of a node from the root(s).
     899
     900    ///Returns the current distance of a node from the root(s).
    908901    ///It may be decreased in the following processes.
    909902    ///
     
    932925
    933926    ///The type of the map that stores the arc lengths.
    934     ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
     927    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
    935928    typedef LEN LengthMap;
    936     ///The type of the arc lengths.
     929    ///The type of the length of the arcs.
    937930    typedef typename LEN::Value Value;
    938931
     
    981974    ///The type of the map that stores the predecessor
    982975    ///arcs of the shortest paths.
    983     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     976    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    984977    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
    985978    ///Instantiates a PredMap.
     
    996989
    997990    ///The type of the map that indicates which nodes are processed.
    998     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     991    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    999992    ///By default it is a NullMap.
    1000993    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
     
    10161009
    10171010    ///The type of the map that stores the distances of the nodes.
    1018     ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
     1011    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
    10191012    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
    10201013    ///Instantiates a DistMap.
     
    10311024
    10321025    ///The type of the shortest paths.
    1033     ///It must conform to the \ref concepts::Path "Path" concept.
     1026    ///It must meet the \ref concepts::Path "Path" concept.
    10341027    typedef lemon::Path<Digraph> Path;
    10351028  };
     
    10371030  /// Default traits class used by DijkstraWizard
    10381031
    1039   /// Default traits class used by DijkstraWizard.
    1040   /// \tparam GR The type of the digraph.
    1041   /// \tparam LEN The type of the length map.
     1032  /// To make it easier to use Dijkstra algorithm
     1033  /// we have created a wizard class.
     1034  /// This \ref DijkstraWizard class needs default traits,
     1035  /// as well as the \ref Dijkstra class.
     1036  /// The \ref DijkstraWizardBase is a class to be the default traits of the
     1037  /// \ref DijkstraWizard class.
    10421038  template<typename GR, typename LEN>
    10431039  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
     
    10981094    typedef TR Base;
    10991095
     1096    ///The type of the digraph the algorithm runs on.
    11001097    typedef typename TR::Digraph Digraph;
    11011098
     
    11051102    typedef typename Digraph::OutArcIt OutArcIt;
    11061103
     1104    ///The type of the map that stores the arc lengths.
    11071105    typedef typename TR::LengthMap LengthMap;
     1106    ///The type of the length of the arcs.
    11081107    typedef typename LengthMap::Value Value;
     1108    ///\brief The type of the map that stores the predecessor
     1109    ///arcs of the shortest paths.
    11091110    typedef typename TR::PredMap PredMap;
     1111    ///The type of the map that stores the distances of the nodes.
    11101112    typedef typename TR::DistMap DistMap;
     1113    ///The type of the map that indicates which nodes are processed.
    11111114    typedef typename TR::ProcessedMap ProcessedMap;
     1115    ///The type of the shortest paths
    11121116    typedef typename TR::Path Path;
     1117    ///The heap type used by the dijkstra algorithm.
    11131118    typedef typename TR::Heap Heap;
    11141119
     
    11821187      SetPredMapBase(const TR &b) : TR(b) {}
    11831188    };
    1184 
    1185     ///\brief \ref named-templ-param "Named parameter" for setting
    1186     ///the predecessor map.
    1187     ///
    1188     ///\ref named-templ-param "Named parameter" function for setting
    1189     ///the map that stores the predecessor arcs of the nodes.
     1189    ///\brief \ref named-func-param "Named parameter"
     1190    ///for setting PredMap object.
     1191    ///
     1192    ///\ref named-func-param "Named parameter"
     1193    ///for setting PredMap object.
    11901194    template<class T>
    11911195    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
     
    12011205      SetDistMapBase(const TR &b) : TR(b) {}
    12021206    };
    1203 
    1204     ///\brief \ref named-templ-param "Named parameter" for setting
    1205     ///the distance map.
    1206     ///
    1207     ///\ref named-templ-param "Named parameter" function for setting
    1208     ///the map that stores the distances of the nodes calculated
    1209     ///by the algorithm.
     1207    ///\brief \ref named-func-param "Named parameter"
     1208    ///for setting DistMap object.
     1209    ///
     1210    ///\ref named-func-param "Named parameter"
     1211    ///for setting DistMap object.
    12101212    template<class T>
    12111213    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
     
    12211223      SetProcessedMapBase(const TR &b) : TR(b) {}
    12221224    };
    1223 
    1224     ///\brief \ref named-func-param "Named parameter" for setting
    1225     ///the processed map.
    1226     ///
    1227     ///\ref named-templ-param "Named parameter" function for setting
    1228     ///the map that indicates which nodes are processed.
     1225    ///\brief \ref named-func-param "Named parameter"
     1226    ///for setting ProcessedMap object.
     1227    ///
     1228    /// \ref named-func-param "Named parameter"
     1229    ///for setting ProcessedMap object.
    12291230    template<class T>
    12301231    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
     
    12391240      SetPathBase(const TR &b) : TR(b) {}
    12401241    };
    1241 
    12421242    ///\brief \ref named-func-param "Named parameter"
    12431243    ///for getting the shortest path to the target node.
  • lemon/dim2.h

    r761 r463  
    2222#include <iostream>
    2323
    24 ///\ingroup geomdat
     24///\ingroup misc
    2525///\file
    2626///\brief A simple two dimensional vector and a bounding box implementation
     27///
     28/// The class \ref lemon::dim2::Point "dim2::Point" implements
     29/// a two dimensional vector with the usual operations.
     30///
     31/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
     32/// the rectangular bounding box of a set of
     33/// \ref lemon::dim2::Point "dim2::Point"'s.
    2734
    2835namespace lemon {
     
    3441  namespace dim2 {
    3542
    36   /// \addtogroup geomdat
     43  /// \addtogroup misc
    3744  /// @{
    3845
  • lemon/fib_heap.h

    r758 r730  
    2121
    2222///\file
    23 ///\ingroup heaps
    24 ///\brief Fibonacci heap implementation.
     23///\ingroup auxdat
     24///\brief Fibonacci Heap implementation.
    2525
    2626#include <vector>
    27 #include <utility>
    2827#include <functional>
    2928#include <lemon/math.h>
     
    3130namespace lemon {
    3231
    33   /// \ingroup heaps
     32  /// \ingroup auxdat
    3433  ///
    35   /// \brief Fibonacci heap data structure.
     34  ///\brief Fibonacci Heap.
    3635  ///
    37   /// This class implements the \e Fibonacci \e heap data structure.
    38   /// It fully conforms to the \ref concepts::Heap "heap concept".
     36  ///This class implements the \e Fibonacci \e heap data structure. A \e heap
     37  ///is a data structure for storing items with specified values called \e
     38  ///priorities in such a way that finding the item with minimum priority is
     39  ///efficient. \c CMP specifies the ordering of the priorities. In a heap
     40  ///one can change the priority of an item, add or erase an item, etc.
    3941  ///
    40   /// The methods \ref increase() and \ref erase() are not efficient in a
    41   /// Fibonacci heap. In case of many calls of these operations, it is
    42   /// better to use other heap structure, e.g. \ref BinHeap "binary heap".
     42  ///The methods \ref increase and \ref erase are not efficient in a Fibonacci
     43  ///heap. In case of many calls to these operations, it is better to use a
     44  ///\ref BinHeap "binary heap".
    4345  ///
    44   /// \tparam PR Type of the priorities of the items.
    45   /// \tparam IM A read-writable item map with \c int values, used
    46   /// internally to handle the cross references.
    47   /// \tparam CMP A functor class for comparing the priorities.
    48   /// The default is \c std::less<PR>.
     46  ///\param PRIO Type of the priority of the items.
     47  ///\param IM A read and writable Item int map, used internally
     48  ///to handle the cross references.
     49  ///\param CMP A class for the ordering of the priorities. The
     50  ///default is \c std::less<PRIO>.
     51  ///
     52  ///\sa BinHeap
     53  ///\sa Dijkstra
    4954#ifdef DOXYGEN
    50   template <typename PR, typename IM, typename CMP>
     55  template <typename PRIO, typename IM, typename CMP>
    5156#else
    52   template <typename PR, typename IM, typename CMP = std::less<PR> >
     57  template <typename PRIO, typename IM, typename CMP = std::less<PRIO> >
    5358#endif
    5459  class FibHeap {
    5560  public:
    56 
    57     /// Type of the item-int map.
     61    ///\e
    5862    typedef IM ItemIntMap;
    59     /// Type of the priorities.
    60     typedef PR Prio;
    61     /// Type of the items stored in the heap.
     63    ///\e
     64    typedef PRIO Prio;
     65    ///\e
    6266    typedef typename ItemIntMap::Key Item;
    63     /// Type of the item-priority pairs.
     67    ///\e
    6468    typedef std::pair<Item,Prio> Pair;
    65     /// Functor type for comparing the priorities.
     69    ///\e
    6670    typedef CMP Compare;
    6771
     
    7781  public:
    7882
    79     /// \brief Type to represent the states of the items.
    80     ///
    81     /// Each item has a state associated to it. It can be "in heap",
    82     /// "pre-heap" or "post-heap". The latter two are indifferent from the
     83    /// \brief Type to represent the items states.
     84    ///
     85    /// Each Item element have a state associated to it. It may be "in heap",
     86    /// "pre heap" or "post heap". The latter two are indifferent from the
    8387    /// heap's point of view, but may be useful to the user.
    8488    ///
     
    9195    };
    9296
    93     /// \brief Constructor.
    94     ///
    95     /// Constructor.
    96     /// \param map A map that assigns \c int values to the items.
    97     /// It is used internally to handle the cross references.
    98     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
     97    /// \brief The constructor
     98    ///
     99    /// \c map should be given to the constructor, since it is
     100    ///   used internally to handle the cross references.
    99101    explicit FibHeap(ItemIntMap &map)
    100102      : _minimum(0), _iim(map), _num() {}
    101103
    102     /// \brief Constructor.
    103     ///
    104     /// Constructor.
    105     /// \param map A map that assigns \c int values to the items.
    106     /// It is used internally to handle the cross references.
    107     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
    108     /// \param comp The function object used for comparing the priorities.
     104    /// \brief The constructor
     105    ///
     106    /// \c map should be given to the constructor, since it is used
     107    /// internally to handle the cross references. \c comp is an
     108    /// object for ordering of the priorities.
    109109    FibHeap(ItemIntMap &map, const Compare &comp)
    110110      : _minimum(0), _iim(map), _comp(comp), _num() {}
     
    112112    /// \brief The number of items stored in the heap.
    113113    ///
    114     /// This function returns the number of items stored in the heap.
     114    /// Returns the number of items stored in the heap.
    115115    int size() const { return _num; }
    116116
    117     /// \brief Check if the heap is empty.
    118     ///
    119     /// This function returns \c true if the heap is empty.
     117    /// \brief Checks if the heap stores no items.
     118    ///
     119    ///   Returns \c true if and only if the heap stores no items.
    120120    bool empty() const { return _num==0; }
    121121
    122     /// \brief Make the heap empty.
    123     ///
    124     /// This functon makes the heap empty.
    125     /// It does not change the cross reference map. If you want to reuse
    126     /// a heap that is not surely empty, you should first clear it and
    127     /// then you should set the cross reference map to \c PRE_HEAP
    128     /// for each item.
     122    /// \brief Make empty this heap.
     123    ///
     124    /// Make empty this heap. It does not change the cross reference
     125    /// map.  If you want to reuse a heap what is not surely empty you
     126    /// should first clear the heap and after that you should set the
     127    /// cross reference map for each item to \c PRE_HEAP.
    129128    void clear() {
    130129      _data.clear(); _minimum = 0; _num = 0;
    131130    }
    132131
    133     /// \brief Insert an item into the heap with the given priority.
    134     ///
    135     /// This function inserts the given item into the heap with the
    136     /// given priority.
    137     /// \param item The item to insert.
    138     /// \param prio The priority of the item.
    139     /// \pre \e item must not be stored in the heap.
    140     void push (const Item& item, const Prio& prio) {
     132    /// \brief \c item gets to the heap with priority \c value independently
     133    /// if \c item was already there.
     134    ///
     135    /// This method calls \ref push(\c item, \c value) if \c item is not
     136    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
     137    /// \ref increase(\c item, \c value) otherwise.
     138    void set (const Item& item, const Prio& value) {
     139      int i=_iim[item];
     140      if ( i >= 0 && _data[i].in ) {
     141        if ( _comp(value, _data[i].prio) ) decrease(item, value);
     142        if ( _comp(_data[i].prio, value) ) increase(item, value);
     143      } else push(item, value);
     144    }
     145
     146    /// \brief Adds \c item to the heap with priority \c value.
     147    ///
     148    /// Adds \c item to the heap with priority \c value.
     149    /// \pre \c item must not be stored in the heap.
     150    void push (const Item& item, const Prio& value) {
    141151      int i=_iim[item];
    142152      if ( i < 0 ) {
     
    159169        _data[_minimum].right_neighbor=i;
    160170        _data[i].left_neighbor=_minimum;
    161         if ( _comp( prio, _data[_minimum].prio) ) _minimum=i;
     171        if ( _comp( value, _data[_minimum].prio) ) _minimum=i;
    162172      } else {
    163173        _data[i].right_neighbor=_data[i].left_neighbor=i;
    164174        _minimum=i;
    165175      }
    166       _data[i].prio=prio;
     176      _data[i].prio=value;
    167177      ++_num;
    168178    }
    169179
    170     /// \brief Return the item having minimum priority.
    171     ///
    172     /// This function returns the item having minimum priority.
    173     /// \pre The heap must be non-empty.
     180    /// \brief Returns the item with minimum priority relative to \c Compare.
     181    ///
     182    /// This method returns the item with minimum priority relative to \c
     183    /// Compare.
     184    /// \pre The heap must be nonempty.
    174185    Item top() const { return _data[_minimum].name; }
    175186
    176     /// \brief The minimum priority.
    177     ///
    178     /// This function returns the minimum priority.
    179     /// \pre The heap must be non-empty.
    180     Prio prio() const { return _data[_minimum].prio; }
    181 
    182     /// \brief Remove the item having minimum priority.
    183     ///
    184     /// This function removes the item having minimum priority.
     187    /// \brief Returns the minimum priority relative to \c Compare.
     188    ///
     189    /// It returns the minimum priority relative to \c Compare.
     190    /// \pre The heap must be nonempty.
     191    const Prio& prio() const { return _data[_minimum].prio; }
     192
     193    /// \brief Returns the priority of \c item.
     194    ///
     195    /// It returns the priority of \c item.
     196    /// \pre \c item must be in the heap.
     197    const Prio& operator[](const Item& item) const {
     198      return _data[_iim[item]].prio;
     199    }
     200
     201    /// \brief Deletes the item with minimum priority relative to \c Compare.
     202    ///
     203    /// This method deletes the item with minimum priority relative to \c
     204    /// Compare from the heap.
    185205    /// \pre The heap must be non-empty.
    186206    void pop() {
     
    189209        _data[_minimum].in=false;
    190210        if ( _data[_minimum].degree!=0 ) {
    191           makeRoot(_data[_minimum].child);
     211          makeroot(_data[_minimum].child);
    192212          _minimum=_data[_minimum].child;
    193213          balance();
     
    202222          int last_child=_data[child].left_neighbor;
    203223
    204           makeRoot(child);
     224          makeroot(child);
    205225
    206226          _data[left].right_neighbor=child;
     
    215235    }
    216236
    217     /// \brief Remove the given item from the heap.
    218     ///
    219     /// This function removes the given item from the heap if it is
    220     /// already stored.
    221     /// \param item The item to delete.
    222     /// \pre \e item must be in the heap.
     237    /// \brief Deletes \c item from the heap.
     238    ///
     239    /// This method deletes \c item from the heap, if \c item was already
     240    /// stored in the heap. It is quite inefficient in Fibonacci heaps.
    223241    void erase (const Item& item) {
    224242      int i=_iim[item];
     
    235253    }
    236254
    237     /// \brief The priority of the given item.
    238     ///
    239     /// This function returns the priority of the given item.
    240     /// \param item The item.
    241     /// \pre \e item must be in the heap.
    242     Prio operator[](const Item& item) const {
    243       return _data[_iim[item]].prio;
    244     }
    245 
    246     /// \brief Set the priority of an item or insert it, if it is
    247     /// not stored in the heap.
    248     ///
    249     /// This method sets the priority of the given item if it is
    250     /// already stored in the heap. Otherwise it inserts the given
    251     /// item into the heap with the given priority.
    252     /// \param item The item.
    253     /// \param prio The priority.
    254     void set (const Item& item, const Prio& prio) {
     255    /// \brief Decreases the priority of \c item to \c value.
     256    ///
     257    /// This method decreases the priority of \c item to \c value.
     258    /// \pre \c item must be stored in the heap with priority at least \c
     259    ///   value relative to \c Compare.
     260    void decrease (Item item, const Prio& value) {
    255261      int i=_iim[item];
    256       if ( i >= 0 && _data[i].in ) {
    257         if ( _comp(prio, _data[i].prio) ) decrease(item, prio);
    258         if ( _comp(_data[i].prio, prio) ) increase(item, prio);
    259       } else push(item, prio);
    260     }
    261 
    262     /// \brief Decrease the priority of an item to the given value.
    263     ///
    264     /// This function decreases the priority of an item to the given value.
    265     /// \param item The item.
    266     /// \param prio The priority.
    267     /// \pre \e item must be stored in the heap with priority at least \e prio.
    268     void decrease (const Item& item, const Prio& prio) {
    269       int i=_iim[item];
    270       _data[i].prio=prio;
     262      _data[i].prio=value;
    271263      int p=_data[i].parent;
    272264
    273       if ( p!=-1 && _comp(prio, _data[p].prio) ) {
     265      if ( p!=-1 && _comp(value, _data[p].prio) ) {
    274266        cut(i,p);
    275267        cascade(p);
    276268      }
    277       if ( _comp(prio, _data[_minimum].prio) ) _minimum=i;
    278     }
    279 
    280     /// \brief Increase the priority of an item to the given value.
    281     ///
    282     /// This function increases the priority of an item to the given value.
    283     /// \param item The item.
    284     /// \param prio The priority.
    285     /// \pre \e item must be stored in the heap with priority at most \e prio.
    286     void increase (const Item& item, const Prio& prio) {
     269      if ( _comp(value, _data[_minimum].prio) ) _minimum=i;
     270    }
     271
     272    /// \brief Increases the priority of \c item to \c value.
     273    ///
     274    /// This method sets the priority of \c item to \c value. Though
     275    /// there is no precondition on the priority of \c item, this
     276    /// method should be used only if it is indeed necessary to increase
     277    /// (relative to \c Compare) the priority of \c item, because this
     278    /// method is inefficient.
     279    void increase (Item item, const Prio& value) {
    287280      erase(item);
    288       push(item, prio);
    289     }
    290 
    291     /// \brief Return the state of an item.
    292     ///
    293     /// This method returns \c PRE_HEAP if the given item has never
    294     /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
    295     /// and \c POST_HEAP otherwise.
    296     /// In the latter case it is possible that the item will get back
    297     /// to the heap again.
    298     /// \param item The item.
     281      push(item, value);
     282    }
     283
     284
     285    /// \brief Returns if \c item is in, has already been in, or has never
     286    /// been in the heap.
     287    ///
     288    /// This method returns PRE_HEAP if \c item has never been in the
     289    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
     290    /// otherwise. In the latter case it is possible that \c item will
     291    /// get back to the heap again.
    299292    State state(const Item &item) const {
    300293      int i=_iim[item];
     
    306299    }
    307300
    308     /// \brief Set the state of an item in the heap.
    309     ///
    310     /// This function sets the state of the given item in the heap.
    311     /// It can be used to manually clear the heap when it is important
    312     /// to achive better time complexity.
     301    /// \brief Sets the state of the \c item in the heap.
     302    ///
     303    /// Sets the state of the \c item in the heap. It can be used to
     304    /// manually clear the heap when it is important to achive the
     305    /// better time _complexity.
    313306    /// \param i The item.
    314307    /// \param st The state. It should not be \c IN_HEAP.
     
    373366    }
    374367
    375     void makeRoot(int c) {
     368    void makeroot(int c) {
    376369      int s=c;
    377370      do {
  • lemon/full_graph.h

    r827 r825  
    2525///\ingroup graphs
    2626///\file
    27 ///\brief FullDigraph and FullGraph classes.
     27///\brief FullGraph and FullDigraph classes.
    2828
    2929namespace lemon {
     
    149149  /// \ingroup graphs
    150150  ///
    151   /// \brief A directed full graph class.
    152   ///
    153   /// FullDigraph is a simple and fast implmenetation of directed full
    154   /// (complete) graphs. It contains an arc from each node to each node
    155   /// (including a loop for each node), therefore the number of arcs
    156   /// is the square of the number of nodes.
    157   /// This class is completely static and it needs constant memory space.
    158   /// Thus you can neither add nor delete nodes or arcs, however
    159   /// the structure can be resized using resize().
    160   ///
    161   /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
    162   /// Most of its member functions and nested classes are documented
    163   /// only in the concept class.
    164   ///
    165   /// \note FullDigraph and FullGraph classes are very similar,
     151  /// \brief A full digraph class.
     152  ///
     153  /// This is a simple and fast directed full graph implementation.
     154  /// From each node go arcs to each node (including the source node),
     155  /// therefore the number of the arcs in the digraph is the square of
     156  /// the node number. This digraph type is completely static, so you
     157  /// can neither add nor delete either arcs or nodes, and it needs
     158  /// constant space in memory.
     159  ///
     160  /// This class fully conforms to the \ref concepts::Digraph
     161  /// "Digraph concept".
     162  ///
     163  /// The \c FullDigraph and \c FullGraph classes are very similar,
    166164  /// but there are two differences. While this class conforms only
    167   /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
    168   /// conforms to the \ref concepts::Graph "Graph" concept,
    169   /// moreover FullGraph does not contain a loop for each
    170   /// node as this class does.
     165  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
     166  /// class conforms to the \ref concepts::Graph "Graph" concept,
     167  /// moreover \c FullGraph does not contain a loop arc for each
     168  /// node as \c FullDigraph does.
    171169  ///
    172170  /// \sa FullGraph
     
    176174  public:
    177175
    178     /// \brief Default constructor.
    179     ///
    180     /// Default constructor. The number of nodes and arcs will be zero.
     176    /// \brief Constructor
    181177    FullDigraph() { construct(0); }
    182178
     
    189185    /// \brief Resizes the digraph
    190186    ///
    191     /// This function resizes the digraph. It fully destroys and
    192     /// rebuilds the structure, therefore the maps of the digraph will be
     187    /// Resizes the digraph. The function will fully destroy and
     188    /// rebuild the digraph. This cause that the maps of the digraph will
    193189    /// reallocated automatically and the previous values will be lost.
    194190    void resize(int n) {
     
    202198    /// \brief Returns the node with the given index.
    203199    ///
    204     /// Returns the node with the given index. Since this structure is
    205     /// completely static, the nodes can be indexed with integers from
    206     /// the range <tt>[0..nodeNum()-1]</tt>.
     200    /// Returns the node with the given index. Since it is a static
     201    /// digraph its nodes can be indexed with integers from the range
     202    /// <tt>[0..nodeNum()-1]</tt>.
    207203    /// \sa index()
    208204    Node operator()(int ix) const { return Parent::operator()(ix); }
     
    210206    /// \brief Returns the index of the given node.
    211207    ///
    212     /// Returns the index of the given node. Since this structure is
    213     /// completely static, the nodes can be indexed with integers from
    214     /// the range <tt>[0..nodeNum()-1]</tt>.
    215     /// \sa operator()()
     208    /// Returns the index of the given node. Since it is a static
     209    /// digraph its nodes can be indexed with integers from the range
     210    /// <tt>[0..nodeNum()-1]</tt>.
     211    /// \sa operator()
    216212    static int index(const Node& node) { return Parent::index(node); }
    217213
     
    219215    ///
    220216    /// Returns the arc connecting the given nodes.
    221     Arc arc(Node u, Node v) const {
     217    Arc arc(const Node& u, const Node& v) const {
    222218      return Parent::arc(u, v);
    223219    }
     
    525521  /// \brief An undirected full graph class.
    526522  ///
    527   /// FullGraph is a simple and fast implmenetation of undirected full
    528   /// (complete) graphs. It contains an edge between every distinct pair
    529   /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
    530   /// This class is completely static and it needs constant memory space.
    531   /// Thus you can neither add nor delete nodes or edges, however
    532   /// the structure can be resized using resize().
    533   ///
    534   /// This type fully conforms to the \ref concepts::Graph "Graph concept".
    535   /// Most of its member functions and nested classes are documented
    536   /// only in the concept class.
    537   ///
    538   /// \note FullDigraph and FullGraph classes are very similar,
    539   /// but there are two differences. While FullDigraph
     523  /// This is a simple and fast undirected full graph
     524  /// implementation. From each node go edge to each other node,
     525  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
     526  /// This graph type is completely static, so you can neither
     527  /// add nor delete either edges or nodes, and it needs constant
     528  /// space in memory.
     529  ///
     530  /// This class fully conforms to the \ref concepts::Graph "Graph concept".
     531  ///
     532  /// The \c FullGraph and \c FullDigraph classes are very similar,
     533  /// but there are two differences. While the \c FullDigraph class
    540534  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
    541535  /// this class conforms to the \ref concepts::Graph "Graph" concept,
    542   /// moreover this class does not contain a loop for each
    543   /// node as FullDigraph does.
     536  /// moreover \c FullGraph does not contain a loop arc for each
     537  /// node as \c FullDigraph does.
    544538  ///
    545539  /// \sa FullDigraph
     
    549543  public:
    550544
    551     /// \brief Default constructor.
    552     ///
    553     /// Default constructor. The number of nodes and edges will be zero.
     545    /// \brief Constructor
    554546    FullGraph() { construct(0); }
    555547
     
    562554    /// \brief Resizes the graph
    563555    ///
    564     /// This function resizes the graph. It fully destroys and
    565     /// rebuilds the structure, therefore the maps of the graph will be
     556    /// Resizes the graph. The function will fully destroy and
     557    /// rebuild the graph. This cause that the maps of the graph will
    566558    /// reallocated automatically and the previous values will be lost.
    567559    void resize(int n) {
     
    577569    /// \brief Returns the node with the given index.
    578570    ///
    579     /// Returns the node with the given index. Since this structure is
    580     /// completely static, the nodes can be indexed with integers from
    581     /// the range <tt>[0..nodeNum()-1]</tt>.
     571    /// Returns the node with the given index. Since it is a static
     572    /// graph its nodes can be indexed with integers from the range
     573    /// <tt>[0..nodeNum()-1]</tt>.
    582574    /// \sa index()
    583575    Node operator()(int ix) const { return Parent::operator()(ix); }
     
    585577    /// \brief Returns the index of the given node.
    586578    ///
    587     /// Returns the index of the given node. Since this structure is
    588     /// completely static, the nodes can be indexed with integers from
    589     /// the range <tt>[0..nodeNum()-1]</tt>.
    590     /// \sa operator()()
     579    /// Returns the index of the given node. Since it is a static
     580    /// graph its nodes can be indexed with integers from the range
     581    /// <tt>[0..nodeNum()-1]</tt>.
     582    /// \sa operator()
    591583    static int index(const Node& node) { return Parent::index(node); }
    592584
     
    594586    ///
    595587    /// Returns the arc connecting the given nodes.
    596     Arc arc(Node s, Node t) const {
     588    Arc arc(const Node& s, const Node& t) const {
    597589      return Parent::arc(s, t);
    598590    }
    599591
    600     /// \brief Returns the edge connecting the given nodes.
    601     ///
    602     /// Returns the edge connecting the given nodes.
    603     Edge edge(Node u, Node v) const {
     592    /// \brief Returns the edge connects the given nodes.
     593    ///
     594    /// Returns the edge connects the given nodes.
     595    Edge edge(const Node& u, const Node& v) const {
    604596      return Parent::edge(u, v);
    605597    }
  • lemon/glpk.cc

    r793 r623  
    5757    int i = glp_add_rows(lp, 1);
    5858    glp_set_row_bnds(lp, i, GLP_FR, 0.0, 0.0);
    59     return i;
    60   }
    61 
    62   int GlpkBase::_addRow(Value lo, ExprIterator b,
    63                         ExprIterator e, Value up) {
    64     int i = glp_add_rows(lp, 1);
    65 
    66     if (lo == -INF) {
    67       if (up == INF) {
    68         glp_set_row_bnds(lp, i, GLP_FR, lo, up);
    69       } else {
    70         glp_set_row_bnds(lp, i, GLP_UP, lo, up);
    71       }   
    72     } else {
    73       if (up == INF) {
    74         glp_set_row_bnds(lp, i, GLP_LO, lo, up);
    75       } else if (lo != up) {       
    76         glp_set_row_bnds(lp, i, GLP_DB, lo, up);
    77       } else {
    78         glp_set_row_bnds(lp, i, GLP_FX, lo, up);
    79       }
    80     }
    81 
    82     std::vector<int> indexes;
    83     std::vector<Value> values;
    84 
    85     indexes.push_back(0);
    86     values.push_back(0);
    87 
    88     for(ExprIterator it = b; it != e; ++it) {
    89       indexes.push_back(it->first);
    90       values.push_back(it->second);
    91     }
    92 
    93     glp_set_mat_row(lp, i, values.size() - 1,
    94                     &indexes.front(), &values.front());
    9559    return i;
    9660  }
  • lemon/glpk.h

    r793 r697  
    5555    virtual int _addCol();
    5656    virtual int _addRow();
    57     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    5857
    5958    virtual void _eraseCol(int i);
  • lemon/gomory_hu.h

    r760 r643  
    360360    /// \c t.
    361361    /// \code
    362     /// GomoryHu<Graph> gom(g, capacities);
     362    /// GomoruHu<Graph> gom(g, capacities);
    363363    /// gom.run();
    364364    /// int cnt=0;
    365     /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
     365    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
    366366    /// \endcode
    367367    class MinCutNodeIt
     
    457457    /// \c t.
    458458    /// \code
    459     /// GomoryHu<Graph> gom(g, capacities);
     459    /// GomoruHu<Graph> gom(g, capacities);
    460460    /// gom.run();
    461461    /// int value=0;
    462     /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
     462    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
    463463    ///   value+=capacities[e];
    464464    /// \endcode
  • lemon/grid_graph.h

    r782 r664  
    471471  /// \brief Grid graph class
    472472  ///
    473   /// GridGraph implements a special graph type. The nodes of the
    474   /// graph can be indexed by two integer values \c (i,j) where \c i is
    475   /// in the range <tt>[0..width()-1]</tt> and j is in the range
    476   /// <tt>[0..height()-1]</tt>. Two nodes are connected in the graph if
    477   /// the indices differ exactly on one position and the difference is
    478   /// also exactly one. The nodes of the graph can be obtained by position
    479   /// using the \c operator()() function and the indices of the nodes can
    480   /// be obtained using \c pos(), \c col() and \c row() members. The outgoing
     473  /// This class implements a special graph type. The nodes of the
     474  /// graph can be indexed by two integer \c (i,j) value where \c i is
     475  /// in the \c [0..width()-1] range and j is in the \c
     476  /// [0..height()-1] range. Two nodes are connected in the graph if
     477  /// the indexes differ exactly on one position and exactly one is
     478  /// the difference. The nodes of the graph can be indexed by position
     479  /// with the \c operator()() function. The positions of the nodes can be
     480  /// get with \c pos(), \c col() and \c row() members. The outgoing
    481481  /// arcs can be retrieved with the \c right(), \c up(), \c left()
    482482  /// and \c down() functions, where the bottom-left corner is the
    483483  /// origin.
    484   ///
    485   /// This class is completely static and it needs constant memory space.
    486   /// Thus you can neither add nor delete nodes or edges, however
    487   /// the structure can be resized using resize().
    488484  ///
    489485  /// \image html grid_graph.png
     
    501497  ///\endcode
    502498  ///
    503   /// This type fully conforms to the \ref concepts::Graph "Graph concept".
    504   /// Most of its member functions and nested classes are documented
    505   /// only in the concept class.
     499  /// This graph type fully conforms to the \ref concepts::Graph
     500  /// "Graph concept".
    506501  class GridGraph : public ExtendedGridGraphBase {
    507502    typedef ExtendedGridGraphBase Parent;
     
    509504  public:
    510505
    511     /// \brief Map to get the indices of the nodes as \ref dim2::Point
    512     /// "dim2::Point<int>".
    513     ///
    514     /// Map to get the indices of the nodes as \ref dim2::Point
    515     /// "dim2::Point<int>".
     506    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
     507    ///
     508    /// Map to get the indices of the nodes as dim2::Point<int>.
    516509    class IndexMap {
    517510    public:
     
    522515
    523516      /// \brief Constructor
     517      ///
     518      /// Constructor
    524519      IndexMap(const GridGraph& graph) : _graph(graph) {}
    525520
    526521      /// \brief The subscript operator
     522      ///
     523      /// The subscript operator.
    527524      Value operator[](Key key) const {
    528525        return _graph.pos(key);
     
    544541
    545542      /// \brief Constructor
     543      ///
     544      /// Constructor
    546545      ColMap(const GridGraph& graph) : _graph(graph) {}
    547546
    548547      /// \brief The subscript operator
     548      ///
     549      /// The subscript operator.
    549550      Value operator[](Key key) const {
    550551        return _graph.col(key);
     
    566567
    567568      /// \brief Constructor
     569      ///
     570      /// Constructor
    568571      RowMap(const GridGraph& graph) : _graph(graph) {}
    569572
    570573      /// \brief The subscript operator
     574      ///
     575      /// The subscript operator.
    571576      Value operator[](Key key) const {
    572577        return _graph.row(key);
     
    579584    /// \brief Constructor
    580585    ///
    581     /// Construct a grid graph with the given size.
     586    /// Construct a grid graph with given size.
    582587    GridGraph(int width, int height) { construct(width, height); }
    583588
    584     /// \brief Resizes the graph
    585     ///
    586     /// This function resizes the graph. It fully destroys and
    587     /// rebuilds the structure, therefore the maps of the graph will be
    588     /// reallocated automatically and the previous values will be lost.
     589    /// \brief Resize the graph
     590    ///
     591    /// Resize the graph. The function will fully destroy and rebuild
     592    /// the graph.  This cause that the maps of the graph will
     593    /// reallocated automatically and the previous values will be
     594    /// lost.
    589595    void resize(int width, int height) {
    590596      Parent::notifier(Arc()).clear();
     
    604610    }
    605611
    606     /// \brief The column index of the node.
     612    /// \brief Gives back the column index of the node.
    607613    ///
    608614    /// Gives back the column index of the node.
     
    611617    }
    612618
    613     /// \brief The row index of the node.
     619    /// \brief Gives back the row index of the node.
    614620    ///
    615621    /// Gives back the row index of the node.
     
    618624    }
    619625
    620     /// \brief The position of the node.
     626    /// \brief Gives back the position of the node.
    621627    ///
    622628    /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair.
     
    625631    }
    626632
    627     /// \brief The number of the columns.
     633    /// \brief Gives back the number of the columns.
    628634    ///
    629635    /// Gives back the number of the columns.
     
    632638    }
    633639
    634     /// \brief The number of the rows.
     640    /// \brief Gives back the number of the rows.
    635641    ///
    636642    /// Gives back the number of the rows.
     
    639645    }
    640646
    641     /// \brief The arc goes right from the node.
     647    /// \brief Gives back the arc goes right from the node.
    642648    ///
    643649    /// Gives back the arc goes right from the node. If there is not
     
    647653    }
    648654
    649     /// \brief The arc goes left from the node.
     655    /// \brief Gives back the arc goes left from the node.
    650656    ///
    651657    /// Gives back the arc goes left from the node. If there is not
     
    655661    }
    656662
    657     /// \brief The arc goes up from the node.
     663    /// \brief Gives back the arc goes up from the node.
    658664    ///
    659665    /// Gives back the arc goes up from the node. If there is not
     
    663669    }
    664670
    665     /// \brief The arc goes down from the node.
     671    /// \brief Gives back the arc goes down from the node.
    666672    ///
    667673    /// Gives back the arc goes down from the node. If there is not
  • lemon/hypercube_graph.h

    r827 r825  
    283283  /// \brief Hypercube graph class
    284284  ///
    285   /// HypercubeGraph implements a special graph type. The nodes of the
    286   /// graph are indexed with integers having at most \c dim binary digits.
     285  /// This class implements a special graph type. The nodes of the graph
     286  /// are indiced with integers with at most \c dim binary digits.
    287287  /// Two nodes are connected in the graph if and only if their indices
    288288  /// differ only on one position in the binary form.
    289   /// This class is completely static and it needs constant memory space.
    290   /// Thus you can neither add nor delete nodes or edges, however
    291   /// the structure can be resized using resize().
    292   ///
    293   /// This type fully conforms to the \ref concepts::Graph "Graph concept".
    294   /// Most of its member functions and nested classes are documented
    295   /// only in the concept class.
    296289  ///
    297290  /// \note The type of the indices is chosen to \c int for efficiency
    298291  /// reasons. Thus the maximum dimension of this implementation is 26
    299292  /// (assuming that the size of \c int is 32 bit).
     293  ///
     294  /// This graph type fully conforms to the \ref concepts::Graph
     295  /// "Graph concept".
    300296  class HypercubeGraph : public ExtendedHypercubeGraphBase {
    301297    typedef ExtendedHypercubeGraphBase Parent;
     
    307303    /// Constructs a hypercube graph with \c dim dimensions.
    308304    HypercubeGraph(int dim) { construct(dim); }
    309 
    310     /// \brief Resizes the graph
    311     ///
    312     /// This function resizes the graph. It fully destroys and
    313     /// rebuilds the structure, therefore the maps of the graph will be
    314     /// reallocated automatically and the previous values will be lost.
    315     void resize(int dim) {
    316       Parent::notifier(Arc()).clear();
    317       Parent::notifier(Edge()).clear();
    318       Parent::notifier(Node()).clear();
    319       construct(dim);
    320       Parent::notifier(Node()).build();
    321       Parent::notifier(Edge()).build();
    322       Parent::notifier(Arc()).build();
    323     }
    324305
    325306    /// \brief The number of dimensions.
     
    340321    ///
    341322    /// Gives back the dimension id of the given edge.
    342     /// It is in the range <tt>[0..dim-1]</tt>.
     323    /// It is in the [0..dim-1] range.
    343324    int dimension(Edge edge) const {
    344325      return Parent::dimension(edge);
     
    348329    ///
    349330    /// Gives back the dimension id of the given arc.
    350     /// It is in the range <tt>[0..dim-1]</tt>.
     331    /// It is in the [0..dim-1] range.
    351332    int dimension(Arc arc) const {
    352333      return Parent::dimension(arc);
  • lemon/list_graph.h

    r788 r664  
    2222///\ingroup graphs
    2323///\file
    24 ///\brief ListDigraph and ListGraph classes.
     24///\brief ListDigraph, ListGraph classes.
    2525
    2626#include <lemon/core.h>
     
    3232
    3333namespace lemon {
    34 
    35   class ListDigraph;
    3634
    3735  class ListDigraphBase {
     
    6563    class Node {
    6664      friend class ListDigraphBase;
    67       friend class ListDigraph;
    6865    protected:
    6966
     
    8178    class Arc {
    8279      friend class ListDigraphBase;
    83       friend class ListDigraph;
    8480    protected:
    8581
     
    121117      int n;
    122118      for(n = first_node;
    123           n != -1 && nodes[n].first_out == -1;
     119          n!=-1 && nodes[n].first_in == -1;
    124120          n = nodes[n].next) {}
    125       arc.id = (n == -1) ? -1 : nodes[n].first_out;
     121      arc.id = (n == -1) ? -1 : nodes[n].first_in;
    126122    }
    127123
    128124    void next(Arc& arc) const {
    129       if (arcs[arc.id].next_out != -1) {
    130         arc.id = arcs[arc.id].next_out;
     125      if (arcs[arc.id].next_in != -1) {
     126        arc.id = arcs[arc.id].next_in;
    131127      } else {
    132128        int n;
    133         for(n = nodes[arcs[arc.id].source].next;
    134             n != -1 && nodes[n].first_out == -1;
     129        for(n = nodes[arcs[arc.id].target].next;
     130            n!=-1 && nodes[n].first_in == -1;
    135131            n = nodes[n].next) {}
    136         arc.id = (n == -1) ? -1 : nodes[n].first_out;
     132        arc.id = (n == -1) ? -1 : nodes[n].first_in;
    137133      }
    138134    }
     
    316312  ///A general directed graph structure.
    317313
    318   ///\ref ListDigraph is a versatile and fast directed graph
    319   ///implementation based on linked lists that are stored in
     314  ///\ref ListDigraph is a simple and fast <em>directed graph</em>
     315  ///implementation based on static linked lists that are stored in
    320316  ///\c std::vector structures.
    321317  ///
    322   ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
    323   ///and it also provides several useful additional functionalities.
    324   ///Most of its member functions and nested classes are documented
     318  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
     319  ///also provides several useful additional functionalities.
     320  ///Most of the member functions and nested classes are documented
    325321  ///only in the concept class.
    326322  ///
    327323  ///\sa concepts::Digraph
    328   ///\sa ListGraph
     324
    329325  class ListDigraph : public ExtendedListDigraphBase {
    330326    typedef ExtendedListDigraphBase Parent;
    331327
    332328  private:
    333     /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
     329    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
     330
     331    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
     332    ///
    334333    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
    335     /// \brief Assignment of a digraph to another one is \e not allowed.
    336     /// Use DigraphCopy instead.
     334    ///\brief Assignment of ListDigraph to another one is \e not allowed.
     335    ///Use copyDigraph() instead.
     336
     337    ///Assignment of ListDigraph to another one is \e not allowed.
     338    ///Use copyDigraph() instead.
    337339    void operator=(const ListDigraph &) {}
    338340  public:
     
    346348    ///Add a new node to the digraph.
    347349
    348     ///This function adds a new node to the digraph.
     350    ///Add a new node to the digraph.
    349351    ///\return The new node.
    350352    Node addNode() { return Parent::addNode(); }
     
    352354    ///Add a new arc to the digraph.
    353355
    354     ///This function adds a new arc to the digraph with source node \c s
     356    ///Add a new arc to the digraph with source node \c s
    355357    ///and target node \c t.
    356358    ///\return The new arc.
    357     Arc addArc(Node s, Node t) {
     359    Arc addArc(const Node& s, const Node& t) {
    358360      return Parent::addArc(s, t);
    359361    }
     
    361363    ///\brief Erase a node from the digraph.
    362364    ///
    363     ///This function erases the given node from the digraph.
    364     void erase(Node n) { Parent::erase(n); }
     365    ///Erase a node from the digraph.
     366    ///
     367    void erase(const Node& n) { Parent::erase(n); }
    365368
    366369    ///\brief Erase an arc from the digraph.
    367370    ///
    368     ///This function erases the given arc from the digraph.
    369     void erase(Arc a) { Parent::erase(a); }
     371    ///Erase an arc from the digraph.
     372    ///
     373    void erase(const Arc& a) { Parent::erase(a); }
    370374
    371375    /// Node validity check
    372376
    373     /// This function gives back \c true if the given node is valid,
    374     /// i.e. it is a real node of the digraph.
    375     ///
    376     /// \warning A removed node could become valid again if new nodes are
    377     /// added to the digraph.
     377    /// This function gives back true if the given node is valid,
     378    /// ie. it is a real node of the graph.
     379    ///
     380    /// \warning A Node pointing to a removed item
     381    /// could become valid again later if new nodes are
     382    /// added to the graph.
    378383    bool valid(Node n) const { return Parent::valid(n); }
    379384
    380385    /// Arc validity check
    381386
    382     /// This function gives back \c true if the given arc is valid,
    383     /// i.e. it is a real arc of the digraph.
    384     ///
    385     /// \warning A removed arc could become valid again if new arcs are
    386     /// added to the digraph.
     387    /// This function gives back true if the given arc is valid,
     388    /// ie. it is a real arc of the graph.
     389    ///
     390    /// \warning An Arc pointing to a removed item
     391    /// could become valid again later if new nodes are
     392    /// added to the graph.
    387393    bool valid(Arc a) const { return Parent::valid(a); }
    388394
    389     /// Change the target node of an arc
    390 
    391     /// This function changes the target node of the given arc \c a to \c n.
    392     ///
    393     ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
    394     ///arc remain valid, however \c InArcIt iterators are invalidated.
     395    /// Change the target of \c a to \c n
     396
     397    /// Change the target of \c a to \c n
     398    ///
     399    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
     400    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
     401    ///invalidated.
    395402    ///
    396403    ///\warning This functionality cannot be used together with the Snapshot
     
    399406      Parent::changeTarget(a,n);
    400407    }
    401     /// Change the source node of an arc
    402 
    403     /// This function changes the source node of the given arc \c a to \c n.
    404     ///
    405     ///\note \c InArcIt iterators referencing the changed arc remain
    406     ///valid, however \c ArcIt and \c OutArcIt iterators are invalidated.
     408    /// Change the source of \c a to \c n
     409
     410    /// Change the source of \c a to \c n
     411    ///
     412    ///\note The <tt>InArcIt</tt>s referencing the changed arc remain
     413    ///valid. However the <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s are
     414    ///invalidated.
    407415    ///
    408416    ///\warning This functionality cannot be used together with the Snapshot
     
    412420    }
    413421
    414     /// Reverse the direction of an arc.
    415 
    416     /// This function reverses the direction of the given arc.
    417     ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
    418     ///the changed arc are invalidated.
     422    /// Invert the direction of an arc.
     423
     424    ///\note The <tt>ArcIt</tt>s referencing the changed arc remain
     425    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
     426    ///invalidated.
    419427    ///
    420428    ///\warning This functionality cannot be used together with the Snapshot
    421429    ///feature.
    422     void reverseArc(Arc a) {
    423       Node t=target(a);
    424       changeTarget(a,source(a));
    425       changeSource(a,t);
    426     }
     430    void reverseArc(Arc e) {
     431      Node t=target(e);
     432      changeTarget(e,source(e));
     433      changeSource(e,t);
     434    }
     435
     436    /// Reserve memory for nodes.
     437
     438    /// Using this function it is possible to avoid the superfluous memory
     439    /// allocation: if you know that the digraph you want to build will
     440    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     441    /// then it is worth reserving space for this amount before starting
     442    /// to build the digraph.
     443    /// \sa reserveArc
     444    void reserveNode(int n) { nodes.reserve(n); };
     445
     446    /// Reserve memory for arcs.
     447
     448    /// Using this function it is possible to avoid the superfluous memory
     449    /// allocation: if you know that the digraph you want to build will
     450    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     451    /// then it is worth reserving space for this amount before starting
     452    /// to build the digraph.
     453    /// \sa reserveNode
     454    void reserveArc(int m) { arcs.reserve(m); };
    427455
    428456    ///Contract two nodes.
    429457
    430     ///This function contracts the given two nodes.
    431     ///Node \c v is removed, but instead of deleting its
    432     ///incident arcs, they are joined to node \c u.
    433     ///If the last parameter \c r is \c true (this is the default value),
    434     ///then the newly created loops are removed.
    435     ///
    436     ///\note The moved arcs are joined to node \c u using changeSource()
    437     ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
    438     ///invalidated for the outgoing arcs of node \c v and \c InArcIt
    439     ///iterators are invalidated for the incomming arcs of \c v.
    440     ///Moreover all iterators referencing node \c v or the removed
    441     ///loops are also invalidated. Other iterators remain valid.
     458    ///This function contracts two nodes.
     459    ///Node \p b will be removed but instead of deleting
     460    ///incident arcs, they will be joined to \p a.
     461    ///The last parameter \p r controls whether to remove loops. \c true
     462    ///means that loops will be removed.
     463    ///
     464    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
     465    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
     466    ///may be invalidated.
    442467    ///
    443468    ///\warning This functionality cannot be used together with the Snapshot
    444469    ///feature.
    445     void contract(Node u, Node v, bool r = true)
     470    void contract(Node a, Node b, bool r = true)
    446471    {
    447       for(OutArcIt e(*this,v);e!=INVALID;) {
     472      for(OutArcIt e(*this,b);e!=INVALID;) {
    448473        OutArcIt f=e;
    449474        ++f;
    450         if(r && target(e)==u) erase(e);
    451         else changeSource(e,u);
     475        if(r && target(e)==a) erase(e);
     476        else changeSource(e,a);
    452477        e=f;
    453478      }
    454       for(InArcIt e(*this,v);e!=INVALID;) {
     479      for(InArcIt e(*this,b);e!=INVALID;) {
    455480        InArcIt f=e;
    456481        ++f;
    457         if(r && source(e)==u) erase(e);
    458         else changeTarget(e,u);
     482        if(r && source(e)==a) erase(e);
     483        else changeTarget(e,a);
    459484        e=f;
    460485      }
    461       erase(v);
     486      erase(b);
    462487    }
    463488
    464489    ///Split a node.
    465490
    466     ///This function splits the given node. First, a new node is added
    467     ///to the digraph, then the source of each outgoing arc of node \c n
    468     ///is moved to this new node.
    469     ///If the second parameter \c connect is \c true (this is the default
    470     ///value), then a new arc from node \c n to the newly created node
    471     ///is also added.
     491    ///This function splits a node. First a new node is added to the digraph,
     492    ///then the source of each outgoing arc of \c n is moved to this new node.
     493    ///If \c connect is \c true (this is the default value), then a new arc
     494    ///from \c n to the newly created node is also added.
    472495    ///\return The newly created node.
    473496    ///
    474     ///\note All iterators remain valid.
    475     ///
    476     ///\warning This functionality cannot be used together with the
     497    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
     498    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s may
     499    ///be invalidated.
     500    ///
     501    ///\warning This functionality cannot be used in conjunction with the
    477502    ///Snapshot feature.
    478503    Node split(Node n, bool connect = true) {
    479504      Node b = addNode();
    480       nodes[b.id].first_out=nodes[n.id].first_out;
    481       nodes[n.id].first_out=-1;
    482       for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {
    483         arcs[i].source=b.id;
     505      for(OutArcIt e(*this,n);e!=INVALID;) {
     506        OutArcIt f=e;
     507        ++f;
     508        changeSource(e,b);
     509        e=f;
    484510      }
    485511      if (connect) addArc(n,b);
     
    489515    ///Split an arc.
    490516
    491     ///This function splits the given arc. First, a new node \c v is
    492     ///added to the digraph, then the target node of the original arc
    493     ///is set to \c v. Finally, an arc from \c v to the original target
    494     ///is added.
     517    ///This function splits an arc. First a new node \c b is added to
     518    ///the digraph, then the original arc is re-targeted to \c
     519    ///b. Finally an arc from \c b to the original target is added.
     520    ///
    495521    ///\return The newly created node.
    496     ///
    497     ///\note \c InArcIt iterators referencing the original arc are
    498     ///invalidated. Other iterators remain valid.
    499522    ///
    500523    ///\warning This functionality cannot be used together with the
    501524    ///Snapshot feature.
    502     Node split(Arc a) {
    503       Node v = addNode();
    504       addArc(v,target(a));
    505       changeTarget(a,v);
    506       return v;
    507     }
    508 
    509     ///Clear the digraph.
    510 
    511     ///This function erases all nodes and arcs from the digraph.
    512     ///
    513     void clear() {
    514       Parent::clear();
    515     }
    516 
    517     /// Reserve memory for nodes.
    518 
    519     /// Using this function, it is possible to avoid superfluous memory
    520     /// allocation: if you know that the digraph you want to build will
    521     /// be large (e.g. it will contain millions of nodes and/or arcs),
    522     /// then it is worth reserving space for this amount before starting
    523     /// to build the digraph.
    524     /// \sa reserveArc()
    525     void reserveNode(int n) { nodes.reserve(n); };
    526 
    527     /// Reserve memory for arcs.
    528 
    529     /// Using this function, it is possible to avoid superfluous memory
    530     /// allocation: if you know that the digraph you want to build will
    531     /// be large (e.g. it will contain millions of nodes and/or arcs),
    532     /// then it is worth reserving space for this amount before starting
    533     /// to build the digraph.
    534     /// \sa reserveNode()
    535     void reserveArc(int m) { arcs.reserve(m); };
     525    Node split(Arc e) {
     526      Node b = addNode();
     527      addArc(b,target(e));
     528      changeTarget(e,b);
     529      return b;
     530    }
    536531
    537532    /// \brief Class to make a snapshot of the digraph and restore
     
    543538    /// restore() function.
    544539    ///
    545     /// \note After a state is restored, you cannot restore a later state,
    546     /// i.e. you cannot add the removed nodes and arcs again using
    547     /// another Snapshot instance.
    548     ///
    549     /// \warning Node and arc deletions and other modifications (e.g.
    550     /// reversing, contracting, splitting arcs or nodes) cannot be
     540    /// \warning Arc and node deletions and other modifications (e.g.
     541    /// contracting, splitting, reversing arcs or nodes) cannot be
    551542    /// restored. These events invalidate the snapshot.
    552     /// However the arcs and nodes that were added to the digraph after
    553     /// making the current snapshot can be removed without invalidating it.
    554543    class Snapshot {
    555544    protected:
     
    721710      ///
    722711      /// Default constructor.
    723       /// You have to call save() to actually make a snapshot.
     712      /// To actually make a snapshot you must call save().
    724713      Snapshot()
    725714        : digraph(0), node_observer_proxy(*this),
     
    728717      /// \brief Constructor that immediately makes a snapshot.
    729718      ///
    730       /// This constructor immediately makes a snapshot of the given digraph.
    731       Snapshot(ListDigraph &gr)
     719      /// This constructor immediately makes a snapshot of the digraph.
     720      /// \param _digraph The digraph we make a snapshot of.
     721      Snapshot(ListDigraph &_digraph)
    732722        : node_observer_proxy(*this),
    733723          arc_observer_proxy(*this) {
    734         attach(gr);
     724        attach(_digraph);
    735725      }
    736726
    737727      /// \brief Make a snapshot.
    738728      ///
    739       /// This function makes a snapshot of the given digraph.
    740       /// It can be called more than once. In case of a repeated
     729      /// Make a snapshot of the digraph.
     730      ///
     731      /// This function can be called more than once. In case of a repeated
    741732      /// call, the previous snapshot gets lost.
    742       void save(ListDigraph &gr) {
     733      /// \param _digraph The digraph we make the snapshot of.
     734      void save(ListDigraph &_digraph) {
    743735        if (attached()) {
    744736          detach();
    745737          clear();
    746738        }
    747         attach(gr);
     739        attach(_digraph);
    748740      }
    749741
    750742      /// \brief Undo the changes until the last snapshot.
    751       ///
    752       /// This function undos the changes until the last snapshot
    753       /// created by save() or Snapshot(ListDigraph&).
    754       ///
    755       /// \warning This method invalidates the snapshot, i.e. repeated
    756       /// restoring is not supported unless you call save() again.
     743      //
     744      /// Undo the changes until the last snapshot created by save().
    757745      void restore() {
    758746        detach();
     
    768756      }
    769757
    770       /// \brief Returns \c true if the snapshot is valid.
     758      /// \brief Gives back true when the snapshot is valid.
    771759      ///
    772       /// This function returns \c true if the snapshot is valid.
     760      /// Gives back true when the snapshot is valid.
    773761      bool valid() const {
    774762        return attached();
     
    807795
    808796    typedef ListGraphBase Graph;
     797
     798    class Node;
     799    class Arc;
     800    class Edge;
    809801
    810802    class Node {
     
    856848      bool operator<(const Arc& arc) const {return id < arc.id;}
    857849    };
     850
     851
    858852
    859853    ListGraphBase()
     
    11711165  ///A general undirected graph structure.
    11721166
    1173   ///\ref ListGraph is a versatile and fast undirected graph
    1174   ///implementation based on linked lists that are stored in
     1167  ///\ref ListGraph is a simple and fast <em>undirected graph</em>
     1168  ///implementation based on static linked lists that are stored in
    11751169  ///\c std::vector structures.
    11761170  ///
    1177   ///This type fully conforms to the \ref concepts::Graph "Graph concept"
    1178   ///and it also provides several useful additional functionalities.
    1179   ///Most of its member functions and nested classes are documented
     1171  ///It conforms to the \ref concepts::Graph "Graph concept" and it
     1172  ///also provides several useful additional functionalities.
     1173  ///Most of the member functions and nested classes are documented
    11801174  ///only in the concept class.
    11811175  ///
    11821176  ///\sa concepts::Graph
    1183   ///\sa ListDigraph
     1177
    11841178  class ListGraph : public ExtendedListGraphBase {
    11851179    typedef ExtendedListGraphBase Parent;
    11861180
    11871181  private:
    1188     /// Graphs are \e not copy constructible. Use GraphCopy instead.
     1182    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
     1183
     1184    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
     1185    ///
    11891186    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
    1190     /// \brief Assignment of a graph to another one is \e not allowed.
    1191     /// Use GraphCopy instead.
     1187    ///\brief Assignment of ListGraph to another one is \e not allowed.
     1188    ///Use copyGraph() instead.
     1189
     1190    ///Assignment of ListGraph to another one is \e not allowed.
     1191    ///Use copyGraph() instead.
    11921192    void operator=(const ListGraph &) {}
    11931193  public:
     
    12021202    /// \brief Add a new node to the graph.
    12031203    ///
    1204     /// This function adds a new node to the graph.
     1204    /// Add a new node to the graph.
    12051205    /// \return The new node.
    12061206    Node addNode() { return Parent::addNode(); }
     
    12081208    /// \brief Add a new edge to the graph.
    12091209    ///
    1210     /// This function adds a new edge to the graph between nodes
    1211     /// \c u and \c v with inherent orientation from node \c u to
    1212     /// node \c v.
     1210    /// Add a new edge to the graph with source node \c s
     1211    /// and target node \c t.
    12131212    /// \return The new edge.
    1214     Edge addEdge(Node u, Node v) {
    1215       return Parent::addEdge(u, v);
    1216     }
    1217 
    1218     ///\brief Erase a node from the graph.
    1219     ///
    1220     /// This function erases the given node from the graph.
    1221     void erase(Node n) { Parent::erase(n); }
    1222 
    1223     ///\brief Erase an edge from the graph.
    1224     ///
    1225     /// This function erases the given edge from the graph.
    1226     void erase(Edge e) { Parent::erase(e); }
     1213    Edge addEdge(const Node& s, const Node& t) {
     1214      return Parent::addEdge(s, t);
     1215    }
     1216
     1217    /// \brief Erase a node from the graph.
     1218    ///
     1219    /// Erase a node from the graph.
     1220    ///
     1221    void erase(const Node& n) { Parent::erase(n); }
     1222
     1223    /// \brief Erase an edge from the graph.
     1224    ///
     1225    /// Erase an edge from the graph.
     1226    ///
     1227    void erase(const Edge& e) { Parent::erase(e); }
    12271228    /// Node validity check
    12281229
    1229     /// This function gives back \c true if the given node is valid,
    1230     /// i.e. it is a real node of the graph.
    1231     ///
    1232     /// \warning A removed node could become valid again if new nodes are
     1230    /// This function gives back true if the given node is valid,
     1231    /// ie. it is a real node of the graph.
     1232    ///
     1233    /// \warning A Node pointing to a removed item
     1234    /// could become valid again later if new nodes are
    12331235    /// added to the graph.
    12341236    bool valid(Node n) const { return Parent::valid(n); }
     1237    /// Arc validity check
     1238
     1239    /// This function gives back true if the given arc is valid,
     1240    /// ie. it is a real arc of the graph.
     1241    ///
     1242    /// \warning An Arc pointing to a removed item
     1243    /// could become valid again later if new edges are
     1244    /// added to the graph.
     1245    bool valid(Arc a) const { return Parent::valid(a); }
    12351246    /// Edge validity check
    12361247
    1237     /// This function gives back \c true if the given edge is valid,
    1238     /// i.e. it is a real edge of the graph.
    1239     ///
    1240     /// \warning A removed edge could become valid again if new edges are
     1248    /// This function gives back true if the given edge is valid,
     1249    /// ie. it is a real arc of the graph.
     1250    ///
     1251    /// \warning A Edge pointing to a removed item
     1252    /// could become valid again later if new edges are
    12411253    /// added to the graph.
    12421254    bool valid(Edge e) const { return Parent::valid(e); }
    1243     /// Arc validity check
    1244 
    1245     /// This function gives back \c true if the given arc is valid,
    1246     /// i.e. it is a real arc of the graph.
    1247     ///
    1248     /// \warning A removed arc could become valid again if new edges are
    1249     /// added to the graph.
    1250     bool valid(Arc a) const { return Parent::valid(a); }
    1251 
    1252     /// \brief Change the first node of an edge.
    1253     ///
    1254     /// This function changes the first node of the given edge \c e to \c n.
    1255     ///
    1256     ///\note \c EdgeIt and \c ArcIt iterators referencing the
    1257     ///changed edge are invalidated and all other iterators whose
    1258     ///base node is the changed node are also invalidated.
     1255    /// \brief Change the end \c u of \c e to \c n
     1256    ///
     1257    /// This function changes the end \c u of \c e to node \c n.
     1258    ///
     1259    ///\note The <tt>EdgeIt</tt>s and <tt>ArcIt</tt>s referencing the
     1260    ///changed edge are invalidated and if the changed node is the
     1261    ///base node of an iterator then this iterator is also
     1262    ///invalidated.
    12591263    ///
    12601264    ///\warning This functionality cannot be used together with the
     
    12631267      Parent::changeU(e,n);
    12641268    }
    1265     /// \brief Change the second node of an edge.
    1266     ///
    1267     /// This function changes the second node of the given edge \c e to \c n.
    1268     ///
    1269     ///\note \c EdgeIt iterators referencing the changed edge remain
    1270     ///valid, however \c ArcIt iterators referencing the changed edge and
    1271     ///all other iterators whose base node is the changed node are also
    1272     ///invalidated.
     1269    /// \brief Change the end \c v of \c e to \c n
     1270    ///
     1271    /// This function changes the end \c v of \c e to \c n.
     1272    ///
     1273    ///\note The <tt>EdgeIt</tt>s referencing the changed edge remain
     1274    ///valid, however <tt>ArcIt</tt>s and if the changed node is the
     1275    ///base node of an iterator then this iterator is invalidated.
    12731276    ///
    12741277    ///\warning This functionality cannot be used together with the
     
    12771280      Parent::changeV(e,n);
    12781281    }
    1279 
    12801282    /// \brief Contract two nodes.
    12811283    ///
    1282     /// This function contracts the given two nodes.
    1283     /// Node \c b is removed, but instead of deleting
    1284     /// its incident edges, they are joined to node \c a.
    1285     /// If the last parameter \c r is \c true (this is the default value),
    1286     /// then the newly created loops are removed.
    1287     ///
    1288     /// \note The moved edges are joined to node \c a using changeU()
    1289     /// or changeV(), thus all edge and arc iterators whose base node is
    1290     /// \c b are invalidated.
    1291     /// Moreover all iterators referencing node \c b or the removed
    1292     /// loops are also invalidated. Other iterators remain valid.
     1284    /// This function contracts two nodes.
     1285    /// Node \p b will be removed but instead of deleting
     1286    /// its neighboring arcs, they will be joined to \p a.
     1287    /// The last parameter \p r controls whether to remove loops. \c true
     1288    /// means that loops will be removed.
     1289    ///
     1290    /// \note The <tt>ArcIt</tt>s referencing a moved arc remain
     1291    /// valid.
    12931292    ///
    12941293    ///\warning This functionality cannot be used together with the
     
    13091308    }
    13101309
    1311     ///Clear the graph.
    1312 
    1313     ///This function erases all nodes and arcs from the graph.
    1314     ///
    1315     void clear() {
    1316       Parent::clear();
    1317     }
    1318 
    1319     /// Reserve memory for nodes.
    1320 
    1321     /// Using this function, it is possible to avoid superfluous memory
    1322     /// allocation: if you know that the graph you want to build will
    1323     /// be large (e.g. it will contain millions of nodes and/or edges),
    1324     /// then it is worth reserving space for this amount before starting
    1325     /// to build the graph.
    1326     /// \sa reserveEdge()
    1327     void reserveNode(int n) { nodes.reserve(n); };
    1328 
    1329     /// Reserve memory for edges.
    1330 
    1331     /// Using this function, it is possible to avoid superfluous memory
    1332     /// allocation: if you know that the graph you want to build will
    1333     /// be large (e.g. it will contain millions of nodes and/or edges),
    1334     /// then it is worth reserving space for this amount before starting
    1335     /// to build the graph.
    1336     /// \sa reserveNode()
    1337     void reserveEdge(int m) { arcs.reserve(2 * m); };
    13381310
    13391311    /// \brief Class to make a snapshot of the graph and restore
     
    13451317    /// using the restore() function.
    13461318    ///
    1347     /// \note After a state is restored, you cannot restore a later state,
    1348     /// i.e. you cannot add the removed nodes and edges again using
    1349     /// another Snapshot instance.
    1350     ///
    1351     /// \warning Node and edge deletions and other modifications
    1352     /// (e.g. changing the end-nodes of edges or contracting nodes)
    1353     /// cannot be restored. These events invalidate the snapshot.
    1354     /// However the edges and nodes that were added to the graph after
    1355     /// making the current snapshot can be removed without invalidating it.
     1319    /// \warning Edge and node deletions and other modifications
     1320    /// (e.g. changing nodes of edges, contracting nodes) cannot be
     1321    /// restored. These events invalidate the snapshot.
    13561322    class Snapshot {
    13571323    protected:
     
    15231489      ///
    15241490      /// Default constructor.
    1525       /// You have to call save() to actually make a snapshot.
     1491      /// To actually make a snapshot you must call save().
    15261492      Snapshot()
    15271493        : graph(0), node_observer_proxy(*this),
     
    15301496      /// \brief Constructor that immediately makes a snapshot.
    15311497      ///
    1532       /// This constructor immediately makes a snapshot of the given graph.
    1533       Snapshot(ListGraph &gr)
     1498      /// This constructor immediately makes a snapshot of the graph.
     1499      /// \param _graph The graph we make a snapshot of.
     1500      Snapshot(ListGraph &_graph)
    15341501        : node_observer_proxy(*this),
    15351502          edge_observer_proxy(*this) {
    1536         attach(gr);
     1503        attach(_graph);
    15371504      }
    15381505
    15391506      /// \brief Make a snapshot.
    15401507      ///
    1541       /// This function makes a snapshot of the given graph.
    1542       /// It can be called more than once. In case of a repeated
     1508      /// Make a snapshot of the graph.
     1509      ///
     1510      /// This function can be called more than once. In case of a repeated
    15431511      /// call, the previous snapshot gets lost.
    1544       void save(ListGraph &gr) {
     1512      /// \param _graph The graph we make the snapshot of.
     1513      void save(ListGraph &_graph) {
    15451514        if (attached()) {
    15461515          detach();
    15471516          clear();
    15481517        }
    1549         attach(gr);
     1518        attach(_graph);
    15501519      }
    15511520
    15521521      /// \brief Undo the changes until the last snapshot.
    1553       ///
    1554       /// This function undos the changes until the last snapshot
    1555       /// created by save() or Snapshot(ListGraph&).
    1556       ///
    1557       /// \warning This method invalidates the snapshot, i.e. repeated
    1558       /// restoring is not supported unless you call save() again.
     1522      //
     1523      /// Undo the changes until the last snapshot created by save().
    15591524      void restore() {
    15601525        detach();
     
    15701535      }
    15711536
    1572       /// \brief Returns \c true if the snapshot is valid.
     1537      /// \brief Gives back true when the snapshot is valid.
    15731538      ///
    1574       /// This function returns \c true if the snapshot is valid.
     1539      /// Gives back true when the snapshot is valid.
    15751540      bool valid() const {
    15761541        return attached();
  • lemon/lp_base.h

    r793 r631  
    944944    virtual int _addRow() = 0;
    945945
    946     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
    947       int row = _addRow();
    948       _setRowCoeffs(row, b, e);
    949       _setRowLowerBound(row, l);
    950       _setRowUpperBound(row, u);
    951       return row;
    952     }
    953 
    954946    virtual void _eraseCol(int col) = 0;
    955947    virtual void _eraseRow(int row) = 0;
     
    12161208    ///\return The created row.
    12171209    Row addRow(Value l,const Expr &e, Value u) {
    1218       Row r;
    1219       e.simplify();
    1220       r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
    1221                                 ExprIterator(e.comps.end(), cols), u - *e));
     1210      Row r=addRow();
     1211      row(r,l,e,u);
    12221212      return r;
    12231213    }
     
    12281218    ///\return The created row.
    12291219    Row addRow(const Constr &c) {
    1230       Row r;
    1231       c.expr().simplify();
    1232       r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound():-INF,
    1233                                 ExprIterator(c.expr().comps.begin(), cols),
    1234                                 ExprIterator(c.expr().comps.end(), cols),
    1235                                 c.upperBounded()?c.upperBound():INF));
     1220      Row r=addRow();
     1221      row(r,c);
    12361222      return r;
    12371223    }
  • lemon/lp_skeleton.cc

    r793 r623  
    2929
    3030  int SkeletonSolverBase::_addRow()
    31   {
    32     return ++row_num;
    33   }
    34 
    35   int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value)
    3631  {
    3732    return ++row_num;
  • lemon/lp_skeleton.h

    r793 r623  
    4545    /// \e
    4646    virtual int _addRow();
    47     /// \e
    48     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    4947    /// \e
    5048    virtual void _eraseCol(int i);
  • lemon/maps.h

    r773 r731  
    2323#include <functional>
    2424#include <vector>
    25 #include <map>
    2625
    2726#include <lemon/core.h>
     
    3029///\ingroup maps
    3130///\brief Miscellaneous property maps
     31
     32#include <map>
    3233
    3334namespace lemon {
     
    5758  /// but data written to it is not required (i.e. it will be sent to
    5859  /// <tt>/dev/null</tt>).
    59   /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
     60  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    6061  ///
    6162  /// \sa ConstMap
     
    9091  ///
    9192  /// In other aspects it is equivalent to \c NullMap.
    92   /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
     93  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    9394  /// concept, but it absorbs the data written to it.
    9495  ///
     
    159160  ///
    160161  /// In other aspects it is equivalent to \c NullMap.
    161   /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
     162  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    162163  /// concept, but it absorbs the data written to it.
    163164  ///
     
    233234  /// It can be used with some data structures, for example
    234235  /// \c UnionFind, \c BinHeap, when the used items are small
    235   /// integers. This map conforms to the \ref concepts::ReferenceMap
     236  /// integers. This map conforms the \ref concepts::ReferenceMap
    236237  /// "ReferenceMap" concept.
    237238  ///
     
    341342  /// stored actually. This value can be different from the default
    342343  /// contructed value (i.e. \c %Value()).
    343   /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
     344  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
    344345  /// concept.
    345346  ///
     
    707708  /// The \c Key type of it is inherited from \c M and the \c Value
    708709  /// type is \c V.
    709   /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
     710  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
    710711  ///
    711712  /// The simplest way of using this map is through the convertMap()
     
    17901791  /// \code
    17911792  ///   std::vector<Node> v;
    1792   ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
     1793  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
    17931794  /// \endcode
    17941795  /// \code
    17951796  ///   std::vector<Node> v(countNodes(g));
    1796   ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
     1797  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
    17971798  /// \endcode
    17981799  ///
     
    18181819  ///
    18191820  /// IdMap provides a unique and immutable id for each item of the
    1820   /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
     1821  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
    18211822  ///  - \b unique: different items get different ids,
    18221823  ///  - \b immutable: the id of an item does not change (even if you
     
    18261827  /// the items stored in the graph, which is returned by the \c id()
    18271828  /// function of the graph. This map can be inverted with its member
    1828   /// class \c InverseMap or with the \c operator()() member.
     1829  /// class \c InverseMap or with the \c operator() member.
    18291830  ///
    18301831  /// \tparam GR The graph type.
     
    18661867  public:
    18671868
    1868     /// \brief The inverse map type of IdMap.
    1869     ///
    1870     /// The inverse map type of IdMap. The subscript operator gives back
    1871     /// an item by its id.
    1872     /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
     1869    /// \brief This class represents the inverse of its owner (IdMap).
     1870    ///
     1871    /// This class represents the inverse of its owner (IdMap).
    18731872    /// \see inverse()
    18741873    class InverseMap {
     
    18851884      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
    18861885
    1887       /// \brief Gives back an item by its id.
     1886      /// \brief Gives back the given item from its id.
    18881887      ///
    1889       /// Gives back an item by its id.
     1888      /// Gives back the given item from its id.
    18901889      Item operator[](int id) const { return _graph->fromId(id, Item());}
    18911890
     
    19001899  };
    19011900
    1902   /// \brief Returns an \c IdMap class.
    1903   ///
    1904   /// This function just returns an \c IdMap class.
    1905   /// \relates IdMap
    1906   template <typename K, typename GR>
    1907   inline IdMap<GR, K> idMap(const GR& graph) {
    1908     return IdMap<GR, K>(graph);
    1909   }
    19101901
    19111902  /// \brief General cross reference graph map type.
     
    19141905  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
    19151906  /// and if a key is set to a new value, then stores it in the inverse map.
    1916   /// The graph items can be accessed by their values either using
    1917   /// \c InverseMap or \c operator()(), and the values of the map can be
    1918   /// accessed with an STL compatible forward iterator (\c ValueIt).
    1919   ///
    1920   /// This map is intended to be used when all associated values are
    1921   /// different (the map is actually invertable) or there are only a few
    1922   /// items with the same value.
    1923   /// Otherwise consider to use \c IterableValueMap, which is more
    1924   /// suitable and more efficient for such cases. It provides iterators
    1925   /// to traverse the items with the same associated value, however
    1926   /// it does not have \c InverseMap.
     1907  /// The values of the map can be accessed
     1908  /// with stl compatible forward iterator.
    19271909  ///
    19281910  /// This type is not reference map, so it cannot be modified with
     
    19651947    /// \brief Forward iterator for values.
    19661948    ///
    1967     /// This iterator is an STL compatible forward
     1949    /// This iterator is an stl compatible forward
    19681950    /// iterator on the values of the map. The values can
    19691951    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
    19701952    /// They are considered with multiplicity, so each value is
    19711953    /// traversed for each item it is assigned to.
    1972     class ValueIt
     1954    class ValueIterator
    19731955      : public std::iterator<std::forward_iterator_tag, Value> {
    19741956      friend class CrossRefMap;
    19751957    private:
    1976       ValueIt(typename Container::const_iterator _it)
     1958      ValueIterator(typename Container::const_iterator _it)
    19771959        : it(_it) {}
    19781960    public:
    19791961
    1980       /// Constructor
    1981       ValueIt() {}
    1982 
    1983       /// \e
    1984       ValueIt& operator++() { ++it; return *this; }
    1985       /// \e
    1986       ValueIt operator++(int) {
    1987         ValueIt tmp(*this);
     1962      ValueIterator() {}
     1963
     1964      ValueIterator& operator++() { ++it; return *this; }
     1965      ValueIterator operator++(int) {
     1966        ValueIterator tmp(*this);
    19881967        operator++();
    19891968        return tmp;
    19901969      }
    19911970
    1992       /// \e
    19931971      const Value& operator*() const { return it->first; }
    1994       /// \e
    19951972      const Value* operator->() const { return &(it->first); }
    19961973
    1997       /// \e
    1998       bool operator==(ValueIt jt) const { return it == jt.it; }
    1999       /// \e
    2000       bool operator!=(ValueIt jt) const { return it != jt.it; }
     1974      bool operator==(ValueIterator jt) const { return it == jt.it; }
     1975      bool operator!=(ValueIterator jt) const { return it != jt.it; }
    20011976
    20021977    private:
    20031978      typename Container::const_iterator it;
    20041979    };
    2005    
    2006     /// Alias for \c ValueIt
    2007     typedef ValueIt ValueIterator;
    20081980
    20091981    /// \brief Returns an iterator to the first value.
    20101982    ///
    2011     /// Returns an STL compatible iterator to the
     1983    /// Returns an stl compatible iterator to the
    20121984    /// first value of the map. The values of the
    20131985    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
    20141986    /// range.
    2015     ValueIt beginValue() const {
    2016       return ValueIt(_inv_map.begin());
     1987    ValueIterator beginValue() const {
     1988      return ValueIterator(_inv_map.begin());
    20171989    }
    20181990
    20191991    /// \brief Returns an iterator after the last value.
    20201992    ///
    2021     /// Returns an STL compatible iterator after the
     1993    /// Returns an stl compatible iterator after the
    20221994    /// last value of the map. The values of the
    20231995    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
    20241996    /// range.
    2025     ValueIt endValue() const {
    2026       return ValueIt(_inv_map.end());
     1997    ValueIterator endValue() const {
     1998      return ValueIterator(_inv_map.end());
    20271999    }
    20282000
     
    20612033      typename Container::const_iterator it = _inv_map.find(val);
    20622034      return it != _inv_map.end() ? it->second : INVALID;
    2063     }
    2064    
    2065     /// \brief Returns the number of items with the given value.
    2066     ///
    2067     /// This function returns the number of items with the given value
    2068     /// associated with it.
    2069     int count(const Value &val) const {
    2070       return _inv_map.count(val);
    20712035    }
    20722036
     
    21202084  public:
    21212085
    2122     /// \brief The inverse map type of CrossRefMap.
    2123     ///
    2124     /// The inverse map type of CrossRefMap. The subscript operator gives
    2125     /// back an item by its value.
    2126     /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
    2127     /// \see inverse()
     2086    /// \brief The inverse map type.
     2087    ///
     2088    /// The inverse of this map. The subscript operator of the map
     2089    /// gives back the item that was last assigned to the value.
    21282090    class InverseMap {
    21292091    public:
     
    21522114    };
    21532115
    2154     /// \brief Gives back the inverse of the map.
    2155     ///
    2156     /// Gives back the inverse of the CrossRefMap.
     2116    /// \brief It gives back the read-only inverse map.
     2117    ///
     2118    /// It gives back the read-only inverse map.
    21572119    InverseMap inverse() const {
    21582120      return InverseMap(*this);
     
    21612123  };
    21622124
    2163   /// \brief Provides continuous and unique id for the
     2125  /// \brief Provides continuous and unique ID for the
    21642126  /// items of a graph.
    21652127  ///
    21662128  /// RangeIdMap provides a unique and continuous
    2167   /// id for each item of a given type (\c Node, \c Arc or
     2129  /// ID for each item of a given type (\c Node, \c Arc or
    21682130  /// \c Edge) in a graph. This id is
    21692131  ///  - \b unique: different items get different ids,
     
    21762138  /// the \c id() function of the graph or \ref IdMap.
    21772139  /// This map can be inverted with its member class \c InverseMap,
    2178   /// or with the \c operator()() member.
     2140  /// or with the \c operator() member.
    21792141  ///
    21802142  /// \tparam GR The graph type.
     
    23042266    }
    23052267
    2306     /// \brief Gives back the \e range \e id of the item
    2307     ///
    2308     /// Gives back the \e range \e id of the item.
     2268    /// \brief Gives back the \e RangeId of the item
     2269    ///
     2270    /// Gives back the \e RangeId of the item.
    23092271    int operator[](const Item& item) const {
    23102272      return Map::operator[](item);
    23112273    }
    23122274
    2313     /// \brief Gives back the item belonging to a \e range \e id
    2314     ///
    2315     /// Gives back the item belonging to the given \e range \e id.
     2275    /// \brief Gives back the item belonging to a \e RangeId
     2276    /// 
     2277    /// Gives back the item belonging to a \e RangeId.
    23162278    Item operator()(int id) const {
    23172279      return _inv_map[id];
     
    23272289    /// \brief The inverse map type of RangeIdMap.
    23282290    ///
    2329     /// The inverse map type of RangeIdMap. The subscript operator gives
    2330     /// back an item by its \e range \e id.
    2331     /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
     2291    /// The inverse map type of RangeIdMap.
    23322292    class InverseMap {
    23332293    public:
     
    23472307      ///
    23482308      /// Subscript operator. It gives back the item
    2349       /// that the given \e range \e id currently belongs to.
     2309      /// that the descriptor currently belongs to.
    23502310      Value operator[](const Key& key) const {
    23512311        return _inverted(key);
     
    23652325    /// \brief Gives back the inverse of the map.
    23662326    ///
    2367     /// Gives back the inverse of the RangeIdMap.
     2327    /// Gives back the inverse of the map.
    23682328    const InverseMap inverse() const {
    23692329      return InverseMap(*this);
    23702330    }
    2371   };
    2372 
    2373   /// \brief Returns a \c RangeIdMap class.
    2374   ///
    2375   /// This function just returns an \c RangeIdMap class.
    2376   /// \relates RangeIdMap
    2377   template <typename K, typename GR>
    2378   inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
    2379     return RangeIdMap<GR, K>(graph);
    2380   }
    2381  
    2382   /// \brief Dynamic iterable \c bool map.
    2383   ///
    2384   /// This class provides a special graph map type which can store a
    2385   /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
    2386   /// For both \c true and \c false values it is possible to iterate on
    2387   /// the keys mapped to the value.
    2388   ///
    2389   /// This type is a reference map, so it can be modified with the
    2390   /// subscript operator.
    2391   ///
    2392   /// \tparam GR The graph type.
    2393   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
    2394   /// \c GR::Edge).
    2395   ///
    2396   /// \see IterableIntMap, IterableValueMap
    2397   /// \see CrossRefMap
    2398   template <typename GR, typename K>
    2399   class IterableBoolMap
    2400     : protected ItemSetTraits<GR, K>::template Map<int>::Type {
    2401   private:
    2402     typedef GR Graph;
    2403 
    2404     typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
    2405     typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
    2406 
    2407     std::vector<K> _array;
    2408     int _sep;
    2409 
    2410   public:
    2411 
    2412     /// Indicates that the map is reference map.
    2413     typedef True ReferenceMapTag;
    2414 
    2415     /// The key type
    2416     typedef K Key;
    2417     /// The value type
    2418     typedef bool Value;
    2419     /// The const reference type.
    2420     typedef const Value& ConstReference;
    2421 
    2422   private:
    2423 
    2424     int position(const Key& key) const {
    2425       return Parent::operator[](key);
    2426     }
    2427 
    2428   public:
    2429 
    2430     /// \brief Reference to the value of the map.
    2431     ///
    2432     /// This class is similar to the \c bool type. It can be converted to
    2433     /// \c bool and it provides the same operators.
    2434     class Reference {
    2435       friend class IterableBoolMap;
    2436     private:
    2437       Reference(IterableBoolMap& map, const Key& key)
    2438         : _key(key), _map(map) {}
    2439     public:
    2440 
    2441       Reference& operator=(const Reference& value) {
    2442         _map.set(_key, static_cast<bool>(value));
    2443          return *this;
    2444       }
    2445 
    2446       operator bool() const {
    2447         return static_cast<const IterableBoolMap&>(_map)[_key];
    2448       }
    2449 
    2450       Reference& operator=(bool value) {
    2451         _map.set(_key, value);
    2452         return *this;
    2453       }
    2454       Reference& operator&=(bool value) {
    2455         _map.set(_key, _map[_key] & value);
    2456         return *this;
    2457       }
    2458       Reference& operator|=(bool value) {
    2459         _map.set(_key, _map[_key] | value);
    2460         return *this;
    2461       }
    2462       Reference& operator^=(bool value) {
    2463         _map.set(_key, _map[_key] ^ value);
    2464         return *this;
    2465       }
    2466     private:
    2467       Key _key;
    2468       IterableBoolMap& _map;
    2469     };
    2470 
    2471     /// \brief Constructor of the map with a default value.
    2472     ///
    2473     /// Constructor of the map with a default value.
    2474     explicit IterableBoolMap(const Graph& graph, bool def = false)
    2475       : Parent(graph) {
    2476       typename Parent::Notifier* nf = Parent::notifier();
    2477       Key it;
    2478       for (nf->first(it); it != INVALID; nf->next(it)) {
    2479         Parent::set(it, _array.size());
    2480         _array.push_back(it);
    2481       }
    2482       _sep = (def ? _array.size() : 0);
    2483     }
    2484 
    2485     /// \brief Const subscript operator of the map.
    2486     ///
    2487     /// Const subscript operator of the map.
    2488     bool operator[](const Key& key) const {
    2489       return position(key) < _sep;
    2490     }
    2491 
    2492     /// \brief Subscript operator of the map.
    2493     ///
    2494     /// Subscript operator of the map.
    2495     Reference operator[](const Key& key) {
    2496       return Reference(*this, key);
    2497     }
    2498 
    2499     /// \brief Set operation of the map.
    2500     ///
    2501     /// Set operation of the map.
    2502     void set(const Key& key, bool value) {
    2503       int pos = position(key);
    2504       if (value) {
    2505         if (pos < _sep) return;
    2506         Key tmp = _array[_sep];
    2507         _array[_sep] = key;
    2508         Parent::set(key, _sep);
    2509         _array[pos] = tmp;
    2510         Parent::set(tmp, pos);
    2511         ++_sep;
    2512       } else {
    2513         if (pos >= _sep) return;
    2514         --_sep;
    2515         Key tmp = _array[_sep];
    2516         _array[_sep] = key;
    2517         Parent::set(key, _sep);
    2518         _array[pos] = tmp;
    2519         Parent::set(tmp, pos);
    2520       }
    2521     }
    2522 
    2523     /// \brief Set all items.
    2524     ///
    2525     /// Set all items in the map.
    2526     /// \note Constant time operation.
    2527     void setAll(bool value) {
    2528       _sep = (value ? _array.size() : 0);
    2529     }
    2530 
    2531     /// \brief Returns the number of the keys mapped to \c true.
    2532     ///
    2533     /// Returns the number of the keys mapped to \c true.
    2534     int trueNum() const {
    2535       return _sep;
    2536     }
    2537 
    2538     /// \brief Returns the number of the keys mapped to \c false.
    2539     ///
    2540     /// Returns the number of the keys mapped to \c false.
    2541     int falseNum() const {
    2542       return _array.size() - _sep;
    2543     }
    2544 
    2545     /// \brief Iterator for the keys mapped to \c true.
    2546     ///
    2547     /// Iterator for the keys mapped to \c true. It works
    2548     /// like a graph item iterator, it can be converted to
    2549     /// the key type of the map, incremented with \c ++ operator, and
    2550     /// if the iterator leaves the last valid key, it will be equal to
    2551     /// \c INVALID.
    2552     class TrueIt : public Key {
    2553     public:
    2554       typedef Key Parent;
    2555 
    2556       /// \brief Creates an iterator.
    2557       ///
    2558       /// Creates an iterator. It iterates on the
    2559       /// keys mapped to \c true.
    2560       /// \param map The IterableBoolMap.
    2561       explicit TrueIt(const IterableBoolMap& map)
    2562         : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
    2563           _map(&map) {}
    2564 
    2565       /// \brief Invalid constructor \& conversion.
    2566       ///
    2567       /// This constructor initializes the iterator to be invalid.
    2568       /// \sa Invalid for more details.
    2569       TrueIt(Invalid) : Parent(INVALID), _map(0) {}
    2570 
    2571       /// \brief Increment operator.
    2572       ///
    2573       /// Increment operator.
    2574       TrueIt& operator++() {
    2575         int pos = _map->position(*this);
    2576         Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
    2577         return *this;
    2578       }
    2579 
    2580     private:
    2581       const IterableBoolMap* _map;
    2582     };
    2583 
    2584     /// \brief Iterator for the keys mapped to \c false.
    2585     ///
    2586     /// Iterator for the keys mapped to \c false. It works
    2587     /// like a graph item iterator, it can be converted to
    2588     /// the key type of the map, incremented with \c ++ operator, and
    2589     /// if the iterator leaves the last valid key, it will be equal to
    2590     /// \c INVALID.
    2591     class FalseIt : public Key {
    2592     public:
    2593       typedef Key Parent;
    2594 
    2595       /// \brief Creates an iterator.
    2596       ///
    2597       /// Creates an iterator. It iterates on the
    2598       /// keys mapped to \c false.
    2599       /// \param map The IterableBoolMap.
    2600       explicit FalseIt(const IterableBoolMap& map)
    2601         : Parent(map._sep < int(map._array.size()) ?
    2602                  map._array.back() : INVALID), _map(&map) {}
    2603 
    2604       /// \brief Invalid constructor \& conversion.
    2605       ///
    2606       /// This constructor initializes the iterator to be invalid.
    2607       /// \sa Invalid for more details.
    2608       FalseIt(Invalid) : Parent(INVALID), _map(0) {}
    2609 
    2610       /// \brief Increment operator.
    2611       ///
    2612       /// Increment operator.
    2613       FalseIt& operator++() {
    2614         int pos = _map->position(*this);
    2615         Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
    2616         return *this;
    2617       }
    2618 
    2619     private:
    2620       const IterableBoolMap* _map;
    2621     };
    2622 
    2623     /// \brief Iterator for the keys mapped to a given value.
    2624     ///
    2625     /// Iterator for the keys mapped to a given value. It works
    2626     /// like a graph item iterator, it can be converted to
    2627     /// the key type of the map, incremented with \c ++ operator, and
    2628     /// if the iterator leaves the last valid key, it will be equal to
    2629     /// \c INVALID.
    2630     class ItemIt : public Key {
    2631     public:
    2632       typedef Key Parent;
    2633 
    2634       /// \brief Creates an iterator with a value.
    2635       ///
    2636       /// Creates an iterator with a value. It iterates on the
    2637       /// keys mapped to the given value.
    2638       /// \param map The IterableBoolMap.
    2639       /// \param value The value.
    2640       ItemIt(const IterableBoolMap& map, bool value)
    2641         : Parent(value ?
    2642                  (map._sep > 0 ?
    2643                   map._array[map._sep - 1] : INVALID) :
    2644                  (map._sep < int(map._array.size()) ?
    2645                   map._array.back() : INVALID)), _map(&map) {}
    2646 
    2647       /// \brief Invalid constructor \& conversion.
    2648       ///
    2649       /// This constructor initializes the iterator to be invalid.
    2650       /// \sa Invalid for more details.
    2651       ItemIt(Invalid) : Parent(INVALID), _map(0) {}
    2652 
    2653       /// \brief Increment operator.
    2654       ///
    2655       /// Increment operator.
    2656       ItemIt& operator++() {
    2657         int pos = _map->position(*this);
    2658         int _sep = pos >= _map->_sep ? _map->_sep : 0;
    2659         Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
    2660         return *this;
    2661       }
    2662 
    2663     private:
    2664       const IterableBoolMap* _map;
    2665     };
    2666 
    2667   protected:
    2668 
    2669     virtual void add(const Key& key) {
    2670       Parent::add(key);
    2671       Parent::set(key, _array.size());
    2672       _array.push_back(key);
    2673     }
    2674 
    2675     virtual void add(const std::vector<Key>& keys) {
    2676       Parent::add(keys);
    2677       for (int i = 0; i < int(keys.size()); ++i) {
    2678         Parent::set(keys[i], _array.size());
    2679         _array.push_back(keys[i]);
    2680       }
    2681     }
    2682 
    2683     virtual void erase(const Key& key) {
    2684       int pos = position(key);
    2685       if (pos < _sep) {
    2686         --_sep;
    2687         Parent::set(_array[_sep], pos);
    2688         _array[pos] = _array[_sep];
    2689         Parent::set(_array.back(), _sep);
    2690         _array[_sep] = _array.back();
    2691         _array.pop_back();
    2692       } else {
    2693         Parent::set(_array.back(), pos);
    2694         _array[pos] = _array.back();
    2695         _array.pop_back();
    2696       }
    2697       Parent::erase(key);
    2698     }
    2699 
    2700     virtual void erase(const std::vector<Key>& keys) {
    2701       for (int i = 0; i < int(keys.size()); ++i) {
    2702         int pos = position(keys[i]);
    2703         if (pos < _sep) {
    2704           --_sep;
    2705           Parent::set(_array[_sep], pos);
    2706           _array[pos] = _array[_sep];
    2707           Parent::set(_array.back(), _sep);
    2708           _array[_sep] = _array.back();
    2709           _array.pop_back();
    2710         } else {
    2711           Parent::set(_array.back(), pos);
    2712           _array[pos] = _array.back();
    2713           _array.pop_back();
    2714         }
    2715       }
    2716       Parent::erase(keys);
    2717     }
    2718 
    2719     virtual void build() {
    2720       Parent::build();
    2721       typename Parent::Notifier* nf = Parent::notifier();
    2722       Key it;
    2723       for (nf->first(it); it != INVALID; nf->next(it)) {
    2724         Parent::set(it, _array.size());
    2725         _array.push_back(it);
    2726       }
    2727       _sep = 0;
    2728     }
    2729 
    2730     virtual void clear() {
    2731       _array.clear();
    2732       _sep = 0;
    2733       Parent::clear();
    2734     }
    2735 
    2736   };
    2737 
    2738 
    2739   namespace _maps_bits {
    2740     template <typename Item>
    2741     struct IterableIntMapNode {
    2742       IterableIntMapNode() : value(-1) {}
    2743       IterableIntMapNode(int _value) : value(_value) {}
    2744       Item prev, next;
    2745       int value;
    2746     };
    2747   }
    2748 
    2749   /// \brief Dynamic iterable integer map.
    2750   ///
    2751   /// This class provides a special graph map type which can store an
    2752   /// integer value for graph items (\c Node, \c Arc or \c Edge).
    2753   /// For each non-negative value it is possible to iterate on the keys
    2754   /// mapped to the value.
    2755   ///
    2756   /// This map is intended to be used with small integer values, for which
    2757   /// it is efficient, and supports iteration only for non-negative values.
    2758   /// If you need large values and/or iteration for negative integers,
    2759   /// consider to use \ref IterableValueMap instead.
    2760   ///
    2761   /// This type is a reference map, so it can be modified with the
    2762   /// subscript operator.
    2763   ///
    2764   /// \note The size of the data structure depends on the largest
    2765   /// value in the map.
    2766   ///
    2767   /// \tparam GR The graph type.
    2768   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
    2769   /// \c GR::Edge).
    2770   ///
    2771   /// \see IterableBoolMap, IterableValueMap
    2772   /// \see CrossRefMap
    2773   template <typename GR, typename K>
    2774   class IterableIntMap
    2775     : protected ItemSetTraits<GR, K>::
    2776         template Map<_maps_bits::IterableIntMapNode<K> >::Type {
    2777   public:
    2778     typedef typename ItemSetTraits<GR, K>::
    2779       template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
    2780 
    2781     /// The key type
    2782     typedef K Key;
    2783     /// The value type
    2784     typedef int Value;
    2785     /// The graph type
    2786     typedef GR Graph;
    2787 
    2788     /// \brief Constructor of the map.
    2789     ///
    2790     /// Constructor of the map. It sets all values to -1.
    2791     explicit IterableIntMap(const Graph& graph)
    2792       : Parent(graph) {}
    2793 
    2794     /// \brief Constructor of the map with a given value.
    2795     ///
    2796     /// Constructor of the map with a given value.
    2797     explicit IterableIntMap(const Graph& graph, int value)
    2798       : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
    2799       if (value >= 0) {
    2800         for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
    2801           lace(it);
    2802         }
    2803       }
    2804     }
    2805 
    2806   private:
    2807 
    2808     void unlace(const Key& key) {
    2809       typename Parent::Value& node = Parent::operator[](key);
    2810       if (node.value < 0) return;
    2811       if (node.prev != INVALID) {
    2812         Parent::operator[](node.prev).next = node.next;
    2813       } else {
    2814         _first[node.value] = node.next;
    2815       }
    2816       if (node.next != INVALID) {
    2817         Parent::operator[](node.next).prev = node.prev;
    2818       }
    2819       while (!_first.empty() && _first.back() == INVALID) {
    2820         _first.pop_back();
    2821       }
    2822     }
    2823 
    2824     void lace(const Key& key) {
    2825       typename Parent::Value& node = Parent::operator[](key);
    2826       if (node.value < 0) return;
    2827       if (node.value >= int(_first.size())) {
    2828         _first.resize(node.value + 1, INVALID);
    2829       }
    2830       node.prev = INVALID;
    2831       node.next = _first[node.value];
    2832       if (node.next != INVALID) {
    2833         Parent::operator[](node.next).prev = key;
    2834       }
    2835       _first[node.value] = key;
    2836     }
    2837 
    2838   public:
    2839 
    2840     /// Indicates that the map is reference map.
    2841     typedef True ReferenceMapTag;
    2842 
    2843     /// \brief Reference to the value of the map.
    2844     ///
    2845     /// This class is similar to the \c int type. It can
    2846     /// be converted to \c int and it has the same operators.
    2847     class Reference {
    2848       friend class IterableIntMap;
    2849     private:
    2850       Reference(IterableIntMap& map, const Key& key)
    2851         : _key(key), _map(map) {}
    2852     public:
    2853 
    2854       Reference& operator=(const Reference& value) {
    2855         _map.set(_key, static_cast<const int&>(value));
    2856          return *this;
    2857       }
    2858 
    2859       operator const int&() const {
    2860         return static_cast<const IterableIntMap&>(_map)[_key];
    2861       }
    2862 
    2863       Reference& operator=(int value) {
    2864         _map.set(_key, value);
    2865         return *this;
    2866       }
    2867       Reference& operator++() {
    2868         _map.set(_key, _map[_key] + 1);
    2869         return *this;
    2870       }
    2871       int operator++(int) {
    2872         int value = _map[_key];
    2873         _map.set(_key, value + 1);
    2874         return value;
    2875       }
    2876       Reference& operator--() {
    2877         _map.set(_key, _map[_key] - 1);
    2878         return *this;
    2879       }
    2880       int operator--(int) {
    2881         int value = _map[_key];
    2882         _map.set(_key, value - 1);
    2883         return value;
    2884       }
    2885       Reference& operator+=(int value) {
    2886         _map.set(_key, _map[_key] + value);
    2887         return *this;
    2888       }
    2889       Reference& operator-=(int value) {
    2890         _map.set(_key, _map[_key] - value);
    2891         return *this;
    2892       }
    2893       Reference& operator*=(int value) {
    2894         _map.set(_key, _map[_key] * value);
    2895         return *this;
    2896       }
    2897       Reference& operator/=(int value) {
    2898         _map.set(_key, _map[_key] / value);
    2899         return *this;
    2900       }
    2901       Reference& operator%=(int value) {
    2902         _map.set(_key, _map[_key] % value);
    2903         return *this;
    2904       }
    2905       Reference& operator&=(int value) {
    2906         _map.set(_key, _map[_key] & value);
    2907         return *this;
    2908       }
    2909       Reference& operator|=(int value) {
    2910         _map.set(_key, _map[_key] | value);
    2911         return *this;
    2912       }
    2913       Reference& operator^=(int value) {
    2914         _map.set(_key, _map[_key] ^ value);
    2915         return *this;
    2916       }
    2917       Reference& operator<<=(int value) {
    2918         _map.set(_key, _map[_key] << value);
    2919         return *this;
    2920       }
    2921       Reference& operator>>=(int value) {
    2922         _map.set(_key, _map[_key] >> value);
    2923         return *this;
    2924       }
    2925 
    2926     private:
    2927       Key _key;
    2928       IterableIntMap& _map;
    2929     };
    2930 
    2931     /// The const reference type.
    2932     typedef const Value& ConstReference;
    2933 
    2934     /// \brief Gives back the maximal value plus one.
    2935     ///
    2936     /// Gives back the maximal value plus one.
    2937     int size() const {
    2938       return _first.size();
    2939     }
    2940 
    2941     /// \brief Set operation of the map.
    2942     ///
    2943     /// Set operation of the map.
    2944     void set(const Key& key, const Value& value) {
    2945       unlace(key);
    2946       Parent::operator[](key).value = value;
    2947       lace(key);
    2948     }
    2949 
    2950     /// \brief Const subscript operator of the map.
    2951     ///
    2952     /// Const subscript operator of the map.
    2953     const Value& operator[](const Key& key) const {
    2954       return Parent::operator[](key).value;
    2955     }
    2956 
    2957     /// \brief Subscript operator of the map.
    2958     ///
    2959     /// Subscript operator of the map.
    2960     Reference operator[](const Key& key) {
    2961       return Reference(*this, key);
    2962     }
    2963 
    2964     /// \brief Iterator for the keys with the same value.
    2965     ///
    2966     /// Iterator for the keys with the same value. It works
    2967     /// like a graph item iterator, it can be converted to
    2968     /// the item type of the map, incremented with \c ++ operator, and
    2969     /// if the iterator leaves the last valid item, it will be equal to
    2970     /// \c INVALID.
    2971     class ItemIt : public Key {
    2972     public:
    2973       typedef Key Parent;
    2974 
    2975       /// \brief Invalid constructor \& conversion.
    2976       ///
    2977       /// This constructor initializes the iterator to be invalid.
    2978       /// \sa Invalid for more details.
    2979       ItemIt(Invalid) : Parent(INVALID), _map(0) {}
    2980 
    2981       /// \brief Creates an iterator with a value.
    2982       ///
    2983       /// Creates an iterator with a value. It iterates on the
    2984       /// keys mapped to the given value.
    2985       /// \param map The IterableIntMap.
    2986       /// \param value The value.
    2987       ItemIt(const IterableIntMap& map, int value) : _map(&map) {
    2988         if (value < 0 || value >= int(_map->_first.size())) {
    2989           Parent::operator=(INVALID);
    2990         } else {
    2991           Parent::operator=(_map->_first[value]);
    2992         }
    2993       }
    2994 
    2995       /// \brief Increment operator.
    2996       ///
    2997       /// Increment operator.
    2998       ItemIt& operator++() {
    2999         Parent::operator=(_map->IterableIntMap::Parent::
    3000                           operator[](static_cast<Parent&>(*this)).next);
    3001         return *this;
    3002       }
    3003 
    3004     private:
    3005       const IterableIntMap* _map;
    3006     };
    3007 
    3008   protected:
    3009 
    3010     virtual void erase(const Key& key) {
    3011       unlace(key);
    3012       Parent::erase(key);
    3013     }
    3014 
    3015     virtual void erase(const std::vector<Key>& keys) {
    3016       for (int i = 0; i < int(keys.size()); ++i) {
    3017         unlace(keys[i]);
    3018       }
    3019       Parent::erase(keys);
    3020     }
    3021 
    3022     virtual void clear() {
    3023       _first.clear();
    3024       Parent::clear();
    3025     }
    3026 
    3027   private:
    3028     std::vector<Key> _first;
    3029   };
    3030 
    3031   namespace _maps_bits {
    3032     template <typename Item, typename Value>
    3033     struct IterableValueMapNode {
    3034       IterableValueMapNode(Value _value = Value()) : value(_value) {}
    3035       Item prev, next;
    3036       Value value;
    3037     };
    3038   }
    3039 
    3040   /// \brief Dynamic iterable map for comparable values.
    3041   ///
    3042   /// This class provides a special graph map type which can store a
    3043   /// comparable value for graph items (\c Node, \c Arc or \c Edge).
    3044   /// For each value it is possible to iterate on the keys mapped to
    3045   /// the value (\c ItemIt), and the values of the map can be accessed
    3046   /// with an STL compatible forward iterator (\c ValueIt).
    3047   /// The map stores a linked list for each value, which contains
    3048   /// the items mapped to the value, and the used values are stored
    3049   /// in balanced binary tree (\c std::map).
    3050   ///
    3051   /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
    3052   /// specialized for \c bool and \c int values, respectively.
    3053   ///
    3054   /// This type is not reference map, so it cannot be modified with
    3055   /// the subscript operator.
    3056   ///
    3057   /// \tparam GR The graph type.
    3058   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
    3059   /// \c GR::Edge).
    3060   /// \tparam V The value type of the map. It can be any comparable
    3061   /// value type.
    3062   ///
    3063   /// \see IterableBoolMap, IterableIntMap
    3064   /// \see CrossRefMap
    3065   template <typename GR, typename K, typename V>
    3066   class IterableValueMap
    3067     : protected ItemSetTraits<GR, K>::
    3068         template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
    3069   public:
    3070     typedef typename ItemSetTraits<GR, K>::
    3071       template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
    3072 
    3073     /// The key type
    3074     typedef K Key;
    3075     /// The value type
    3076     typedef V Value;
    3077     /// The graph type
    3078     typedef GR Graph;
    3079 
    3080   public:
    3081 
    3082     /// \brief Constructor of the map with a given value.
    3083     ///
    3084     /// Constructor of the map with a given value.
    3085     explicit IterableValueMap(const Graph& graph,
    3086                               const Value& value = Value())
    3087       : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
    3088       for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
    3089         lace(it);
    3090       }
    3091     }
    3092 
    3093   protected:
    3094 
    3095     void unlace(const Key& key) {
    3096       typename Parent::Value& node = Parent::operator[](key);
    3097       if (node.prev != INVALID) {
    3098         Parent::operator[](node.prev).next = node.next;
    3099       } else {
    3100         if (node.next != INVALID) {
    3101           _first[node.value] = node.next;
    3102         } else {
    3103           _first.erase(node.value);
    3104         }
    3105       }
    3106       if (node.next != INVALID) {
    3107         Parent::operator[](node.next).prev = node.prev;
    3108       }
    3109     }
    3110 
    3111     void lace(const Key& key) {
    3112       typename Parent::Value& node = Parent::operator[](key);
    3113       typename std::map<Value, Key>::iterator it = _first.find(node.value);
    3114       if (it == _first.end()) {
    3115         node.prev = node.next = INVALID;
    3116         _first.insert(std::make_pair(node.value, key));
    3117       } else {
    3118         node.prev = INVALID;
    3119         node.next = it->second;
    3120         if (node.next != INVALID) {
    3121           Parent::operator[](node.next).prev = key;
    3122         }
    3123         it->second = key;
    3124       }
    3125     }
    3126 
    3127   public:
    3128 
    3129     /// \brief Forward iterator for values.
    3130     ///
    3131     /// This iterator is an STL compatible forward
    3132     /// iterator on the values of the map. The values can
    3133     /// be accessed in the <tt>[beginValue, endValue)</tt> range.
    3134     class ValueIt
    3135       : public std::iterator<std::forward_iterator_tag, Value> {
    3136       friend class IterableValueMap;
    3137     private:
    3138       ValueIt(typename std::map<Value, Key>::const_iterator _it)
    3139         : it(_it) {}
    3140     public:
    3141 
    3142       /// Constructor
    3143       ValueIt() {}
    3144 
    3145       /// \e
    3146       ValueIt& operator++() { ++it; return *this; }
    3147       /// \e
    3148       ValueIt operator++(int) {
    3149         ValueIt tmp(*this);
    3150         operator++();
    3151         return tmp;
    3152       }
    3153 
    3154       /// \e
    3155       const Value& operator*() const { return it->first; }
    3156       /// \e
    3157       const Value* operator->() const { return &(it->first); }
    3158 
    3159       /// \e
    3160       bool operator==(ValueIt jt) const { return it == jt.it; }
    3161       /// \e
    3162       bool operator!=(ValueIt jt) const { return it != jt.it; }
    3163 
    3164     private:
    3165       typename std::map<Value, Key>::const_iterator it;
    3166     };
    3167 
    3168     /// \brief Returns an iterator to the first value.
    3169     ///
    3170     /// Returns an STL compatible iterator to the
    3171     /// first value of the map. The values of the
    3172     /// map can be accessed in the <tt>[beginValue, endValue)</tt>
    3173     /// range.
    3174     ValueIt beginValue() const {
    3175       return ValueIt(_first.begin());
    3176     }
    3177 
    3178     /// \brief Returns an iterator after the last value.
    3179     ///
    3180     /// Returns an STL compatible iterator after the
    3181     /// last value of the map. The values of the
    3182     /// map can be accessed in the <tt>[beginValue, endValue)</tt>
    3183     /// range.
    3184     ValueIt endValue() const {
    3185       return ValueIt(_first.end());
    3186     }
    3187 
    3188     /// \brief Set operation of the map.
    3189     ///
    3190     /// Set operation of the map.
    3191     void set(const Key& key, const Value& value) {
    3192       unlace(key);
    3193       Parent::operator[](key).value = value;
    3194       lace(key);
    3195     }
    3196 
    3197     /// \brief Const subscript operator of the map.
    3198     ///
    3199     /// Const subscript operator of the map.
    3200     const Value& operator[](const Key& key) const {
    3201       return Parent::operator[](key).value;
    3202     }
    3203 
    3204     /// \brief Iterator for the keys with the same value.
    3205     ///
    3206     /// Iterator for the keys with the same value. It works
    3207     /// like a graph item iterator, it can be converted to
    3208     /// the item type of the map, incremented with \c ++ operator, and
    3209     /// if the iterator leaves the last valid item, it will be equal to
    3210     /// \c INVALID.
    3211     class ItemIt : public Key {
    3212     public:
    3213       typedef Key Parent;
    3214 
    3215       /// \brief Invalid constructor \& conversion.
    3216       ///
    3217       /// This constructor initializes the iterator to be invalid.
    3218       /// \sa Invalid for more details.
    3219       ItemIt(Invalid) : Parent(INVALID), _map(0) {}
    3220 
    3221       /// \brief Creates an iterator with a value.
    3222       ///
    3223       /// Creates an iterator with a value. It iterates on the
    3224       /// keys which have the given value.
    3225       /// \param map The IterableValueMap
    3226       /// \param value The value
    3227       ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
    3228         typename std::map<Value, Key>::const_iterator it =
    3229           map._first.find(value);
    3230         if (it == map._first.end()) {
    3231           Parent::operator=(INVALID);
    3232         } else {
    3233           Parent::operator=(it->second);
    3234         }
    3235       }
    3236 
    3237       /// \brief Increment operator.
    3238       ///
    3239       /// Increment Operator.
    3240       ItemIt& operator++() {
    3241         Parent::operator=(_map->IterableValueMap::Parent::
    3242                           operator[](static_cast<Parent&>(*this)).next);
    3243         return *this;
    3244       }
    3245 
    3246 
    3247     private:
    3248       const IterableValueMap* _map;
    3249     };
    3250 
    3251   protected:
    3252 
    3253     virtual void add(const Key& key) {
    3254       Parent::add(key);
    3255       unlace(key);
    3256     }
    3257 
    3258     virtual void add(const std::vector<Key>& keys) {
    3259       Parent::add(keys);
    3260       for (int i = 0; i < int(keys.size()); ++i) {
    3261         lace(keys[i]);
    3262       }
    3263     }
    3264 
    3265     virtual void erase(const Key& key) {
    3266       unlace(key);
    3267       Parent::erase(key);
    3268     }
    3269 
    3270     virtual void erase(const std::vector<Key>& keys) {
    3271       for (int i = 0; i < int(keys.size()); ++i) {
    3272         unlace(keys[i]);
    3273       }
    3274       Parent::erase(keys);
    3275     }
    3276 
    3277     virtual void build() {
    3278       Parent::build();
    3279       for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
    3280         lace(it);
    3281       }
    3282     }
    3283 
    3284     virtual void clear() {
    3285       _first.clear();
    3286       Parent::clear();
    3287     }
    3288 
    3289   private:
    3290     std::map<Value, Key> _first;
    32912331  };
    32922332
     
    33012341  public:
    33022342
    3303     /// The key type (the \c Arc type of the digraph).
     2343    ///\e
    33042344    typedef typename GR::Arc Key;
    3305     /// The value type (the \c Node type of the digraph).
     2345    ///\e
    33062346    typedef typename GR::Node Value;
    33072347
     
    33422382  public:
    33432383
    3344     /// The key type (the \c Arc type of the digraph).
     2384    ///\e
    33452385    typedef typename GR::Arc Key;
    3346     /// The value type (the \c Node type of the digraph).
     2386    ///\e
    33472387    typedef typename GR::Node Value;
    33482388
     
    33842424  public:
    33852425
    3386     /// The key type (the \c Edge type of the digraph).
     2426    typedef typename GR::Arc Value;
    33872427    typedef typename GR::Edge Key;
    3388     /// The value type (the \c Arc type of the digraph).
    3389     typedef typename GR::Arc Value;
    33902428
    33912429    /// \brief Constructor
     
    34262464  public:
    34272465
    3428     /// The key type (the \c Edge type of the digraph).
     2466    typedef typename GR::Arc Value;
    34292467    typedef typename GR::Edge Key;
    3430     /// The value type (the \c Arc type of the digraph).
    3431     typedef typename GR::Arc Value;
    34322468
    34332469    /// \brief Constructor
     
    34642500  /// whenever the digraph changes.
    34652501  ///
    3466   /// \warning Besides \c addNode() and \c addArc(), a digraph structure
     2502  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
    34672503  /// may provide alternative ways to modify the digraph.
    34682504  /// The correct behavior of InDegMap is not guarantied if these additional
     
    34802516
    34812517  public:
    3482 
     2518   
    34832519    /// The graph type of InDegMap
    34842520    typedef GR Graph;
     
    35942630  /// whenever the digraph changes.
    35952631  ///
    3596   /// \warning Besides \c addNode() and \c addArc(), a digraph structure
     2632  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
    35972633  /// may provide alternative ways to modify the digraph.
    35982634  /// The correct behavior of OutDegMap is not guarantied if these additional
  • lemon/min_cost_arborescence.h

    r760 r672  
    489489    /// The simplest way to execute the algorithm is to use
    490490    /// one of the member functions called \c run(...). \n
    491     /// If you need better control on the execution,
    492     /// you have to call \ref init() first, then you can add several
     491    /// If you need more control on the execution,
     492    /// first you must call \ref init(), then you can add several
    493493    /// source nodes with \ref addSource().
    494494    /// Finally \ref start() will perform the arborescence
  • lemon/network_simplex.h

    r802 r710  
    4141  ///
    4242  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
    43   /// for finding a \ref min_cost_flow "minimum cost flow"
    44   /// \ref amo93networkflows, \ref dantzig63linearprog,
    45   /// \ref kellyoneill91netsimplex.
     43  /// for finding a \ref min_cost_flow "minimum cost flow".
    4644  /// This algorithm is a specialized version of the linear programming
    4745  /// simplex method directly for the minimum cost flow problem.
     
    164162    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
    165163
     164    typedef std::vector<Arc> ArcVector;
     165    typedef std::vector<Node> NodeVector;
    166166    typedef std::vector<int> IntVector;
    167167    typedef std::vector<bool> BoolVector;
     
    365365        Cost c, min = 0;
    366366        int cnt = _block_size;
    367         int e;
     367        int e, min_arc = _next_arc;
    368368        for (e = _next_arc; e < _search_arc_num; ++e) {
    369369          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    370370          if (c < min) {
    371371            min = c;
    372             _in_arc = e;
     372            min_arc = e;
    373373          }
    374374          if (--cnt == 0) {
    375             if (min < 0) goto search_end;
     375            if (min < 0) break;
    376376            cnt = _block_size;
    377377          }
    378378        }
    379         for (e = 0; e < _next_arc; ++e) {
    380           c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    381           if (c < min) {
    382             min = c;
    383             _in_arc = e;
    384           }
    385           if (--cnt == 0) {
    386             if (min < 0) goto search_end;
    387             cnt = _block_size;
     379        if (min == 0 || cnt > 0) {
     380          for (e = 0; e < _next_arc; ++e) {
     381            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
     382            if (c < min) {
     383              min = c;
     384              min_arc = e;
     385            }
     386            if (--cnt == 0) {
     387              if (min < 0) break;
     388              cnt = _block_size;
     389            }
    388390          }
    389391        }
    390392        if (min >= 0) return false;
    391 
    392       search_end:
     393        _in_arc = min_arc;
    393394        _next_arc = e;
    394395        return true;
     
    428429      {
    429430        // The main parameters of the pivot rule
    430         const double LIST_LENGTH_FACTOR = 0.25;
     431        const double LIST_LENGTH_FACTOR = 1.0;
    431432        const int MIN_LIST_LENGTH = 10;
    432433        const double MINOR_LIMIT_FACTOR = 0.1;
     
    445446      bool findEnteringArc() {
    446447        Cost min, c;
    447         int e;
     448        int e, min_arc = _next_arc;
    448449        if (_curr_length > 0 && _minor_count < _minor_limit) {
    449450          // Minor iteration: select the best eligible arc from the
     
    456457            if (c < min) {
    457458              min = c;
    458               _in_arc = e;
     459              min_arc = e;
    459460            }
    460             else if (c >= 0) {
     461            if (c >= 0) {
    461462              _candidates[i--] = _candidates[--_curr_length];
    462463            }
    463464          }
    464           if (min < 0) return true;
     465          if (min < 0) {
     466            _in_arc = min_arc;
     467            return true;
     468          }
    465469        }
    466470
     
    474478            if (c < min) {
    475479              min = c;
    476               _in_arc = e;
     480              min_arc = e;
    477481            }
    478             if (_curr_length == _list_length) goto search_end;
    479           }
    480         }
    481         for (e = 0; e < _next_arc; ++e) {
    482           c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    483           if (c < 0) {
    484             _candidates[_curr_length++] = e;
    485             if (c < min) {
    486               min = c;
    487               _in_arc = e;
     482            if (_curr_length == _list_length) break;
     483          }
     484        }
     485        if (_curr_length < _list_length) {
     486          for (e = 0; e < _next_arc; ++e) {
     487            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
     488            if (c < 0) {
     489              _candidates[_curr_length++] = e;
     490              if (c < min) {
     491                min = c;
     492                min_arc = e;
     493              }
     494              if (_curr_length == _list_length) break;
    488495            }
    489             if (_curr_length == _list_length) goto search_end;
    490496          }
    491497        }
    492498        if (_curr_length == 0) return false;
    493      
    494       search_end:       
    495499        _minor_count = 1;
     500        _in_arc = min_arc;
    496501        _next_arc = e;
    497502        return true;
     
    545550      {
    546551        // The main parameters of the pivot rule
    547         const double BLOCK_SIZE_FACTOR = 1.0;
     552        const double BLOCK_SIZE_FACTOR = 1.5;
    548553        const int MIN_BLOCK_SIZE = 10;
    549554        const double HEAD_LENGTH_FACTOR = 0.1;
     
    574579        // Extend the list
    575580        int cnt = _block_size;
     581        int last_arc = 0;
    576582        int limit = _head_length;
    577583
    578         for (e = _next_arc; e < _search_arc_num; ++e) {
     584        for (int e = _next_arc; e < _search_arc_num; ++e) {
    579585          _cand_cost[e] = _state[e] *
    580586            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    581587          if (_cand_cost[e] < 0) {
    582588            _candidates[_curr_length++] = e;
     589            last_arc = e;
    583590          }
    584591          if (--cnt == 0) {
    585             if (_curr_length > limit) goto search_end;
     592            if (_curr_length > limit) break;
    586593            limit = 0;
    587594            cnt = _block_size;
    588595          }
    589596        }
    590         for (e = 0; e < _next_arc; ++e) {
    591           _cand_cost[e] = _state[e] *
    592             (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    593           if (_cand_cost[e] < 0) {
    594             _candidates[_curr_length++] = e;
    595           }
    596           if (--cnt == 0) {
    597             if (_curr_length > limit) goto search_end;
    598             limit = 0;
    599             cnt = _block_size;
     597        if (_curr_length <= limit) {
     598          for (int e = 0; e < _next_arc; ++e) {
     599            _cand_cost[e] = _state[e] *
     600              (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
     601            if (_cand_cost[e] < 0) {
     602              _candidates[_curr_length++] = e;
     603              last_arc = e;
     604            }
     605            if (--cnt == 0) {
     606              if (_curr_length > limit) break;
     607              limit = 0;
     608              cnt = _block_size;
     609            }
    600610          }
    601611        }
    602612        if (_curr_length == 0) return false;
    603        
    604       search_end:
     613        _next_arc = last_arc + 1;
    605614
    606615        // Make heap of the candidate list (approximating a partial sort)
     
    610619        // Pop the first element of the heap
    611620        _in_arc = _candidates[0];
    612         _next_arc = e;
    613621        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
    614622                  _sort_func );
     
    626634    ///
    627635    /// \param graph The digraph the algorithm runs on.
    628     /// \param arc_mixing Indicate if the arcs have to be stored in a
    629     /// mixed order in the internal data structure.
    630     /// In special cases, it could lead to better overall performance,
    631     /// but it is usually slower. Therefore it is disabled by default.
    632     NetworkSimplex(const GR& graph, bool arc_mixing = false) :
     636    NetworkSimplex(const GR& graph) :
    633637      _graph(graph), _node_id(graph), _arc_id(graph),
    634638      INF(std::numeric_limits<Value>::has_infinity ?
     
    668672      _state.resize(max_arc_num);
    669673
    670       // Copy the graph
     674      // Copy the graph (store the arcs in a mixed order)
    671675      int i = 0;
    672676      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
    673677        _node_id[n] = i;
    674678      }
    675       if (arc_mixing) {
    676         // Store the arcs in a mixed order
    677         int k = std::max(int(std::sqrt(double(_arc_num))), 10);
    678         int i = 0, j = 0;
    679         for (ArcIt a(_graph); a != INVALID; ++a) {
    680           _arc_id[a] = i;
    681           _source[i] = _node_id[_graph.source(a)];
    682           _target[i] = _node_id[_graph.target(a)];
    683           if ((i += k) >= _arc_num) i = ++j;
    684         }
    685       } else {
    686         // Store the arcs in the original order
    687         int i = 0;
    688         for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
    689           _arc_id[a] = i;
    690           _source[i] = _node_id[_graph.source(a)];
    691           _target[i] = _node_id[_graph.target(a)];
    692         }
     679      int k = std::max(int(std::sqrt(double(_arc_num))), 10);
     680      i = 0;
     681      for (ArcIt a(_graph); a != INVALID; ++a) {
     682        _arc_id[a] = i;
     683        _source[i] = _node_id[_graph.source(a)];
     684        _target[i] = _node_id[_graph.target(a)];
     685        if ((i += k) >= _arc_num) i = (i % k) + 1;
    693686      }
    694687     
    695       // Reset parameters
    696       reset();
     688      // Initialize maps
     689      for (int i = 0; i != _node_num; ++i) {
     690        _supply[i] = 0;
     691      }
     692      for (int i = 0; i != _arc_num; ++i) {
     693        _lower[i] = 0;
     694        _upper[i] = INF;
     695        _cost[i] = 1;
     696      }
     697      _have_lower = false;
     698      _stype = GEQ;
    697699    }
    698700
     
    767769    /// If neither this function nor \ref stSupply() is used before
    768770    /// calling \ref run(), the supply of each node will be set to zero.
     771    /// (It makes sense only if non-zero lower bounds are given.)
    769772    ///
    770773    /// \param map A node map storing the supply values.
     
    787790    /// If neither this function nor \ref supplyMap() is used before
    788791    /// calling \ref run(), the supply of each node will be set to zero.
     792    /// (It makes sense only if non-zero lower bounds are given.)
    789793    ///
    790794    /// Using this function has the same effect as using \ref supplyMap()
  • lemon/path.h

    r798 r606  
    10161016  /// \brief The source of a path
    10171017  ///
    1018   /// This function returns the source node of the given path.
    1019   /// If the path is empty, then it returns \c INVALID.
     1018  /// This function returns the source of the given path.
    10201019  template <typename Digraph, typename Path>
    10211020  typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
    1022     return path.empty() ? INVALID : digraph.source(path.front());
     1021    return digraph.source(path.front());
    10231022  }
    10241023
    10251024  /// \brief The target of a path
    10261025  ///
    1027   /// This function returns the target node of the given path.
    1028   /// If the path is empty, then it returns \c INVALID.
     1026  /// This function returns the target of the given path.
    10291027  template <typename Digraph, typename Path>
    10301028  typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
    1031     return path.empty() ? INVALID : digraph.target(path.back());
     1029    return digraph.target(path.back());
    10321030  }
    10331031
  • lemon/preflow.h

    r802 r688  
    5353    /// The type of the map that stores the flow values.
    5454    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    55 #ifdef DOXYGEN
    56     typedef GR::ArcMap<Value> FlowMap;
    57 #else
    5855    typedef typename Digraph::template ArcMap<Value> FlowMap;
    59 #endif
    6056
    6157    /// \brief Instantiates a FlowMap.
     
    7268    /// The elevator type used by Preflow algorithm.
    7369    ///
    74     /// \sa Elevator, LinkedElevator
    75 #ifdef DOXYGEN
    76     typedef lemon::Elevator<GR, GR::Node> Elevator;
    77 #else
    78     typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
    79 #endif
     70    /// \sa Elevator
     71    /// \sa LinkedElevator
     72    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
    8073
    8174    /// \brief Instantiates an Elevator.
     
    10396  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
    10497  /// \e push-relabel algorithm producing a \ref max_flow
    105   /// "flow of maximum value" in a digraph \ref clrs01algorithms,
    106   /// \ref amo93networkflows, \ref goldberg88newapproach.
     98  /// "flow of maximum value" in a digraph.
    10799  /// The preflow algorithms are the fastest known maximum
    108   /// flow algorithms. The current implementation uses a mixture of the
     100  /// flow algorithms. The current implementation use a mixture of the
    109101  /// \e "highest label" and the \e "bound decrease" heuristics.
    110102  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
     
    380372    }
    381373
    382     /// \brief Sets the tolerance used by the algorithm.
    383     ///
    384     /// Sets the tolerance object used by the algorithm.
    385     /// \return <tt>(*this)</tt>
    386     Preflow& tolerance(const Tolerance& tolerance) {
     374    /// \brief Sets the tolerance used by algorithm.
     375    ///
     376    /// Sets the tolerance used by algorithm.
     377    Preflow& tolerance(const Tolerance& tolerance) const {
    387378      _tolerance = tolerance;
    388379      return *this;
     
    391382    /// \brief Returns a const reference to the tolerance.
    392383    ///
    393     /// Returns a const reference to the tolerance object used by
    394     /// the algorithm.
     384    /// Returns a const reference to the tolerance.
    395385    const Tolerance& tolerance() const {
    396       return _tolerance;
     386      return tolerance;
    397387    }
    398388
     
    400390    /// The simplest way to execute the preflow algorithm is to use
    401391    /// \ref run() or \ref runMinCut().\n
    402     /// If you need better control on the initial solution or the execution,
    403     /// you have to call one of the \ref init() functions first, then
     392    /// If you need more control on the initial solution or the execution,
     393    /// first you have to call one of the \ref init() functions, then
    404394    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
    405395
  • lemon/radix_heap.h

    r758 r730  
    2020#define LEMON_RADIX_HEAP_H
    2121
    22 ///\ingroup heaps
     22///\ingroup auxdat
    2323///\file
    24 ///\brief Radix heap implementation.
     24///\brief Radix Heap implementation.
    2525
    2626#include <vector>
     
    3030
    3131
    32   /// \ingroup heaps
     32  /// \ingroup auxdata
    3333  ///
    34   /// \brief Radix heap data structure.
     34  /// \brief A Radix Heap implementation.
    3535  ///
    36   /// This class implements the \e radix \e heap data structure.
    37   /// It practically conforms to the \ref concepts::Heap "heap concept",
    38   /// but it has some limitations due its special implementation.
    39   /// The type of the priorities must be \c int and the priority of an
    40   /// item cannot be decreased under the priority of the last removed item.
     36  /// This class implements the \e radix \e heap data structure. A \e heap
     37  /// is a data structure for storing items with specified values called \e
     38  /// priorities in such a way that finding the item with minimum priority is
     39  /// efficient. This heap type can store only items with \e int priority.
     40  /// In a heap one can change the priority of an item, add or erase an
     41  /// item, but the priority cannot be decreased under the last removed
     42  /// item's priority.
    4143  ///
    42   /// \tparam IM A read-writable item map with \c int values, used
    43   /// internally to handle the cross references.
     44  /// \param IM A read and writable Item int map, used internally
     45  /// to handle the cross references.
     46  ///
     47  /// \see BinHeap
     48  /// \see Dijkstra
    4449  template <typename IM>
    4550  class RadixHeap {
    4651
    4752  public:
    48 
    49     /// Type of the item-int map.
     53    typedef typename IM::Key Item;
     54    typedef int Prio;
    5055    typedef IM ItemIntMap;
    51     /// Type of the priorities.
    52     typedef int Prio;
    53     /// Type of the items stored in the heap.
    54     typedef typename ItemIntMap::Key Item;
    5556
    5657    /// \brief Exception thrown by RadixHeap.
    5758    ///
    58     /// This exception is thrown when an item is inserted into a
    59     /// RadixHeap with a priority smaller than the last erased one.
     59    /// This Exception is thrown when a smaller priority
     60    /// is inserted into the \e RadixHeap then the last time erased.
    6061    /// \see RadixHeap
    61     class PriorityUnderflowError : public Exception {
     62
     63    class UnderFlowPriorityError : public Exception {
    6264    public:
    6365      virtual const char* what() const throw() {
    64         return "lemon::RadixHeap::PriorityUnderflowError";
     66        return "lemon::RadixHeap::UnderFlowPriorityError";
    6567      }
    6668    };
    6769
    68     /// \brief Type to represent the states of the items.
    69     ///
    70     /// Each item has a state associated to it. It can be "in heap",
    71     /// "pre-heap" or "post-heap". The latter two are indifferent from the
     70    /// \brief Type to represent the items states.
     71    ///
     72    /// Each Item element have a state associated to it. It may be "in heap",
     73    /// "pre heap" or "post heap". The latter two are indifferent from the
    7274    /// heap's point of view, but may be useful to the user.
    7375    ///
    74     /// The item-int map must be initialized in such way that it assigns
    75     /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
     76    /// The ItemIntMap \e should be initialized in such way that it maps
     77    /// PRE_HEAP (-1) to any element to be put in the heap...
    7678    enum State {
    77       IN_HEAP = 0,    ///< = 0.
    78       PRE_HEAP = -1,  ///< = -1.
    79       POST_HEAP = -2  ///< = -2.
     79      IN_HEAP = 0,
     80      PRE_HEAP = -1,
     81      POST_HEAP = -2
    8082    };
    8183
     
    9597    };
    9698
    97     std::vector<RadixItem> _data;
    98     std::vector<RadixBox> _boxes;
     99    std::vector<RadixItem> data;
     100    std::vector<RadixBox> boxes;
    99101
    100102    ItemIntMap &_iim;
    101103
     104
    102105  public:
    103 
    104     /// \brief Constructor.
    105     ///
    106     /// Constructor.
    107     /// \param map A map that assigns \c int values to the items.
    108     /// It is used internally to handle the cross references.
    109     /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
    110     /// \param minimum The initial minimum value of the heap.
    111     /// \param capacity The initial capacity of the heap.
    112     RadixHeap(ItemIntMap &map, int minimum = 0, int capacity = 0)
    113       : _iim(map)
    114     {
    115       _boxes.push_back(RadixBox(minimum, 1));
    116       _boxes.push_back(RadixBox(minimum + 1, 1));
    117       while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
     106    /// \brief The constructor.
     107    ///
     108    /// The constructor.
     109    ///
     110    /// \param map It should be given to the constructor, since it is used
     111    /// internally to handle the cross references. The value of the map
     112    /// should be PRE_HEAP (-1) for each element.
     113    ///
     114    /// \param minimal The initial minimal value of the heap.
     115    /// \param capacity It determines the initial capacity of the heap.
     116    RadixHeap(ItemIntMap &map, int minimal = 0, int capacity = 0)
     117      : _iim(map) {
     118      boxes.push_back(RadixBox(minimal, 1));
     119      boxes.push_back(RadixBox(minimal + 1, 1));
     120      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
    118121        extend();
    119122      }
    120123    }
    121124
    122     /// \brief The number of items stored in the heap.
    123     ///
    124     /// This function returns the number of items stored in the heap.
    125     int size() const { return _data.size(); }
    126 
    127     /// \brief Check if the heap is empty.
    128     ///
    129     /// This function returns \c true if the heap is empty.
    130     bool empty() const { return _data.empty(); }
    131 
    132     /// \brief Make the heap empty.
    133     ///
    134     /// This functon makes the heap empty.
    135     /// It does not change the cross reference map. If you want to reuse
    136     /// a heap that is not surely empty, you should first clear it and
    137     /// then you should set the cross reference map to \c PRE_HEAP
    138     /// for each item.
    139     /// \param minimum The minimum value of the heap.
    140     /// \param capacity The capacity of the heap.
    141     void clear(int minimum = 0, int capacity = 0) {
    142       _data.clear(); _boxes.clear();
    143       _boxes.push_back(RadixBox(minimum, 1));
    144       _boxes.push_back(RadixBox(minimum + 1, 1));
    145       while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
     125    /// The number of items stored in the heap.
     126    ///
     127    /// \brief Returns the number of items stored in the heap.
     128    int size() const { return data.size(); }
     129    /// \brief Checks if the heap stores no items.
     130    ///
     131    /// Returns \c true if and only if the heap stores no items.
     132    bool empty() const { return data.empty(); }
     133
     134    /// \brief Make empty this heap.
     135    ///
     136    /// Make empty this heap. It does not change the cross reference
     137    /// map.  If you want to reuse a heap what is not surely empty you
     138    /// should first clear the heap and after that you should set the
     139    /// cross reference map for each item to \c PRE_HEAP.
     140    void clear(int minimal = 0, int capacity = 0) {
     141      data.clear(); boxes.clear();
     142      boxes.push_back(RadixBox(minimal, 1));
     143      boxes.push_back(RadixBox(minimal + 1, 1));
     144      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
    146145        extend();
    147146      }
     
    151150
    152151    bool upper(int box, Prio pr) {
    153       return pr < _boxes[box].min;
     152      return pr < boxes[box].min;
    154153    }
    155154
    156155    bool lower(int box, Prio pr) {
    157       return pr >= _boxes[box].min + _boxes[box].size;
    158     }
    159 
    160     // Remove item from the box list
     156      return pr >= boxes[box].min + boxes[box].size;
     157    }
     158
     159    /// \brief Remove item from the box list.
    161160    void remove(int index) {
    162       if (_data[index].prev >= 0) {
    163         _data[_data[index].prev].next = _data[index].next;
     161      if (data[index].prev >= 0) {
     162        data[data[index].prev].next = data[index].next;
    164163      } else {
    165         _boxes[_data[index].box].first = _data[index].next;
    166       }
    167       if (_data[index].next >= 0) {
    168         _data[_data[index].next].prev = _data[index].prev;
    169       }
    170     }
    171 
    172     // Insert item into the box list
     164        boxes[data[index].box].first = data[index].next;
     165      }
     166      if (data[index].next >= 0) {
     167        data[data[index].next].prev = data[index].prev;
     168      }
     169    }
     170
     171    /// \brief Insert item into the box list.
    173172    void insert(int box, int index) {
    174       if (_boxes[box].first == -1) {
    175         _boxes[box].first = index;
    176         _data[index].next = _data[index].prev = -1;
     173      if (boxes[box].first == -1) {
     174        boxes[box].first = index;
     175        data[index].next = data[index].prev = -1;
    177176      } else {
    178         _data[index].next = _boxes[box].first;
    179         _data[_boxes[box].first].prev = index;
    180         _data[index].prev = -1;
    181         _boxes[box].first = index;
    182       }
    183       _data[index].box = box;
    184     }
    185 
    186     // Add a new box to the box list
     177        data[index].next = boxes[box].first;
     178        data[boxes[box].first].prev = index;
     179        data[index].prev = -1;
     180        boxes[box].first = index;
     181      }
     182      data[index].box = box;
     183    }
     184
     185    /// \brief Add a new box to the box list.
    187186    void extend() {
    188       int min = _boxes.back().min + _boxes.back().size;
    189       int bs = 2 * _boxes.back().size;
    190       _boxes.push_back(RadixBox(min, bs));
    191     }
    192 
    193     // Move an item up into the proper box.
    194     void bubbleUp(int index) {
    195       if (!lower(_data[index].box, _data[index].prio)) return;
     187      int min = boxes.back().min + boxes.back().size;
     188      int bs = 2 * boxes.back().size;
     189      boxes.push_back(RadixBox(min, bs));
     190    }
     191
     192    /// \brief Move an item up into the proper box.
     193    void bubble_up(int index) {
     194      if (!lower(data[index].box, data[index].prio)) return;
    196195      remove(index);
    197       int box = findUp(_data[index].box, _data[index].prio);
     196      int box = findUp(data[index].box, data[index].prio);
    198197      insert(box, index);
    199198    }
    200199
    201     // Find up the proper box for the item with the given priority
     200    /// \brief Find up the proper box for the item with the given prio.
    202201    int findUp(int start, int pr) {
    203202      while (lower(start, pr)) {
    204         if (++start == int(_boxes.size())) {
     203        if (++start == int(boxes.size())) {
    205204          extend();
    206205        }
     
    209208    }
    210209
    211     // Move an item down into the proper box
    212     void bubbleDown(int index) {
    213       if (!upper(_data[index].box, _data[index].prio)) return;
     210    /// \brief Move an item down into the proper box.
     211    void bubble_down(int index) {
     212      if (!upper(data[index].box, data[index].prio)) return;
    214213      remove(index);
    215       int box = findDown(_data[index].box, _data[index].prio);
     214      int box = findDown(data[index].box, data[index].prio);
    216215      insert(box, index);
    217216    }
    218217
    219     // Find down the proper box for the item with the given priority
     218    /// \brief Find up the proper box for the item with the given prio.
    220219    int findDown(int start, int pr) {
    221220      while (upper(start, pr)) {
    222         if (--start < 0) throw PriorityUnderflowError();
     221        if (--start < 0) throw UnderFlowPriorityError();
    223222      }
    224223      return start;
    225224    }
    226225
    227     // Find the first non-empty box
     226    /// \brief Find the first not empty box.
    228227    int findFirst() {
    229228      int first = 0;
    230       while (_boxes[first].first == -1) ++first;
     229      while (boxes[first].first == -1) ++first;
    231230      return first;
    232231    }
    233232
    234     // Gives back the minimum priority of the given box
     233    /// \brief Gives back the minimal prio of the box.
    235234    int minValue(int box) {
    236       int min = _data[_boxes[box].first].prio;
    237       for (int k = _boxes[box].first; k != -1; k = _data[k].next) {
    238         if (_data[k].prio < min) min = _data[k].prio;
     235      int min = data[boxes[box].first].prio;
     236      for (int k = boxes[box].first; k != -1; k = data[k].next) {
     237        if (data[k].prio < min) min = data[k].prio;
    239238      }
    240239      return min;
    241240    }
    242241
    243     // Rearrange the items of the heap and make the first box non-empty
     242    /// \brief Rearrange the items of the heap and makes the
     243    /// first box not empty.
    244244    void moveDown() {
    245245      int box = findFirst();
     
    247247      int min = minValue(box);
    248248      for (int i = 0; i <= box; ++i) {
    249         _boxes[i].min = min;
    250         min += _boxes[i].size;
    251       }
    252       int curr = _boxes[box].first, next;
     249        boxes[i].min = min;
     250        min += boxes[i].size;
     251      }
     252      int curr = boxes[box].first, next;
    253253      while (curr != -1) {
    254         next = _data[curr].next;
    255         bubbleDown(curr);
     254        next = data[curr].next;
     255        bubble_down(curr);
    256256        curr = next;
    257257      }
    258258    }
    259259
    260     void relocateLast(int index) {
    261       if (index != int(_data.size()) - 1) {
    262         _data[index] = _data.back();
    263         if (_data[index].prev != -1) {
    264           _data[_data[index].prev].next = index;
     260    void relocate_last(int index) {
     261      if (index != int(data.size()) - 1) {
     262        data[index] = data.back();
     263        if (data[index].prev != -1) {
     264          data[data[index].prev].next = index;
    265265        } else {
    266           _boxes[_data[index].box].first = index;
     266          boxes[data[index].box].first = index;
    267267        }
    268         if (_data[index].next != -1) {
    269           _data[_data[index].next].prev = index;
     268        if (data[index].next != -1) {
     269          data[data[index].next].prev = index;
    270270        }
    271         _iim[_data[index].item] = index;
    272       }
    273       _data.pop_back();
     271        _iim[data[index].item] = index;
     272      }
     273      data.pop_back();
    274274    }
    275275
     
    278278    /// \brief Insert an item into the heap with the given priority.
    279279    ///
    280     /// This function inserts the given item into the heap with the
    281     /// given priority.
     280    /// Adds \c i to the heap with priority \c p.
    282281    /// \param i The item to insert.
    283282    /// \param p The priority of the item.
    284     /// \pre \e i must not be stored in the heap.
    285     /// \warning This method may throw an \c UnderFlowPriorityException.
    286283    void push(const Item &i, const Prio &p) {
    287       int n = _data.size();
     284      int n = data.size();
    288285      _iim.set(i, n);
    289       _data.push_back(RadixItem(i, p));
    290       while (lower(_boxes.size() - 1, p)) {
     286      data.push_back(RadixItem(i, p));
     287      while (lower(boxes.size() - 1, p)) {
    291288        extend();
    292289      }
    293       int box = findDown(_boxes.size() - 1, p);
     290      int box = findDown(boxes.size() - 1, p);
    294291      insert(box, n);
    295292    }
    296293
    297     /// \brief Return the item having minimum priority.
    298     ///
    299     /// This function returns the item having minimum priority.
    300     /// \pre The heap must be non-empty.
     294    /// \brief Returns the item with minimum priority.
     295    ///
     296    /// This method returns the item with minimum priority.
     297    /// \pre The heap must be nonempty.
    301298    Item top() const {
    302299      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
    303       return _data[_boxes[0].first].item;
    304     }
    305 
    306     /// \brief The minimum priority.
    307     ///
    308     /// This function returns the minimum priority.
    309     /// \pre The heap must be non-empty.
     300      return data[boxes[0].first].item;
     301    }
     302
     303    /// \brief Returns the minimum priority.
     304    ///
     305    /// It returns the minimum priority.
     306    /// \pre The heap must be nonempty.
    310307    Prio prio() const {
    311308      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
    312       return _data[_boxes[0].first].prio;
     309      return data[boxes[0].first].prio;
    313310     }
    314311
    315     /// \brief Remove the item having minimum priority.
    316     ///
    317     /// This function removes the item having minimum priority.
     312    /// \brief Deletes the item with minimum priority.
     313    ///
     314    /// This method deletes the item with minimum priority.
    318315    /// \pre The heap must be non-empty.
    319316    void pop() {
    320317      moveDown();
    321       int index = _boxes[0].first;
    322       _iim[_data[index].item] = POST_HEAP;
     318      int index = boxes[0].first;
     319      _iim[data[index].item] = POST_HEAP;
    323320      remove(index);
    324       relocateLast(index);
    325     }
    326 
    327     /// \brief Remove the given item from the heap.
    328     ///
    329     /// This function removes the given item from the heap if it is
    330     /// already stored.
    331     /// \param i The item to delete.
    332     /// \pre \e i must be in the heap.
     321      relocate_last(index);
     322    }
     323
     324    /// \brief Deletes \c i from the heap.
     325    ///
     326    /// This method deletes item \c i from the heap, if \c i was
     327    /// already stored in the heap.
     328    /// \param i The item to erase.
    333329    void erase(const Item &i) {
    334330      int index = _iim[i];
    335331      _iim[i] = POST_HEAP;
    336332      remove(index);
    337       relocateLast(index);
     333      relocate_last(index);
    338334   }
    339335
    340     /// \brief The priority of the given item.
    341     ///
    342     /// This function returns the priority of the given item.
    343     /// \param i The item.
    344     /// \pre \e i must be in the heap.
     336    /// \brief Returns the priority of \c i.
     337    ///
     338    /// This function returns the priority of item \c i.
     339    /// \pre \c i must be in the heap.
     340    /// \param i The item.
    345341    Prio operator[](const Item &i) const {
    346342      int idx = _iim[i];
    347       return _data[idx].prio;
    348     }
    349 
    350     /// \brief Set the priority of an item or insert it, if it is
    351     /// not stored in the heap.
    352     ///
    353     /// This method sets the priority of the given item if it is
    354     /// already stored in the heap. Otherwise it inserts the given
    355     /// item into the heap with the given priority.
     343      return data[idx].prio;
     344    }
     345
     346    /// \brief \c i gets to the heap with priority \c p independently
     347    /// if \c i was already there.
     348    ///
     349    /// This method calls \ref push(\c i, \c p) if \c i is not stored
     350    /// in the heap and sets the priority of \c i to \c p otherwise.
     351    /// It may throw an \e UnderFlowPriorityException.
    356352    /// \param i The item.
    357353    /// \param p The priority.
    358     /// \pre \e i must be in the heap.
    359     /// \warning This method may throw an \c UnderFlowPriorityException.
    360354    void set(const Item &i, const Prio &p) {
    361355      int idx = _iim[i];
     
    363357        push(i, p);
    364358      }
    365       else if( p >= _data[idx].prio ) {
    366         _data[idx].prio = p;
    367         bubbleUp(idx);
     359      else if( p >= data[idx].prio ) {
     360        data[idx].prio = p;
     361        bubble_up(idx);
    368362      } else {
    369         _data[idx].prio = p;
    370         bubbleDown(idx);
    371       }
    372     }
    373 
    374     /// \brief Decrease the priority of an item to the given value.
    375     ///
    376     /// This function decreases the priority of an item to the given value.
     363        data[idx].prio = p;
     364        bubble_down(idx);
     365      }
     366    }
     367
     368
     369    /// \brief Decreases the priority of \c i to \c p.
     370    ///
     371    /// This method decreases the priority of item \c i to \c p.
     372    /// \pre \c i must be stored in the heap with priority at least \c p, and
     373    /// \c should be greater or equal to the last removed item's priority.
    377374    /// \param i The item.
    378375    /// \param p The priority.
    379     /// \pre \e i must be stored in the heap with priority at least \e p.
    380     /// \warning This method may throw an \c UnderFlowPriorityException.
    381376    void decrease(const Item &i, const Prio &p) {
    382377      int idx = _iim[i];
    383       _data[idx].prio = p;
    384       bubbleDown(idx);
    385     }
    386 
    387     /// \brief Increase the priority of an item to the given value.
    388     ///
    389     /// This function increases the priority of an item to the given value.
     378      data[idx].prio = p;
     379      bubble_down(idx);
     380    }
     381
     382    /// \brief Increases the priority of \c i to \c p.
     383    ///
     384    /// This method sets the priority of item \c i to \c p.
     385    /// \pre \c i must be stored in the heap with priority at most \c p
    390386    /// \param i The item.
    391387    /// \param p The priority.
    392     /// \pre \e i must be stored in the heap with priority at most \e p.
    393388    void increase(const Item &i, const Prio &p) {
    394389      int idx = _iim[i];
    395       _data[idx].prio = p;
    396       bubbleUp(idx);
    397     }
    398 
    399     /// \brief Return the state of an item.
    400     ///
    401     /// This method returns \c PRE_HEAP if the given item has never
    402     /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
    403     /// and \c POST_HEAP otherwise.
    404     /// In the latter case it is possible that the item will get back
    405     /// to the heap again.
     390      data[idx].prio = p;
     391      bubble_up(idx);
     392    }
     393
     394    /// \brief Returns if \c item is in, has already been in, or has
     395    /// never been in the heap.
     396    ///
     397    /// This method returns PRE_HEAP if \c item has never been in the
     398    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
     399    /// otherwise. In the latter case it is possible that \c item will
     400    /// get back to the heap again.
    406401    /// \param i The item.
    407402    State state(const Item &i) const {
     
    411406    }
    412407
    413     /// \brief Set the state of an item in the heap.
    414     ///
    415     /// This function sets the state of the given item in the heap.
    416     /// It can be used to manually clear the heap when it is important
    417     /// to achive better time complexity.
     408    /// \brief Sets the state of the \c item in the heap.
     409    ///
     410    /// Sets the state of the \c item in the heap. It can be used to
     411    /// manually clear the heap when it is important to achive the
     412    /// better time complexity.
    418413    /// \param i The item.
    419414    /// \param st The state. It should not be \c IN_HEAP.
  • lemon/smart_graph.h

    r827 r825  
    3333
    3434  class SmartDigraph;
    35 
     35  ///Base of SmartDigraph
     36
     37  ///Base of SmartDigraph
     38  ///
    3639  class SmartDigraphBase {
    3740  protected:
     
    185188  ///\brief A smart directed graph class.
    186189  ///
    187   ///\ref SmartDigraph is a simple and fast digraph implementation.
    188   ///It is also quite memory efficient but at the price
    189   ///that it does not support node and arc deletion
    190   ///(except for the Snapshot feature).
     190  ///This is a simple and fast digraph implementation.
     191  ///It is also quite memory efficient, but at the price
     192  ///that <b> it does support only limited (only stack-like)
     193  ///node and arc deletions</b>.
     194  ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
    191195  ///
    192   ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
    193   ///and it also provides some additional functionalities.
    194   ///Most of its member functions and nested classes are documented
    195   ///only in the concept class.
    196   ///
    197   ///\sa concepts::Digraph
    198   ///\sa SmartGraph
     196  ///\sa concepts::Digraph.
    199197  class SmartDigraph : public ExtendedSmartDigraphBase {
    200198    typedef ExtendedSmartDigraphBase Parent;
    201199
    202200  private:
    203     /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
     201
     202    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
     203
     204    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
     205    ///
    204206    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
    205     /// \brief Assignment of a digraph to another one is \e not allowed.
    206     /// Use DigraphCopy instead.
     207    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
     208    ///Use DigraphCopy() instead.
     209
     210    ///Assignment of SmartDigraph to another one is \e not allowed.
     211    ///Use DigraphCopy() instead.
    207212    void operator=(const SmartDigraph &) {}
    208213
     
    217222    ///Add a new node to the digraph.
    218223
    219     ///This function adds a new node to the digraph.
    220     ///\return The new node.
     224    /// Add a new node to the digraph.
     225    /// \return The new node.
    221226    Node addNode() { return Parent::addNode(); }
    222227
    223228    ///Add a new arc to the digraph.
    224229
    225     ///This function adds a new arc to the digraph with source node \c s
     230    ///Add a new arc to the digraph with source node \c s
    226231    ///and target node \c t.
    227232    ///\return The new arc.
    228     Arc addArc(Node s, Node t) {
     233    Arc addArc(const Node& s, const Node& t) {
    229234      return Parent::addArc(s, t);
    230235    }
    231236
     237    /// \brief Using this it is possible to avoid the superfluous memory
     238    /// allocation.
     239
     240    /// Using this it is possible to avoid the superfluous memory
     241    /// allocation: if you know that the digraph you want to build will
     242    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     243    /// then it is worth reserving space for this amount before starting
     244    /// to build the digraph.
     245    /// \sa reserveArc
     246    void reserveNode(int n) { nodes.reserve(n); };
     247
     248    /// \brief Using this it is possible to avoid the superfluous memory
     249    /// allocation.
     250
     251    /// Using this it is possible to avoid the superfluous memory
     252    /// allocation: if you know that the digraph you want to build will
     253    /// be very large (e.g. it will contain millions of nodes and/or arcs)
     254    /// then it is worth reserving space for this amount before starting
     255    /// to build the digraph.
     256    /// \sa reserveNode
     257    void reserveArc(int m) { arcs.reserve(m); };
     258
    232259    /// \brief Node validity check
    233260    ///
    234     /// This function gives back \c true if the given node is valid,
    235     /// i.e. it is a real node of the digraph.
     261    /// This function gives back true if the given node is valid,
     262    /// ie. it is a real node of the graph.
    236263    ///
    237264    /// \warning A removed node (using Snapshot) could become valid again
    238     /// if new nodes are added to the digraph.
     265    /// when new nodes are added to the graph.
    239266    bool valid(Node n) const { return Parent::valid(n); }
    240267
    241268    /// \brief Arc validity check
    242269    ///
    243     /// This function gives back \c true if the given arc is valid,
    244     /// i.e. it is a real arc of the digraph.
     270    /// This function gives back true if the given arc is valid,
     271    /// ie. it is a real arc of the graph.
    245272    ///
    246273    /// \warning A removed arc (using Snapshot) could become valid again
    247     /// if new arcs are added to the graph.
     274    /// when new arcs are added to the graph.
    248275    bool valid(Arc a) const { return Parent::valid(a); }
    249276
     277    ///Clear the digraph.
     278
     279    ///Erase all the nodes and arcs from the digraph.
     280    ///
     281    void clear() {
     282      Parent::clear();
     283    }
     284
    250285    ///Split a node.
    251286
    252     ///This function splits the given node. First, a new node is added
    253     ///to the digraph, then the source of each outgoing arc of node \c n
    254     ///is moved to this new node.
    255     ///If the second parameter \c connect is \c true (this is the default
    256     ///value), then a new arc from node \c n to the newly created node
    257     ///is also added.
     287    ///This function splits a node. First a new node is added to the digraph,
     288    ///then the source of each outgoing arc of \c n is moved to this new node.
     289    ///If \c connect is \c true (this is the default value), then a new arc
     290    ///from \c n to the newly created node is also added.
    258291    ///\return The newly created node.
    259292    ///
    260     ///\note All iterators remain valid.
    261     ///
     293    ///\note The <tt>Arc</tt>s
     294    ///referencing a moved arc remain
     295    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
     296    ///may be invalidated.
    262297    ///\warning This functionality cannot be used together with the Snapshot
    263298    ///feature.
     
    274309    }
    275310
    276     ///Clear the digraph.
    277 
    278     ///This function erases all nodes and arcs from the digraph.
    279     ///
    280     void clear() {
    281       Parent::clear();
    282     }
    283 
    284     /// Reserve memory for nodes.
    285 
    286     /// Using this function, it is possible to avoid superfluous memory
    287     /// allocation: if you know that the digraph you want to build will
    288     /// be large (e.g. it will contain millions of nodes and/or arcs),
    289     /// then it is worth reserving space for this amount before starting
    290     /// to build the digraph.
    291     /// \sa reserveArc()
    292     void reserveNode(int n) { nodes.reserve(n); };
    293 
    294     /// Reserve memory for arcs.
    295 
    296     /// Using this function, it is possible to avoid superfluous memory
    297     /// allocation: if you know that the digraph you want to build will
    298     /// be large (e.g. it will contain millions of nodes and/or arcs),
    299     /// then it is worth reserving space for this amount before starting
    300     /// to build the digraph.
    301     /// \sa reserveNode()
    302     void reserveArc(int m) { arcs.reserve(m); };
    303 
    304311  public:
    305312
     
    326333  public:
    327334
    328     ///Class to make a snapshot of the digraph and to restore it later.
    329 
    330     ///Class to make a snapshot of the digraph and to restore it later.
     335    ///Class to make a snapshot of the digraph and to restrore to it later.
     336
     337    ///Class to make a snapshot of the digraph and to restrore to it later.
    331338    ///
    332339    ///The newly added nodes and arcs can be removed using the
    333     ///restore() function. This is the only way for deleting nodes and/or
    334     ///arcs from a SmartDigraph structure.
    335     ///
    336     ///\note After a state is restored, you cannot restore a later state,
    337     ///i.e. you cannot add the removed nodes and arcs again using
    338     ///another Snapshot instance.
    339     ///
    340     ///\warning Node splitting cannot be restored.
    341     ///\warning The validity of the snapshot is not stored due to
    342     ///performance reasons. If you do not use the snapshot correctly,
    343     ///it can cause broken program, invalid or not restored state of
    344     ///the digraph or no change.
     340    ///restore() function.
     341    ///\note After you restore a state, you cannot restore
     342    ///a later state, in other word you cannot add again the arcs deleted
     343    ///by restore() using another one Snapshot instance.
     344    ///
     345    ///\warning If you do not use correctly the snapshot that can cause
     346    ///either broken program, invalid state of the digraph, valid but
     347    ///not the restored digraph or no change. Because the runtime performance
     348    ///the validity of the snapshot is not stored.
    345349    class Snapshot
    346350    {
     
    354358
    355359      ///Default constructor.
    356       ///You have to call save() to actually make a snapshot.
     360      ///To actually make a snapshot you must call save().
     361      ///
    357362      Snapshot() : _graph(0) {}
    358363      ///Constructor that immediately makes a snapshot
    359364
    360       ///This constructor immediately makes a snapshot of the given digraph.
    361       ///
    362       Snapshot(SmartDigraph &gr) : _graph(&gr) {
     365      ///This constructor immediately makes a snapshot of the digraph.
     366      ///\param graph The digraph we make a snapshot of.
     367      Snapshot(SmartDigraph &graph) : _graph(&graph) {
    363368        node_num=_graph->nodes.size();
    364369        arc_num=_graph->arcs.size();
     
    367372      ///Make a snapshot.
    368373
    369       ///This function makes a snapshot of the given digraph.
    370       ///It can be called more than once. In case of a repeated
     374      ///Make a snapshot of the digraph.
     375      ///
     376      ///This function can be called more than once. In case of a repeated
    371377      ///call, the previous snapshot gets lost.
    372       void save(SmartDigraph &gr) {
    373         _graph=&gr;
     378      ///\param graph The digraph we make the snapshot of.
     379      void save(SmartDigraph &graph)
     380      {
     381        _graph=&graph;
    374382        node_num=_graph->nodes.size();
    375383        arc_num=_graph->arcs.size();
     
    378386      ///Undo the changes until a snapshot.
    379387
    380       ///This function undos the changes until the last snapshot
    381       ///created by save() or Snapshot(SmartDigraph&).
     388      ///Undo the changes until a snapshot created by save().
     389      ///
     390      ///\note After you restored a state, you cannot restore
     391      ///a later state, in other word you cannot add again the arcs deleted
     392      ///by restore().
    382393      void restore()
    383394      {
     
    611622  /// \brief A smart undirected graph class.
    612623  ///
    613   /// \ref SmartGraph is a simple and fast graph implementation.
    614   /// It is also quite memory efficient but at the price
    615   /// that it does not support node and edge deletion
    616   /// (except for the Snapshot feature).
     624  /// This is a simple and fast graph implementation.
     625  /// It is also quite memory efficient, but at the price
     626  /// that <b> it does support only limited (only stack-like)
     627  /// node and arc deletions</b>.
     628  /// It fully conforms to the \ref concepts::Graph "Graph concept".
    617629  ///
    618   /// This type fully conforms to the \ref concepts::Graph "Graph concept"
    619   /// and it also provides some additional functionalities.
    620   /// Most of its member functions and nested classes are documented
    621   /// only in the concept class.
    622   ///
    623   /// \sa concepts::Graph
    624   /// \sa SmartDigraph
     630  /// \sa concepts::Graph.
    625631  class SmartGraph : public ExtendedSmartGraphBase {
    626632    typedef ExtendedSmartGraphBase Parent;
    627633
    628634  private:
    629     /// Graphs are \e not copy constructible. Use GraphCopy instead.
     635
     636    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
     637
     638    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
     639    ///
    630640    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
    631     /// \brief Assignment of a graph to another one is \e not allowed.
    632     /// Use GraphCopy instead.
     641
     642    ///\brief Assignment of SmartGraph to another one is \e not allowed.
     643    ///Use GraphCopy() instead.
     644
     645    ///Assignment of SmartGraph to another one is \e not allowed.
     646    ///Use GraphCopy() instead.
    633647    void operator=(const SmartGraph &) {}
    634648
     
    641655    SmartGraph() {}
    642656
    643     /// \brief Add a new node to the graph.
    644     ///
    645     /// This function adds a new node to the graph.
     657    ///Add a new node to the graph.
     658
     659    /// Add a new node to the graph.
    646660    /// \return The new node.
    647661    Node addNode() { return Parent::addNode(); }
    648662
    649     /// \brief Add a new edge to the graph.
    650     ///
    651     /// This function adds a new edge to the graph between nodes
    652     /// \c u and \c v with inherent orientation from node \c u to
    653     /// node \c v.
    654     /// \return The new edge.
    655     Edge addEdge(Node u, Node v) {
    656       return Parent::addEdge(u, v);
     663    ///Add a new edge to the graph.
     664
     665    ///Add a new edge to the graph with node \c s
     666    ///and \c t.
     667    ///\return The new edge.
     668    Edge addEdge(const Node& s, const Node& t) {
     669      return Parent::addEdge(s, t);
    657670    }
    658671
    659672    /// \brief Node validity check
    660673    ///
    661     /// This function gives back \c true if the given node is valid,
    662     /// i.e. it is a real node of the graph.
     674    /// This function gives back true if the given node is valid,
     675    /// ie. it is a real node of the graph.
    663676    ///
    664677    /// \warning A removed node (using Snapshot) could become valid again
    665     /// if new nodes are added to the graph.
     678    /// when new nodes are added to the graph.
    666679    bool valid(Node n) const { return Parent::valid(n); }
    667680
     681    /// \brief Arc validity check
     682    ///
     683    /// This function gives back true if the given arc is valid,
     684    /// ie. it is a real arc of the graph.
     685    ///
     686    /// \warning A removed arc (using Snapshot) could become valid again
     687    /// when new edges are added to the graph.
     688    bool valid(Arc a) const { return Parent::valid(a); }
     689
    668690    /// \brief Edge validity check
    669691    ///
    670     /// This function gives back \c true if the given edge is valid,
    671     /// i.e. it is a real edge of the graph.
     692    /// This function gives back true if the given edge is valid,
     693    /// ie. it is a real edge of the graph.
    672694    ///
    673695    /// \warning A removed edge (using Snapshot) could become valid again
    674     /// if new edges are added to the graph.
     696    /// when new edges are added to the graph.
    675697    bool valid(Edge e) const { return Parent::valid(e); }
    676698
    677     /// \brief Arc validity check
    678     ///
    679     /// This function gives back \c true if the given arc is valid,
    680     /// i.e. it is a real arc of the graph.
    681     ///
    682     /// \warning A removed arc (using Snapshot) could become valid again
    683     /// if new edges are added to the graph.
    684     bool valid(Arc a) const { return Parent::valid(a); }
    685 
    686699    ///Clear the graph.
    687700
    688     ///This function erases all nodes and arcs from the graph.
     701    ///Erase all the nodes and edges from the graph.
    689702    ///
    690703    void clear() {
    691704      Parent::clear();
    692705    }
    693 
    694     /// Reserve memory for nodes.
    695 
    696     /// Using this function, it is possible to avoid superfluous memory
    697     /// allocation: if you know that the graph you want to build will
    698     /// be large (e.g. it will contain millions of nodes and/or edges),
    699     /// then it is worth reserving space for this amount before starting
    700     /// to build the graph.
    701     /// \sa reserveEdge()
    702     void reserveNode(int n) { nodes.reserve(n); };
    703 
    704     /// Reserve memory for edges.
    705 
    706     /// Using this function, it is possible to avoid superfluous memory
    707     /// allocation: if you know that the graph you want to build will
    708     /// be large (e.g. it will contain millions of nodes and/or edges),
    709     /// then it is worth reserving space for this amount before starting
    710     /// to build the graph.
    711     /// \sa reserveNode()
    712     void reserveEdge(int m) { arcs.reserve(2 * m); };
    713706
    714707  public:
     
    750743  public:
    751744
    752     ///Class to make a snapshot of the graph and to restore it later.
    753 
    754     ///Class to make a snapshot of the graph and to restore it later.
    755     ///
    756     ///The newly added nodes and edges can be removed using the
    757     ///restore() function. This is the only way for deleting nodes and/or
    758     ///edges from a SmartGraph structure.
    759     ///
    760     ///\note After a state is restored, you cannot restore a later state,
    761     ///i.e. you cannot add the removed nodes and edges again using
    762     ///another Snapshot instance.
    763     ///
    764     ///\warning The validity of the snapshot is not stored due to
    765     ///performance reasons. If you do not use the snapshot correctly,
    766     ///it can cause broken program, invalid or not restored state of
    767     ///the graph or no change.
     745    ///Class to make a snapshot of the digraph and to restrore to it later.
     746
     747    ///Class to make a snapshot of the digraph and to restrore to it later.
     748    ///
     749    ///The newly added nodes and arcs can be removed using the
     750    ///restore() function.
     751    ///
     752    ///\note After you restore a state, you cannot restore
     753    ///a later state, in other word you cannot add again the arcs deleted
     754    ///by restore() using another one Snapshot instance.
     755    ///
     756    ///\warning If you do not use correctly the snapshot that can cause
     757    ///either broken program, invalid state of the digraph, valid but
     758    ///not the restored digraph or no change. Because the runtime performance
     759    ///the validity of the snapshot is not stored.
    768760    class Snapshot
    769761    {
     
    777769
    778770      ///Default constructor.
    779       ///You have to call save() to actually make a snapshot.
     771      ///To actually make a snapshot you must call save().
     772      ///
    780773      Snapshot() : _graph(0) {}
    781774      ///Constructor that immediately makes a snapshot
    782775
    783       /// This constructor immediately makes a snapshot of the given graph.
     776      ///This constructor immediately makes a snapshot of the digraph.
     777      ///\param graph The digraph we make a snapshot of.
     778      Snapshot(SmartGraph &graph) {
     779        graph.saveSnapshot(*this);
     780      }
     781
     782      ///Make a snapshot.
     783
     784      ///Make a snapshot of the graph.
    784785      ///
    785       Snapshot(SmartGraph &gr) {
    786         gr.saveSnapshot(*this);
    787       }
    788 
    789       ///Make a snapshot.
    790 
    791       ///This function makes a snapshot of the given graph.
    792       ///It can be called more than once. In case of a repeated
     786      ///This function can be called more than once. In case of a repeated
    793787      ///call, the previous snapshot gets lost.
    794       void save(SmartGraph &gr)
     788      ///\param graph The digraph we make the snapshot of.
     789      void save(SmartGraph &graph)
    795790      {
    796         gr.saveSnapshot(*this);
    797       }
    798 
    799       ///Undo the changes until the last snapshot.
    800 
    801       ///This function undos the changes until the last snapshot
    802       ///created by save() or Snapshot(SmartGraph&).
     791        graph.saveSnapshot(*this);
     792      }
     793
     794      ///Undo the changes until a snapshot.
     795
     796      ///Undo the changes until a snapshot created by save().
     797      ///
     798      ///\note After you restored a state, you cannot restore
     799      ///a later state, in other word you cannot add again the arcs deleted
     800      ///by restore().
    803801      void restore()
    804802      {
  • lemon/soplex.cc

    r793 r623  
    9292  }
    9393
    94   int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
    95     soplex::DSVector v;
    96     for (ExprIterator it = b; it != e; ++it) {
    97       v.add(it->first, it->second);
    98     }
    99     soplex::LPRow r(l, v, u);
    100     soplex->addRow(r);
    101 
    102     _row_names.push_back(std::string());
    103 
    104     return soplex->nRows() - 1;
    105   }
    106 
    10794
    10895  void SoplexLp::_eraseCol(int i) {
  • lemon/soplex.h

    r793 r623  
    8585    virtual int _addCol();
    8686    virtual int _addRow();
    87     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    8887
    8988    virtual void _eraseCol(int i);
  • m4/lx_check_coin.m4

    r796 r674  
    8989        CBC_LDFLAGS="-L$with_coin/lib"
    9090      fi
    91       CBC_LIBS="-lOsi -lCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
     91      CBC_LIBS="-lOsi -lCbc -lOsiCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
    9292
    9393      lx_save_cxxflags="$CXXFLAGS"
  • scripts/chg-len.py

    r780 r439  
    11#! /usr/bin/env python
    2 #
    3 # This file is a part of LEMON, a generic C++ optimization library.
    4 #
    5 # Copyright (C) 2003-2009
    6 # Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
    7 # (Egervary Research Group on Combinatorial Optimization, EGRES).
    8 #
    9 # Permission to use, modify and distribute this software is granted
    10 # provided that this copyright notice appears in all copies. For
    11 # precise terms see the accompanying LICENSE file.
    12 #
    13 # This software is provided "AS IS" with no warranty of any kind,
    14 # express or implied, and with no claim as to its suitability for any
    15 # purpose.
    162
    173import sys
  • scripts/mk-release.sh

    r780 r611  
    11#!/bin/bash
    2 #
    3 # This file is a part of LEMON, a generic C++ optimization library.
    4 #
    5 # Copyright (C) 2003-2009
    6 # Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
    7 # (Egervary Research Group on Combinatorial Optimization, EGRES).
    8 #
    9 # Permission to use, modify and distribute this software is granted
    10 # provided that this copyright notice appears in all copies. For
    11 # precise terms see the accompanying LICENSE file.
    12 #
    13 # This software is provided "AS IS" with no warranty of any kind,
    14 # express or implied, and with no claim as to its suitability for any
    15 # purpose.
    162
    173set -e
  • scripts/unify-sources.sh

    r780 r702  
    11#!/bin/bash
    2 #
    3 # This file is a part of LEMON, a generic C++ optimization library.
    4 #
    5 # Copyright (C) 2003-2009
    6 # Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
    7 # (Egervary Research Group on Combinatorial Optimization, EGRES).
    8 #
    9 # Permission to use, modify and distribute this software is granted
    10 # provided that this copyright notice appears in all copies. For
    11 # precise terms see the accompanying LICENSE file.
    12 #
    13 # This software is provided "AS IS" with no warranty of any kind,
    14 # express or implied, and with no claim as to its suitability for any
    15 # purpose.
    162
    173YEAR=`date +%Y`
  • test/CMakeLists.txt

    r817 r726  
    1010SET(TESTS
    1111  adaptors_test
    12   bellman_ford_test
    1312  bfs_test
    1413  circulation_test
     
    3332  min_cost_arborescence_test
    3433  min_cost_flow_test
    35   min_mean_cycle_test
    3634  path_test
    3735  preflow_test
  • test/Makefile.am

    r817 r696  
    88check_PROGRAMS += \
    99        test/adaptors_test \
    10         test/bellman_ford_test \
    1110        test/bfs_test \
    1211        test/circulation_test \
     
    3130        test/min_cost_arborescence_test \
    3231        test/min_cost_flow_test \
    33         test/min_mean_cycle_test \
    3432        test/path_test \
    3533        test/preflow_test \
     
    5553
    5654test_adaptors_test_SOURCES = test/adaptors_test.cc
    57 test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
    5855test_bfs_test_SOURCES = test/bfs_test.cc
    5956test_circulation_test_SOURCES = test/circulation_test.cc
     
    8077test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
    8178test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
    82 test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc
    8379test_path_test_SOURCES = test/path_test.cc
    8480test_preflow_test_SOURCES = test/preflow_test.cc
  • test/circulation_test.cc

    r736 r658  
    8888    .supplyMap(supply)
    8989    .flowMap(flow);
    90  
    91   const CirculationType::Elevator& elev = const_circ_test.elevator();
    92   circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
    93   CirculationType::Tolerance tol = const_circ_test.tolerance();
    94   circ_test.tolerance(tol);
    9590
    9691  circ_test.init();
  • test/digraph_test.cc

    r827 r824  
    3737  checkGraphArcList(G, 0);
    3838
    39   G.reserveNode(3);
    40   G.reserveArc(4);
    41 
    4239  Node
    4340    n1 = G.addNode(),
     
    284281  G.addNode();
    285282  snapshot.save(G);
    286 
    287   G.addArc(G.addNode(), G.addNode());
    288 
    289   snapshot.restore();
    290   snapshot.save(G);
    291 
    292   checkGraphNodeList(G, 4);
    293   checkGraphArcList(G, 4);
    294283
    295284  G.addArc(G.addNode(), G.addNode());
     
    499488  typedef FullDigraph Digraph;
    500489  DIGRAPH_TYPEDEFS(Digraph);
    501 
    502490  Digraph G(num);
    503   check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
    504 
    505   G.resize(num);
    506   check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
    507491
    508492  checkGraphNodeList(G, num);
  • test/graph_test.cc

    r787 r463  
    3939  checkGraphArcList(G, 0);
    4040
    41   G.reserveNode(3);
    42   G.reserveEdge(3);
    43 
    4441  Node
    4542    n1 = G.addNode(),
     
    260257
    261258  snapshot.restore();
    262   snapshot.save(G);
    263259
    264260  checkGraphNodeList(G, 4);
    265261  checkGraphEdgeList(G, 3);
    266262  checkGraphArcList(G, 6);
    267  
    268   G.addEdge(G.addNode(), G.addNode());
    269 
    270   snapshot.restore();
    271 
    272   checkGraphNodeList(G, 4);
    273   checkGraphEdgeList(G, 3);
    274   checkGraphArcList(G, 6);
    275263}
    276264
     
    280268
    281269  Graph G(num);
    282   check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
    283         "Wrong size");
    284 
    285   G.resize(num);
    286   check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
    287         "Wrong size");
    288 
    289270  checkGraphNodeList(G, num);
    290271  checkGraphEdgeList(G, num * (num - 1) / 2);
     
    431412  check(G.height() == height, "Wrong row number");
    432413
    433   G.resize(width, height);
    434   check(G.width() == width, "Wrong column number");
    435   check(G.height() == height, "Wrong row number");
    436 
    437414  for (int i = 0; i < width; ++i) {
    438415    for (int j = 0; j < height; ++j) {
     
    510487
    511488  HypercubeGraph G(dim);
    512   check(G.dimension() == dim, "Wrong dimension");
    513 
    514   G.resize(dim);
    515   check(G.dimension() == dim, "Wrong dimension");
    516  
    517489  checkGraphNodeList(G, 1 << dim);
    518490  checkGraphEdgeList(G, dim * (1 << (dim-1)));
  • test/heap_test.cc

    r749 r728  
    2626
    2727#include <lemon/smart_graph.h>
     28
    2829#include <lemon/lgf_reader.h>
    2930#include <lemon/dijkstra.h>
     
    3132
    3233#include <lemon/bin_heap.h>
    33 #include <lemon/fourary_heap.h>
    34 #include <lemon/kary_heap.h>
    3534#include <lemon/fib_heap.h>
    36 #include <lemon/pairing_heap.h>
    3735#include <lemon/radix_heap.h>
    38 #include <lemon/binom_heap.h>
    3936#include <lemon/bucket_heap.h>
    4037
     
    9390void heapSortTest() {
    9491  RangeMap<int> map(test_len, -1);
     92
    9593  Heap heap(map);
    9694
    9795  std::vector<int> v(test_len);
     96
    9897  for (int i = 0; i < test_len; ++i) {
    9998    v[i] = test_seq[i];
     
    102101  std::sort(v.begin(), v.end());
    103102  for (int i = 0; i < test_len; ++i) {
    104     check(v[i] == heap.prio(), "Wrong order in heap sort.");
     103    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
    105104    heap.pop();
    106105  }
     
    114113
    115114  std::vector<int> v(test_len);
     115
    116116  for (int i = 0; i < test_len; ++i) {
    117117    v[i] = test_seq[i];
     
    124124  std::sort(v.begin(), v.end());
    125125  for (int i = 0; i < test_len; ++i) {
    126     check(v[i] == heap.prio(), "Wrong order in heap increase test.");
     126    check(v[i] == heap.prio() ,"Wrong order in heap increase test.");
    127127    heap.pop();
    128128  }
    129129}
     130
     131
    130132
    131133template <typename Heap>
     
    143145    if (dijkstra.reached(s)) {
    144146      check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a],
    145              "Error in shortest path tree.");
     147             "Error in a shortest path tree!");
    146148    }
    147149  }
     
    152154      Node s = digraph.source(a);
    153155      check( dijkstra.dist(n) - dijkstra.dist(s) == length[a],
    154              "Error in shortest path tree.");
     156             "Error in a shortest path tree!");
    155157    }
    156158  }
     
    174176    run();
    175177
    176   // BinHeap
    177178  {
    178179    typedef BinHeap<Prio, ItemIntMap> IntHeap;
     
    186187  }
    187188
    188   // FouraryHeap
    189   {
    190     typedef FouraryHeap<Prio, ItemIntMap> IntHeap;
    191     checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
    192     heapSortTest<IntHeap>();
    193     heapIncreaseTest<IntHeap>();
    194 
    195     typedef FouraryHeap<Prio, IntNodeMap > NodeHeap;
    196     checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
    197     dijkstraHeapTest<NodeHeap>(digraph, length, source);
    198   }
    199 
    200   // KaryHeap
    201   {
    202     typedef KaryHeap<Prio, ItemIntMap> IntHeap;
    203     checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
    204     heapSortTest<IntHeap>();
    205     heapIncreaseTest<IntHeap>();
    206 
    207     typedef KaryHeap<Prio, IntNodeMap > NodeHeap;
    208     checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
    209     dijkstraHeapTest<NodeHeap>(digraph, length, source);
    210   }
    211 
    212   // FibHeap
    213189  {
    214190    typedef FibHeap<Prio, ItemIntMap> IntHeap;
     
    222198  }
    223199
    224   // PairingHeap
    225   {
    226     typedef PairingHeap<Prio, ItemIntMap> IntHeap;
    227     checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
    228     heapSortTest<IntHeap>();
    229     heapIncreaseTest<IntHeap>();
    230 
    231     typedef PairingHeap<Prio, IntNodeMap > NodeHeap;
    232     checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
    233     dijkstraHeapTest<NodeHeap>(digraph, length, source);
    234   }
    235 
    236   // RadixHeap
    237200  {
    238201    typedef RadixHeap<ItemIntMap> IntHeap;
     
    246209  }
    247210
    248   // BinomHeap
    249   {
    250     typedef BinomHeap<Prio, ItemIntMap> IntHeap;
    251     checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
    252     heapSortTest<IntHeap>();
    253     heapIncreaseTest<IntHeap>();
    254 
    255     typedef BinomHeap<Prio, IntNodeMap > NodeHeap;
    256     checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
    257     dijkstraHeapTest<NodeHeap>(digraph, length, source);
    258   }
    259 
    260   // BucketHeap, SimpleBucketHeap
    261211  {
    262212    typedef BucketHeap<ItemIntMap> IntHeap;
     
    268218    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
    269219    dijkstraHeapTest<NodeHeap>(digraph, length, source);
    270 
    271     typedef SimpleBucketHeap<ItemIntMap> SimpleIntHeap;
    272     heapSortTest<SimpleIntHeap>();
    273   }
     220  }
     221
    274222
    275223  return 0;
  • test/maps_test.cc

    r773 r731  
    2424#include <lemon/maps.h>
    2525#include <lemon/list_graph.h>
    26 #include <lemon/smart_graph.h>
    27 #include <lemon/adaptors.h>
    28 #include <lemon/dfs.h>
    2926
    3027#include "test_tools.h"
     
    6461typedef ReadWriteMap<A, bool> BoolWriteMap;
    6562typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
    66 
    67 template<typename Map1, typename Map2, typename ItemIt>
    68 void compareMap(const Map1& map1, const Map2& map2, ItemIt it) {
    69   for (; it != INVALID; ++it)
    70     check(map1[it] == map2[it], "The maps are not equal");
    71 }
    7263
    7364int main()
     
    339330  {
    340331    typedef std::vector<int> vec;
    341     checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
    342     checkConcept<WriteMap<int, bool>,
    343                  LoggerBoolMap<std::back_insert_iterator<vec> > >();
    344 
    345332    vec v1;
    346333    vec v2(10);
     
    362349          it != map2.end(); ++it )
    363350      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
    364    
    365     typedef ListDigraph Graph;
    366     DIGRAPH_TYPEDEFS(Graph);
    367     Graph gr;
    368 
    369     Node n0 = gr.addNode();
    370     Node n1 = gr.addNode();
    371     Node n2 = gr.addNode();
    372     Node n3 = gr.addNode();
    373    
    374     gr.addArc(n3, n0);
    375     gr.addArc(n3, n2);
    376     gr.addArc(n0, n2);
    377     gr.addArc(n2, n1);
    378     gr.addArc(n0, n1);
    379    
    380     {
    381       std::vector<Node> v;
    382       dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
    383 
    384       check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
    385             "Something is wrong with LoggerBoolMap");
    386     }
    387     {
    388       std::vector<Node> v(countNodes(gr));
    389       dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
    390      
    391       check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
    392             "Something is wrong with LoggerBoolMap");
    393     }
    394   }
    395  
    396   // IdMap, RangeIdMap
    397   {
    398     typedef ListDigraph Graph;
    399     DIGRAPH_TYPEDEFS(Graph);
    400 
    401     checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
    402     checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
    403     checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
    404     checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
    405    
    406     Graph gr;
    407     IdMap<Graph, Node> nmap(gr);
    408     IdMap<Graph, Arc> amap(gr);
    409     RangeIdMap<Graph, Node> nrmap(gr);
    410     RangeIdMap<Graph, Arc> armap(gr);
    411    
    412     Node n0 = gr.addNode();
    413     Node n1 = gr.addNode();
    414     Node n2 = gr.addNode();
    415    
    416     Arc a0 = gr.addArc(n0, n1);
    417     Arc a1 = gr.addArc(n0, n2);
    418     Arc a2 = gr.addArc(n2, n1);
    419     Arc a3 = gr.addArc(n2, n0);
    420    
    421     check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
    422     check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
    423     check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
    424 
    425     check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
    426     check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
    427     check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
    428     check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
    429 
    430     check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
    431     check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
    432    
    433     check(nrmap.size() == 3 && armap.size() == 4,
    434           "Wrong RangeIdMap::size()");
    435 
    436     check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
    437     check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
    438     check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
    439    
    440     check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
    441     check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
    442     check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
    443     check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
    444 
    445     check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
    446     check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
    447    
    448     gr.erase(n1);
    449    
    450     if (nrmap[n0] == 1) nrmap.swap(n0, n2);
    451     nrmap.swap(n2, n0);
    452     if (armap[a1] == 1) armap.swap(a1, a3);
    453     armap.swap(a3, a1);
    454    
    455     check(nrmap.size() == 2 && armap.size() == 2,
    456           "Wrong RangeIdMap::size()");
    457 
    458     check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
    459     check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
    460    
    461     check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
    462     check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
    463 
    464     check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
    465     check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
    466   }
    467  
    468   // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
    469   {
    470     typedef ListGraph Graph;
    471     GRAPH_TYPEDEFS(Graph);
    472    
    473     checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
    474     checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
    475     checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
    476     checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
    477     checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
    478     checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
    479 
    480     Graph gr;
    481     Node n0 = gr.addNode();
    482     Node n1 = gr.addNode();
    483     Node n2 = gr.addNode();
    484    
    485     gr.addEdge(n0,n1);
    486     gr.addEdge(n1,n2);
    487     gr.addEdge(n0,n2);
    488     gr.addEdge(n2,n1);
    489     gr.addEdge(n1,n2);
    490     gr.addEdge(n0,n1);
    491    
    492     for (EdgeIt e(gr); e != INVALID; ++e) {
    493       check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
    494       check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
    495     }
    496    
    497     compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
    498                targetMap(orienter(gr, constMap<Edge, bool>(false))),
    499                EdgeIt(gr));
    500 
    501     typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
    502     Digraph dgr(gr, constMap<Edge, bool>(true));
    503     OutDegMap<Digraph> odm(dgr);
    504     InDegMap<Digraph> idm(dgr);
    505    
    506     check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
    507     check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
    508    
    509     gr.addEdge(n2, n0);
    510 
    511     check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
    512     check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
    513351  }
    514352 
     
    516354  {
    517355    typedef ListDigraph Graph;
    518     DIGRAPH_TYPEDEFS(Graph);
    519 
    520     checkConcept<ReadWriteMap<Node, int>,
    521                  CrossRefMap<Graph, Node, int> >();
    522     checkConcept<ReadWriteMap<Node, bool>,
    523                  CrossRefMap<Graph, Node, bool> >();
    524     checkConcept<ReadWriteMap<Node, double>,
    525                  CrossRefMap<Graph, Node, double> >();
    526    
    527     Graph gr;
    528     typedef CrossRefMap<Graph, Node, char> CRMap;
    529     CRMap map(gr);
    530    
    531     Node n0 = gr.addNode();
    532     Node n1 = gr.addNode();
    533     Node n2 = gr.addNode();
    534    
    535     map.set(n0, 'A');
    536     map.set(n1, 'B');
    537     map.set(n2, 'C');
    538    
    539     check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
    540           "Wrong CrossRefMap");
    541     check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
    542           "Wrong CrossRefMap");
    543     check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
    544           "Wrong CrossRefMap");
    545     check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
    546           "Wrong CrossRefMap::count()");
    547    
    548     CRMap::ValueIt it = map.beginValue();
    549     check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
    550           it == map.endValue(), "Wrong value iterator");
    551    
    552     map.set(n2, 'A');
    553 
    554     check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
    555           "Wrong CrossRefMap");
    556     check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
    557     check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
    558     check(map('C') == INVALID && map.inverse()['C'] == INVALID,
    559           "Wrong CrossRefMap");
    560     check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
    561           "Wrong CrossRefMap::count()");
    562 
    563     it = map.beginValue();
    564     check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
    565           it == map.endValue(), "Wrong value iterator");
    566 
    567     map.set(n0, 'C');
    568 
    569     check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
    570           "Wrong CrossRefMap");
    571     check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
    572     check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
    573     check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
    574     check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
    575           "Wrong CrossRefMap::count()");
    576 
    577     it = map.beginValue();
    578     check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
    579           it == map.endValue(), "Wrong value iterator");
    580   }
    581 
    582   // CrossRefMap
    583   {
    584     typedef SmartDigraph Graph;
    585356    DIGRAPH_TYPEDEFS(Graph);
    586357
     
    613384          it == map.endValue(), "Wrong value iterator");
    614385  }
    615  
    616   // Iterable bool map
    617   {
    618     typedef SmartGraph Graph;
    619     typedef SmartGraph::Node Item;
    620 
    621     typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
    622     checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
    623 
    624     const int num = 10;
    625     Graph g;
    626     std::vector<Item> items;
    627     for (int i = 0; i < num; ++i) {
    628       items.push_back(g.addNode());
    629     }
    630 
    631     Ibm map1(g, true);
    632     int n = 0;
    633     for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
    634       check(map1[static_cast<Item>(it)], "Wrong TrueIt");
    635       ++n;
    636     }
    637     check(n == num, "Wrong number");
    638 
    639     n = 0;
    640     for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
    641         check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
    642         ++n;
    643     }
    644     check(n == num, "Wrong number");
    645     check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
    646     check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
    647 
    648     map1[items[5]] = true;
    649 
    650     n = 0;
    651     for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
    652         check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
    653         ++n;
    654     }
    655     check(n == num, "Wrong number");
    656 
    657     map1[items[num / 2]] = false;
    658     check(map1[items[num / 2]] == false, "Wrong map value");
    659 
    660     n = 0;
    661     for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
    662         check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
    663         ++n;
    664     }
    665     check(n == num - 1, "Wrong number");
    666 
    667     n = 0;
    668     for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
    669         check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
    670         ++n;
    671     }
    672     check(n == 1, "Wrong number");
    673 
    674     map1[items[0]] = false;
    675     check(map1[items[0]] == false, "Wrong map value");
    676 
    677     map1[items[num - 1]] = false;
    678     check(map1[items[num - 1]] == false, "Wrong map value");
    679 
    680     n = 0;
    681     for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
    682         check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
    683         ++n;
    684     }
    685     check(n == num - 3, "Wrong number");
    686     check(map1.trueNum() == num - 3, "Wrong number");
    687 
    688     n = 0;
    689     for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
    690         check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
    691         ++n;
    692     }
    693     check(n == 3, "Wrong number");
    694     check(map1.falseNum() == 3, "Wrong number");
    695   }
    696 
    697   // Iterable int map
    698   {
    699     typedef SmartGraph Graph;
    700     typedef SmartGraph::Node Item;
    701     typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
    702 
    703     checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
    704 
    705     const int num = 10;
    706     Graph g;
    707     std::vector<Item> items;
    708     for (int i = 0; i < num; ++i) {
    709       items.push_back(g.addNode());
    710     }
    711 
    712     Iim map1(g);
    713     check(map1.size() == 0, "Wrong size");
    714 
    715     for (int i = 0; i < num; ++i) {
    716       map1[items[i]] = i;
    717     }
    718     check(map1.size() == num, "Wrong size");
    719 
    720     for (int i = 0; i < num; ++i) {
    721       Iim::ItemIt it(map1, i);
    722       check(static_cast<Item>(it) == items[i], "Wrong value");
    723       ++it;
    724       check(static_cast<Item>(it) == INVALID, "Wrong value");
    725     }
    726 
    727     for (int i = 0; i < num; ++i) {
    728       map1[items[i]] = i % 2;
    729     }
    730     check(map1.size() == 2, "Wrong size");
    731 
    732     int n = 0;
    733     for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
    734       check(map1[static_cast<Item>(it)] == 0, "Wrong value");
    735       ++n;
    736     }
    737     check(n == (num + 1) / 2, "Wrong number");
    738 
    739     for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
    740       check(map1[static_cast<Item>(it)] == 1, "Wrong value");
    741       ++n;
    742     }
    743     check(n == num, "Wrong number");
    744 
    745   }
    746 
    747   // Iterable value map
    748   {
    749     typedef SmartGraph Graph;
    750     typedef SmartGraph::Node Item;
    751     typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
    752 
    753     checkConcept<ReadWriteMap<Item, double>, Ivm>();
    754 
    755     const int num = 10;
    756     Graph g;
    757     std::vector<Item> items;
    758     for (int i = 0; i < num; ++i) {
    759       items.push_back(g.addNode());
    760     }
    761 
    762     Ivm map1(g, 0.0);
    763     check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
    764     check(*map1.beginValue() == 0.0, "Wrong value");
    765 
    766     for (int i = 0; i < num; ++i) {
    767       map1.set(items[i], static_cast<double>(i));
    768     }
    769     check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
    770 
    771     for (int i = 0; i < num; ++i) {
    772       Ivm::ItemIt it(map1, static_cast<double>(i));
    773       check(static_cast<Item>(it) == items[i], "Wrong value");
    774       ++it;
    775       check(static_cast<Item>(it) == INVALID, "Wrong value");
    776     }
    777 
    778     for (Ivm::ValueIt vit = map1.beginValue();
    779          vit != map1.endValue(); ++vit) {
    780       check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
    781             "Wrong ValueIt");
    782     }
    783 
    784     for (int i = 0; i < num; ++i) {
    785       map1.set(items[i], static_cast<double>(i % 2));
    786     }
    787     check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
    788 
    789     int n = 0;
    790     for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
    791       check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
    792       ++n;
    793     }
    794     check(n == (num + 1) / 2, "Wrong number");
    795 
    796     for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
    797       check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
    798       ++n;
    799     }
    800     check(n == num, "Wrong number");
    801 
    802   }
     386
    803387  return 0;
    804388}
  • test/mip_test.cc

    r795 r678  
    5151  if (stat ==  MipSolver::OPTIMAL) {
    5252    std::ostringstream sbuf;
    53     sbuf << "Wrong optimal value ("<< mip.solValue()
    54          <<" instead of " << exp_opt << ")";
     53    buf << "Wrong optimal value: the right optimum is " << exp_opt;
    5554    check(std::abs(mip.solValue()-exp_opt) < 1e-3, sbuf.str());
    5655    //+ecvt(exp_opt,2)
  • test/preflow_test.cc

    r736 r632  
    9595  PreflowType preflow_test(g, cap, n, n);
    9696  const PreflowType& const_preflow_test = preflow_test;
    97  
    98   const PreflowType::Elevator& elev = const_preflow_test.elevator();
    99   preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
    100   PreflowType::Tolerance tol = const_preflow_test.tolerance();
    101   preflow_test.tolerance(tol);
    10297
    10398  preflow_test
  • test/test_tools.h

    r810 r463  
    3838///print something like this (and then exits).
    3939///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
    40 #define check(rc, msg)                                                  \
    41   {                                                                     \
    42     if(!(rc)) {                                                         \
    43       std::cerr << __FILE__ ":" << __LINE__ << ": error: "              \
    44                 << msg << std::endl;                                    \
    45       abort();                                                          \
    46     } else { }                                                          \
    47   }                                                                     \
    48    
     40#define check(rc, msg) \
     41  if(!(rc)) { \
     42    std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \
     43    abort(); \
     44  } else { } \
    4945
    5046#endif
  • tools/lemon-0.x-to-1.x.sh

    r738 r621  
    3636        -e "s/Edge\>/_Ar_c_label_/g"\
    3737        -e "s/\<edge\>/_ar_c_label_/g"\
    38         -e "s/_edge\>/__ar_c_label_/g"\
     38        -e "s/_edge\>/_ar_c_label_/g"\
    3939        -e "s/Edges\>/_Ar_c_label_s/g"\
    4040        -e "s/\<edges\>/_ar_c_label_s/g"\
    41         -e "s/_edges\>/__ar_c_label_s/g"\
     41        -e "s/_edges\>/_ar_c_label_s/g"\
    4242        -e "s/\([Ee]\)dge\([a-z]\)/_\1d_ge_label_\2/g"\
    4343        -e "s/\([a-z]\)edge/\1_ed_ge_label_/g"\
     
    6969        -e "s/_GR_APH_TY_PEDE_FS_label_/GRAPH_TYPEDEFS/g"\
    7070        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
    71         -e "s/\<digraph_adaptor\.h\>/adaptors.h/g"\
    72         -e "s/\<digraph_utils\.h\>/core.h/g"\
    73         -e "s/\<digraph_reader\.h\>/lgf_reader.h/g"\
    74         -e "s/\<digraph_writer\.h\>/lgf_writer.h/g"\
    75         -e "s/\<topology\.h\>/connectivity.h/g"\
    7671        -e "s/DigraphToEps/GraphToEps/g"\
    7772        -e "s/digraphToEps/graphToEps/g"\
Note: See TracChangeset for help on using the changeset viewer.