Changes in / [929:65a0521e744e:933:ac5f72c48367] in lemon
- Files:
-
- 16 added
- 75 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r727 r791 35 35 CHECK_TYPE_SIZE("long long" LONG_LONG) 36 36 SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG}) 37 38 INCLUDE(FindPythonInterp) 37 39 38 40 ENABLE_TESTING() -
INSTALL
r615 r890 174 174 175 175 Disable COIN-OR support. 176 177 178 Makefile Variables 179 ================== 180 181 Some Makefile variables are reserved by the GNU Coding Standards for 182 the use of the "user" - the person building the package. For instance, 183 CXX and CXXFLAGS are such variables, and have the same meaning as 184 explained in the previous section. These variables can be set on the 185 command line when invoking `make' like this: 186 `make [VARIABLE=VALUE]...' 187 188 WARNINGCXXFLAGS is a non-standard Makefile variable introduced by us 189 to hold several compiler flags related to warnings. Its default value 190 can be overridden when invoking `make'. For example to disable all 191 warning flags use `make WARNINGCXXFLAGS='. 192 193 In order to turn off a single flag from the default set of warning 194 flags, you can use the CXXFLAGS variable, since this is passed after 195 WARNINGCXXFLAGS. For example to turn off `-Wold-style-cast' (which is 196 used by default when g++ is detected) you can use 197 `make CXXFLAGS="-g -O2 -Wno-old-style-cast"'. -
Makefile.am
r676 r840 18 18 cmake/FindGLPK.cmake \ 19 19 cmake/FindCOIN.cmake \ 20 cmake/LEMONConfig.cmake.in \ 20 21 cmake/version.cmake.in \ 21 22 cmake/version.cmake \ … … 44 45 include doc/Makefile.am 45 46 include tools/Makefile.am 47 include scripts/Makefile.am 46 48 47 49 DIST_SUBDIRS = demo -
README
r705 r921 18 18 Copying, distribution and modification conditions and terms. 19 19 20 NEWS 21 22 News and version history. 23 20 24 INSTALL 21 25 … … 34 38 Some example programs to make you easier to get familiar with LEMON. 35 39 40 scripts/ 41 42 Scripts that make it easier to develop LEMON. 43 36 44 test/ 37 45 -
configure.ac
r727 r840 42 42 43 43 AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no]) 44 AC_CHECK_PROG([python_found],[python],[yes],[no]) 44 45 AC_CHECK_PROG([gs_found],[gs],[yes],[no]) 45 46 … … 82 83 fi 83 84 AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"]) 85 86 dnl Support for running test cases using valgrind. 87 use_valgrind=no 88 AC_ARG_ENABLE([valgrind], 89 AS_HELP_STRING([--enable-valgrind], [use valgrind when running tests]), 90 [use_valgrind=yes]) 91 92 if [[ "$use_valgrind" = "yes" ]]; then 93 AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no) 94 95 if [[ "$HAVE_VALGRIND" = "no" ]]; then 96 AC_MSG_ERROR([Valgrind not found in PATH.]) 97 fi 98 fi 99 AM_CONDITIONAL(USE_VALGRIND, [test "$use_valgrind" = "yes"]) 84 100 85 101 dnl Checks for header files. … … 128 144 echo 129 145 echo Build additional tools........ : $enable_tools 146 echo Use valgrind for tests........ : $use_valgrind 130 147 echo 131 148 echo The packace will be installed in -
demo/arg_parser_demo.cc
r463 r915 66 66 .other("..."); 67 67 68 // Throw an exception when problems occurs. The default behavior is to 69 // exit(1) on these cases, but this makes Valgrind falsely warn 70 // about memory leaks. 71 ap.throwOnProblems(); 72 68 73 // Perform the parsing process 69 74 // (in case of any error it terminates the program) 70 ap.parse(); 75 // The try {} construct is necessary only if the ap.trowOnProblems() 76 // setting is in use. 77 try { 78 ap.parse(); 79 } catch (ArgParserException &) { return 1; } 71 80 72 81 // Check each option if it has been given and print its value -
doc/CMakeLists.txt
r726 r895 10 10 ) 11 11 12 IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)12 IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE) 13 13 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/) 14 14 SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha) … … 27 27 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps 28 28 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps 29 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/planar.png ${CMAKE_CURRENT_SOURCE_DIR}/images/planar.eps 29 30 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps 30 31 COMMAND ${CMAKE_COMMAND} -E remove_directory html 32 COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox 31 33 COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile 32 34 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -
doc/Doxyfile.in
r379 r803 1 # Doxyfile 1.5. 7.11 # Doxyfile 1.5.9 2 2 3 3 #--------------------------------------------------------------------------- … … 22 22 QT_AUTOBRIEF = NO 23 23 MULTILINE_CPP_IS_BRIEF = NO 24 DETAILS_AT_TOP = YES25 24 INHERIT_DOCS = NO 26 25 SEPARATE_MEMBER_PAGES = NO … … 92 91 "@abs_top_srcdir@/demo" \ 93 92 "@abs_top_srcdir@/tools" \ 94 "@abs_top_srcdir@/test/test_tools.h" 93 "@abs_top_srcdir@/test/test_tools.h" \ 94 "@abs_top_builddir@/doc/references.dox" 95 95 INPUT_ENCODING = UTF-8 96 96 FILE_PATTERNS = *.h \ … … 224 224 SKIP_FUNCTION_MACROS = YES 225 225 #--------------------------------------------------------------------------- 226 # Configuration::additions related to external references226 # Options related to the search engine 227 227 #--------------------------------------------------------------------------- 228 228 TAGFILES = "@abs_top_srcdir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/ " -
doc/Makefile.am
r720 r895 29 29 edge_biconnected_components.eps \ 30 30 node_biconnected_components.eps \ 31 planar.eps \ 31 32 strongly_connected_components.eps 32 33 … … 67 68 fi 68 69 69 html-local: $(DOC_PNG_IMAGES) 70 references.dox: doc/references.bib 71 if test ${python_found} = yes; then \ 72 cd doc; \ 73 python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \ 74 cd ..; \ 75 else \ 76 echo; \ 77 echo "Python not found."; \ 78 echo; \ 79 exit 1; \ 80 fi 81 82 html-local: $(DOC_PNG_IMAGES) references.dox 70 83 if test ${doxygen_found} = yes; then \ 71 84 cd doc; \ -
doc/groups.dox
r762 r879 317 317 318 318 This group contains the common graph search algorithms, namely 319 \e breadth-first \e search (BFS) and \e depth-first \e search (DFS). 319 \e breadth-first \e search (BFS) and \e depth-first \e search (DFS) 320 \ref clrs01algorithms. 320 321 */ 321 322 … … 325 326 \brief Algorithms for finding shortest paths. 326 327 327 This group contains the algorithms for finding shortest paths in digraphs. 328 This group contains the algorithms for finding shortest paths in digraphs 329 \ref clrs01algorithms. 328 330 329 331 - \ref Dijkstra algorithm for finding shortest paths from a source node … … 347 349 348 350 This group contains the algorithms for finding minimum cost spanning 349 trees and arborescences .351 trees and arborescences \ref clrs01algorithms. 350 352 */ 351 353 … … 356 358 357 359 This group contains the algorithms for finding maximum flows and 358 feasible circulations .360 feasible circulations \ref clrs01algorithms, \ref amo93networkflows. 359 361 360 362 The \e maximum \e flow \e problem is to find a flow of maximum value between … … 371 373 372 374 LEMON contains several algorithms for solving maximum flow problems: 373 - \ref EdmondsKarp Edmonds-Karp algorithm. 374 - \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm. 375 - \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees. 376 - \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees. 377 378 In most cases the \ref Preflow "Preflow" algorithm provides the 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 379 385 fastest method for computing a maximum flow. All implementations 380 386 also provide functions to query the minimum cut, which is the dual … … 394 400 395 401 This group contains the algorithms for finding minimum cost flows and 396 circulations. For more information about this problem and its dual 397 solution see \ref min_cost_flow "Minimum Cost Flow Problem". 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". 398 405 399 406 LEMON contains several algorithms for this problem. 400 407 - \ref NetworkSimplex Primal Network Simplex algorithm with various 401 pivot strategies. 402 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on 403 cost scaling. 404 - \ref CapacityScaling Successive Shortest %Path algorithm with optional 405 capacity scaling. 406 - \ref CancelAndTighten The Cancel and Tighten algorithm. 407 - \ref CycleCanceling Cycle-Canceling algorithms. 408 pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex. 409 - \ref CostScaling Cost Scaling algorithm based on push/augment and 410 relabel operations \ref goldberg90approximation, \ref goldberg97efficient, 411 \ref bunnagel98efficient. 412 - \ref CapacityScaling Capacity Scaling algorithm based on the successive 413 shortest path method \ref edmondskarp72theoretical. 414 - \ref CycleCanceling Cycle-Canceling algorithms, two of which are 415 strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling. 408 416 409 417 In general NetworkSimplex is the most efficient implementation, … … 441 449 If you want to find minimum cut just between two distinict nodes, 442 450 see the \ref max_flow "maximum flow problem". 451 */ 452 453 /** 454 @defgroup min_mean_cycle Minimum Mean Cycle Algorithms 455 @ingroup algs 456 \brief Algorithms for finding minimum mean cycles. 457 458 This group contains the algorithms for finding minimum mean cycles 459 \ref clrs01algorithms, \ref amo93networkflows. 460 461 The \e minimum \e mean \e cycle \e problem is to find a directed cycle 462 of minimum mean length (cost) in a digraph. 463 The mean length of a cycle is the average length of its arcs, i.e. the 464 ratio between the total length of the cycle and the number of arcs on it. 465 466 This problem has an important connection to \e conservative \e length 467 \e functions, too. A length function on the arcs of a digraph is called 468 conservative if and only if there is no directed cycle of negative total 469 length. For an arbitrary length function, the negative of the minimum 470 cycle mean is the smallest \f$\epsilon\f$ value so that increasing the 471 arc lengths uniformly by \f$\epsilon\f$ results in a conservative length 472 function. 473 474 LEMON contains three algorithms for solving the minimum mean cycle problem: 475 - \ref Karp "Karp"'s original algorithm \ref amo93networkflows, 476 \ref dasdan98minmeancycle. 477 - \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved 478 version of Karp's algorithm \ref dasdan98minmeancycle. 479 - \ref Howard "Howard"'s policy iteration algorithm 480 \ref dasdan98minmeancycle. 481 482 In practice, the Howard algorithm proved to be by far the most efficient 483 one, though the best known theoretical bound on its running time is 484 exponential. 485 Both Karp and HartmannOrlin algorithms run in time O(ne) and use space 486 O(n<sup>2</sup>+e), but the latter one is typically faster due to the 487 applied early termination scheme. 443 488 */ 444 489 … … 535 580 536 581 /** 537 @defgroup lp_group L p and MipSolvers582 @defgroup lp_group LP and MIP Solvers 538 583 @ingroup gen_opt_group 539 \brief Lp and Mip solver interfaces for LEMON. 540 541 This group contains Lp and Mip solver interfaces for LEMON. The 542 various LP solvers could be used in the same manner with this 543 interface. 584 \brief LP and MIP solver interfaces for LEMON. 585 586 This group contains LP and MIP solver interfaces for LEMON. 587 Various LP solvers could be used in the same manner with this 588 high-level interface. 589 590 The currently supported solvers are \ref glpk, \ref clp, \ref cbc, 591 \ref cplex, \ref soplex. 544 592 */ 545 593 … … 680 728 \brief Skeleton and concept checking classes for graph structures 681 729 682 This group contains the skeletons and concept checking classes of LEMON's683 graph structures and helper classes used to implement these.730 This group contains the skeletons and concept checking classes of 731 graph structures. 684 732 */ 685 733 -
doc/mainpage.dox
r705 r921 22 22 \section intro Introduction 23 23 24 \subsection whatis What is LEMON 25 26 LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling 27 and <b>O</b>ptimization in <b>N</b>etworks. 28 It is a C++ template 29 library aimed at combinatorial optimization tasks which 30 often involve in working 31 with graphs. 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 implementations of common 27 data structures and algorithms with focus on combinatorial optimization 28 tasks connected mainly with graphs and networks. 32 29 33 30 <b> … … 39 36 </b> 40 37 41 \subsection howtoread How to read the documentation 38 The project is maintained by the 39 <a href="http://www.cs.elte.hu/egres/">Egervá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/en/">Eötvös Loránd University</a>, 43 Budapest, 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 42 48 43 49 If you would like to get to know the library, see 44 50 <a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>. 51 52 If you are interested in starting to use the library, see the <a class="el" 53 href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation 54 Guide</a>. 45 55 46 56 If you know what you are looking for, then try to find it under the -
doc/min_cost_flow.dox
r710 r835 27 27 minimum total cost from a set of supply nodes to a set of demand nodes 28 28 in a network with capacity constraints (lower and upper bounds) 29 and arc costs .29 and arc costs \ref amo93networkflows. 30 30 31 31 Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$, … … 79 79 - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$. 80 80 - For all \f$u\in V\f$ nodes: 81 - \f$\pi(u) <=0\f$;81 - \f$\pi(u)\leq 0\f$; 82 82 - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$, 83 83 then \f$\pi(u)=0\f$. … … 146 146 - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$. 147 147 - For all \f$u\in V\f$ nodes: 148 - \f$\pi(u) >=0\f$;148 - \f$\pi(u)\geq 0\f$; 149 149 - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$, 150 150 then \f$\pi(u)=0\f$. -
lemon/Makefile.am
r929 r933 63 63 lemon/binomial_heap.h \ 64 64 lemon/bucket_heap.h \ 65 lemon/capacity_scaling.h \ 65 66 lemon/cbc.h \ 66 67 lemon/circulation.h \ … … 69 70 lemon/concept_check.h \ 70 71 lemon/connectivity.h \ 72 lemon/core.h \ 73 lemon/cost_scaling.h \ 71 74 lemon/counter.h \ 72 lemon/core.h \73 75 lemon/cplex.h \ 76 lemon/cycle_canceling.h \ 74 77 lemon/dfs.h \ 75 78 lemon/dheap.h \ … … 87 90 lemon/graph_to_eps.h \ 88 91 lemon/grid_graph.h \ 92 lemon/hartmann_orlin.h \ 93 lemon/howard.h \ 89 94 lemon/hypercube_graph.h \ 95 lemon/karp.h \ 90 96 lemon/kruskal.h \ 91 97 lemon/hao_orlin.h \ … … 104 110 lemon/pairing_heap.h \ 105 111 lemon/path.h \ 112 lemon/planarity.h \ 106 113 lemon/preflow.h \ 107 114 lemon/quad_heap.h \ … … 111 118 lemon/smart_graph.h \ 112 119 lemon/soplex.h \ 120 lemon/static_graph.h \ 113 121 lemon/suurballe.h \ 114 122 lemon/time_measure.h \ -
lemon/adaptors.h
r703 r834 361 361 /// parameter is set to be \c const. 362 362 /// 363 /// This class provides item counting in the same time as the adapted 364 /// digraph structure. 365 /// 363 366 /// \tparam DGR The type of the adapted digraph. 364 367 /// It must conform to the \ref concepts::Digraph "Digraph" concept. … … 719 722 /// by adding or removing nodes or arcs, unless the \c GR template 720 723 /// parameter is set to be \c const. 724 /// 725 /// This class provides only linear time counting for nodes and arcs. 721 726 /// 722 727 /// \tparam DGR The type of the adapted digraph. … … 1315 1320 /// parameter is set to be \c const. 1316 1321 /// 1322 /// This class provides only linear time counting for nodes, edges and arcs. 1323 /// 1317 1324 /// \tparam GR The type of the adapted graph. 1318 1325 /// It must conform to the \ref concepts::Graph "Graph" concept. … … 1471 1478 /// by adding or removing nodes or arcs/edges, unless the \c GR template 1472 1479 /// parameter is set to be \c const. 1480 /// 1481 /// This class provides only linear time item counting. 1473 1482 /// 1474 1483 /// \tparam GR The type of the adapted digraph or graph. … … 1620 1629 /// parameter is set to be \c const. 1621 1630 /// 1631 /// This class provides only linear time counting for nodes and arcs. 1632 /// 1622 1633 /// \tparam DGR The type of the adapted digraph. 1623 1634 /// It must conform to the \ref concepts::Digraph "Digraph" concept. … … 1729 1740 /// by adding or removing nodes or edges, unless the \c GR template 1730 1741 /// parameter is set to be \c const. 1742 /// 1743 /// This class provides only linear time counting for nodes, edges and arcs. 1731 1744 /// 1732 1745 /// \tparam GR The type of the adapted graph. … … 2233 2246 /// parameter is set to be \c const. 2234 2247 /// 2248 /// This class provides item counting in the same time as the adapted 2249 /// digraph structure. 2250 /// 2235 2251 /// \tparam DGR The type of the adapted digraph. 2236 2252 /// It must conform to the \ref concepts::Digraph "Digraph" concept. … … 2535 2551 /// by adding or removing nodes or arcs, unless the \c GR template 2536 2552 /// parameter is set to be \c const. 2553 /// 2554 /// This class provides item counting in the same time as the adapted 2555 /// graph structure. 2537 2556 /// 2538 2557 /// \tparam GR The type of the adapted graph. … … 2678 2697 /// arcs). 2679 2698 /// This class conforms to the \ref concepts::Digraph "Digraph" concept. 2699 /// 2700 /// This class provides only linear time counting for nodes and arcs. 2680 2701 /// 2681 2702 /// \tparam DGR The type of the adapted digraph. … … 3326 3347 /// in the adaptor. 3327 3348 /// 3349 /// This class provides item counting in the same time as the adapted 3350 /// digraph structure. 3351 /// 3328 3352 /// \tparam DGR The type of the adapted digraph. 3329 3353 /// It must conform to the \ref concepts::Digraph "Digraph" concept. -
lemon/arg_parser.cc
r463 r915 21 21 namespace lemon { 22 22 23 void ArgParser::_terminate(ArgParserException::Reason reason) const 24 { 25 if(_exit_on_problems) 26 exit(1); 27 else throw(ArgParserException(reason)); 28 } 29 30 23 31 void ArgParser::_showHelp(void *p) 24 32 { 25 33 (static_cast<ArgParser*>(p))->showHelp(); 26 exit(1);34 (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP); 27 35 } 28 36 29 37 ArgParser::ArgParser(int argc, const char * const *argv) 30 :_argc(argc), _argv(argv), _command_name(argv[0]) { 38 :_argc(argc), _argv(argv), _command_name(argv[0]), 39 _exit_on_problems(true) { 31 40 funcOption("-help","Print a short help message",_showHelp,this); 32 41 synonym("help","-help"); … … 343 352 i!=_others_help.end();++i) showHelp(i); 344 353 for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); 345 exit(1);354 _terminate(ArgParserException::HELP); 346 355 } 347 356 … … 352 361 std::cerr << "\nType '" << _command_name << 353 362 " --help' to obtain a short summary on the usage.\n\n"; 354 exit(1);363 _terminate(ArgParserException::UNKNOWN_OPT); 355 364 } 356 365 … … 415 424 std::cerr << "\nType '" << _command_name << 416 425 " --help' to obtain a short summary on the usage.\n\n"; 417 exit(1);426 _terminate(ArgParserException::INVALID_OPT); 418 427 } 419 428 } -
lemon/arg_parser.h
r463 r915 35 35 namespace lemon { 36 36 37 ///Exception used by ArgParser 38 class ArgParserException : public Exception { 39 public: 40 enum Reason { 41 HELP, /// <tt>--help</tt> option was given 42 UNKNOWN_OPT, /// Unknown option was given 43 INVALID_OPT /// Invalid combination of options 44 }; 45 46 private: 47 Reason _reason; 48 49 public: 50 ///Constructor 51 ArgParserException(Reason r) throw() : _reason(r) {} 52 ///Virtual destructor 53 virtual ~ArgParserException() throw() {} 54 ///A short description of the exception 55 virtual const char* what() const throw() { 56 switch(_reason) 57 { 58 case HELP: 59 return "lemon::ArgParseException: ask for help"; 60 break; 61 case UNKNOWN_OPT: 62 return "lemon::ArgParseException: unknown option"; 63 break; 64 case INVALID_OPT: 65 return "lemon::ArgParseException: invalid combination of options"; 66 break; 67 } 68 return ""; 69 } 70 ///Return the reason for the failure 71 Reason reason() const {return _reason; } 72 }; 73 74 37 75 ///Command line arguments parser 38 76 … … 104 142 std::string _command_name; 105 143 106 144 107 145 private: 108 146 //Bind a function to an option. … … 116 154 const std::string &help, 117 155 void (*func)(void *),void *data); 156 157 bool _exit_on_problems; 158 159 void _terminate(ArgParserException::Reason reason) const; 118 160 119 161 public: … … 381 423 const std::vector<std::string> &files() const { return _file_args; } 382 424 425 ///Throw instead of exit in case of problems 426 void throwOnProblems() 427 { 428 _exit_on_problems=false; 429 } 383 430 }; 384 431 } -
lemon/bellman_ford.h
r746 r917 24 24 /// \brief Bellman-Ford algorithm. 25 25 26 #include <lemon/list_graph.h> 26 27 #include <lemon/bits/path_dump.h> 27 28 #include <lemon/core.h> 28 29 #include <lemon/error.h> 29 30 #include <lemon/maps.h> 31 #include <lemon/tolerance.h> 30 32 #include <lemon/path.h> 31 33 … … 34 36 namespace lemon { 35 37 36 /// \brief Default OperationTraits for the BellmanFord algorithm class.38 /// \brief Default operation traits for the BellmanFord algorithm class. 37 39 /// 38 40 /// This operation traits class defines all computational operations … … 41 43 /// If the numeric type does not have infinity value, then the maximum 42 44 /// value is used as extremal infinity value. 45 /// 46 /// \see BellmanFordToleranceOperationTraits 43 47 template < 44 48 typename V, 45 49 bool has_inf = std::numeric_limits<V>::has_infinity> 46 50 struct BellmanFordDefaultOperationTraits { 47 /// \ e51 /// \brief Value type for the algorithm. 48 52 typedef V Value; 49 53 /// \brief Gives back the zero value of the type. … … 84 88 }; 85 89 90 /// \brief Operation traits for the BellmanFord algorithm class 91 /// using tolerance. 92 /// 93 /// This operation traits class defines all computational operations 94 /// and constants that are used in the Bellman-Ford algorithm. 95 /// The only difference between this implementation and 96 /// \ref BellmanFordDefaultOperationTraits is that this class uses 97 /// the \ref Tolerance "tolerance technique" in its \ref less() 98 /// function. 99 /// 100 /// \tparam V The value type. 101 /// \tparam eps The epsilon value for the \ref less() function. 102 /// By default, it is the epsilon value used by \ref Tolerance 103 /// "Tolerance<V>". 104 /// 105 /// \see BellmanFordDefaultOperationTraits 106 #ifdef DOXYGEN 107 template <typename V, V eps> 108 #else 109 template < 110 typename V, 111 V eps = Tolerance<V>::def_epsilon> 112 #endif 113 struct BellmanFordToleranceOperationTraits { 114 /// \brief Value type for the algorithm. 115 typedef V Value; 116 /// \brief Gives back the zero value of the type. 117 static Value zero() { 118 return static_cast<Value>(0); 119 } 120 /// \brief Gives back the positive infinity value of the type. 121 static Value infinity() { 122 return std::numeric_limits<Value>::infinity(); 123 } 124 /// \brief Gives back the sum of the given two elements. 125 static Value plus(const Value& left, const Value& right) { 126 return left + right; 127 } 128 /// \brief Gives back \c true only if the first value is less than 129 /// the second. 130 static bool less(const Value& left, const Value& right) { 131 return left + eps < right; 132 } 133 }; 134 86 135 /// \brief Default traits class of BellmanFord class. 87 136 /// … … 107 156 /// It defines the used operations and the infinity value for the 108 157 /// given \c Value type. 109 /// \see BellmanFordDefaultOperationTraits 158 /// \see BellmanFordDefaultOperationTraits, 159 /// BellmanFordToleranceOperationTraits 110 160 typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; 111 161 … … 171 221 /// the lengths of the arcs. The default map type is 172 222 /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>". 223 /// \tparam TR The traits class that defines various types used by the 224 /// algorithm. By default, it is \ref BellmanFordDefaultTraits 225 /// "BellmanFordDefaultTraits<GR, LEN>". 226 /// In most cases, this parameter should not be set directly, 227 /// consider to use the named template parameters instead. 173 228 #ifdef DOXYGEN 174 229 template <typename GR, typename LEN, typename TR> … … 237 292 _dist = Traits::createDistMap(*_gr); 238 293 } 239 _mask = new MaskMap(*_gr, false); 294 if(!_mask) { 295 _mask = new MaskMap(*_gr); 296 } 240 297 } 241 298 … … 300 357 /// \ref named-templ-param "Named parameter" for setting 301 358 /// \c OperationTraits type. 302 /// For more information see \ref BellmanFordDefaultOperationTraits.359 /// For more information, see \ref BellmanFordDefaultOperationTraits. 303 360 template <class T> 304 361 struct SetOperationTraits … … 403 460 _process.push_back(it); 404 461 _mask->set(it, true); 462 } 463 } else { 464 for (NodeIt it(*_gr); it != INVALID; ++it) { 465 _mask->set(it, false); 405 466 } 406 467 } … … 718 779 /// 719 780 /// The shortest path tree used here is equal to the shortest path 720 /// tree used in \ref predNode() and \ predMap().781 /// tree used in \ref predNode() and \ref predMap(). 721 782 /// 722 783 /// \pre Either \ref run() or \ref init() must be called before … … 733 794 /// 734 795 /// The shortest path tree used here is equal to the shortest path 735 /// tree used in \ref predArc() and \ predMap().796 /// tree used in \ref predArc() and \ref predMap(). 736 797 /// 737 798 /// \pre Either \ref run() or \ref init() must be called before … … 776 837 /// length if the algorithm has already found one. 777 838 /// Otherwise it gives back an empty path. 778 lemon::Path<Digraph> negativeCycle() {839 lemon::Path<Digraph> negativeCycle() const { 779 840 typename Digraph::template NodeMap<int> state(*_gr, -1); 780 841 lemon::Path<Digraph> cycle; … … 826 887 /// It defines the used operations and the infinity value for the 827 888 /// given \c Value type. 828 /// \see BellmanFordDefaultOperationTraits 889 /// \see BellmanFordDefaultOperationTraits, 890 /// BellmanFordToleranceOperationTraits 829 891 typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; 830 892 … … 927 989 /// This class should only be used through the \ref bellmanFord() 928 990 /// function, which makes it easier to use the algorithm. 991 /// 992 /// \tparam TR The traits class that defines various types used by the 993 /// algorithm. 929 994 template<class TR> 930 995 class BellmanFordWizard : public TR { -
lemon/bfs.h
r764 r891 64 64 ///The type of the map that indicates which nodes are processed. 65 65 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 66 ///By default it is a NullMap.66 ///By default, it is a NullMap. 67 67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 68 68 ///Instantiates a \c ProcessedMap. … … 122 122 ///\tparam GR The type of the digraph the algorithm runs on. 123 123 ///The default type is \ref ListDigraph. 124 ///\tparam TR The traits class that defines various types used by the 125 ///algorithm. By default, it is \ref BfsDefaultTraits 126 ///"BfsDefaultTraits<GR>". 127 ///In most cases, this parameter should not be set directly, 128 ///consider to use the named template parameters instead. 124 129 #ifdef DOXYGEN 125 130 template <typename GR, … … 702 707 ///Runs the algorithm to visit all nodes in the digraph. 703 708 704 ///This method runs the %BFS algorithm in order to 705 ///compute the shortest path to each node. 706 /// 707 ///The algorithm computes 708 ///- the shortest path tree (forest), 709 ///- the distance of each node from the root(s). 709 ///This method runs the %BFS algorithm in order to visit all nodes 710 ///in the digraph. 710 711 /// 711 712 ///\note <tt>b.run(s)</tt> is just a shortcut of the following code. … … 853 854 ///The type of the map that indicates which nodes are processed. 854 855 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 855 ///By default it is a NullMap.856 ///By default, it is a NullMap. 856 857 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 857 858 ///Instantiates a ProcessedMap. … … 962 963 /// This class should only be used through the \ref bfs() function, 963 964 /// which makes it easier to use the algorithm. 965 /// 966 /// \tparam TR The traits class that defines various types used by the 967 /// algorithm. 964 968 template<class TR> 965 969 class BfsWizard : public TR … … 1047 1051 ///Runs BFS algorithm to visit all nodes in the digraph. 1048 1052 1049 ///This method runs BFS algorithm in order to compute1050 /// the shortest path to each node.1053 ///This method runs BFS algorithm in order to visit all nodes 1054 ///in the digraph. 1051 1055 void run() 1052 1056 { … … 1300 1304 /// does not observe the BFS events. If you want to observe the BFS 1301 1305 /// events, you should implement your own visitor class. 1302 /// \tparam TR T raits class to set various datatypes used by the1303 /// algorithm. The default traits class is1304 /// \ref BfsVisitDefaultTraits"BfsVisitDefaultTraits<GR>".1305 /// See \ref BfsVisitDefaultTraits for the documentation of1306 /// a BFS visit traits class.1306 /// \tparam TR The traits class that defines various types used by the 1307 /// algorithm. By default, it is \ref BfsVisitDefaultTraits 1308 /// "BfsVisitDefaultTraits<GR>". 1309 /// In most cases, this parameter should not be set directly, 1310 /// consider to use the named template parameters instead. 1307 1311 #ifdef DOXYGEN 1308 1312 template <typename GR, typename VS, typename TR> … … 1696 1700 /// \brief Runs the algorithm to visit all nodes in the digraph. 1697 1701 /// 1698 /// This method runs the %BFS algorithm in order to 1699 /// compute the shortest path to each node. 1700 /// 1701 /// The algorithm computes 1702 /// - the shortest path tree (forest), 1703 /// - the distance of each node from the root(s). 1702 /// This method runs the %BFS algorithm in order to visit all nodes 1703 /// in the digraph. 1704 1704 /// 1705 1705 /// \note <tt>b.run(s)</tt> is just a shortcut of the following code. -
lemon/bits/graph_extender.h
r732 r825 57 57 } 58 58 59 Node fromId(int id, Node) const{59 static Node fromId(int id, Node) { 60 60 return Parent::nodeFromId(id); 61 61 } 62 62 63 Arc fromId(int id, Arc) const{63 static Arc fromId(int id, Arc) { 64 64 return Parent::arcFromId(id); 65 65 } … … 356 356 } 357 357 358 Node fromId(int id, Node) const{358 static Node fromId(int id, Node) { 359 359 return Parent::nodeFromId(id); 360 360 } 361 361 362 Arc fromId(int id, Arc) const{362 static Arc fromId(int id, Arc) { 363 363 return Parent::arcFromId(id); 364 364 } 365 365 366 Edge fromId(int id, Edge) const{366 static Edge fromId(int id, Edge) { 367 367 return Parent::edgeFromId(id); 368 368 } -
lemon/bits/map_extender.h
r765 r867 85 85 typedef typename Map::Value Value; 86 86 87 MapIt() {}88 89 MapIt(Invalid i) : Parent(i) {}90 91 explicit MapIt(Map& _map) : map( _map) {92 map .notifier()->first(*this);87 MapIt() : map(NULL) {} 88 89 MapIt(Invalid i) : Parent(i), map(NULL) {} 90 91 explicit MapIt(Map& _map) : map(&_map) { 92 map->notifier()->first(*this); 93 93 } 94 94 95 95 MapIt(const Map& _map, const Item& item) 96 : Parent(item), map(&_map) {} 97 98 MapIt& operator++() { 99 map->notifier()->next(*this); 100 return *this; 101 } 102 103 typename MapTraits<Map>::ConstReturnValue operator*() const { 104 return (*map)[*this]; 105 } 106 107 typename MapTraits<Map>::ReturnValue operator*() { 108 return (*map)[*this]; 109 } 110 111 void set(const Value& value) { 112 map->set(*this, value); 113 } 114 115 protected: 116 Map* map; 117 118 }; 119 120 class ConstMapIt : public Item { 121 typedef Item Parent; 122 123 public: 124 125 typedef typename Map::Value Value; 126 127 ConstMapIt() : map(NULL) {} 128 129 ConstMapIt(Invalid i) : Parent(i), map(NULL) {} 130 131 explicit ConstMapIt(Map& _map) : map(&_map) { 132 map->notifier()->first(*this); 133 } 134 135 ConstMapIt(const Map& _map, const Item& item) 96 136 : Parent(item), map(_map) {} 97 137 98 MapIt& operator++() {99 map .notifier()->next(*this);138 ConstMapIt& operator++() { 139 map->notifier()->next(*this); 100 140 return *this; 101 141 } … … 105 145 } 106 146 107 typename MapTraits<Map>::ReturnValue operator*() { 108 return map[*this]; 109 } 110 111 void set(const Value& value) { 112 map.set(*this, value); 113 } 114 115 protected: 116 Map& map; 117 118 }; 119 120 class ConstMapIt : public Item { 121 typedef Item Parent; 122 123 public: 124 125 typedef typename Map::Value Value; 126 127 ConstMapIt() {} 128 129 ConstMapIt(Invalid i) : Parent(i) { } 130 131 explicit ConstMapIt(Map& _map) : map(_map) { 132 map.notifier()->first(*this); 133 } 134 135 ConstMapIt(const Map& _map, const Item& item) 136 : Parent(item), map(_map) {} 137 138 ConstMapIt& operator++() { 139 map.notifier()->next(*this); 140 return *this; 141 } 142 143 typename MapTraits<Map>::ConstReturnValue operator*() const { 144 return map[*this]; 145 } 146 147 protected: 148 const Map& map; 147 protected: 148 const Map* map; 149 149 }; 150 150 … … 153 153 154 154 public: 155 156 ItemIt() {} 157 158 ItemIt(Invalid i) : Parent(i) {}159 160 explicit ItemIt(Map& _map) : map( _map) {161 map .notifier()->first(*this);155 ItemIt() : map(NULL) {} 156 157 158 ItemIt(Invalid i) : Parent(i), map(NULL) {} 159 160 explicit ItemIt(Map& _map) : map(&_map) { 161 map->notifier()->first(*this); 162 162 } 163 163 164 164 ItemIt(const Map& _map, const Item& item) 165 : Parent(item), map( _map) {}165 : Parent(item), map(&_map) {} 166 166 167 167 ItemIt& operator++() { 168 map .notifier()->next(*this);169 return *this; 170 } 171 172 protected: 173 const Map ↦168 map->notifier()->next(*this); 169 return *this; 170 } 171 172 protected: 173 const Map* map; 174 174 175 175 }; … … 232 232 typedef typename Map::Value Value; 233 233 234 MapIt() {}235 236 MapIt(Invalid i) : Parent(i) { }237 238 explicit MapIt(Map& _map) : map( _map) {239 map .graph.first(*this);234 MapIt() : map(NULL) {} 235 236 MapIt(Invalid i) : Parent(i), map(NULL) { } 237 238 explicit MapIt(Map& _map) : map(&_map) { 239 map->graph.first(*this); 240 240 } 241 241 242 242 MapIt(const Map& _map, const Item& item) 243 : Parent(item), map( _map) {}243 : Parent(item), map(&_map) {} 244 244 245 245 MapIt& operator++() { 246 map .graph.next(*this);246 map->graph.next(*this); 247 247 return *this; 248 248 } 249 249 250 250 typename MapTraits<Map>::ConstReturnValue operator*() const { 251 return map[*this];251 return (*map)[*this]; 252 252 } 253 253 254 254 typename MapTraits<Map>::ReturnValue operator*() { 255 return map[*this];255 return (*map)[*this]; 256 256 } 257 257 258 258 void set(const Value& value) { 259 map .set(*this, value);260 } 261 262 protected: 263 Map ↦259 map->set(*this, value); 260 } 261 262 protected: 263 Map* map; 264 264 265 265 }; … … 272 272 typedef typename Map::Value Value; 273 273 274 ConstMapIt() {}275 276 ConstMapIt(Invalid i) : Parent(i) { }277 278 explicit ConstMapIt(Map& _map) : map( _map) {279 map .graph.first(*this);274 ConstMapIt() : map(NULL) {} 275 276 ConstMapIt(Invalid i) : Parent(i), map(NULL) { } 277 278 explicit ConstMapIt(Map& _map) : map(&_map) { 279 map->graph.first(*this); 280 280 } 281 281 282 282 ConstMapIt(const Map& _map, const Item& item) 283 : Parent(item), map( _map) {}283 : Parent(item), map(&_map) {} 284 284 285 285 ConstMapIt& operator++() { 286 map .graph.next(*this);286 map->graph.next(*this); 287 287 return *this; 288 288 } 289 289 290 290 typename MapTraits<Map>::ConstReturnValue operator*() const { 291 return map[*this];292 } 293 294 protected: 295 const Map ↦291 return (*map)[*this]; 292 } 293 294 protected: 295 const Map* map; 296 296 }; 297 297 … … 300 300 301 301 public: 302 303 ItemIt() {} 304 305 ItemIt(Invalid i) : Parent(i) { }306 307 explicit ItemIt(Map& _map) : map( _map) {308 map .graph.first(*this);302 ItemIt() : map(NULL) {} 303 304 305 ItemIt(Invalid i) : Parent(i), map(NULL) { } 306 307 explicit ItemIt(Map& _map) : map(&_map) { 308 map->graph.first(*this); 309 309 } 310 310 311 311 ItemIt(const Map& _map, const Item& item) 312 : Parent(item), map( _map) {}312 : Parent(item), map(&_map) {} 313 313 314 314 ItemIt& operator++() { 315 map .graph.next(*this);316 return *this; 317 } 318 319 protected: 320 const Map ↦315 map->graph.next(*this); 316 return *this; 317 } 318 319 protected: 320 const Map* map; 321 321 322 322 }; -
lemon/cbc.cc
r623 r793 95 95 } 96 96 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 } 97 109 98 110 void CbcMip::_eraseCol(int i) { -
lemon/cbc.h
r623 r793 63 63 virtual int _addCol(); 64 64 virtual int _addRow(); 65 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 65 66 66 67 virtual void _eraseCol(int i); -
lemon/circulation.h
r762 r891 174 174 \tparam SM The type of the supply map. The default map type is 175 175 \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>". 176 \tparam TR The traits class that defines various types used by the 177 algorithm. By default, it is \ref CirculationDefaultTraits 178 "CirculationDefaultTraits<GR, LM, UM, SM>". 179 In most cases, this parameter should not be set directly, 180 consider to use the named template parameters instead. 176 181 */ 177 182 #ifdef DOXYGEN … … 307 312 /// able to automatically created by the algorithm (i.e. the 308 313 /// digraph and the maximum level should be passed to it). 309 /// However an external elevator object could also be passed to the314 /// However, an external elevator object could also be passed to the 310 315 /// algorithm with the \ref elevator(Elevator&) "elevator()" function 311 316 /// before calling \ref run() or \ref init(). -
lemon/clp.cc
r623 r793 79 79 } 80 80 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 81 94 82 95 void ClpLp::_eraseCol(int c) { -
lemon/clp.h
r623 r793 76 76 virtual int _addCol(); 77 77 virtual int _addRow(); 78 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 78 79 79 80 virtual void _eraseCol(int i); -
lemon/concepts/digraph.h
r627 r833 36 36 /// \brief Class describing the concept of directed graphs. 37 37 /// 38 /// This class describes the \ref concept "concept" of the39 /// immutable directed digraphs.38 /// This class describes the common interface of all directed 39 /// graphs (digraphs). 40 40 /// 41 /// Note that actual digraph implementation like @ref ListDigraph or 42 /// @ref SmartDigraph may have several additional functionality. 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. 43 47 /// 44 /// \sa concept48 /// \sa Graph 45 49 class Digraph { 46 50 private: 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 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. 58 55 void operator=(const Digraph &) {} 56 59 57 public: 60 ///\e 61 62 /// Defalult constructor. 63 64 /// Defalult constructor. 65 /// 58 /// Default constructor. 66 59 Digraph() { } 67 /// Class for identifying a node of the digraph 60 61 /// The node type of the digraph 68 62 69 63 /// This class identifies a node of the digraph. It also serves 70 64 /// as a base class of the node iterators, 71 /// thus they willconvert to this type.65 /// thus they convert to this type. 72 66 class Node { 73 67 public: 74 68 /// Default constructor 75 69 76 /// @warning The default constructor sets the iterator77 /// to an undefined value.70 /// Default constructor. 71 /// \warning It sets the object to an undefined value. 78 72 Node() { } 79 73 /// Copy constructor. … … 83 77 Node(const Node&) { } 84 78 85 /// Invalid constructor \& conversion.86 87 /// This constructor initializes the iteratorto be invalid.79 /// %Invalid constructor \& conversion. 80 81 /// Initializes the object to be invalid. 88 82 /// \sa Invalid for more details. 89 83 Node(Invalid) { } 90 84 /// Equality operator 91 85 86 /// Equality operator. 87 /// 92 88 /// Two iterators are equal if and only if they point to the 93 /// same object or both are invalid.89 /// same object or both are \c INVALID. 94 90 bool operator==(Node) const { return true; } 95 91 96 92 /// Inequality operator 97 93 98 /// \sa operator==(Node n) 99 /// 94 /// Inequality operator. 100 95 bool operator!=(Node) const { return true; } 101 96 102 97 /// Artificial ordering operator. 103 98 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. 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. 110 104 bool operator<(Node) const { return false; } 111 112 }; 113 114 /// This iterator goes through each node. 115 116 /// This iterator goes through each node. 117 /// Its usage is quite simple, for example you can count the number 118 /// of nodes in digraph \c g of type \c Digraph like this: 105 }; 106 107 /// Iterator class for the nodes. 108 109 /// This iterator goes through each node of the digraph. 110 /// 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: 119 112 ///\code 120 113 /// int count=0; … … 125 118 /// Default constructor 126 119 127 /// @warning The default constructor sets the iterator128 /// to an undefined value.120 /// Default constructor. 121 /// \warning It sets the iterator to an undefined value. 129 122 NodeIt() { } 130 123 /// Copy constructor. … … 133 126 /// 134 127 NodeIt(const NodeIt& n) : Node(n) { } 135 /// Invalid constructor \& conversion.136 137 /// Initialize the iterator to be invalid.128 /// %Invalid constructor \& conversion. 129 130 /// Initializes the iterator to be invalid. 138 131 /// \sa Invalid for more details. 139 132 NodeIt(Invalid) { } 140 133 /// Sets the iterator to the first node. 141 134 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. 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 /// 151 142 NodeIt(const Digraph&, const Node&) { } 152 143 /// Next node. … … 158 149 159 150 160 /// Class for identifying an arcof the digraph151 /// The arc type of the digraph 161 152 162 153 /// This class identifies an arc of the digraph. It also serves … … 167 158 /// Default constructor 168 159 169 /// @warning The default constructor sets the iterator170 /// to an undefined value.160 /// Default constructor. 161 /// \warning It sets the object to an undefined value. 171 162 Arc() { } 172 163 /// Copy constructor. … … 175 166 /// 176 167 Arc(const Arc&) { } 177 /// Initialize the iterator to be invalid.178 179 /// Initialize the iteratorto be invalid.180 /// 168 /// %Invalid constructor \& conversion. 169 170 /// Initializes the object to be invalid. 171 /// \sa Invalid for more details. 181 172 Arc(Invalid) { } 182 173 /// Equality operator 183 174 175 /// Equality operator. 176 /// 184 177 /// Two iterators are equal if and only if they point to the 185 /// same object or both are invalid.178 /// same object or both are \c INVALID. 186 179 bool operator==(Arc) const { return true; } 187 180 /// Inequality operator 188 181 189 /// \sa operator==(Arc n) 190 /// 182 /// Inequality operator. 191 183 bool operator!=(Arc) const { return true; } 192 184 193 185 /// Artificial ordering operator. 194 186 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. 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. 201 192 bool operator<(Arc) const { return false; } 202 193 }; 203 194 204 /// This iterator goes troughthe outgoing arcs of a node.195 /// Iterator class for the outgoing arcs of a node. 205 196 206 197 /// This iterator goes trough the \e outgoing arcs of a certain node 207 198 /// of a digraph. 208 /// Its usage is quite simple, for example you can count the number199 /// Its usage is quite simple, for example, you can count the number 209 200 /// of outgoing arcs of a node \c n 210 /// in digraph \c g of type \cDigraph as follows.201 /// in a digraph \c g of type \c %Digraph as follows. 211 202 ///\code 212 203 /// int count=0; 213 /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;204 /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count; 214 205 ///\endcode 215 216 206 class OutArcIt : public Arc { 217 207 public: 218 208 /// Default constructor 219 209 220 /// @warning The default constructor sets the iterator221 /// to an undefined value.210 /// Default constructor. 211 /// \warning It sets the iterator to an undefined value. 222 212 OutArcIt() { } 223 213 /// Copy constructor. … … 226 216 /// 227 217 OutArcIt(const OutArcIt& e) : Arc(e) { } 228 /// Initialize the iterator to be invalid.229 230 /// Initialize the iterator to be invalid.231 /// 218 /// %Invalid constructor \& conversion. 219 220 /// Initializes the iterator to be invalid. 221 /// \sa Invalid for more details. 232 222 OutArcIt(Invalid) { } 233 /// This constructor sets the iterator to the first outgoing arc.234 235 /// This constructor sets the iterator to the first outgoing arc of236 /// the node.223 /// Sets the iterator to the first outgoing arc. 224 225 /// Sets the iterator to the first outgoing arc of the given node. 226 /// 237 227 OutArcIt(const Digraph&, const Node&) { } 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. 228 /// Sets the iterator to the given arc. 229 230 /// Sets the iterator to the given arc of the given digraph. 231 /// 243 232 OutArcIt(const Digraph&, const Arc&) { } 244 /// Next outgoing arc233 /// Next outgoing arc 245 234 246 235 /// Assign the iterator to the next … … 249 238 }; 250 239 251 /// This iterator goes troughthe incoming arcs of a node.240 /// Iterator class for the incoming arcs of a node. 252 241 253 242 /// This iterator goes trough the \e incoming arcs of a certain node 254 243 /// of a digraph. 255 /// Its usage is quite simple, for example you can count the number256 /// of outgoing arcs of a node \c n257 /// in digraph \c g of type \cDigraph as follows.244 /// 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. 258 247 ///\code 259 248 /// int count=0; 260 /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;249 /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count; 261 250 ///\endcode 262 263 251 class InArcIt : public Arc { 264 252 public: 265 253 /// Default constructor 266 254 267 /// @warning The default constructor sets the iterator268 /// to an undefined value.255 /// Default constructor. 256 /// \warning It sets the iterator to an undefined value. 269 257 InArcIt() { } 270 258 /// Copy constructor. … … 273 261 /// 274 262 InArcIt(const InArcIt& e) : Arc(e) { } 275 /// Initialize the iterator to be invalid.276 277 /// Initialize the iterator to be invalid.278 /// 263 /// %Invalid constructor \& conversion. 264 265 /// Initializes the iterator to be invalid. 266 /// \sa Invalid for more details. 279 267 InArcIt(Invalid) { } 280 /// This constructor sets the iterator tofirst incoming arc.281 282 /// This constructor set the iterator to the first incoming arc of283 /// the node.268 /// Sets the iterator to the first incoming arc. 269 270 /// Sets the iterator to the first incoming arc of the given node. 271 /// 284 272 InArcIt(const Digraph&, const Node&) { } 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. 273 /// Sets the iterator to the given arc. 274 275 /// Sets the iterator to the given arc of the given digraph. 276 /// 290 277 InArcIt(const Digraph&, const Arc&) { } 291 278 /// Next incoming arc 292 279 293 /// Assign the iterator to the next inarc of the corresponding node.294 /// 280 /// Assign the iterator to the next 281 /// incoming arc of the corresponding node. 295 282 InArcIt& operator++() { return *this; } 296 283 }; 297 /// This iterator goes through each arc. 298 299 /// This iterator goes through each arc of a digraph. 300 /// Its usage is quite simple, for example you can count the number 301 /// of arcs in a digraph \c g of type \c Digraph as follows: 284 285 /// Iterator class for the arcs. 286 287 /// This iterator goes through each arc of the digraph. 288 /// 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: 302 290 ///\code 303 291 /// int count=0; 304 /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;292 /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count; 305 293 ///\endcode 306 294 class ArcIt : public Arc { … … 308 296 /// Default constructor 309 297 310 /// @warning The default constructor sets the iterator311 /// to an undefined value.298 /// Default constructor. 299 /// \warning It sets the iterator to an undefined value. 312 300 ArcIt() { } 313 301 /// Copy constructor. … … 316 304 /// 317 305 ArcIt(const ArcIt& e) : Arc(e) { } 318 /// Initialize the iterator to be invalid.319 320 /// Initialize the iterator to be invalid.321 /// 306 /// %Invalid constructor \& conversion. 307 308 /// Initializes the iterator to be invalid. 309 /// \sa Invalid for more details. 322 310 ArcIt(Invalid) { } 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. 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 /// 333 320 ArcIt(const Digraph&, const Arc&) { } 334 /// Next arc321 /// Next arc 335 322 336 323 /// Assign the iterator to the next arc. 324 /// 337 325 ArcIt& operator++() { return *this; } 338 326 }; 339 ///Gives back the target node of an arc. 340 341 ///Gives back the target node of an arc. 342 /// 327 328 /// \brief The source node of the arc. 329 /// 330 /// Returns the source node of the given arc. 331 Node source(Arc) const { return INVALID; } 332 333 /// \brief The target node of the arc. 334 /// 335 /// Returns the target node of the given arc. 343 336 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 /// 348 Node source(Arc) const { return INVALID; } 349 350 /// \brief Returns the ID of the node. 337 338 /// \brief The ID of the node. 339 /// 340 /// Returns the ID of the given node. 351 341 int id(Node) const { return -1; } 352 342 353 /// \brief Returns the ID of the arc. 343 /// \brief The ID of the arc. 344 /// 345 /// Returns the ID of the given arc. 354 346 int id(Arc) const { return -1; } 355 347 356 /// \brief Returns the node with the given ID. 357 /// 358 /// \pre The argument should be a valid node ID in the graph. 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. 359 352 Node nodeFromId(int) const { return INVALID; } 360 353 361 /// \brief Returns the arc with the given ID. 362 /// 363 /// \pre The argument should be a valid arc ID in the graph. 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. 364 358 Arc arcFromId(int) const { return INVALID; } 365 359 366 /// \brief Returns an upper bound on the node IDs. 360 /// \brief An upper bound on the node IDs. 361 /// 362 /// Returns an upper bound on the node IDs. 367 363 int maxNodeId() const { return -1; } 368 364 369 /// \brief Returns an upper bound on the arc IDs. 365 /// \brief An upper bound on the arc IDs. 366 /// 367 /// Returns an upper bound on the arc IDs. 370 368 int maxArcId() const { return -1; } 371 369 … … 393 391 int maxId(Arc) const { return -1; } 394 392 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 395 398 /// \brief The base node of the iterator. 396 399 /// 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; }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; } 400 403 401 404 /// \brief The running node of the iterator. 402 405 /// 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; }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; } 406 409 407 410 /// \brief The base node of the iterator. 408 411 /// 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; }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; } 412 415 413 416 /// \brief The running node of the iterator. 414 417 /// 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. 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. 427 426 template<class T> 428 427 class NodeMap : public ReferenceMap<Node, T, T&, const T&> { 429 428 public: 430 429 431 /// \e432 NodeMap(const Digraph&) { }433 /// \e430 /// Constructor 431 explicit NodeMap(const Digraph&) { } 432 /// Constructor with given initial value 434 433 NodeMap(const Digraph&, T) { } 435 434 … … 446 445 }; 447 446 448 /// \brief Reference map of the arcs to type \c T. 449 /// 450 /// Reference map of the arcs to type \c T. 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. 451 451 template<class T> 452 452 class ArcMap : public ReferenceMap<Arc, T, T&, const T&> { 453 453 public: 454 454 455 /// \e456 ArcMap(const Digraph&) { }457 /// \e455 /// Constructor 456 explicit ArcMap(const Digraph&) { } 457 /// Constructor with given initial value 458 458 ArcMap(const Digraph&, T) { } 459 459 460 private: 460 461 ///Copy constructor -
lemon/concepts/graph.h
r704 r833 19 19 ///\ingroup graph_concepts 20 20 ///\file 21 ///\brief The concept of Undirected Graphs.21 ///\brief The concept of undirected graphs. 22 22 23 23 #ifndef LEMON_CONCEPTS_GRAPH_H … … 25 25 26 26 #include <lemon/concepts/graph_components.h> 27 #include <lemon/concepts/maps.h> 28 #include <lemon/concept_check.h> 27 29 #include <lemon/core.h> 28 30 … … 32 34 /// \ingroup graph_concepts 33 35 /// 34 /// \brief Class describing the concept of Undirected Graphs.36 /// \brief Class describing the concept of undirected graphs. 35 37 /// 36 /// This class describes the common interface of all Undirected37 /// Graphs.38 /// This class describes the common interface of all undirected 39 /// graphs. 38 40 /// 39 /// As all concept describing classes it provides onlyinterface40 /// without any sensible implementation. So any algorithm for41 /// undirected graph should compile with this class, but it will not41 /// 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 42 44 /// run properly, of course. 45 /// An actual graph implementation like \ref ListGraph or 46 /// \ref SmartGraph may have additional functionality. 43 47 /// 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. 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. 53 61 /// 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. 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. 61 68 /// 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. 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 68 73 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 69 81 public: 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 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 75 90 /// specializations for undirected graphs. 76 91 typedef True UndirectedTag; 77 92 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. 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. 85 98 class Node { 86 99 public: 87 100 /// Default constructor 88 101 89 /// @warning The default constructor sets the iterator90 /// to an undefined value.102 /// Default constructor. 103 /// \warning It sets the object to an undefined value. 91 104 Node() { } 92 105 /// Copy constructor. … … 96 109 Node(const Node&) { } 97 110 98 /// Invalid constructor \& conversion.99 100 /// This constructor initializes the iteratorto be invalid.111 /// %Invalid constructor \& conversion. 112 113 /// Initializes the object to be invalid. 101 114 /// \sa Invalid for more details. 102 115 Node(Invalid) { } 103 116 /// Equality operator 104 117 118 /// Equality operator. 119 /// 105 120 /// Two iterators are equal if and only if they point to the 106 /// same object or both are invalid.121 /// same object or both are \c INVALID. 107 122 bool operator==(Node) const { return true; } 108 123 109 124 /// Inequality operator 110 125 111 /// \sa operator==(Node n) 112 /// 126 /// Inequality operator. 113 127 bool operator!=(Node) const { return true; } 114 128 115 129 /// Artificial ordering operator. 116 130 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 131 /// Artificial ordering operator. 132 /// 133 /// \note This operator only has to define some strict ordering of 121 134 /// the items; this order has nothing to do with the iteration 122 135 /// ordering of the items. … … 125 138 }; 126 139 127 /// This iterator goes through each node.128 129 /// This iterator goes through each node .130 /// Its usage is quite simple, for example you can count the number131 /// of nodes in graph \c g of type \cGraph like this:140 /// Iterator class for the nodes. 141 142 /// This iterator goes through each node of the graph. 143 /// 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: 132 145 ///\code 133 146 /// int count=0; … … 138 151 /// Default constructor 139 152 140 /// @warning The default constructor sets the iterator141 /// to an undefined value.153 /// Default constructor. 154 /// \warning It sets the iterator to an undefined value. 142 155 NodeIt() { } 143 156 /// Copy constructor. … … 146 159 /// 147 160 NodeIt(const NodeIt& n) : Node(n) { } 148 /// Invalid constructor \& conversion.149 150 /// Initialize the iterator to be invalid.161 /// %Invalid constructor \& conversion. 162 163 /// Initializes the iterator to be invalid. 151 164 /// \sa Invalid for more details. 152 165 NodeIt(Invalid) { } 153 166 /// Sets the iterator to the first node. 154 167 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. 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 /// 164 175 NodeIt(const Graph&, const Node&) { } 165 176 /// Next node. … … 171 182 172 183 173 /// The base type of the edge iterators. 174 175 /// The base type of the edge iterators. 176 /// 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. 177 189 class Edge { 178 190 public: 179 191 /// Default constructor 180 192 181 /// @warning The default constructor sets the iterator182 /// to an undefined value.193 /// Default constructor. 194 /// \warning It sets the object to an undefined value. 183 195 Edge() { } 184 196 /// Copy constructor. … … 187 199 /// 188 200 Edge(const Edge&) { } 189 /// Initialize the iterator to be invalid.190 191 /// Initialize the iteratorto be invalid.192 /// 201 /// %Invalid constructor \& conversion. 202 203 /// Initializes the object to be invalid. 204 /// \sa Invalid for more details. 193 205 Edge(Invalid) { } 194 206 /// Equality operator 195 207 208 /// Equality operator. 209 /// 196 210 /// Two iterators are equal if and only if they point to the 197 /// same object or both are invalid.211 /// same object or both are \c INVALID. 198 212 bool operator==(Edge) const { return true; } 199 213 /// Inequality operator 200 214 201 /// \sa operator==(Edge n) 202 /// 215 /// Inequality operator. 203 216 bool operator!=(Edge) const { return true; } 204 217 205 218 /// Artificial ordering operator. 206 219 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. 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. 213 225 bool operator<(Edge) const { return false; } 214 226 }; 215 227 216 /// This iterator goes through each edge.217 218 /// This iterator goes through each edge of agraph.219 /// Its usage is quite simple, for example you can count the number220 /// of edges in a graph \c g of type \c Graph as follows:228 /// Iterator class for the edges. 229 230 /// This iterator goes through each edge of the graph. 231 /// 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: 221 233 ///\code 222 234 /// int count=0; … … 227 239 /// Default constructor 228 240 229 /// @warning The default constructor sets the iterator230 /// to an undefined value.241 /// Default constructor. 242 /// \warning It sets the iterator to an undefined value. 231 243 EdgeIt() { } 232 244 /// Copy constructor. … … 235 247 /// 236 248 EdgeIt(const EdgeIt& e) : Edge(e) { } 237 /// Initialize the iterator to be invalid.238 239 /// Initialize the iterator to be invalid.240 /// 249 /// %Invalid constructor \& conversion. 250 251 /// Initializes the iterator to be invalid. 252 /// \sa Invalid for more details. 241 253 EdgeIt(Invalid) { } 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. 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 /// 252 263 EdgeIt(const Graph&, const Edge&) { } 253 264 /// Next edge 254 265 255 266 /// Assign the iterator to the next edge. 267 /// 256 268 EdgeIt& operator++() { return *this; } 257 269 }; 258 270 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 /// 266 /// Its usage is quite simple, for example you can compute the 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. 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. 275 /// 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. 269 278 /// 270 279 ///\code … … 272 281 /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count; 273 282 ///\endcode 283 /// 284 /// \warning Loop edges will be iterated twice. 274 285 class IncEdgeIt : public Edge { 275 286 public: 276 287 /// Default constructor 277 288 278 /// @warning The default constructor sets the iterator279 /// to an undefined value.289 /// Default constructor. 290 /// \warning It sets the iterator to an undefined value. 280 291 IncEdgeIt() { } 281 292 /// Copy constructor. … … 284 295 /// 285 296 IncEdgeIt(const IncEdgeIt& e) : Edge(e) { } 286 /// Initialize the iterator to be invalid.287 288 /// Initialize the iterator to be invalid.289 /// 297 /// %Invalid constructor \& conversion. 298 299 /// Initializes the iterator to be invalid. 300 /// \sa Invalid for more details. 290 301 IncEdgeIt(Invalid) { } 291 /// This constructor sets the iterator to first incident arc.292 293 /// This constructor set the iterator to the first incident arc of294 /// the node.302 /// Sets the iterator to the first incident edge. 303 304 /// Sets the iterator to the first incident edge of the given node. 305 /// 295 306 IncEdgeIt(const Graph&, const Node&) { } 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. 307 /// Sets the iterator to the given edge. 308 309 /// Sets the iterator to the given edge of the given graph. 310 /// 301 311 IncEdgeIt(const Graph&, const Edge&) { } 302 /// Next incident arc303 304 /// Assign the iterator to the next incident arc312 /// Next incident edge 313 314 /// Assign the iterator to the next incident edge 305 315 /// of the corresponding node. 306 316 IncEdgeIt& operator++() { return *this; } 307 317 }; 308 318 309 /// The directed arc type.310 311 /// Th e directed arc type. It can be converted to the312 /// edge or it should be inherited from the undirected313 /// edge.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. 314 324 class Arc { 315 325 public: 316 326 /// Default constructor 317 327 318 /// @warning The default constructor sets the iterator319 /// to an undefined value.328 /// Default constructor. 329 /// \warning It sets the object to an undefined value. 320 330 Arc() { } 321 331 /// Copy constructor. … … 324 334 /// 325 335 Arc(const Arc&) { } 326 /// Initialize the iterator to be invalid.327 328 /// Initialize the iteratorto be invalid.329 /// 336 /// %Invalid constructor \& conversion. 337 338 /// Initializes the object to be invalid. 339 /// \sa Invalid for more details. 330 340 Arc(Invalid) { } 331 341 /// Equality operator 332 342 343 /// Equality operator. 344 /// 333 345 /// Two iterators are equal if and only if they point to the 334 /// same object or both are invalid.346 /// same object or both are \c INVALID. 335 347 bool operator==(Arc) const { return true; } 336 348 /// Inequality operator 337 349 338 /// \sa operator==(Arc n) 339 /// 350 /// Inequality operator. 340 351 bool operator!=(Arc) const { return true; } 341 352 342 353 /// Artificial ordering operator. 343 354 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. 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. 350 360 bool operator<(Arc) const { return false; } 351 361 352 /// Converison to Edge 362 /// Converison to \c Edge 363 364 /// Converison to \c Edge. 365 /// 353 366 operator Edge() const { return Edge(); } 354 367 }; 355 /// This iterator goes through each directed arc. 356 357 /// This iterator goes through each arc of a graph. 358 /// Its usage is quite simple, for example you can count the number 359 /// of arcs in a graph \c g of type \c Graph as follows: 368 369 /// Iterator class for the arcs. 370 371 /// This iterator goes through each directed arc of the graph. 372 /// 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: 360 374 ///\code 361 375 /// int count=0; 362 /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;376 /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count; 363 377 ///\endcode 364 378 class ArcIt : public Arc { … … 366 380 /// Default constructor 367 381 368 /// @warning The default constructor sets the iterator369 /// to an undefined value.382 /// Default constructor. 383 /// \warning It sets the iterator to an undefined value. 370 384 ArcIt() { } 371 385 /// Copy constructor. … … 374 388 /// 375 389 ArcIt(const ArcIt& e) : Arc(e) { } 376 /// Initialize the iterator to be invalid.377 378 /// Initialize the iterator to be invalid.379 /// 390 /// %Invalid constructor \& conversion. 391 392 /// Initializes the iterator to be invalid. 393 /// \sa Invalid for more details. 380 394 ArcIt(Invalid) { } 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. 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 /// 391 404 ArcIt(const Graph&, const Arc&) { } 392 /// Next arc405 /// Next arc 393 406 394 407 /// Assign the iterator to the next arc. 408 /// 395 409 ArcIt& operator++() { return *this; } 396 410 }; 397 411 398 /// This iterator goes trough the outgoing directedarcs of a node.399 400 /// This iterator goes trough the \e outgoing arcs of a certain node401 /// of a graph.402 /// Its usage is quite simple, for example you can count the number412 /// 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. 416 /// Its usage is quite simple, for example, you can count the number 403 417 /// of outgoing arcs of a node \c n 404 /// in graph \c g of type \cGraph as follows.418 /// in a graph \c g of type \c %Graph as follows. 405 419 ///\code 406 420 /// int count=0; 407 /// for ( Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;421 /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count; 408 422 ///\endcode 409 410 423 class OutArcIt : public Arc { 411 424 public: 412 425 /// Default constructor 413 426 414 /// @warning The default constructor sets the iterator415 /// to an undefined value.427 /// Default constructor. 428 /// \warning It sets the iterator to an undefined value. 416 429 OutArcIt() { } 417 430 /// Copy constructor. … … 420 433 /// 421 434 OutArcIt(const OutArcIt& e) : Arc(e) { } 422 /// Initialize the iterator to be invalid.423 424 /// Initialize the iterator to be invalid.425 /// 435 /// %Invalid constructor \& conversion. 436 437 /// Initializes the iterator to be invalid. 438 /// \sa Invalid for more details. 426 439 OutArcIt(Invalid) { } 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 440 /// Sets the iterator to the first outgoing arc. 441 442 /// Sets the iterator to the first outgoing arc of the given node. 443 /// 433 444 OutArcIt(const Graph& n, const Node& g) { 434 445 ignore_unused_variable_warning(n); 435 446 ignore_unused_variable_warning(g); 436 447 } 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. 448 /// Sets the iterator to the given arc. 449 450 /// Sets the iterator to the given arc of the given graph. 451 /// 442 452 OutArcIt(const Graph&, const Arc&) { } 443 /// Next outgoing arc453 /// Next outgoing arc 444 454 445 455 /// Assign the iterator to the next … … 448 458 }; 449 459 450 /// This iterator goes trough the incoming directedarcs of a node.451 452 /// This iterator goes trough the \e incoming arcs of a certain node453 /// of a graph.454 /// Its usage is quite simple, for example you can count the number455 /// of outgoing arcs of a node \c n456 /// in graph \c g of type \cGraph as follows.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. 464 /// 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. 457 467 ///\code 458 468 /// int count=0; 459 /// for (Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;469 /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count; 460 470 ///\endcode 461 462 471 class InArcIt : public Arc { 463 472 public: 464 473 /// Default constructor 465 474 466 /// @warning The default constructor sets the iterator467 /// to an undefined value.475 /// Default constructor. 476 /// \warning It sets the iterator to an undefined value. 468 477 InArcIt() { } 469 478 /// Copy constructor. … … 472 481 /// 473 482 InArcIt(const InArcIt& e) : Arc(e) { } 474 /// Initialize the iterator to be invalid.475 476 /// Initialize the iterator to be invalid.477 /// 483 /// %Invalid constructor \& conversion. 484 485 /// Initializes the iterator to be invalid. 486 /// \sa Invalid for more details. 478 487 InArcIt(Invalid) { } 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 488 /// Sets the iterator to the first incoming arc. 489 490 /// Sets the iterator to the first incoming arc of the given node. 491 /// 485 492 InArcIt(const Graph& g, const Node& n) { 486 493 ignore_unused_variable_warning(n); 487 494 ignore_unused_variable_warning(g); 488 495 } 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. 496 /// Sets the iterator to the given arc. 497 498 /// Sets the iterator to the given arc of the given graph. 499 /// 494 500 InArcIt(const Graph&, const Arc&) { } 495 501 /// Next incoming arc 496 502 497 /// Assign the iterator to the next inarc of the corresponding node.498 /// 503 /// Assign the iterator to the next 504 /// incoming arc of the corresponding node. 499 505 InArcIt& operator++() { return *this; } 500 506 }; 501 507 502 /// \brief Reference map of the nodes to type \c T. 503 /// 504 /// Reference map of the nodes to type \c T. 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. 505 512 template<class T> 506 513 class NodeMap : public ReferenceMap<Node, T, T&, const T&> … … 508 515 public: 509 516 510 /// \e511 NodeMap(const Graph&) { }512 /// \e517 /// Constructor 518 explicit NodeMap(const Graph&) { } 519 /// Constructor with given initial value 513 520 NodeMap(const Graph&, T) { } 514 521 … … 525 532 }; 526 533 527 /// \brief Reference map of the arcs to type \c T. 528 /// 529 /// Reference map of the arcs to type \c T. 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. 530 538 template<class T> 531 539 class ArcMap : public ReferenceMap<Arc, T, T&, const T&> … … 533 541 public: 534 542 535 /// \e536 ArcMap(const Graph&) { }537 /// \e543 /// Constructor 544 explicit ArcMap(const Graph&) { } 545 /// Constructor with given initial value 538 546 ArcMap(const Graph&, T) { } 547 539 548 private: 540 549 ///Copy constructor … … 549 558 }; 550 559 551 /// Reference map of the edges to type \c T. 552 553 /// Reference map of the edges to type \c T. 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. 554 564 template<class T> 555 565 class EdgeMap : public ReferenceMap<Edge, T, T&, const T&> … … 557 567 public: 558 568 559 /// \e560 EdgeMap(const Graph&) { }561 /// \e569 /// Constructor 570 explicit EdgeMap(const Graph&) { } 571 /// Constructor with given initial value 562 572 EdgeMap(const Graph&, T) { } 573 563 574 private: 564 575 ///Copy constructor … … 573 584 }; 574 585 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. 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. 619 595 /// \sa v() 620 596 /// \sa direction() 621 597 Node u(Edge) const { return INVALID; } 622 598 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. 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. 633 608 /// \sa u() 634 609 /// \sa direction() 635 610 Node v(Edge) const { return INVALID; } 636 611 637 /// \brief Source node of the directed arc. 612 /// \brief The source node of the arc. 613 /// 614 /// Returns the source node of the given arc. 638 615 Node source(Arc) const { return INVALID; } 639 616 640 /// \brief Target node of the directed arc. 617 /// \brief The target node of the arc. 618 /// 619 /// Returns the target node of the given arc. 641 620 Node target(Arc) const { return INVALID; } 642 621 643 /// \brief Returns the id of the node. 622 /// \brief The ID of the node. 623 /// 624 /// Returns the ID of the given node. 644 625 int id(Node) const { return -1; } 645 626 646 /// \brief Returns the id of the edge. 627 /// \brief The ID of the edge. 628 /// 629 /// Returns the ID of the given edge. 647 630 int id(Edge) const { return -1; } 648 631 649 /// \brief Returns the id of the arc. 632 /// \brief The ID of the arc. 633 /// 634 /// Returns the ID of the given arc. 650 635 int id(Arc) const { return -1; } 651 636 652 /// \brief Returns the node with the given id. 653 /// 654 /// \pre The argument should be a valid node id in the graph. 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. 655 641 Node nodeFromId(int) const { return INVALID; } 656 642 657 /// \brief Returns the edge with the given id. 658 /// 659 /// \pre The argument should be a valid edge id in the graph. 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. 660 647 Edge edgeFromId(int) const { return INVALID; } 661 648 662 /// \brief Returns the arc with the given id. 663 /// 664 /// \pre The argument should be a valid arc id in the graph. 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. 665 653 Arc arcFromId(int) const { return INVALID; } 666 654 667 /// \brief Returns an upper bound on the node IDs. 655 /// \brief An upper bound on the node IDs. 656 /// 657 /// Returns an upper bound on the node IDs. 668 658 int maxNodeId() const { return -1; } 669 659 670 /// \brief Returns an upper bound on the edge IDs. 660 /// \brief An upper bound on the edge IDs. 661 /// 662 /// Returns an upper bound on the edge IDs. 671 663 int maxEdgeId() const { return -1; } 672 664 673 /// \brief Returns an upper bound on the arc IDs. 665 /// \brief An upper bound on the arc IDs. 666 /// 667 /// Returns an upper bound on the arc IDs. 674 668 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; } 675 703 676 704 void first(Node&) const {} … … 706 734 int maxId(Arc) const { return -1; } 707 735 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 } 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; } 749 769 750 770 template <typename _Graph> -
lemon/concepts/graph_components.h
r713 r833 19 19 ///\ingroup graph_concepts 20 20 ///\file 21 ///\brief The concept of graph components.21 ///\brief The concepts of graph components. 22 22 23 23 #ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H … … 93 93 /// associative containers (e.g. \c std::map). 94 94 /// 95 /// \note This operator only ha veto define some strict ordering of95 /// \note This operator only has to define some strict ordering of 96 96 /// the items; this order has nothing to do with the iteration 97 97 /// ordering of the items. -
lemon/concepts/heap.h
r757 r883 89 89 /// handle the cross references. The assigned value must be 90 90 /// \c PRE_HEAP (<tt>-1</tt>) for each item. 91 #ifdef DOXYGEN 91 92 explicit Heap(ItemIntMap &map) {} 93 #else 94 explicit Heap(ItemIntMap&) {} 95 #endif 92 96 93 97 /// \brief Constructor. … … 99 103 /// \c PRE_HEAP (<tt>-1</tt>) for each item. 100 104 /// \param comp The function object used for comparing the priorities. 105 #ifdef DOXYGEN 101 106 explicit Heap(ItemIntMap &map, const CMP &comp) {} 107 #else 108 explicit Heap(ItemIntMap&, const CMP&) {} 109 #endif 102 110 103 111 /// \brief The number of items stored in the heap. … … 127 135 /// \param p The priority of the item. 128 136 /// \pre \e i must not be stored in the heap. 137 #ifdef DOXYGEN 129 138 void push(const Item &i, const Prio &p) {} 139 #else 140 void push(const Item&, const Prio&) {} 141 #endif 130 142 131 143 /// \brief Return the item having minimum priority. … … 133 145 /// This function returns the item having minimum priority. 134 146 /// \pre The heap must be non-empty. 135 Item top() const { }147 Item top() const { return Item(); } 136 148 137 149 /// \brief The minimum priority. … … 139 151 /// This function returns the minimum priority. 140 152 /// \pre The heap must be non-empty. 141 Prio prio() const { }153 Prio prio() const { return Prio(); } 142 154 143 155 /// \brief Remove the item having minimum priority. … … 153 165 /// \param i The item to delete. 154 166 /// \pre \e i must be in the heap. 167 #ifdef DOXYGEN 155 168 void erase(const Item &i) {} 169 #else 170 void erase(const Item&) {} 171 #endif 156 172 157 173 /// \brief The priority of the given item. … … 160 176 /// \param i The item. 161 177 /// \pre \e i must be in the heap. 178 #ifdef DOXYGEN 162 179 Prio operator[](const Item &i) const {} 180 #else 181 Prio operator[](const Item&) const { return Prio(); } 182 #endif 163 183 164 184 /// \brief Set the priority of an item or insert it, if it is … … 171 191 /// \param i The item. 172 192 /// \param p The priority. 193 #ifdef DOXYGEN 173 194 void set(const Item &i, const Prio &p) {} 195 #else 196 void set(const Item&, const Prio&) {} 197 #endif 174 198 175 199 /// \brief Decrease the priority of an item to the given value. … … 179 203 /// \param p The priority. 180 204 /// \pre \e i must be stored in the heap with priority at least \e p. 205 #ifdef DOXYGEN 181 206 void decrease(const Item &i, const Prio &p) {} 207 #else 208 void decrease(const Item&, const Prio&) {} 209 #endif 182 210 183 211 /// \brief Increase the priority of an item to the given value. … … 187 215 /// \param p The priority. 188 216 /// \pre \e i must be stored in the heap with priority at most \e p. 217 #ifdef DOXYGEN 189 218 void increase(const Item &i, const Prio &p) {} 219 #else 220 void increase(const Item&, const Prio&) {} 221 #endif 190 222 191 223 /// \brief Return the state of an item. … … 197 229 /// to the heap again. 198 230 /// \param i The item. 231 #ifdef DOXYGEN 199 232 State state(const Item &i) const {} 233 #else 234 State state(const Item&) const { return PRE_HEAP; } 235 #endif 200 236 201 237 /// \brief Set the state of an item in the heap. … … 206 242 /// \param i The item. 207 243 /// \param st The state. It should not be \c IN_HEAP. 244 #ifdef DOXYGEN 208 245 void state(const Item& i, State st) {} 246 #else 247 void state(const Item&, State) {} 248 #endif 209 249 210 250 -
lemon/concepts/path.h
r606 r832 19 19 ///\ingroup concept 20 20 ///\file 21 ///\brief Classes for representing paths in digraphs.21 ///\brief The concept of paths 22 22 /// 23 23 … … 39 39 /// A skeleton structure for representing directed paths in a 40 40 /// digraph. 41 /// In a sense, a path can be treated as a list of arcs. 42 /// LEMON path types just store this list. As a consequence, they cannot 43 /// enumerate the nodes on the path directly and a zero length path 44 /// cannot store its source node. 45 /// 46 /// The arcs of a path should be stored in the order of their directions, 47 /// i.e. the target node of each arc should be the same as the source 48 /// node of the next arc. This consistency could be checked using 49 /// \ref checkPath(). 50 /// The source and target nodes of a (consistent) path can be obtained 51 /// using \ref pathSource() and \ref pathTarget(). 52 /// 53 /// A path can be constructed from another path of any type using the 54 /// copy constructor or the assignment operator. 55 /// 41 56 /// \tparam GR The digraph type in which the path is. 42 ///43 /// In a sense, the path can be treated as a list of arcs. The44 /// lemon path type stores just this list. As a consequence it45 /// cannot enumerate the nodes in the path and the zero length46 /// paths cannot store the source.47 ///48 57 template <typename GR> 49 58 class Path { … … 60 69 Path() {} 61 70 62 /// \brief Template co nstructor71 /// \brief Template copy constructor 63 72 template <typename CPath> 64 73 Path(const CPath& cpath) {} 65 74 66 /// \brief Template assigment 75 /// \brief Template assigment operator 67 76 template <typename CPath> 68 77 Path& operator=(const CPath& cpath) { … … 71 80 } 72 81 73 /// Length of the path ie. the number of arcs in the path.82 /// Length of the path, i.e. the number of arcs on the path. 74 83 int length() const { return 0;} 75 84 … … 80 89 void clear() {} 81 90 82 /// \brief LEMON style iterator for path arcs91 /// \brief LEMON style iterator for enumerating the arcs of a path. 83 92 /// 84 /// This class is used to iterate on the arcs of the paths.93 /// LEMON style iterator class for enumerating the arcs of a path. 85 94 class ArcIt { 86 95 public: … … 89 98 /// Invalid constructor 90 99 ArcIt(Invalid) {} 91 /// Constructor for first arc100 /// Sets the iterator to the first arc of the given path 92 101 ArcIt(const Path &) {} 93 102 94 /// Conversion to Arc103 /// Conversion to \c Arc 95 104 operator Arc() const { return INVALID; } 96 105 … … 193 202 /// 194 203 /// A skeleton structure for path dumpers. The path dumpers are 195 /// the generalization of the paths. The path dumpers can 196 /// enumerate the arcs of the path wheter in forward or in 197 /// backward order. In most time these classes are not used 198 /// directly rather it used to assign a dumped class to a real 199 /// path type. 204 /// the generalization of the paths, they can enumerate the arcs 205 /// of the path either in forward or in backward order. 206 /// These classes are typically not used directly, they are rather 207 /// used to be assigned to a real path type. 200 208 /// 201 209 /// The main purpose of this concept is that the shortest path 202 /// algorithms can enumerate easily the arcs in reverse order. 203 /// If we would like to give back a real path from these 204 /// algorithms then we should create a temporarly path object. In 205 /// LEMON such algorithms gives back a path dumper what can 206 /// assigned to a real path and the dumpers can be implemented as 210 /// algorithms can enumerate the arcs easily in reverse order. 211 /// In LEMON, such algorithms give back a (reverse) path dumper that 212 /// can be assigned to a real path. The dumpers can be implemented as 207 213 /// an adaptor class to the predecessor map. 208 214 /// 209 215 /// \tparam GR The digraph type in which the path is. 210 ///211 /// The paths can be constructed from any path type by a212 /// template constructor or a template assignment operator.213 216 template <typename GR> 214 217 class PathDumper { … … 220 223 typedef typename Digraph::Arc Arc; 221 224 222 /// Length of the path ie. the number of arcs in the path.225 /// Length of the path, i.e. the number of arcs on the path. 223 226 int length() const { return 0;} 224 227 … … 228 231 /// \brief Forward or reverse dumping 229 232 /// 230 /// If the RevPathTag is defined and true then reverse dumping 231 /// is provided in the path dumper. In this case instead of the 232 /// ArcIt the RevArcIt iterator should be implemented in the 233 /// dumper. 233 /// If this tag is defined to be \c True, then reverse dumping 234 /// is provided in the path dumper. In this case, \c RevArcIt 235 /// iterator should be implemented instead of \c ArcIt iterator. 234 236 typedef False RevPathTag; 235 237 236 /// \brief LEMON style iterator for path arcs238 /// \brief LEMON style iterator for enumerating the arcs of a path. 237 239 /// 238 /// This class is used to iterate on the arcs of the paths.240 /// LEMON style iterator class for enumerating the arcs of a path. 239 241 class ArcIt { 240 242 public: … … 243 245 /// Invalid constructor 244 246 ArcIt(Invalid) {} 245 /// Constructor for first arc247 /// Sets the iterator to the first arc of the given path 246 248 ArcIt(const PathDumper&) {} 247 249 248 /// Conversion to Arc250 /// Conversion to \c Arc 249 251 operator Arc() const { return INVALID; } 250 252 … … 261 263 }; 262 264 263 /// \brief LEMON style iterator for path arcs 265 /// \brief LEMON style iterator for enumerating the arcs of a path 266 /// in reverse direction. 264 267 /// 265 /// This class is used to iterate on the arcs of the paths in266 /// reverse direction.268 /// LEMON style iterator class for enumerating the arcs of a path 269 /// in reverse direction. 267 270 class RevArcIt { 268 271 public: … … 271 274 /// Invalid constructor 272 275 RevArcIt(Invalid) {} 273 /// Constructor for first arc276 /// Sets the iterator to the last arc of the given path 274 277 RevArcIt(const PathDumper &) {} 275 278 276 /// Conversion to Arc279 /// Conversion to \c Arc 277 280 operator Arc() const { return INVALID; } 278 281 -
lemon/counter.h
r463 r833 213 213 /// 'Do nothing' version of Counter. 214 214 215 /// This class can be used in the same way as \ref Counter howeverit215 /// This class can be used in the same way as \ref Counter, but it 216 216 /// does not count at all and does not print report on destruction. 217 217 /// -
lemon/cplex.cc
r623 r793 112 112 } 113 113 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 } 114 147 115 148 void CplexBase::_eraseCol(int i) { -
lemon/cplex.h
r623 r793 94 94 virtual int _addCol(); 95 95 virtual int _addRow(); 96 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 96 97 97 98 virtual void _eraseCol(int i); -
lemon/dfs.h
r764 r891 64 64 ///The type of the map that indicates which nodes are processed. 65 65 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 66 ///By default it is a NullMap.66 ///By default, it is a NullMap. 67 67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 68 68 ///Instantiates a \c ProcessedMap. … … 122 122 ///\tparam GR The type of the digraph the algorithm runs on. 123 123 ///The default type is \ref ListDigraph. 124 ///\tparam TR The traits class that defines various types used by the 125 ///algorithm. By default, it is \ref DfsDefaultTraits 126 ///"DfsDefaultTraits<GR>". 127 ///In most cases, this parameter should not be set directly, 128 ///consider to use the named template parameters instead. 124 129 #ifdef DOXYGEN 125 130 template <typename GR, … … 634 639 ///Runs the algorithm to visit all nodes in the digraph. 635 640 636 ///This method runs the %DFS algorithm in order to compute the 637 ///%DFS path to each node. 638 /// 639 ///The algorithm computes 640 ///- the %DFS tree (forest), 641 ///- the distance of each node from the root(s) in the %DFS tree. 641 ///This method runs the %DFS algorithm in order to visit all nodes 642 ///in the digraph. 642 643 /// 643 644 ///\note <tt>d.run()</tt> is just a shortcut of the following code. … … 783 784 ///The type of the map that indicates which nodes are processed. 784 785 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 785 ///By default it is a NullMap.786 ///By default, it is a NullMap. 786 787 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 787 788 ///Instantiates a ProcessedMap. … … 892 893 /// This class should only be used through the \ref dfs() function, 893 894 /// which makes it easier to use the algorithm. 895 /// 896 /// \tparam TR The traits class that defines various types used by the 897 /// algorithm. 894 898 template<class TR> 895 899 class DfsWizard : public TR … … 977 981 ///Runs DFS algorithm to visit all nodes in the digraph. 978 982 979 ///This method runs DFS algorithm in order to compute980 /// the DFS path to each node.983 ///This method runs DFS algorithm in order to visit all nodes 984 ///in the digraph. 981 985 void run() 982 986 { … … 1242 1246 /// does not observe the DFS events. If you want to observe the DFS 1243 1247 /// events, you should implement your own visitor class. 1244 /// \tparam TR T raits class to set various datatypes used by the1245 /// algorithm. The default traits class is1246 /// \ref DfsVisitDefaultTraits"DfsVisitDefaultTraits<GR>".1247 /// See \ref DfsVisitDefaultTraits for the documentation of1248 /// a DFS visit traits class.1248 /// \tparam TR The traits class that defines various types used by the 1249 /// algorithm. By default, it is \ref DfsVisitDefaultTraits 1250 /// "DfsVisitDefaultTraits<GR>". 1251 /// In most cases, this parameter should not be set directly, 1252 /// consider to use the named template parameters instead. 1249 1253 #ifdef DOXYGEN 1250 1254 template <typename GR, typename VS, typename TR> … … 1579 1583 /// \brief Runs the algorithm to visit all nodes in the digraph. 1580 1584 1581 /// This method runs the %DFS algorithm in order to 1582 /// compute the %DFS path to each node. 1583 /// 1584 /// The algorithm computes 1585 /// - the %DFS tree (forest), 1586 /// - the distance of each node from the root(s) in the %DFS tree. 1585 /// This method runs the %DFS algorithm in order to visit all nodes 1586 /// in the digraph. 1587 1587 /// 1588 1588 /// \note <tt>d.run()</tt> is just a shortcut of the following code. -
lemon/dijkstra.h
r764 r891 133 133 ///The type of the map that indicates which nodes are processed. 134 134 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 135 ///By default it is a NullMap.135 ///By default, it is a NullMap. 136 136 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 137 137 ///Instantiates a \c ProcessedMap. … … 193 193 ///it is necessary. The default map type is \ref 194 194 ///concepts::Digraph::ArcMap "GR::ArcMap<int>". 195 ///\tparam TR The traits class that defines various types used by the 196 ///algorithm. By default, it is \ref DijkstraDefaultTraits 197 ///"DijkstraDefaultTraits<GR, LEN>". 198 ///In most cases, this parameter should not be set directly, 199 ///consider to use the named template parameters instead. 195 200 #ifdef DOXYGEN 196 201 template <typename GR, typename LEN, typename TR> … … 207 212 208 213 ///The type of the arc lengths. 209 typedef typename TR:: LengthMap::Value Value;214 typedef typename TR::Value Value; 210 215 ///The type of the map that stores the arc lengths. 211 216 typedef typename TR::LengthMap LengthMap; … … 427 432 ///passed to the constructor of the cross reference and the cross 428 433 ///reference should be passed to the constructor of the heap). 429 ///However external heap and cross reference objects could also be434 ///However, external heap and cross reference objects could also be 430 435 ///passed to the algorithm using the \ref heap() function before 431 436 ///calling \ref run(Node) "run()" or \ref init(). … … 448 453 ///\ref named-templ-param "Named parameter" for setting 449 454 ///\c OperationTraits type. 450 /// For more information see \ref DijkstraDefaultOperationTraits.455 /// For more information, see \ref DijkstraDefaultOperationTraits. 451 456 template <class T> 452 457 struct SetOperationTraits … … 997 1002 ///The type of the map that indicates which nodes are processed. 998 1003 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 999 ///By default it is a NullMap.1004 ///By default, it is a NullMap. 1000 1005 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 1001 1006 ///Instantiates a ProcessedMap. … … 1093 1098 /// This class should only be used through the \ref dijkstra() function, 1094 1099 /// which makes it easier to use the algorithm. 1100 /// 1101 /// \tparam TR The traits class that defines various types used by the 1102 /// algorithm. 1095 1103 template<class TR> 1096 1104 class DijkstraWizard : public TR -
lemon/edge_set.h
r717 r834 256 256 /// all arcs incident to the given node is erased from the arc set. 257 257 /// 258 /// This class fully conforms to the \ref concepts::Digraph 259 /// "Digraph" concept. 260 /// It provides only linear time counting for nodes and arcs. 261 /// 258 262 /// \param GR The type of the graph which shares its node set with 259 263 /// this class. Its interface must conform to the 260 264 /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph" 261 265 /// concept. 262 ///263 /// This class fully conforms to the \ref concepts::Digraph264 /// "Digraph" concept.265 266 template <typename GR> 266 267 class ListArcSet : public ArcSetExtender<ListArcSetBase<GR> > { … … 686 687 /// incident to the given node is erased from the arc set. 687 688 /// 689 /// This class fully conforms to the \ref concepts::Graph "Graph" 690 /// concept. 691 /// It provides only linear time counting for nodes, edges and arcs. 692 /// 688 693 /// \param GR The type of the graph which shares its node set 689 694 /// with this class. Its interface must conform to the 690 695 /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph" 691 /// concept.692 ///693 /// This class fully conforms to the \ref concepts::Graph "Graph"694 696 /// concept. 695 697 template <typename GR> … … 868 870 } 869 871 870 void next(Arc& arc) const{872 static void next(Arc& arc) { 871 873 --arc.id; 872 874 } … … 955 957 /// arcs. Therefore the arcs cannot be erased from the arc sets. 956 958 /// 959 /// This class fully conforms to the \ref concepts::Digraph "Digraph" 960 /// concept. 961 /// It provides only linear time counting for nodes and arcs. 962 /// 957 963 /// \warning If a node is erased from the underlying graph and this 958 964 /// node is the source or target of one arc in the arc set, then 959 965 /// the arc set is invalidated, and it cannot be used anymore. The 960 966 /// validity can be checked with the \c valid() member function. 961 ///962 /// This class fully conforms to the \ref concepts::Digraph963 /// "Digraph" concept.964 967 template <typename GR> 965 968 class SmartArcSet : public ArcSetExtender<SmartArcSetBase<GR> > { … … 1174 1177 } 1175 1178 1176 void next(Arc& arc) const{1179 static void next(Arc& arc) { 1177 1180 --arc.id; 1178 1181 } … … 1182 1185 } 1183 1186 1184 void next(Edge& arc) const{1187 static void next(Edge& arc) { 1185 1188 --arc.id; 1186 1189 } … … 1305 1308 /// edges cannot be erased from the edge sets. 1306 1309 /// 1310 /// This class fully conforms to the \ref concepts::Graph "Graph" 1311 /// concept. 1312 /// It provides only linear time counting for nodes, edges and arcs. 1313 /// 1307 1314 /// \warning If a node is erased from the underlying graph and this 1308 1315 /// node is incident to one edge in the edge set, then the edge set 1309 1316 /// is invalidated, and it cannot be used anymore. The validity can 1310 1317 /// be checked with the \c valid() member function. 1311 ///1312 /// This class fully conforms to the \ref concepts::Graph1313 /// "Graph" concept.1314 1318 template <typename GR> 1315 1319 class SmartEdgeSet : public EdgeSetExtender<SmartEdgeSetBase<GR> > { -
lemon/full_graph.h
r664 r834 25 25 ///\ingroup graphs 26 26 ///\file 27 ///\brief Full Graph and FullDigraph classes.27 ///\brief FullDigraph and FullGraph classes. 28 28 29 29 namespace lemon { … … 52 52 53 53 Node operator()(int ix) const { return Node(ix); } 54 int index(const Node& node) const{ return node._id; }54 static int index(const Node& node) { return node._id; } 55 55 56 56 Arc arc(const Node& s, const Node& t) const { … … 149 149 /// \ingroup graphs 150 150 /// 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, 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 /// This class provides constant time counting for nodes and arcs. 166 /// 167 /// \note FullDigraph and FullGraph classes are very similar, 164 168 /// but there are two differences. While this class conforms only 165 /// to the \ref concepts::Digraph "Digraph" concept, the \cFullGraph166 /// c lass conforms to the \ref concepts::Graph "Graph" concept,167 /// moreover \c FullGraph does not contain a loop arcfor each168 /// node as \c FullDigraphdoes.169 /// to the \ref concepts::Digraph "Digraph" concept, FullGraph 170 /// conforms to the \ref concepts::Graph "Graph" concept, 171 /// moreover FullGraph does not contain a loop for each 172 /// node as this class does. 169 173 /// 170 174 /// \sa FullGraph … … 174 178 public: 175 179 176 /// \brief Constructor 180 /// \brief Default constructor. 181 /// 182 /// Default constructor. The number of nodes and arcs will be zero. 177 183 FullDigraph() { construct(0); } 178 184 … … 185 191 /// \brief Resizes the digraph 186 192 /// 187 /// Resizes the digraph. The function will fully destroyand188 /// rebuild the digraph. This cause that the maps of the digraph will193 /// This function resizes the digraph. It fully destroys and 194 /// rebuilds the structure, therefore the maps of the digraph will be 189 195 /// reallocated automatically and the previous values will be lost. 190 196 void resize(int n) { … … 198 204 /// \brief Returns the node with the given index. 199 205 /// 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>. 206 /// Returns the node with the given index. Since this structure is 207 /// completely static, the nodes can be indexed with integers from 208 /// the range <tt>[0..nodeNum()-1]</tt>. 209 /// The index of a node is the same as its ID. 203 210 /// \sa index() 204 211 Node operator()(int ix) const { return Parent::operator()(ix); } … … 206 213 /// \brief Returns the index of the given node. 207 214 /// 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() 212 int index(const Node& node) const { return Parent::index(node); } 215 /// Returns the index of the given node. Since this structure is 216 /// completely static, the nodes can be indexed with integers from 217 /// the range <tt>[0..nodeNum()-1]</tt>. 218 /// The index of a node is the same as its ID. 219 /// \sa operator()() 220 static int index(const Node& node) { return Parent::index(node); } 213 221 214 222 /// \brief Returns the arc connecting the given nodes. 215 223 /// 216 224 /// Returns the arc connecting the given nodes. 217 Arc arc( const Node& u, const Node&v) const {225 Arc arc(Node u, Node v) const { 218 226 return Parent::arc(u, v); 219 227 } … … 284 292 285 293 Node operator()(int ix) const { return Node(ix); } 286 int index(const Node& node) const{ return node._id; }294 static int index(const Node& node) { return node._id; } 287 295 288 296 Edge edge(const Node& u, const Node& v) const { … … 521 529 /// \brief An undirected full graph class. 522 530 /// 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 531 /// FullGraph is a simple and fast implmenetation of undirected full 532 /// (complete) graphs. It contains an edge between every distinct pair 533 /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>. 534 /// This class is completely static and it needs constant memory space. 535 /// Thus you can neither add nor delete nodes or edges, however 536 /// the structure can be resized using resize(). 537 /// 538 /// This type fully conforms to the \ref concepts::Graph "Graph concept". 539 /// Most of its member functions and nested classes are documented 540 /// only in the concept class. 541 /// 542 /// This class provides constant time counting for nodes, edges and arcs. 543 /// 544 /// \note FullDigraph and FullGraph classes are very similar, 545 /// but there are two differences. While FullDigraph 534 546 /// conforms only to the \ref concepts::Digraph "Digraph" concept, 535 547 /// this class conforms to the \ref concepts::Graph "Graph" concept, 536 /// moreover \c FullGraph does not contain a loop arcfor each537 /// node as \cFullDigraph does.548 /// moreover this class does not contain a loop for each 549 /// node as FullDigraph does. 538 550 /// 539 551 /// \sa FullDigraph … … 543 555 public: 544 556 545 /// \brief Constructor 557 /// \brief Default constructor. 558 /// 559 /// Default constructor. The number of nodes and edges will be zero. 546 560 FullGraph() { construct(0); } 547 561 … … 554 568 /// \brief Resizes the graph 555 569 /// 556 /// Resizes the graph. The function will fully destroyand557 /// rebuild the graph. This cause that the maps of the graph will570 /// This function resizes the graph. It fully destroys and 571 /// rebuilds the structure, therefore the maps of the graph will be 558 572 /// reallocated automatically and the previous values will be lost. 559 573 void resize(int n) { … … 569 583 /// \brief Returns the node with the given index. 570 584 /// 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>. 585 /// Returns the node with the given index. Since this structure is 586 /// completely static, the nodes can be indexed with integers from 587 /// the range <tt>[0..nodeNum()-1]</tt>. 588 /// The index of a node is the same as its ID. 574 589 /// \sa index() 575 590 Node operator()(int ix) const { return Parent::operator()(ix); } … … 577 592 /// \brief Returns the index of the given node. 578 593 /// 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() 583 int index(const Node& node) const { return Parent::index(node); } 594 /// Returns the index of the given node. Since this structure is 595 /// completely static, the nodes can be indexed with integers from 596 /// the range <tt>[0..nodeNum()-1]</tt>. 597 /// The index of a node is the same as its ID. 598 /// \sa operator()() 599 static int index(const Node& node) { return Parent::index(node); } 584 600 585 601 /// \brief Returns the arc connecting the given nodes. 586 602 /// 587 603 /// Returns the arc connecting the given nodes. 588 Arc arc( const Node& s, const Node&t) const {604 Arc arc(Node s, Node t) const { 589 605 return Parent::arc(s, t); 590 606 } 591 607 592 /// \brief Returns the edge connect sthe given nodes.593 /// 594 /// Returns the edge connect sthe given nodes.595 Edge edge( const Node& u, const Node&v) const {608 /// \brief Returns the edge connecting the given nodes. 609 /// 610 /// Returns the edge connecting the given nodes. 611 Edge edge(Node u, Node v) const { 596 612 return Parent::edge(u, v); 597 613 } -
lemon/glpk.cc
r623 r793 57 57 int i = glp_add_rows(lp, 1); 58 58 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()); 59 95 return i; 60 96 } -
lemon/glpk.h
r697 r902 26 26 #include <lemon/lp_base.h> 27 27 28 // forward declaration29 #if !defined _GLP_PROB && !defined GLP_PROB30 #define _GLP_PROB31 #define GLP_PROB32 typedef struct { double _opaque_prob; } glp_prob;33 /* LP/MIP problem object */34 #endif35 36 28 namespace lemon { 37 29 30 namespace _solver_bits { 31 class VoidPtr { 32 private: 33 void *_ptr; 34 public: 35 VoidPtr() : _ptr(0) {} 36 37 template <typename T> 38 VoidPtr(T* ptr) : _ptr(reinterpret_cast<void*>(ptr)) {} 39 40 template <typename T> 41 VoidPtr& operator=(T* ptr) { 42 _ptr = reinterpret_cast<void*>(ptr); 43 return *this; 44 } 45 46 template <typename T> 47 operator T*() const { return reinterpret_cast<T*>(_ptr); } 48 }; 49 } 38 50 39 51 /// \brief Base interface for the GLPK LP and MIP solver … … 44 56 protected: 45 57 46 typedef glp_prob LPX; 47 glp_prob* lp; 58 _solver_bits::VoidPtr lp; 48 59 49 60 GlpkBase(); … … 55 66 virtual int _addCol(); 56 67 virtual int _addRow(); 68 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 57 69 58 70 virtual void _eraseCol(int i); … … 123 135 124 136 ///Pointer to the underlying GLPK data structure. 125 LPX *lpx() {return lp;}137 _solver_bits::VoidPtr lpx() {return lp;} 126 138 ///Const pointer to the underlying GLPK data structure. 127 const LPX *lpx() const {return lp;}139 _solver_bits::VoidPtr lpx() const {return lp;} 128 140 129 141 ///Returns the constraint identifier understood by GLPK. -
lemon/gomory_hu.h
r760 r833 295 295 /// \pre \ref run() must be called before using this function. 296 296 template <typename CutMap> 297 Value minCutMap(const Node& s, ///<297 Value minCutMap(const Node& s, 298 298 const Node& t, 299 ///<300 299 CutMap& cutMap 301 ///<302 300 ) const { 303 301 Node sn = s, tn = t; … … 395 393 /// \endcode 396 394 /// does not necessarily give the same set of nodes. 397 /// However it is ensured that395 /// However, it is ensured that 398 396 /// \code 399 397 /// MinCutNodeIt(gomory, s, t, true); -
lemon/graph_to_eps.h
r664 r909 143 143 ///\param gr Reference to the graph to be printed. 144 144 ///\param ost Reference to the output stream. 145 ///By default it is <tt>std::cout</tt>.145 ///By default, it is <tt>std::cout</tt>. 146 146 ///\param pros If it is \c true, then the \c ostream referenced by \c os 147 147 ///will be explicitly deallocated by the destructor. … … 513 513 ///Turn on/off pre-scaling 514 514 515 ///By default graphToEps() rescales the whole image in order to avoid515 ///By default, graphToEps() rescales the whole image in order to avoid 516 516 ///very big or very small bounding boxes. 517 517 /// … … 685 685 #else 686 686 os << bits::getWinFormattedDate(); 687 os << std::endl; 687 688 #endif 688 689 } 689 os << std::endl;690 690 691 691 if (_autoArcWidthScale) { … … 1115 1115 ///\param g Reference to the graph to be printed. 1116 1116 ///\param os Reference to the output stream. 1117 ///By default it is <tt>std::cout</tt>.1117 ///By default, it is <tt>std::cout</tt>. 1118 1118 /// 1119 1119 ///This function also has a lot of … … 1127 1127 ///\endcode 1128 1128 /// 1129 ///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.1129 ///For more detailed examples, see the \ref graph_to_eps_demo.cc demo file. 1130 1130 /// 1131 1131 ///\warning Don't forget to put the \ref GraphToEps::run() "run()" -
lemon/grid_graph.h
r664 r834 471 471 /// \brief Grid graph class 472 472 /// 473 /// This classimplements a special graph type. The nodes of the474 /// graph can be indexed by two integer \c (i,j) valuewhere \c i is475 /// in the \c [0..width()-1] range and j is in the \c476 /// [0..height()-1] range.Two nodes are connected in the graph if477 /// the ind exes differ exactly on one position and exactly one is478 /// the difference. The nodes of the graph can be indexed by position479 /// with the \c operator()() function. The positions of the nodes can be480 /// get with\c pos(), \c col() and \c row() members. The outgoing473 /// 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 481 481 /// arcs can be retrieved with the \c right(), \c up(), \c left() 482 482 /// and \c down() functions, where the bottom-left corner is the 483 483 /// 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(). 484 488 /// 485 489 /// \image html grid_graph.png … … 497 501 ///\endcode 498 502 /// 499 /// This graph type fully conforms to the \ref concepts::Graph 500 /// "Graph concept". 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. 506 /// 507 /// This class provides constant time counting for nodes, edges and arcs. 501 508 class GridGraph : public ExtendedGridGraphBase { 502 509 typedef ExtendedGridGraphBase Parent; … … 504 511 public: 505 512 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>. 513 /// \brief Map to get the indices of the nodes as \ref dim2::Point 514 /// "dim2::Point<int>". 515 /// 516 /// Map to get the indices of the nodes as \ref dim2::Point 517 /// "dim2::Point<int>". 509 518 class IndexMap { 510 519 public: … … 515 524 516 525 /// \brief Constructor 517 ///518 /// Constructor519 526 IndexMap(const GridGraph& graph) : _graph(graph) {} 520 527 521 528 /// \brief The subscript operator 522 ///523 /// The subscript operator.524 529 Value operator[](Key key) const { 525 530 return _graph.pos(key); … … 541 546 542 547 /// \brief Constructor 543 ///544 /// Constructor545 548 ColMap(const GridGraph& graph) : _graph(graph) {} 546 549 547 550 /// \brief The subscript operator 548 ///549 /// The subscript operator.550 551 Value operator[](Key key) const { 551 552 return _graph.col(key); … … 567 568 568 569 /// \brief Constructor 569 ///570 /// Constructor571 570 RowMap(const GridGraph& graph) : _graph(graph) {} 572 571 573 572 /// \brief The subscript operator 574 ///575 /// The subscript operator.576 573 Value operator[](Key key) const { 577 574 return _graph.row(key); … … 584 581 /// \brief Constructor 585 582 /// 586 /// Construct a grid graph with given size.583 /// Construct a grid graph with the given size. 587 584 GridGraph(int width, int height) { construct(width, height); } 588 585 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. 586 /// \brief Resizes the graph 587 /// 588 /// This function resizes the graph. It fully destroys and 589 /// rebuilds the structure, therefore the maps of the graph will be 590 /// reallocated automatically and the previous values will be lost. 595 591 void resize(int width, int height) { 596 592 Parent::notifier(Arc()).clear(); … … 610 606 } 611 607 612 /// \brief Gives back the column index of the node.608 /// \brief The column index of the node. 613 609 /// 614 610 /// Gives back the column index of the node. … … 617 613 } 618 614 619 /// \brief Gives back the row index of the node.615 /// \brief The row index of the node. 620 616 /// 621 617 /// Gives back the row index of the node. … … 624 620 } 625 621 626 /// \brief Gives back the position of the node.622 /// \brief The position of the node. 627 623 /// 628 624 /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair. … … 631 627 } 632 628 633 /// \brief Gives back the number of the columns.629 /// \brief The number of the columns. 634 630 /// 635 631 /// Gives back the number of the columns. … … 638 634 } 639 635 640 /// \brief Gives back the number of the rows.636 /// \brief The number of the rows. 641 637 /// 642 638 /// Gives back the number of the rows. … … 645 641 } 646 642 647 /// \brief Gives back the arc goes right from the node.643 /// \brief The arc goes right from the node. 648 644 /// 649 645 /// Gives back the arc goes right from the node. If there is not … … 653 649 } 654 650 655 /// \brief Gives back the arc goes left from the node.651 /// \brief The arc goes left from the node. 656 652 /// 657 653 /// Gives back the arc goes left from the node. If there is not … … 661 657 } 662 658 663 /// \brief Gives back the arc goes up from the node.659 /// \brief The arc goes up from the node. 664 660 /// 665 661 /// Gives back the arc goes up from the node. If there is not … … 669 665 } 670 666 671 /// \brief Gives back the arc goes down from the node.667 /// \brief The arc goes down from the node. 672 668 /// 673 669 /// Gives back the arc goes down from the node. If there is not -
lemon/hypercube_graph.h
r664 r835 263 263 } 264 264 265 int index(Node node) const{265 static int index(Node node) { 266 266 return node._id; 267 267 } … … 283 283 /// \brief Hypercube graph class 284 284 /// 285 /// This class implements a special graph type. The nodes of the graph286 /// are indiced with integers withat most \c dim binary digits.285 /// HypercubeGraph implements a special graph type. The nodes of the 286 /// graph are indexed with integers having at most \c dim binary digits. 287 287 /// Two nodes are connected in the graph if and only if their indices 288 288 /// 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. 296 /// 297 /// This class provides constant time counting for nodes, edges and arcs. 289 298 /// 290 299 /// \note The type of the indices is chosen to \c int for efficiency 291 300 /// reasons. Thus the maximum dimension of this implementation is 26 292 301 /// (assuming that the size of \c int is 32 bit). 293 ///294 /// This graph type fully conforms to the \ref concepts::Graph295 /// "Graph concept".296 302 class HypercubeGraph : public ExtendedHypercubeGraphBase { 297 303 typedef ExtendedHypercubeGraphBase Parent; … … 303 309 /// Constructs a hypercube graph with \c dim dimensions. 304 310 HypercubeGraph(int dim) { construct(dim); } 311 312 /// \brief Resizes the graph 313 /// 314 /// This function resizes the graph. It fully destroys and 315 /// rebuilds the structure, therefore the maps of the graph will be 316 /// reallocated automatically and the previous values will be lost. 317 void resize(int dim) { 318 Parent::notifier(Arc()).clear(); 319 Parent::notifier(Edge()).clear(); 320 Parent::notifier(Node()).clear(); 321 construct(dim); 322 Parent::notifier(Node()).build(); 323 Parent::notifier(Edge()).build(); 324 Parent::notifier(Arc()).build(); 325 } 305 326 306 327 /// \brief The number of dimensions. … … 321 342 /// 322 343 /// Gives back the dimension id of the given edge. 323 /// It is in the [0..dim-1] range.344 /// It is in the range <tt>[0..dim-1]</tt>. 324 345 int dimension(Edge edge) const { 325 346 return Parent::dimension(edge); … … 329 350 /// 330 351 /// Gives back the dimension id of the given arc. 331 /// It is in the [0..dim-1] range.352 /// It is in the range <tt>[0..dim-1]</tt>. 332 353 int dimension(Arc arc) const { 333 354 return Parent::dimension(arc); … … 338 359 /// Gives back the index of the given node. 339 360 /// The lower bits of the integer describes the node. 340 int index(Node node) const{361 static int index(Node node) { 341 362 return Parent::index(node); 342 363 } -
lemon/lgf_reader.h
r646 r833 428 428 ///\endcode 429 429 /// 430 /// By default the reader uses the first section in the file of the430 /// By default, the reader uses the first section in the file of the 431 431 /// proper type. If a section has an optional name, then it can be 432 432 /// selected for reading by giving an optional name parameter to the … … 2222 2222 /// whitespaces are trimmed from each processed string. 2223 2223 /// 2224 /// For example let's see a section, which contain several2224 /// For example, let's see a section, which contain several 2225 2225 /// integers, which should be inserted into a vector. 2226 2226 ///\code -
lemon/list_graph.h
r664 r835 22 22 ///\ingroup graphs 23 23 ///\file 24 ///\brief ListDigraph ,ListGraph classes.24 ///\brief ListDigraph and ListGraph classes. 25 25 26 26 #include <lemon/core.h> … … 32 32 33 33 namespace lemon { 34 35 class ListDigraph; 34 36 35 37 class ListDigraphBase { … … 63 65 class Node { 64 66 friend class ListDigraphBase; 67 friend class ListDigraph; 65 68 protected: 66 69 … … 78 81 class Arc { 79 82 friend class ListDigraphBase; 83 friend class ListDigraph; 80 84 protected: 81 85 … … 117 121 int n; 118 122 for(n = first_node; 119 n !=-1 && nodes[n].first_in== -1;123 n != -1 && nodes[n].first_out == -1; 120 124 n = nodes[n].next) {} 121 arc.id = (n == -1) ? -1 : nodes[n].first_ in;125 arc.id = (n == -1) ? -1 : nodes[n].first_out; 122 126 } 123 127 124 128 void next(Arc& arc) const { 125 if (arcs[arc.id].next_ in!= -1) {126 arc.id = arcs[arc.id].next_ in;129 if (arcs[arc.id].next_out != -1) { 130 arc.id = arcs[arc.id].next_out; 127 131 } else { 128 132 int n; 129 for(n = nodes[arcs[arc.id]. target].next;130 n !=-1 && nodes[n].first_in== -1;133 for(n = nodes[arcs[arc.id].source].next; 134 n != -1 && nodes[n].first_out == -1; 131 135 n = nodes[n].next) {} 132 arc.id = (n == -1) ? -1 : nodes[n].first_ in;136 arc.id = (n == -1) ? -1 : nodes[n].first_out; 133 137 } 134 138 } … … 312 316 ///A general directed graph structure. 313 317 314 ///\ref ListDigraph is a simple and fast <em>directed graph</em>315 ///implementation based on staticlinked lists that are stored in318 ///\ref ListDigraph is a versatile and fast directed graph 319 ///implementation based on linked lists that are stored in 316 320 ///\c std::vector structures. 317 321 /// 318 /// It conforms to the \ref concepts::Digraph "Digraph concept" and it319 ///a lso provides several useful additional functionalities.320 ///Most of themember functions and nested classes are documented322 ///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 321 325 ///only in the concept class. 322 326 /// 327 ///This class provides only linear time counting for nodes and arcs. 328 /// 323 329 ///\sa concepts::Digraph 324 330 ///\sa ListGraph 325 331 class ListDigraph : public ExtendedListDigraphBase { 326 332 typedef ExtendedListDigraphBase Parent; 327 333 328 334 private: 329 ///ListDigraph is \e not copy constructible. Use copyDigraph() instead. 330 331 ///ListDigraph is \e not copy constructible. Use copyDigraph() instead. 332 /// 335 /// Digraphs are \e not copy constructible. Use DigraphCopy instead. 333 336 ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {}; 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. 337 /// \brief Assignment of a digraph to another one is \e not allowed. 338 /// Use DigraphCopy instead. 339 339 void operator=(const ListDigraph &) {} 340 340 public: … … 348 348 ///Add a new node to the digraph. 349 349 350 /// Adda new node to the digraph.350 ///This function adds a new node to the digraph. 351 351 ///\return The new node. 352 352 Node addNode() { return Parent::addNode(); } … … 354 354 ///Add a new arc to the digraph. 355 355 356 /// Adda new arc to the digraph with source node \c s356 ///This function adds a new arc to the digraph with source node \c s 357 357 ///and target node \c t. 358 358 ///\return The new arc. 359 Arc addArc( const Node& s, const Node&t) {359 Arc addArc(Node s, Node t) { 360 360 return Parent::addArc(s, t); 361 361 } … … 363 363 ///\brief Erase a node from the digraph. 364 364 /// 365 ///Erase a node from the digraph. 366 /// 367 void erase(const Node& n) { Parent::erase(n); } 365 ///This function erases the given node along with its outgoing and 366 ///incoming arcs from the digraph. 367 /// 368 ///\note All iterators referencing the removed node or the connected 369 ///arcs are invalidated, of course. 370 void erase(Node n) { Parent::erase(n); } 368 371 369 372 ///\brief Erase an arc from the digraph. 370 373 /// 371 ///Erase an arc from the digraph. 372 /// 373 void erase(const Arc& a) { Parent::erase(a); } 374 ///This function erases the given arc from the digraph. 375 /// 376 ///\note All iterators referencing the removed arc are invalidated, 377 ///of course. 378 void erase(Arc a) { Parent::erase(a); } 374 379 375 380 /// Node validity check 376 381 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. 382 /// This function gives back \c true if the given node is valid, 383 /// i.e. it is a real node of the digraph. 384 /// 385 /// \warning A removed node could become valid again if new nodes are 386 /// added to the digraph. 383 387 bool valid(Node n) const { return Parent::valid(n); } 384 388 385 389 /// Arc validity check 386 390 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. 391 /// This function gives back \c true if the given arc is valid, 392 /// i.e. it is a real arc of the digraph. 393 /// 394 /// \warning A removed arc could become valid again if new arcs are 395 /// added to the digraph. 393 396 bool valid(Arc a) const { return Parent::valid(a); } 394 397 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. 398 /// Change the target node of an arc 399 400 /// This function changes the target node of the given arc \c a to \c n. 401 /// 402 ///\note \c ArcIt and \c OutArcIt iterators referencing the changed 403 ///arc remain valid, but \c InArcIt iterators are invalidated. 402 404 /// 403 405 ///\warning This functionality cannot be used together with the Snapshot … … 406 408 Parent::changeTarget(a,n); 407 409 } 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. 410 /// Change the source node of an arc 411 412 /// This function changes the source node of the given arc \c a to \c n. 413 /// 414 ///\note \c InArcIt iterators referencing the changed arc remain 415 ///valid, but \c ArcIt and \c OutArcIt iterators are invalidated. 415 416 /// 416 417 ///\warning This functionality cannot be used together with the Snapshot … … 420 421 } 421 422 422 /// Invertthe direction of an arc.423 424 /// \note The <tt>ArcIt</tt>s referencing the changed arc remain425 /// valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are426 /// invalidated.423 /// Reverse the direction of an arc. 424 425 /// This function reverses the direction of the given arc. 426 ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing 427 ///the changed arc are invalidated. 427 428 /// 428 429 ///\warning This functionality cannot be used together with the Snapshot 429 430 ///feature. 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); }; 431 void reverseArc(Arc a) { 432 Node t=target(a); 433 changeTarget(a,source(a)); 434 changeSource(a,t); 435 } 455 436 456 437 ///Contract two nodes. 457 438 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. 439 ///This function contracts the given two nodes. 440 ///Node \c v is removed, but instead of deleting its 441 ///incident arcs, they are joined to node \c u. 442 ///If the last parameter \c r is \c true (this is the default value), 443 ///then the newly created loops are removed. 444 /// 445 ///\note The moved arcs are joined to node \c u using changeSource() 446 ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are 447 ///invalidated for the outgoing arcs of node \c v and \c InArcIt 448 ///iterators are invalidated for the incomming arcs of \c v. 449 ///Moreover all iterators referencing node \c v or the removed 450 ///loops are also invalidated. Other iterators remain valid. 467 451 /// 468 452 ///\warning This functionality cannot be used together with the Snapshot 469 453 ///feature. 470 void contract(Node a, Node b, bool r = true)454 void contract(Node u, Node v, bool r = true) 471 455 { 472 for(OutArcIt e(*this, b);e!=INVALID;) {456 for(OutArcIt e(*this,v);e!=INVALID;) { 473 457 OutArcIt f=e; 474 458 ++f; 475 if(r && target(e)== a) erase(e);476 else changeSource(e, a);459 if(r && target(e)==u) erase(e); 460 else changeSource(e,u); 477 461 e=f; 478 462 } 479 for(InArcIt e(*this, b);e!=INVALID;) {463 for(InArcIt e(*this,v);e!=INVALID;) { 480 464 InArcIt f=e; 481 465 ++f; 482 if(r && source(e)== a) erase(e);483 else changeTarget(e, a);466 if(r && source(e)==u) erase(e); 467 else changeTarget(e,u); 484 468 e=f; 485 469 } 486 erase( b);470 erase(v); 487 471 } 488 472 489 473 ///Split a node. 490 474 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. 475 ///This function splits the given node. First, a new node is added 476 ///to the digraph, then the source of each outgoing arc of node \c n 477 ///is moved to this new node. 478 ///If the second parameter \c connect is \c true (this is the default 479 ///value), then a new arc from node \c n to the newly created node 480 ///is also added. 495 481 ///\return The newly created node. 496 482 /// 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 483 ///\note All iterators remain valid. 484 /// 485 ///\warning This functionality cannot be used together with the 502 486 ///Snapshot feature. 503 487 Node split(Node n, bool connect = true) { 504 488 Node b = addNode(); 505 for(OutArcIt e(*this,n);e!=INVALID;) { 506 OutArcIt f=e; 507 ++f; 508 changeSource(e,b); 509 e=f; 489 nodes[b.id].first_out=nodes[n.id].first_out; 490 nodes[n.id].first_out=-1; 491 for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) { 492 arcs[i].source=b.id; 510 493 } 511 494 if (connect) addArc(n,b); … … 515 498 ///Split an arc. 516 499 517 ///This function splits an arc. First a new node \c b is added to518 /// the digraph, then the original arc is re-targeted to \c519 /// b. Finally an arc from \c b to the original target is added.520 /// 500 ///This function splits the given arc. First, a new node \c v is 501 ///added to the digraph, then the target node of the original arc 502 ///is set to \c v. Finally, an arc from \c v to the original target 503 ///is added. 521 504 ///\return The newly created node. 505 /// 506 ///\note \c InArcIt iterators referencing the original arc are 507 ///invalidated. Other iterators remain valid. 522 508 /// 523 509 ///\warning This functionality cannot be used together with the 524 510 ///Snapshot feature. 525 Node split(Arc e) { 526 Node b = addNode(); 527 addArc(b,target(e)); 528 changeTarget(e,b); 529 return b; 530 } 511 Node split(Arc a) { 512 Node v = addNode(); 513 addArc(v,target(a)); 514 changeTarget(a,v); 515 return v; 516 } 517 518 ///Clear the digraph. 519 520 ///This function erases all nodes and arcs from the digraph. 521 /// 522 ///\note All iterators of the digraph are invalidated, of course. 523 void clear() { 524 Parent::clear(); 525 } 526 527 /// Reserve memory for nodes. 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 reserveArc() 535 void reserveNode(int n) { nodes.reserve(n); }; 536 537 /// Reserve memory for arcs. 538 539 /// Using this function, it is possible to avoid superfluous memory 540 /// allocation: if you know that the digraph you want to build will 541 /// be large (e.g. it will contain millions of nodes and/or arcs), 542 /// then it is worth reserving space for this amount before starting 543 /// to build the digraph. 544 /// \sa reserveNode() 545 void reserveArc(int m) { arcs.reserve(m); }; 531 546 532 547 /// \brief Class to make a snapshot of the digraph and restore … … 538 553 /// restore() function. 539 554 /// 540 /// \warning Arc and node deletions and other modifications (e.g. 541 /// contracting, splitting, reversing arcs or nodes) cannot be 555 /// \note After a state is restored, you cannot restore a later state, 556 /// i.e. you cannot add the removed nodes and arcs again using 557 /// another Snapshot instance. 558 /// 559 /// \warning Node and arc deletions and other modifications (e.g. 560 /// reversing, contracting, splitting arcs or nodes) cannot be 542 561 /// restored. These events invalidate the snapshot. 562 /// However, the arcs and nodes that were added to the digraph after 563 /// making the current snapshot can be removed without invalidating it. 543 564 class Snapshot { 544 565 protected: … … 710 731 /// 711 732 /// Default constructor. 712 /// To actually make a snapshot you must call save().733 /// You have to call save() to actually make a snapshot. 713 734 Snapshot() 714 735 : digraph(0), node_observer_proxy(*this), … … 717 738 /// \brief Constructor that immediately makes a snapshot. 718 739 /// 719 /// This constructor immediately makes a snapshot of the digraph. 720 /// \param _digraph The digraph we make a snapshot of. 721 Snapshot(ListDigraph &_digraph) 740 /// This constructor immediately makes a snapshot of the given digraph. 741 Snapshot(ListDigraph &gr) 722 742 : node_observer_proxy(*this), 723 743 arc_observer_proxy(*this) { 724 attach( _digraph);744 attach(gr); 725 745 } 726 746 727 747 /// \brief Make a snapshot. 728 748 /// 729 /// Make a snapshot of the digraph. 730 /// 731 /// This function can be called more than once. In case of a repeated 749 /// This function makes a snapshot of the given digraph. 750 /// It can be called more than once. In case of a repeated 732 751 /// call, the previous snapshot gets lost. 733 /// \param _digraph The digraph we make the snapshot of. 734 void save(ListDigraph &_digraph) { 752 void save(ListDigraph &gr) { 735 753 if (attached()) { 736 754 detach(); 737 755 clear(); 738 756 } 739 attach( _digraph);757 attach(gr); 740 758 } 741 759 742 760 /// \brief Undo the changes until the last snapshot. 743 // 744 /// Undo the changes until the last snapshot created by save(). 761 /// 762 /// This function undos the changes until the last snapshot 763 /// created by save() or Snapshot(ListDigraph&). 764 /// 765 /// \warning This method invalidates the snapshot, i.e. repeated 766 /// restoring is not supported unless you call save() again. 745 767 void restore() { 746 768 detach(); … … 756 778 } 757 779 758 /// \brief Gives back true whenthe snapshot is valid.780 /// \brief Returns \c true if the snapshot is valid. 759 781 /// 760 /// Gives back true whenthe snapshot is valid.782 /// This function returns \c true if the snapshot is valid. 761 783 bool valid() const { 762 784 return attached(); … … 795 817 796 818 typedef ListGraphBase Graph; 797 798 class Node;799 class Arc;800 class Edge;801 819 802 820 class Node { … … 848 866 bool operator<(const Arc& arc) const {return id < arc.id;} 849 867 }; 850 851 852 868 853 869 ListGraphBase() … … 1165 1181 ///A general undirected graph structure. 1166 1182 1167 ///\ref ListGraph is a simple and fast <em>undirected graph</em>1168 ///implementation based on staticlinked lists that are stored in1183 ///\ref ListGraph is a versatile and fast undirected graph 1184 ///implementation based on linked lists that are stored in 1169 1185 ///\c std::vector structures. 1170 1186 /// 1171 /// It conforms to the \ref concepts::Graph "Graph concept" and it1172 ///a lso provides several useful additional functionalities.1173 ///Most of themember functions and nested classes are documented1187 ///This type fully conforms to the \ref concepts::Graph "Graph concept" 1188 ///and it also provides several useful additional functionalities. 1189 ///Most of its member functions and nested classes are documented 1174 1190 ///only in the concept class. 1175 1191 /// 1192 ///This class provides only linear time counting for nodes, edges and arcs. 1193 /// 1176 1194 ///\sa concepts::Graph 1177 1195 ///\sa ListDigraph 1178 1196 class ListGraph : public ExtendedListGraphBase { 1179 1197 typedef ExtendedListGraphBase Parent; 1180 1198 1181 1199 private: 1182 ///ListGraph is \e not copy constructible. Use copyGraph() instead. 1183 1184 ///ListGraph is \e not copy constructible. Use copyGraph() instead. 1185 /// 1200 /// Graphs are \e not copy constructible. Use GraphCopy instead. 1186 1201 ListGraph(const ListGraph &) :ExtendedListGraphBase() {}; 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. 1202 /// \brief Assignment of a graph to another one is \e not allowed. 1203 /// Use GraphCopy instead. 1192 1204 void operator=(const ListGraph &) {} 1193 1205 public: … … 1202 1214 /// \brief Add a new node to the graph. 1203 1215 /// 1204 /// Adda new node to the graph.1216 /// This function adds a new node to the graph. 1205 1217 /// \return The new node. 1206 1218 Node addNode() { return Parent::addNode(); } … … 1208 1220 /// \brief Add a new edge to the graph. 1209 1221 /// 1210 /// Add a new edge to the graph with source node \c s 1211 /// and target node \c t. 1222 /// This function adds a new edge to the graph between nodes 1223 /// \c u and \c v with inherent orientation from node \c u to 1224 /// node \c v. 1212 1225 /// \return The new edge. 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); } 1226 Edge addEdge(Node u, Node v) { 1227 return Parent::addEdge(u, v); 1228 } 1229 1230 ///\brief Erase a node from the graph. 1231 /// 1232 /// This function erases the given node along with its incident arcs 1233 /// from the graph. 1234 /// 1235 /// \note All iterators referencing the removed node or the incident 1236 /// edges are invalidated, of course. 1237 void erase(Node n) { Parent::erase(n); } 1238 1239 ///\brief Erase an edge from the graph. 1240 /// 1241 /// This function erases the given edge from the graph. 1242 /// 1243 /// \note All iterators referencing the removed edge are invalidated, 1244 /// of course. 1245 void erase(Edge e) { Parent::erase(e); } 1228 1246 /// Node validity check 1229 1247 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 1248 /// This function gives back \c true if the given node is valid, 1249 /// i.e. it is a real node of the graph. 1250 /// 1251 /// \warning A removed node could become valid again if new nodes are 1235 1252 /// added to the graph. 1236 1253 bool valid(Node n) const { return Parent::valid(n); } 1254 /// Edge validity check 1255 1256 /// This function gives back \c true if the given edge is valid, 1257 /// i.e. it is a real edge of the graph. 1258 /// 1259 /// \warning A removed edge could become valid again if new edges are 1260 /// added to the graph. 1261 bool valid(Edge e) const { return Parent::valid(e); } 1237 1262 /// Arc validity check 1238 1263 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 1264 /// This function gives back \c true if the given arc is valid, 1265 /// i.e. it is a real arc of the graph. 1266 /// 1267 /// \warning A removed arc could become valid again if new edges are 1244 1268 /// added to the graph. 1245 1269 bool valid(Arc a) const { return Parent::valid(a); } 1246 /// Edge validity check 1247 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 1253 /// added to the graph. 1254 bool valid(Edge e) const { return Parent::valid(e); } 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. 1270 1271 /// \brief Change the first node of an edge. 1272 /// 1273 /// This function changes the first node of the given edge \c e to \c n. 1274 /// 1275 ///\note \c EdgeIt and \c ArcIt iterators referencing the 1276 ///changed edge are invalidated and all other iterators whose 1277 ///base node is the changed node are also invalidated. 1263 1278 /// 1264 1279 ///\warning This functionality cannot be used together with the … … 1267 1282 Parent::changeU(e,n); 1268 1283 } 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. 1284 /// \brief Change the second node of an edge. 1285 /// 1286 /// This function changes the second node of the given edge \c e to \c n. 1287 /// 1288 ///\note \c EdgeIt iterators referencing the changed edge remain 1289 ///valid, but \c ArcIt iterators referencing the changed edge and 1290 ///all other iterators whose base node is the changed node are also 1291 ///invalidated. 1276 1292 /// 1277 1293 ///\warning This functionality cannot be used together with the … … 1280 1296 Parent::changeV(e,n); 1281 1297 } 1298 1282 1299 /// \brief Contract two nodes. 1283 1300 /// 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. 1301 /// This function contracts the given two nodes. 1302 /// Node \c b is removed, but instead of deleting 1303 /// its incident edges, they are joined to node \c a. 1304 /// If the last parameter \c r is \c true (this is the default value), 1305 /// then the newly created loops are removed. 1306 /// 1307 /// \note The moved edges are joined to node \c a using changeU() 1308 /// or changeV(), thus all edge and arc iterators whose base node is 1309 /// \c b are invalidated. 1310 /// Moreover all iterators referencing node \c b or the removed 1311 /// loops are also invalidated. Other iterators remain valid. 1292 1312 /// 1293 1313 ///\warning This functionality cannot be used together with the … … 1308 1328 } 1309 1329 1330 ///Clear the graph. 1331 1332 ///This function erases all nodes and arcs from the graph. 1333 /// 1334 ///\note All iterators of the graph are invalidated, of course. 1335 void clear() { 1336 Parent::clear(); 1337 } 1338 1339 /// Reserve memory for nodes. 1340 1341 /// Using this function, it is possible to avoid superfluous memory 1342 /// allocation: if you know that the graph you want to build will 1343 /// be large (e.g. it will contain millions of nodes and/or edges), 1344 /// then it is worth reserving space for this amount before starting 1345 /// to build the graph. 1346 /// \sa reserveEdge() 1347 void reserveNode(int n) { nodes.reserve(n); }; 1348 1349 /// Reserve memory for edges. 1350 1351 /// Using this function, it is possible to avoid superfluous memory 1352 /// allocation: if you know that the graph you want to build will 1353 /// be large (e.g. it will contain millions of nodes and/or edges), 1354 /// then it is worth reserving space for this amount before starting 1355 /// to build the graph. 1356 /// \sa reserveNode() 1357 void reserveEdge(int m) { arcs.reserve(2 * m); }; 1310 1358 1311 1359 /// \brief Class to make a snapshot of the graph and restore … … 1317 1365 /// using the restore() function. 1318 1366 /// 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. 1367 /// \note After a state is restored, you cannot restore a later state, 1368 /// i.e. you cannot add the removed nodes and edges again using 1369 /// another Snapshot instance. 1370 /// 1371 /// \warning Node and edge deletions and other modifications 1372 /// (e.g. changing the end-nodes of edges or contracting nodes) 1373 /// cannot be restored. These events invalidate the snapshot. 1374 /// However, the edges and nodes that were added to the graph after 1375 /// making the current snapshot can be removed without invalidating it. 1322 1376 class Snapshot { 1323 1377 protected: … … 1489 1543 /// 1490 1544 /// Default constructor. 1491 /// To actually make a snapshot you must call save().1545 /// You have to call save() to actually make a snapshot. 1492 1546 Snapshot() 1493 1547 : graph(0), node_observer_proxy(*this), … … 1496 1550 /// \brief Constructor that immediately makes a snapshot. 1497 1551 /// 1498 /// This constructor immediately makes a snapshot of the graph. 1499 /// \param _graph The graph we make a snapshot of. 1500 Snapshot(ListGraph &_graph) 1552 /// This constructor immediately makes a snapshot of the given graph. 1553 Snapshot(ListGraph &gr) 1501 1554 : node_observer_proxy(*this), 1502 1555 edge_observer_proxy(*this) { 1503 attach( _graph);1556 attach(gr); 1504 1557 } 1505 1558 1506 1559 /// \brief Make a snapshot. 1507 1560 /// 1508 /// Make a snapshot of the graph. 1509 /// 1510 /// This function can be called more than once. In case of a repeated 1561 /// This function makes a snapshot of the given graph. 1562 /// It can be called more than once. In case of a repeated 1511 1563 /// call, the previous snapshot gets lost. 1512 /// \param _graph The graph we make the snapshot of. 1513 void save(ListGraph &_graph) { 1564 void save(ListGraph &gr) { 1514 1565 if (attached()) { 1515 1566 detach(); 1516 1567 clear(); 1517 1568 } 1518 attach( _graph);1569 attach(gr); 1519 1570 } 1520 1571 1521 1572 /// \brief Undo the changes until the last snapshot. 1522 // 1523 /// Undo the changes until the last snapshot created by save(). 1573 /// 1574 /// This function undos the changes until the last snapshot 1575 /// created by save() or Snapshot(ListGraph&). 1576 /// 1577 /// \warning This method invalidates the snapshot, i.e. repeated 1578 /// restoring is not supported unless you call save() again. 1524 1579 void restore() { 1525 1580 detach(); … … 1535 1590 } 1536 1591 1537 /// \brief Gives back true whenthe snapshot is valid.1592 /// \brief Returns \c true if the snapshot is valid. 1538 1593 /// 1539 /// Gives back true whenthe snapshot is valid.1594 /// This function returns \c true if the snapshot is valid. 1540 1595 bool valid() const { 1541 1596 return attached(); -
lemon/lp_base.h
r631 r903 147 147 ///Iterator for iterate over the columns of an LP problem 148 148 149 /// Its usage is quite simple, for example you can count the number149 /// Its usage is quite simple, for example, you can count the number 150 150 /// of columns in an LP \c lp: 151 151 ///\code … … 242 242 ///Iterator for iterate over the rows of an LP problem 243 243 244 /// Its usage is quite simple, for example you can count the number244 /// Its usage is quite simple, for example, you can count the number 245 245 /// of rows in an LP \c lp: 246 246 ///\code … … 944 944 virtual int _addRow() = 0; 945 945 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 946 954 virtual void _eraseCol(int col) = 0; 947 955 virtual void _eraseRow(int row) = 0; … … 1208 1216 ///\return The created row. 1209 1217 Row addRow(Value l,const Expr &e, Value u) { 1210 Row r=addRow(); 1211 row(r,l,e,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)); 1212 1222 return r; 1213 1223 } … … 1218 1228 ///\return The created row. 1219 1229 Row addRow(const Constr &c) { 1220 Row r=addRow(); 1221 row(r,c); 1230 Row r; 1231 c.expr().simplify(); 1232 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, 1233 ExprIterator(c.expr().comps.begin(), cols), 1234 ExprIterator(c.expr().comps.end(), cols), 1235 c.upperBounded()?c.upperBound()-*c.expr():INF)); 1222 1236 return r; 1223 1237 } -
lemon/lp_skeleton.cc
r623 r793 29 29 30 30 int SkeletonSolverBase::_addRow() 31 { 32 return ++row_num; 33 } 34 35 int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value) 31 36 { 32 37 return ++row_num; -
lemon/lp_skeleton.h
r623 r793 45 45 /// \e 46 46 virtual int _addRow(); 47 /// \e 48 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 47 49 /// \e 48 50 virtual void _eraseCol(int i); -
lemon/maps.h
r773 r839 231 231 /// This map is essentially a wrapper for \c std::vector. It assigns 232 232 /// values to integer keys from the range <tt>[0..size-1]</tt>. 233 /// It can be used with some data structures, for example234 /// \c UnionFind, \c BinHeap, when the used items are small233 /// It can be used together with some data structures, e.g. 234 /// heap types and \c UnionFind, when the used items are small 235 235 /// integers. This map conforms to the \ref concepts::ReferenceMap 236 /// "ReferenceMap" concept. 236 /// "ReferenceMap" concept. 237 237 /// 238 238 /// The simplest way of using this map is through the rangeMap() … … 349 349 /// The name of this type also refers to this important usage. 350 350 /// 351 /// Apart form that this map can be used in many other cases since it351 /// Apart form that, this map can be used in many other cases since it 352 352 /// is based on \c std::map, which is a general associative container. 353 /// However keep in mind that it is usually not as efficient as other353 /// However, keep in mind that it is usually not as efficient as other 354 354 /// maps. 355 355 /// … … 1786 1786 /// The most important usage of it is storing certain nodes or arcs 1787 1787 /// that were marked \c true by an algorithm. 1788 /// For example it makes easier to store the nodes in the processing1788 /// For example, it makes easier to store the nodes in the processing 1789 1789 /// order of Dfs algorithm, as the following examples show. 1790 1790 /// \code … … 1801 1801 /// 1802 1802 /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so 1803 /// it cannot be used when a readable map is needed, for example as1803 /// it cannot be used when a readable map is needed, for example, as 1804 1804 /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms. 1805 1805 /// … … 1923 1923 /// Otherwise consider to use \c IterableValueMap, which is more 1924 1924 /// suitable and more efficient for such cases. It provides iterators 1925 /// to traverse the items with the same associated value, however1925 /// to traverse the items with the same associated value, but 1926 1926 /// it does not have \c InverseMap. 1927 1927 /// … … 3467 3467 /// may provide alternative ways to modify the digraph. 3468 3468 /// The correct behavior of InDegMap is not guarantied if these additional 3469 /// features are used. For example the functions3469 /// features are used. For example, the functions 3470 3470 /// \ref ListDigraph::changeSource() "changeSource()", 3471 3471 /// \ref ListDigraph::changeTarget() "changeTarget()" and … … 3597 3597 /// may provide alternative ways to modify the digraph. 3598 3598 /// The correct behavior of OutDegMap is not guarantied if these additional 3599 /// features are used. For example the functions3599 /// features are used. For example, the functions 3600 3600 /// \ref ListDigraph::changeSource() "changeSource()", 3601 3601 /// \ref ListDigraph::changeTarget() "changeTarget()" and … … 3765 3765 } 3766 3766 3767 3768 /// \brief Copy the values of a graph map to another map. 3769 /// 3770 /// This function copies the values of a graph map to another graph map. 3771 /// \c To::Key must be equal or convertible to \c From::Key and 3772 /// \c From::Value must be equal or convertible to \c To::Value. 3773 /// 3774 /// For example, an edge map of \c int value type can be copied to 3775 /// an arc map of \c double value type in an undirected graph, but 3776 /// an arc map cannot be copied to an edge map. 3777 /// Note that even a \ref ConstMap can be copied to a standard graph map, 3778 /// but \ref mapFill() can also be used for this purpose. 3779 /// 3780 /// \param gr The graph for which the maps are defined. 3781 /// \param from The map from which the values have to be copied. 3782 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. 3783 /// \param to The map to which the values have to be copied. 3784 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. 3785 template <typename GR, typename From, typename To> 3786 void mapCopy(const GR& gr, const From& from, To& to) { 3787 typedef typename To::Key Item; 3788 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3789 3790 for (ItemIt it(gr); it != INVALID; ++it) { 3791 to.set(it, from[it]); 3792 } 3793 } 3794 3795 /// \brief Compare two graph maps. 3796 /// 3797 /// This function compares the values of two graph maps. It returns 3798 /// \c true if the maps assign the same value for all items in the graph. 3799 /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal 3800 /// and their \c Value types must be comparable using \c %operator==(). 3801 /// 3802 /// \param gr The graph for which the maps are defined. 3803 /// \param map1 The first map. 3804 /// \param map2 The second map. 3805 template <typename GR, typename Map1, typename Map2> 3806 bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) { 3807 typedef typename Map2::Key Item; 3808 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3809 3810 for (ItemIt it(gr); it != INVALID; ++it) { 3811 if (!(map1[it] == map2[it])) return false; 3812 } 3813 return true; 3814 } 3815 3816 /// \brief Return an item having minimum value of a graph map. 3817 /// 3818 /// This function returns an item (\c Node, \c Arc or \c Edge) having 3819 /// minimum value of the given graph map. 3820 /// If the item set is empty, it returns \c INVALID. 3821 /// 3822 /// \param gr The graph for which the map is defined. 3823 /// \param map The graph map. 3824 template <typename GR, typename Map> 3825 typename Map::Key mapMin(const GR& gr, const Map& map) { 3826 return mapMin(gr, map, std::less<typename Map::Value>()); 3827 } 3828 3829 /// \brief Return an item having minimum value of a graph map. 3830 /// 3831 /// This function returns an item (\c Node, \c Arc or \c Edge) having 3832 /// minimum value of the given graph map. 3833 /// If the item set is empty, it returns \c INVALID. 3834 /// 3835 /// \param gr The graph for which the map is defined. 3836 /// \param map The graph map. 3837 /// \param comp Comparison function object. 3838 template <typename GR, typename Map, typename Comp> 3839 typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) { 3840 typedef typename Map::Key Item; 3841 typedef typename Map::Value Value; 3842 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3843 3844 ItemIt min_item(gr); 3845 if (min_item == INVALID) return INVALID; 3846 Value min = map[min_item]; 3847 for (ItemIt it(gr); it != INVALID; ++it) { 3848 if (comp(map[it], min)) { 3849 min = map[it]; 3850 min_item = it; 3851 } 3852 } 3853 return min_item; 3854 } 3855 3856 /// \brief Return an item having maximum value of a graph map. 3857 /// 3858 /// This function returns an item (\c Node, \c Arc or \c Edge) having 3859 /// maximum value of the given graph map. 3860 /// If the item set is empty, it returns \c INVALID. 3861 /// 3862 /// \param gr The graph for which the map is defined. 3863 /// \param map The graph map. 3864 template <typename GR, typename Map> 3865 typename Map::Key mapMax(const GR& gr, const Map& map) { 3866 return mapMax(gr, map, std::less<typename Map::Value>()); 3867 } 3868 3869 /// \brief Return an item having maximum value of a graph map. 3870 /// 3871 /// This function returns an item (\c Node, \c Arc or \c Edge) having 3872 /// maximum value of the given graph map. 3873 /// If the item set is empty, it returns \c INVALID. 3874 /// 3875 /// \param gr The graph for which the map is defined. 3876 /// \param map The graph map. 3877 /// \param comp Comparison function object. 3878 template <typename GR, typename Map, typename Comp> 3879 typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) { 3880 typedef typename Map::Key Item; 3881 typedef typename Map::Value Value; 3882 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3883 3884 ItemIt max_item(gr); 3885 if (max_item == INVALID) return INVALID; 3886 Value max = map[max_item]; 3887 for (ItemIt it(gr); it != INVALID; ++it) { 3888 if (comp(max, map[it])) { 3889 max = map[it]; 3890 max_item = it; 3891 } 3892 } 3893 return max_item; 3894 } 3895 3896 /// \brief Return the minimum value of a graph map. 3897 /// 3898 /// This function returns the minimum value of the given graph map. 3899 /// The corresponding item set of the graph must not be empty. 3900 /// 3901 /// \param gr The graph for which the map is defined. 3902 /// \param map The graph map. 3903 template <typename GR, typename Map> 3904 typename Map::Value mapMinValue(const GR& gr, const Map& map) { 3905 return map[mapMin(gr, map, std::