Changeset 956:141f9c0db4a3 in lemon
- Timestamp:
-
03/06/10 15:35:12
(15 years ago)
- Author:
- Alpar Juttner <alpar@…>
- Branch:
- default
- Children:
- 957:f802439d2b58, 959:38213abd2911, 1041:f112c18bc304
- Phase:
- public
- Message:
-
Unify the sources (#339)
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
-
r915
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
70 | 70 | // about memory leaks. |
71 | 71 | ap.throwOnProblems(); |
72 | | |
| 72 | |
73 | 73 | // Perform the parsing process |
74 | 74 | // (in case of any error it terminates the program) |
-
r953
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r921
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
26 | 26 | It is a C++ template library providing efficient implementations of common |
27 | 27 | data structures and algorithms with focus on combinatorial optimization |
28 | | tasks connected mainly with graphs and networks. |
| 28 | tasks connected mainly with graphs and networks. |
29 | 29 | |
30 | 30 | <b> |
… |
… |
|
36 | 36 | </b> |
37 | 37 | |
38 | | The project is maintained by the |
| 38 | The project is maintained by the |
39 | 39 | <a href="http://www.cs.elte.hu/egres/">Egerváry Research Group on |
40 | 40 | Combinatorial Optimization</a> \ref egres |
-
r835
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
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$. |
84 | | |
| 84 | |
85 | 85 | Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc |
86 | 86 | \f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e. |
… |
… |
|
120 | 120 | \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] |
121 | 121 | |
122 | | It means that the total demand must be less or equal to the |
| 122 | It means that the total demand must be less or equal to the |
123 | 123 | total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or |
124 | 124 | positive) and all the demands have to be satisfied, but there |
-
r834
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
422 | 422 | Parent::initialize(digraph); |
423 | 423 | _node_filter = &node_filter; |
424 | | _arc_filter = &arc_filter; |
| 424 | _arc_filter = &arc_filter; |
425 | 425 | } |
426 | 426 | |
… |
… |
|
509 | 509 | |
510 | 510 | template <typename V> |
511 | | class NodeMap |
512 | | : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, |
513 | | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> { |
| 511 | class NodeMap |
| 512 | : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, |
| 513 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> { |
514 | 514 | typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, |
515 | | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent; |
| 515 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent; |
516 | 516 | |
517 | 517 | public: |
… |
… |
|
536 | 536 | |
537 | 537 | template <typename V> |
538 | | class ArcMap |
| 538 | class ArcMap |
539 | 539 | : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, |
540 | | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> { |
| 540 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> { |
541 | 541 | typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, |
542 | 542 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent; |
… |
… |
|
583 | 583 | Parent::initialize(digraph); |
584 | 584 | _node_filter = &node_filter; |
585 | | _arc_filter = &arc_filter; |
| 585 | _arc_filter = &arc_filter; |
586 | 586 | } |
587 | 587 | |
… |
… |
|
652 | 652 | |
653 | 653 | template <typename V> |
654 | | class NodeMap |
| 654 | class NodeMap |
655 | 655 | : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, |
656 | 656 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> { |
657 | | typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, |
| 657 | typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, |
658 | 658 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent; |
659 | 659 | |
… |
… |
|
679 | 679 | |
680 | 680 | template <typename V> |
681 | | class ArcMap |
| 681 | class ArcMap |
682 | 682 | : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, |
683 | 683 | LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> { |
… |
… |
|
1022 | 1022 | |
1023 | 1023 | template <typename V> |
1024 | | class NodeMap |
| 1024 | class NodeMap |
1025 | 1025 | : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1026 | 1026 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> { |
1027 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
| 1027 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1028 | 1028 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent; |
1029 | 1029 | |
… |
… |
|
1049 | 1049 | |
1050 | 1050 | template <typename V> |
1051 | | class ArcMap |
| 1051 | class ArcMap |
1052 | 1052 | : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1053 | 1053 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> { |
1054 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
| 1054 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1055 | 1055 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent; |
1056 | 1056 | |
… |
… |
|
1076 | 1076 | |
1077 | 1077 | template <typename V> |
1078 | | class EdgeMap |
| 1078 | class EdgeMap |
1079 | 1079 | : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1080 | 1080 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> { |
1081 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
| 1081 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, |
1082 | 1082 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent; |
1083 | 1083 | |
… |
… |
|
1118 | 1118 | NF* _node_filter; |
1119 | 1119 | EF* _edge_filter; |
1120 | | SubGraphBase() |
1121 | | : Parent(), _node_filter(0), _edge_filter(0) { } |
| 1120 | SubGraphBase() |
| 1121 | : Parent(), _node_filter(0), _edge_filter(0) { } |
1122 | 1122 | |
1123 | 1123 | void initialize(GR& graph, NF& node_filter, EF& edge_filter) { |
… |
… |
|
1220 | 1220 | |
1221 | 1221 | template <typename V> |
1222 | | class NodeMap |
| 1222 | class NodeMap |
1223 | 1223 | : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1224 | 1224 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> { |
1225 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
| 1225 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1226 | 1226 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent; |
1227 | 1227 | |
… |
… |
|
1247 | 1247 | |
1248 | 1248 | template <typename V> |
1249 | | class ArcMap |
| 1249 | class ArcMap |
1250 | 1250 | : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1251 | 1251 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> { |
1252 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
| 1252 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1253 | 1253 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent; |
1254 | 1254 | |
… |
… |
|
1274 | 1274 | |
1275 | 1275 | template <typename V> |
1276 | | class EdgeMap |
| 1276 | class EdgeMap |
1277 | 1277 | : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1278 | 1278 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> { |
1279 | | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
1280 | | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent; |
| 1279 | typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, |
| 1280 | LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent; |
1281 | 1281 | |
1282 | 1282 | public: |
… |
… |
|
1505 | 1505 | #endif |
1506 | 1506 | typedef DigraphAdaptorExtender< |
1507 | | SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, |
| 1507 | SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, |
1508 | 1508 | true> > Parent; |
1509 | 1509 | |
… |
… |
|
1526 | 1526 | /// Creates a subgraph for the given digraph or graph with the |
1527 | 1527 | /// given node filter map. |
1528 | | FilterNodes(GR& graph, NF& node_filter) |
| 1528 | FilterNodes(GR& graph, NF& node_filter) |
1529 | 1529 | : Parent(), const_true_map() |
1530 | 1530 | { |
… |
… |
|
1564 | 1564 | typename enable_if<UndirectedTagIndicator<GR> >::type> : |
1565 | 1565 | public GraphAdaptorExtender< |
1566 | | SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, |
| 1566 | SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, |
1567 | 1567 | true> > { |
1568 | 1568 | |
1569 | 1569 | typedef GraphAdaptorExtender< |
1570 | | SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, |
| 1570 | SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, |
1571 | 1571 | true> > Parent; |
1572 | 1572 | |
… |
… |
|
1654 | 1654 | #endif |
1655 | 1655 | typedef DigraphAdaptorExtender< |
1656 | | SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, |
| 1656 | SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, |
1657 | 1657 | AF, false> > Parent; |
1658 | 1658 | |
… |
… |
|
1762 | 1762 | class FilterEdges : |
1763 | 1763 | public GraphAdaptorExtender< |
1764 | | SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, |
| 1764 | SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, |
1765 | 1765 | EF, false> > { |
1766 | 1766 | #endif |
1767 | 1767 | typedef GraphAdaptorExtender< |
1768 | | SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, |
| 1768 | SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, |
1769 | 1769 | EF, false> > Parent; |
1770 | 1770 | |
… |
… |
|
1791 | 1791 | /// Creates a subgraph for the given graph with the given edge |
1792 | 1792 | /// filter map. |
1793 | | FilterEdges(GR& graph, EF& edge_filter) |
| 1793 | FilterEdges(GR& graph, EF& edge_filter) |
1794 | 1794 | : Parent(), const_true_map() { |
1795 | 1795 | Parent::initialize(graph, const_true_map, edge_filter); |
… |
… |
|
1859 | 1859 | bool _forward; |
1860 | 1860 | |
1861 | | Arc(const Edge& edge, bool forward) |
| 1861 | Arc(const Edge& edge, bool forward) |
1862 | 1862 | : _edge(edge), _forward(forward) {} |
1863 | 1863 | |
… |
… |
|
2099 | 2099 | |
2100 | 2100 | ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value) |
2101 | | : _forward(*adaptor._digraph, value), |
| 2101 | : _forward(*adaptor._digraph, value), |
2102 | 2102 | _backward(*adaptor._digraph, value) {} |
2103 | 2103 | |
… |
… |
|
2217 | 2217 | typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier; |
2218 | 2218 | EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); } |
2219 | | |
| 2219 | |
2220 | 2220 | typedef EdgeNotifier ArcNotifier; |
2221 | 2221 | ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); } |
… |
… |
|
2729 | 2729 | typename FM = CM, |
2730 | 2730 | typename TL = Tolerance<typename CM::Value> > |
2731 | | class ResidualDigraph |
| 2731 | class ResidualDigraph |
2732 | 2732 | : public SubDigraph< |
2733 | 2733 | Undirector<const DGR>, |
… |
… |
|
2786 | 2786 | ResidualDigraph(const DGR& digraph, const CM& capacity, |
2787 | 2787 | FM& flow, const TL& tolerance = Tolerance()) |
2788 | | : Parent(), _capacity(&capacity), _flow(&flow), |
| 2788 | : Parent(), _capacity(&capacity), _flow(&flow), |
2789 | 2789 | _graph(digraph), _node_filter(), |
2790 | 2790 | _forward_filter(capacity, flow, tolerance), |
… |
… |
|
2868 | 2868 | |
2869 | 2869 | /// Constructor |
2870 | | ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) |
| 2870 | ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) |
2871 | 2871 | : _adaptor(&adaptor) {} |
2872 | 2872 | |
… |
… |
|
3448 | 3448 | /// to get a node map of the split digraph. |
3449 | 3449 | /// Its value type is inherited from the first node map type (\c IN). |
3450 | | /// \tparam IN The type of the node map for the in-nodes. |
| 3450 | /// \tparam IN The type of the node map for the in-nodes. |
3451 | 3451 | /// \tparam OUT The type of the node map for the out-nodes. |
3452 | 3452 | template <typename IN, typename OUT> |
-
r915
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
27 | 27 | else throw(ArgParserException(reason)); |
28 | 28 | } |
29 | | |
30 | | |
| 29 | |
| 30 | |
31 | 31 | void ArgParser::_showHelp(void *p) |
32 | 32 | { |
-
r915
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
43 | 43 | INVALID_OPT /// Invalid combination of options |
44 | 44 | }; |
45 | | |
| 45 | |
46 | 46 | private: |
47 | 47 | Reason _reason; |
48 | | |
| 48 | |
49 | 49 | public: |
50 | 50 | ///Constructor |
… |
… |
|
142 | 142 | std::string _command_name; |
143 | 143 | |
144 | | |
| 144 | |
145 | 145 | private: |
146 | 146 | //Bind a function to an option. |
… |
… |
|
156 | 156 | |
157 | 157 | bool _exit_on_problems; |
158 | | |
| 158 | |
159 | 159 | void _terminate(ArgParserException::Reason reason) const; |
160 | 160 | |
… |
… |
|
424 | 424 | |
425 | 425 | ///Throw instead of exit in case of problems |
426 | | void throwOnProblems() |
| 426 | void throwOnProblems() |
427 | 427 | { |
428 | 428 | _exit_on_problems=false; |
-
r917
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
37 | 37 | |
38 | 38 | /// \brief Default operation traits for the BellmanFord algorithm class. |
39 | | /// |
| 39 | /// |
40 | 40 | /// This operation traits class defines all computational operations |
41 | 41 | /// and constants that are used in the Bellman-Ford algorithm. |
… |
… |
|
46 | 46 | /// \see BellmanFordToleranceOperationTraits |
47 | 47 | template < |
48 | | typename V, |
| 48 | typename V, |
49 | 49 | bool has_inf = std::numeric_limits<V>::has_infinity> |
50 | 50 | struct BellmanFordDefaultOperationTraits { |
… |
… |
|
87 | 87 | } |
88 | 88 | }; |
89 | | |
| 89 | |
90 | 90 | /// \brief Operation traits for the BellmanFord algorithm class |
91 | 91 | /// using tolerance. |
… |
… |
|
140 | 140 | template<typename GR, typename LEN> |
141 | 141 | struct BellmanFordDefaultTraits { |
142 | | /// The type of the digraph the algorithm runs on. |
| 142 | /// The type of the digraph the algorithm runs on. |
143 | 143 | typedef GR Digraph; |
144 | 144 | |
… |
… |
|
159 | 159 | /// BellmanFordToleranceOperationTraits |
160 | 160 | typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; |
161 | | |
162 | | /// \brief The type of the map that stores the last arcs of the |
| 161 | |
| 162 | /// \brief The type of the map that stores the last arcs of the |
163 | 163 | /// shortest paths. |
164 | | /// |
| 164 | /// |
165 | 165 | /// The type of the map that stores the last |
166 | 166 | /// arcs of the shortest paths. |
… |
… |
|
169 | 169 | |
170 | 170 | /// \brief Instantiates a \c PredMap. |
171 | | /// |
172 | | /// This function instantiates a \ref PredMap. |
| 171 | /// |
| 172 | /// This function instantiates a \ref PredMap. |
173 | 173 | /// \param g is the digraph to which we would like to define the |
174 | 174 | /// \ref PredMap. |
… |
… |
|
185 | 185 | /// \brief Instantiates a \c DistMap. |
186 | 186 | /// |
187 | | /// This function instantiates a \ref DistMap. |
188 | | /// \param g is the digraph to which we would like to define the |
| 187 | /// This function instantiates a \ref DistMap. |
| 188 | /// \param g is the digraph to which we would like to define the |
189 | 189 | /// \ref DistMap. |
190 | 190 | static DistMap *createDistMap(const GR& g) { |
… |
… |
|
193 | 193 | |
194 | 194 | }; |
195 | | |
| 195 | |
196 | 196 | /// \brief %BellmanFord algorithm class. |
197 | 197 | /// |
198 | 198 | /// \ingroup shortest_path |
199 | | /// This class provides an efficient implementation of the Bellman-Ford |
| 199 | /// This class provides an efficient implementation of the Bellman-Ford |
200 | 200 | /// algorithm. The maximum time complexity of the algorithm is |
201 | 201 | /// <tt>O(ne)</tt>. |
… |
… |
|
208 | 208 | /// |
209 | 209 | /// The arc lengths are passed to the algorithm using a |
210 | | /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any |
| 210 | /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any |
211 | 211 | /// kind of length. The type of the length values is determined by the |
212 | 212 | /// \ref concepts::ReadMap::Value "Value" type of the length map. |
… |
… |
|
238 | 238 | ///The type of the underlying digraph. |
239 | 239 | typedef typename TR::Digraph Digraph; |
240 | | |
| 240 | |
241 | 241 | /// \brief The type of the arc lengths. |
242 | 242 | typedef typename TR::LengthMap::Value Value; |
… |
… |
|
285 | 285 | void create_maps() { |
286 | 286 | if(!_pred) { |
287 | | _local_pred = true; |
288 | | _pred = Traits::createPredMap(*_gr); |
| 287 | _local_pred = true; |
| 288 | _pred = Traits::createPredMap(*_gr); |
289 | 289 | } |
290 | 290 | if(!_dist) { |
291 | | _local_dist = true; |
292 | | _dist = Traits::createDistMap(*_gr); |
| 291 | _local_dist = true; |
| 292 | _dist = Traits::createDistMap(*_gr); |
293 | 293 | } |
294 | 294 | if(!_mask) { |
… |
… |
|
296 | 296 | } |
297 | 297 | } |
298 | | |
| 298 | |
299 | 299 | public : |
300 | | |
| 300 | |
301 | 301 | typedef BellmanFord Create; |
302 | 302 | |
… |
… |
|
321 | 321 | /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
322 | 322 | template <class T> |
323 | | struct SetPredMap |
| 323 | struct SetPredMap |
324 | 324 | : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > { |
325 | 325 | typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create; |
326 | 326 | }; |
327 | | |
| 327 | |
328 | 328 | template <class T> |
329 | 329 | struct SetDistMapTraits : public Traits { |
… |
… |
|
342 | 342 | /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
343 | 343 | template <class T> |
344 | | struct SetDistMap |
| 344 | struct SetDistMap |
345 | 345 | : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > { |
346 | 346 | typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create; |
… |
… |
|
351 | 351 | typedef T OperationTraits; |
352 | 352 | }; |
353 | | |
354 | | /// \brief \ref named-templ-param "Named parameter" for setting |
| 353 | |
| 354 | /// \brief \ref named-templ-param "Named parameter" for setting |
355 | 355 | /// \c OperationTraits type. |
356 | 356 | /// |
… |
… |
|
364 | 364 | Create; |
365 | 365 | }; |
366 | | |
| 366 | |
367 | 367 | ///@} |
368 | 368 | |
369 | 369 | protected: |
370 | | |
| 370 | |
371 | 371 | BellmanFord() {} |
372 | 372 | |
373 | | public: |
374 | | |
| 373 | public: |
| 374 | |
375 | 375 | /// \brief Constructor. |
376 | 376 | /// |
… |
… |
|
382 | 382 | _pred(0), _local_pred(false), |
383 | 383 | _dist(0), _local_dist(false), _mask(0) {} |
384 | | |
| 384 | |
385 | 385 | ///Destructor. |
386 | 386 | ~BellmanFord() { |
… |
… |
|
409 | 409 | BellmanFord &predMap(PredMap &map) { |
410 | 410 | if(_local_pred) { |
411 | | delete _pred; |
412 | | _local_pred=false; |
| 411 | delete _pred; |
| 412 | _local_pred=false; |
413 | 413 | } |
414 | 414 | _pred = ↦ |
… |
… |
|
427 | 427 | BellmanFord &distMap(DistMap &map) { |
428 | 428 | if(_local_dist) { |
429 | | delete _dist; |
430 | | _local_dist=false; |
| 429 | delete _dist; |
| 430 | _local_dist=false; |
431 | 431 | } |
432 | 432 | _dist = ↦ |
… |
… |
|
446 | 446 | |
447 | 447 | /// \brief Initializes the internal data structures. |
448 | | /// |
| 448 | /// |
449 | 449 | /// Initializes the internal data structures. The optional parameter |
450 | 450 | /// is the initial distance of each node. |
… |
… |
|
452 | 452 | create_maps(); |
453 | 453 | for (NodeIt it(*_gr); it != INVALID; ++it) { |
454 | | _pred->set(it, INVALID); |
455 | | _dist->set(it, value); |
| 454 | _pred->set(it, INVALID); |
| 455 | _dist->set(it, value); |
456 | 456 | } |
457 | 457 | _process.clear(); |
458 | 458 | if (OperationTraits::less(value, OperationTraits::infinity())) { |
459 | | for (NodeIt it(*_gr); it != INVALID; ++it) { |
460 | | _process.push_back(it); |
461 | | _mask->set(it, true); |
462 | | } |
| 459 | for (NodeIt it(*_gr); it != INVALID; ++it) { |
| 460 | _process.push_back(it); |
| 461 | _mask->set(it, true); |
| 462 | } |
463 | 463 | } else { |
464 | | for (NodeIt it(*_gr); it != INVALID; ++it) { |
465 | | _mask->set(it, false); |
466 | | } |
467 | | } |
468 | | } |
469 | | |
| 464 | for (NodeIt it(*_gr); it != INVALID; ++it) { |
| 465 | _mask->set(it, false); |
| 466 | } |
| 467 | } |
| 468 | } |
| 469 | |
470 | 470 | /// \brief Adds a new source node. |
471 | 471 | /// |
… |
… |
|
475 | 475 | _dist->set(source, dst); |
476 | 476 | if (!(*_mask)[source]) { |
477 | | _process.push_back(source); |
478 | | _mask->set(source, true); |
| 477 | _process.push_back(source); |
| 478 | _mask->set(source, true); |
479 | 479 | } |
480 | 480 | } |
… |
… |
|
501 | 501 | bool processNextRound() { |
502 | 502 | for (int i = 0; i < int(_process.size()); ++i) { |
503 | | _mask->set(_process[i], false); |
| 503 | _mask->set(_process[i], false); |
504 | 504 | } |
505 | 505 | std::vector<Node> nextProcess; |
506 | 506 | std::vector<Value> values(_process.size()); |
507 | 507 | for (int i = 0; i < int(_process.size()); ++i) { |
508 | | values[i] = (*_dist)[_process[i]]; |
| 508 | values[i] = (*_dist)[_process[i]]; |
509 | 509 | } |
510 | 510 | for (int i = 0; i < int(_process.size()); ++i) { |
511 | | for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { |
512 | | Node target = _gr->target(it); |
513 | | Value relaxed = OperationTraits::plus(values[i], (*_length)[it]); |
514 | | if (OperationTraits::less(relaxed, (*_dist)[target])) { |
515 | | _pred->set(target, it); |
516 | | _dist->set(target, relaxed); |
517 | | if (!(*_mask)[target]) { |
518 | | _mask->set(target, true); |
519 | | nextProcess.push_back(target); |
520 | | } |
521 | | } |
522 | | } |
| 511 | for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { |
| 512 | Node target = _gr->target(it); |
| 513 | Value relaxed = OperationTraits::plus(values[i], (*_length)[it]); |
| 514 | if (OperationTraits::less(relaxed, (*_dist)[target])) { |
| 515 | _pred->set(target, it); |
| 516 | _dist->set(target, relaxed); |
| 517 | if (!(*_mask)[target]) { |
| 518 | _mask->set(target, true); |
| 519 | nextProcess.push_back(target); |
| 520 | } |
| 521 | } |
| 522 | } |
523 | 523 | } |
524 | 524 | _process.swap(nextProcess); |
… |
… |
|
542 | 542 | bool processNextWeakRound() { |
543 | 543 | for (int i = 0; i < int(_process.size()); ++i) { |
544 | | _mask->set(_process[i], false); |
| 544 | _mask->set(_process[i], false); |
545 | 545 | } |
546 | 546 | std::vector<Node> nextProcess; |
547 | 547 | for (int i = 0; i < int(_process.size()); ++i) { |
548 | | for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { |
549 | | Node target = _gr->target(it); |
550 | | Value relaxed = |
551 | | OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]); |
552 | | if (OperationTraits::less(relaxed, (*_dist)[target])) { |
553 | | _pred->set(target, it); |
554 | | _dist->set(target, relaxed); |
555 | | if (!(*_mask)[target]) { |
556 | | _mask->set(target, true); |
557 | | nextProcess.push_back(target); |
558 | | } |
559 | | } |
560 | | } |
| 548 | for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { |
| 549 | Node target = _gr->target(it); |
| 550 | Value relaxed = |
| 551 | OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]); |
| 552 | if (OperationTraits::less(relaxed, (*_dist)[target])) { |
| 553 | _pred->set(target, it); |
| 554 | _dist->set(target, relaxed); |
| 555 | if (!(*_mask)[target]) { |
| 556 | _mask->set(target, true); |
| 557 | nextProcess.push_back(target); |
| 558 | } |
| 559 | } |
| 560 | } |
561 | 561 | } |
562 | 562 | _process.swap(nextProcess); |
… |
… |
|
580 | 580 | int num = countNodes(*_gr) - 1; |
581 | 581 | for (int i = 0; i < num; ++i) { |
582 | | if (processNextWeakRound()) break; |
| 582 | if (processNextWeakRound()) break; |
583 | 583 | } |
584 | 584 | } |
… |
… |
|
592 | 592 | /// if the digraph contains cycles with negative total length. |
593 | 593 | /// |
594 | | /// The algorithm computes |
| 594 | /// The algorithm computes |
595 | 595 | /// - the shortest path tree (forest), |
596 | 596 | /// - the distance of each node from the root(s). |
597 | | /// |
| 597 | /// |
598 | 598 | /// \return \c false if there is a negative cycle in the digraph. |
599 | 599 | /// |
600 | 600 | /// \pre init() must be called and at least one root node should be |
601 | | /// added with addSource() before using this function. |
| 601 | /// added with addSource() before using this function. |
602 | 602 | bool checkedStart() { |
603 | 603 | int num = countNodes(*_gr); |
604 | 604 | for (int i = 0; i < num; ++i) { |
605 | | if (processNextWeakRound()) return true; |
| 605 | if (processNextWeakRound()) return true; |
606 | 606 | } |
607 | 607 | return _process.empty(); |
… |
… |
|
627 | 627 | /// |
628 | 628 | /// \pre init() must be called and at least one root node should be |
629 | | /// added with addSource() before using this function. |
| 629 | /// added with addSource() before using this function. |
630 | 630 | void limitedStart(int num) { |
631 | 631 | for (int i = 0; i < num; ++i) { |
632 | | if (processNextRound()) break; |
633 | | } |
634 | | } |
635 | | |
| 632 | if (processNextRound()) break; |
| 633 | } |
| 634 | } |
| 635 | |
636 | 636 | /// \brief Runs the algorithm from the given root node. |
637 | | /// |
| 637 | /// |
638 | 638 | /// This method runs the Bellman-Ford algorithm from the given root |
639 | 639 | /// node \c s in order to compute the shortest path to each node. |
… |
… |
|
654 | 654 | start(); |
655 | 655 | } |
656 | | |
| 656 | |
657 | 657 | /// \brief Runs the algorithm from the given root node with arc |
658 | 658 | /// number limit. |
659 | | /// |
| 659 | /// |
660 | 660 | /// This method runs the Bellman-Ford algorithm from the given root |
661 | 661 | /// node \c s in order to compute the shortest path distance for each |
… |
… |
|
683 | 683 | limitedStart(num); |
684 | 684 | } |
685 | | |
| 685 | |
686 | 686 | ///@} |
687 | 687 | |
… |
… |
|
698 | 698 | /// |
699 | 699 | /// Constructor for getting the active nodes of the given BellmanFord |
700 | | /// instance. |
| 700 | /// instance. |
701 | 701 | ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm) |
702 | 702 | { |
… |
… |
|
712 | 712 | /// |
713 | 713 | /// Conversion to \c Node. |
714 | | operator Node() const { |
| 714 | operator Node() const { |
715 | 715 | return _index >= 0 ? _algorithm->_process[_index] : INVALID; |
716 | 716 | } |
… |
… |
|
721 | 721 | ActiveIt& operator++() { |
722 | 722 | --_index; |
723 | | return *this; |
724 | | } |
725 | | |
726 | | bool operator==(const ActiveIt& it) const { |
727 | | return static_cast<Node>(*this) == static_cast<Node>(it); |
728 | | } |
729 | | bool operator!=(const ActiveIt& it) const { |
730 | | return static_cast<Node>(*this) != static_cast<Node>(it); |
731 | | } |
732 | | bool operator<(const ActiveIt& it) const { |
733 | | return static_cast<Node>(*this) < static_cast<Node>(it); |
734 | | } |
735 | | |
| 723 | return *this; |
| 724 | } |
| 725 | |
| 726 | bool operator==(const ActiveIt& it) const { |
| 727 | return static_cast<Node>(*this) == static_cast<Node>(it); |
| 728 | } |
| 729 | bool operator!=(const ActiveIt& it) const { |
| 730 | return static_cast<Node>(*this) != static_cast<Node>(it); |
| 731 | } |
| 732 | bool operator<(const ActiveIt& it) const { |
| 733 | return static_cast<Node>(*this) < static_cast<Node>(it); |
| 734 | } |
| 735 | |
736 | 736 | private: |
737 | 737 | const BellmanFord* _algorithm; |
738 | 738 | int _index; |
739 | 739 | }; |
740 | | |
| 740 | |
741 | 741 | /// \name Query Functions |
742 | 742 | /// The result of the Bellman-Ford algorithm can be obtained using these |
743 | 743 | /// functions.\n |
744 | 744 | /// Either \ref run() or \ref init() should be called before using them. |
745 | | |
| 745 | |
746 | 746 | ///@{ |
747 | 747 | |
748 | 748 | /// \brief The shortest path to the given node. |
749 | | /// |
| 749 | /// |
750 | 750 | /// Gives back the shortest path to the given node from the root(s). |
751 | 751 | /// |
… |
… |
|
758 | 758 | return Path(*_gr, *_pred, t); |
759 | 759 | } |
760 | | |
| 760 | |
761 | 761 | /// \brief The distance of the given node from the root(s). |
762 | 762 | /// |
… |
… |
|
798 | 798 | /// \pre Either \ref run() or \ref init() must be called before |
799 | 799 | /// using this function. |
800 | | Node predNode(Node v) const { |
801 | | return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); |
802 | | } |
803 | | |
| 800 | Node predNode(Node v) const { |
| 801 | return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); |
| 802 | } |
| 803 | |
804 | 804 | /// \brief Returns a const reference to the node map that stores the |
805 | 805 | /// distances of the nodes. |
… |
… |
|
811 | 811 | /// using this function. |
812 | 812 | const DistMap &distMap() const { return *_dist;} |
813 | | |
| 813 | |
814 | 814 | /// \brief Returns a const reference to the node map that stores the |
815 | 815 | /// predecessor arcs. |
… |
… |
|
821 | 821 | /// using this function. |
822 | 822 | const PredMap &predMap() const { return *_pred; } |
823 | | |
| 823 | |
824 | 824 | /// \brief Checks if a node is reached from the root(s). |
825 | 825 | /// |
… |
… |
|
833 | 833 | |
834 | 834 | /// \brief Gives back a negative cycle. |
835 | | /// |
| 835 | /// |
836 | 836 | /// This function gives back a directed cycle with negative total |
837 | 837 | /// length if the algorithm has already found one. |
… |
… |
|
860 | 860 | return cycle; |
861 | 861 | } |
862 | | |
| 862 | |
863 | 863 | ///@} |
864 | 864 | }; |
865 | | |
| 865 | |
866 | 866 | /// \brief Default traits class of bellmanFord() function. |
867 | 867 | /// |
… |
… |
|
871 | 871 | template <typename GR, typename LEN> |
872 | 872 | struct BellmanFordWizardDefaultTraits { |
873 | | /// The type of the digraph the algorithm runs on. |
| 873 | /// The type of the digraph the algorithm runs on. |
874 | 874 | typedef GR Digraph; |
875 | 875 | |
… |
… |
|
893 | 893 | /// \brief The type of the map that stores the last |
894 | 894 | /// arcs of the shortest paths. |
895 | | /// |
| 895 | /// |
896 | 896 | /// The type of the map that stores the last arcs of the shortest paths. |
897 | 897 | /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
… |
… |
|
899 | 899 | |
900 | 900 | /// \brief Instantiates a \c PredMap. |
901 | | /// |
| 901 | /// |
902 | 902 | /// This function instantiates a \ref PredMap. |
903 | 903 | /// \param g is the digraph to which we would like to define the |
… |
… |
|
915 | 915 | /// \brief Instantiates a \c DistMap. |
916 | 916 | /// |
917 | | /// This function instantiates a \ref DistMap. |
| 917 | /// This function instantiates a \ref DistMap. |
918 | 918 | /// \param g is the digraph to which we would like to define the |
919 | 919 | /// \ref DistMap. |
… |
… |
|
928 | 928 | typedef lemon::Path<Digraph> Path; |
929 | 929 | }; |
930 | | |
| 930 | |
931 | 931 | /// \brief Default traits class used by BellmanFordWizard. |
932 | 932 | /// |
… |
… |
|
935 | 935 | /// \tparam LEN The type of the length map. |
936 | 936 | template <typename GR, typename LEN> |
937 | | class BellmanFordWizardBase |
| 937 | class BellmanFordWizardBase |
938 | 938 | : public BellmanFordWizardDefaultTraits<GR, LEN> { |
939 | 939 | |
… |
… |
|
958 | 958 | public: |
959 | 959 | /// Constructor. |
960 | | |
| 960 | |
961 | 961 | /// This constructor does not require parameters, it initiates |
962 | 962 | /// all of the attributes to default values \c 0. |
… |
… |
|
965 | 965 | |
966 | 966 | /// Constructor. |
967 | | |
| 967 | |
968 | 968 | /// This constructor requires two parameters, |
969 | 969 | /// others are initiated to \c 0. |
970 | 970 | /// \param gr The digraph the algorithm runs on. |
971 | 971 | /// \param len The length map. |
972 | | BellmanFordWizardBase(const GR& gr, |
973 | | const LEN& len) : |
974 | | _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), |
975 | | _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), |
| 972 | BellmanFordWizardBase(const GR& gr, |
| 973 | const LEN& len) : |
| 974 | _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), |
| 975 | _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), |
976 | 976 | _pred(0), _dist(0), _path(0), _di(0) {} |
977 | 977 | |
978 | 978 | }; |
979 | | |
| 979 | |
980 | 980 | /// \brief Auxiliary class for the function-type interface of the |
981 | 981 | /// \ref BellmanFord "Bellman-Ford" algorithm. |
… |
… |
|
1002 | 1002 | typedef typename Digraph::Arc Arc; |
1003 | 1003 | typedef typename Digraph::OutArcIt ArcIt; |
1004 | | |
| 1004 | |
1005 | 1005 | typedef typename TR::LengthMap LengthMap; |
1006 | 1006 | typedef typename LengthMap::Value Value; |
… |
… |
|
1019 | 1019 | /// \param gr The digraph the algorithm runs on. |
1020 | 1020 | /// \param len The length map. |
1021 | | BellmanFordWizard(const Digraph& gr, const LengthMap& len) |
| 1021 | BellmanFordWizard(const Digraph& gr, const LengthMap& len) |
1022 | 1022 | : TR(gr, len) {} |
1023 | 1023 | |
… |
… |
|
1028 | 1028 | |
1029 | 1029 | /// \brief Runs the Bellman-Ford algorithm from the given source node. |
1030 | | /// |
| 1030 | /// |
1031 | 1031 | /// This method runs the Bellman-Ford algorithm from the given source |
1032 | 1032 | /// node in order to compute the shortest path to each node. |
1033 | 1033 | void run(Node s) { |
1034 | | BellmanFord<Digraph,LengthMap,TR> |
1035 | | bf(*reinterpret_cast<const Digraph*>(Base::_graph), |
| 1034 | BellmanFord<Digraph,LengthMap,TR> |
| 1035 | bf(*reinterpret_cast<const Digraph*>(Base::_graph), |
1036 | 1036 | *reinterpret_cast<const LengthMap*>(Base::_length)); |
1037 | 1037 | if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred)); |
… |
… |
|
1068 | 1068 | SetPredMapBase(const TR &b) : TR(b) {} |
1069 | 1069 | }; |
1070 | | |
| 1070 | |
1071 | 1071 | /// \brief \ref named-templ-param "Named parameter" for setting |
1072 | 1072 | /// the predecessor map. |
… |
… |
|
1079 | 1079 | return BellmanFordWizard<SetPredMapBase<T> >(*this); |
1080 | 1080 | } |
1081 | | |
| 1081 | |
1082 | 1082 | template<class T> |
1083 | 1083 | struct SetDistMapBase : public Base { |
… |
… |
|
1086 | 1086 | SetDistMapBase(const TR &b) : TR(b) {} |
1087 | 1087 | }; |
1088 | | |
| 1088 | |
1089 | 1089 | /// \brief \ref named-templ-param "Named parameter" for setting |
1090 | 1090 | /// the distance map. |
… |
… |
|
1127 | 1127 | return *this; |
1128 | 1128 | } |
1129 | | |
| 1129 | |
1130 | 1130 | }; |
1131 | | |
| 1131 | |
1132 | 1132 | /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford" |
1133 | 1133 | /// algorithm. |
… |
… |
|
1137 | 1137 | /// algorithm. |
1138 | 1138 | /// |
1139 | | /// This function also has several \ref named-templ-func-param |
1140 | | /// "named parameters", they are declared as the members of class |
| 1139 | /// This function also has several \ref named-templ-func-param |
| 1140 | /// "named parameters", they are declared as the members of class |
1141 | 1141 | /// \ref BellmanFordWizard. |
1142 | 1142 | /// The following examples show how to use these parameters. |
… |
… |
|
1155 | 1155 | BellmanFordWizard<BellmanFordWizardBase<GR,LEN> > |
1156 | 1156 | bellmanFord(const GR& digraph, |
1157 | | const LEN& length) |
| 1157 | const LEN& length) |
1158 | 1158 | { |
1159 | 1159 | return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length); |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
83 | 83 | |
84 | 84 | ///The type of the map that indicates which nodes are reached. |
85 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 85 | ///It must conform to |
| 86 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
86 | 87 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
87 | 88 | ///Instantiates a \c ReachedMap. |
… |
… |
|
272 | 273 | ///\ref named-templ-param "Named parameter" for setting |
273 | 274 | ///\c ReachedMap type. |
274 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 275 | ///It must conform to |
| 276 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
275 | 277 | template <class T> |
276 | 278 | struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > { |
… |
… |
|
873 | 875 | |
874 | 876 | ///The type of the map that indicates which nodes are reached. |
875 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 877 | ///It must conform to |
| 878 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
876 | 879 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
877 | 880 | ///Instantiates a ReachedMap. |
… |
… |
|
1266 | 1269 | /// |
1267 | 1270 | /// The type of the map that indicates which nodes are reached. |
1268 | | /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 1271 | /// It must conform to |
| 1272 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
1269 | 1273 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
1270 | 1274 | |
-
r929
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
259 | 259 | int p=_data[i].parent; |
260 | 260 | _data[i].prio=value; |
261 | | |
| 261 | |
262 | 262 | while( p!=-1 && _comp(value, _data[p].prio) ) { |
263 | 263 | _data[i].name=_data[p].name; |
… |
… |
|
323 | 323 | |
324 | 324 | private: |
325 | | |
| 325 | |
326 | 326 | // Find the minimum of the roots |
327 | 327 | int findMin() { |
… |
… |
|
351 | 351 | } |
352 | 352 | if( _data[_head].right_neighbor==-1 ) return; |
353 | | |
| 353 | |
354 | 354 | int x=_head; |
355 | 355 | int x_prev=-1, x_next=_data[x].right_neighbor; |
… |
… |
|
385 | 385 | int curr=_data.size(); |
386 | 386 | _data.push_back(Store()); |
387 | | |
| 387 | |
388 | 388 | while( p!=-1 || q!=-1 ) { |
389 | 389 | if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) { |
… |
… |
|
398 | 398 | } |
399 | 399 | } |
400 | | |
| 400 | |
401 | 401 | _head=_data.back().right_neighbor; |
402 | 402 | _data.pop_back(); |
-
r664
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
71 | 71 | |
72 | 72 | private: |
73 | | |
| 73 | |
74 | 74 | // The MapBase of the Map which imlements the core regisitry function. |
75 | 75 | typedef typename Notifier::ObserverBase Parent; |
-
r674
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
158 | 158 | public: |
159 | 159 | typedef DefaultMap<_Graph, _Item, _Value> Map; |
160 | | |
| 160 | |
161 | 161 | typedef typename Parent::GraphType GraphType; |
162 | 162 | typedef typename Parent::Value Value; |
-
r732
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
64 | 64 | Node oppositeNode(const Node &n, const Arc &e) const { |
65 | 65 | if (n == Parent::source(e)) |
66 | | return Parent::target(e); |
| 66 | return Parent::target(e); |
67 | 67 | else if(n==Parent::target(e)) |
68 | | return Parent::source(e); |
| 68 | return Parent::source(e); |
69 | 69 | else |
70 | | return INVALID; |
| 70 | return INVALID; |
71 | 71 | } |
72 | 72 | |
… |
… |
|
92 | 92 | // Iterable extensions |
93 | 93 | |
94 | | class NodeIt : public Node { |
| 94 | class NodeIt : public Node { |
95 | 95 | const Digraph* digraph; |
96 | 96 | public: |
… |
… |
|
101 | 101 | |
102 | 102 | explicit NodeIt(const Digraph& _graph) : digraph(&_graph) { |
103 | | _graph.first(static_cast<Node&>(*this)); |
104 | | } |
105 | | |
106 | | NodeIt(const Digraph& _graph, const Node& node) |
107 | | : Node(node), digraph(&_graph) {} |
108 | | |
109 | | NodeIt& operator++() { |
110 | | digraph->next(*this); |
111 | | return *this; |
112 | | } |
113 | | |
114 | | }; |
115 | | |
116 | | |
117 | | class ArcIt : public Arc { |
| 103 | _graph.first(static_cast<Node&>(*this)); |
| 104 | } |
| 105 | |
| 106 | NodeIt(const Digraph& _graph, const Node& node) |
| 107 | : Node(node), digraph(&_graph) {} |
| 108 | |
| 109 | NodeIt& operator++() { |
| 110 | digraph->next(*this); |
| 111 | return *this; |
| 112 | } |
| 113 | |
| 114 | }; |
| 115 | |
| 116 | |
| 117 | class ArcIt : public Arc { |
118 | 118 | const Digraph* digraph; |
119 | 119 | public: |
… |
… |
|
124 | 124 | |
125 | 125 | explicit ArcIt(const Digraph& _graph) : digraph(&_graph) { |
126 | | _graph.first(static_cast<Arc&>(*this)); |
127 | | } |
128 | | |
129 | | ArcIt(const Digraph& _graph, const Arc& e) : |
130 | | Arc(e), digraph(&_graph) { } |
131 | | |
132 | | ArcIt& operator++() { |
133 | | digraph->next(*this); |
134 | | return *this; |
135 | | } |
136 | | |
137 | | }; |
138 | | |
139 | | |
140 | | class OutArcIt : public Arc { |
| 126 | _graph.first(static_cast<Arc&>(*this)); |
| 127 | } |
| 128 | |
| 129 | ArcIt(const Digraph& _graph, const Arc& e) : |
| 130 | Arc(e), digraph(&_graph) { } |
| 131 | |
| 132 | ArcIt& operator++() { |
| 133 | digraph->next(*this); |
| 134 | return *this; |
| 135 | } |
| 136 | |
| 137 | }; |
| 138 | |
| 139 | |
| 140 | class OutArcIt : public Arc { |
141 | 141 | const Digraph* digraph; |
142 | 142 | public: |
… |
… |
|
146 | 146 | OutArcIt(Invalid i) : Arc(i) { } |
147 | 147 | |
148 | | OutArcIt(const Digraph& _graph, const Node& node) |
149 | | : digraph(&_graph) { |
150 | | _graph.firstOut(*this, node); |
151 | | } |
152 | | |
153 | | OutArcIt(const Digraph& _graph, const Arc& arc) |
154 | | : Arc(arc), digraph(&_graph) {} |
155 | | |
156 | | OutArcIt& operator++() { |
157 | | digraph->nextOut(*this); |
158 | | return *this; |
159 | | } |
160 | | |
161 | | }; |
162 | | |
163 | | |
164 | | class InArcIt : public Arc { |
| 148 | OutArcIt(const Digraph& _graph, const Node& node) |
| 149 | : digraph(&_graph) { |
| 150 | _graph.firstOut(*this, node); |
| 151 | } |
| 152 | |
| 153 | OutArcIt(const Digraph& _graph, const Arc& arc) |
| 154 | : Arc(arc), digraph(&_graph) {} |
| 155 | |
| 156 | OutArcIt& operator++() { |
| 157 | digraph->nextOut(*this); |
| 158 | return *this; |
| 159 | } |
| 160 | |
| 161 | }; |
| 162 | |
| 163 | |
| 164 | class InArcIt : public Arc { |
165 | 165 | const Digraph* digraph; |
166 | 166 | public: |
… |
… |
|
170 | 170 | InArcIt(Invalid i) : Arc(i) { } |
171 | 171 | |
172 | | InArcIt(const Digraph& _graph, const Node& node) |
173 | | : digraph(&_graph) { |
174 | | _graph.firstIn(*this, node); |
175 | | } |
176 | | |
177 | | InArcIt(const Digraph& _graph, const Arc& arc) : |
178 | | Arc(arc), digraph(&_graph) {} |
179 | | |
180 | | InArcIt& operator++() { |
181 | | digraph->nextIn(*this); |
182 | | return *this; |
| 172 | InArcIt(const Digraph& _graph, const Node& node) |
| 173 | : digraph(&_graph) { |
| 174 | _graph.firstIn(*this, node); |
| 175 | } |
| 176 | |
| 177 | InArcIt(const Digraph& _graph, const Arc& arc) : |
| 178 | Arc(arc), digraph(&_graph) {} |
| 179 | |
| 180 | InArcIt& operator++() { |
| 181 | digraph->nextIn(*this); |
| 182 | return *this; |
183 | 183 | } |
184 | 184 | |
… |
… |
|
216 | 216 | |
217 | 217 | // Mappable extension |
218 | | |
| 218 | |
219 | 219 | template <typename _Value> |
220 | | class ArcMap |
| 220 | class ArcMap |
221 | 221 | : public MapExtender<DefaultMap<Digraph, Arc, _Value> > { |
222 | 222 | typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent; |
223 | 223 | |
224 | 224 | public: |
225 | | explicit ArcMap(const Digraph& _g) |
226 | | : Parent(_g) {} |
227 | | ArcMap(const Digraph& _g, const _Value& _v) |
228 | | : Parent(_g, _v) {} |
| 225 | explicit ArcMap(const Digraph& _g) |
| 226 | : Parent(_g) {} |
| 227 | ArcMap(const Digraph& _g, const _Value& _v) |
| 228 | : Parent(_g, _v) {} |
229 | 229 | |
230 | 230 | ArcMap& operator=(const ArcMap& cmap) { |
231 | | return operator=<ArcMap>(cmap); |
| 231 | return operator=<ArcMap>(cmap); |
232 | 232 | } |
233 | 233 | |
… |
… |
|
235 | 235 | ArcMap& operator=(const CMap& cmap) { |
236 | 236 | Parent::operator=(cmap); |
237 | | return *this; |
| 237 | return *this; |
238 | 238 | } |
239 | 239 | |
… |
… |
|
248 | 248 | return arc; |
249 | 249 | } |
250 | | |
| 250 | |
251 | 251 | void clear() { |
252 | 252 | notifier(Arc()).clear(); |
… |
… |
|
311 | 311 | Node oppositeNode(const Node &n, const Edge &e) const { |
312 | 312 | if( n == Parent::u(e)) |
313 | | return Parent::v(e); |
| 313 | return Parent::v(e); |
314 | 314 | else if( n == Parent::v(e)) |
315 | | return Parent::u(e); |
| 315 | return Parent::u(e); |
316 | 316 | else |
317 | | return INVALID; |
| 317 | return INVALID; |
318 | 318 | } |
319 | 319 | |
… |
… |
|
339 | 339 | |
340 | 340 | using Parent::notifier; |
341 | | |
| 341 | |
342 | 342 | ArcNotifier& notifier(Arc) const { |
343 | 343 | return arc_notifier; |
… |
… |
|
349 | 349 | |
350 | 350 | |
351 | | class NodeIt : public Node { |
| 351 | class NodeIt : public Node { |
352 | 352 | const Graph* graph; |
353 | 353 | public: |
… |
… |
|
358 | 358 | |
359 | 359 | explicit NodeIt(const Graph& _graph) : graph(&_graph) { |
360 | | _graph.first(static_cast<Node&>(*this)); |
361 | | } |
362 | | |
363 | | NodeIt(const Graph& _graph, const Node& node) |
364 | | : Node(node), graph(&_graph) {} |
365 | | |
366 | | NodeIt& operator++() { |
367 | | graph->next(*this); |
368 | | return *this; |
369 | | } |
370 | | |
371 | | }; |
372 | | |
373 | | |
374 | | class ArcIt : public Arc { |
| 360 | _graph.first(static_cast<Node&>(*this)); |
| 361 | } |
| 362 | |
| 363 | NodeIt(const Graph& _graph, const Node& node) |
| 364 | : Node(node), graph(&_graph) {} |
| 365 | |
| 366 | NodeIt& operator++() { |
| 367 | graph->next(*this); |
| 368 | return *this; |
| 369 | } |
| 370 | |
| 371 | }; |
| 372 | |
| 373 | |
| 374 | class ArcIt : public Arc { |
375 | 375 | const Graph* graph; |
376 | 376 | public: |
… |
… |
|
381 | 381 | |
382 | 382 | explicit ArcIt(const Graph& _graph) : graph(&_graph) { |
383 | | _graph.first(static_cast<Arc&>(*this)); |
384 | | } |
385 | | |
386 | | ArcIt(const Graph& _graph, const Arc& e) : |
387 | | Arc(e), graph(&_graph) { } |
388 | | |
389 | | ArcIt& operator++() { |
390 | | graph->next(*this); |
391 | | return *this; |
392 | | } |
393 | | |
394 | | }; |
395 | | |
396 | | |
397 | | class OutArcIt : public Arc { |
| 383 | _graph.first(static_cast<Arc&>(*this)); |
| 384 | } |
| 385 | |
| 386 | ArcIt(const Graph& _graph, const Arc& e) : |
| 387 | Arc(e), graph(&_graph) { } |
| 388 | |
| 389 | ArcIt& operator++() { |
| 390 | graph->next(*this); |
| 391 | return *this; |
| 392 | } |
| 393 | |
| 394 | }; |
| 395 | |
| 396 | |
| 397 | class OutArcIt : public Arc { |
398 | 398 | const Graph* graph; |
399 | 399 | public: |
… |
… |
|
403 | 403 | OutArcIt(Invalid i) : Arc(i) { } |
404 | 404 | |
405 | | OutArcIt(const Graph& _graph, const Node& node) |
406 | | : graph(&_graph) { |
407 | | _graph.firstOut(*this, node); |
408 | | } |
409 | | |
410 | | OutArcIt(const Graph& _graph, const Arc& arc) |
411 | | : Arc(arc), graph(&_graph) {} |
412 | | |
413 | | OutArcIt& operator++() { |
414 | | graph->nextOut(*this); |
415 | | return *this; |
416 | | } |
417 | | |
418 | | }; |
419 | | |
420 | | |
421 | | class InArcIt : public Arc { |
| 405 | OutArcIt(const Graph& _graph, const Node& node) |
| 406 | : graph(&_graph) { |
| 407 | _graph.firstOut(*this, node); |
| 408 | } |
| 409 | |
| 410 | OutArcIt(const Graph& _graph, const Arc& arc) |
| 411 | : Arc(arc), graph(&_graph) {} |
| 412 | |
| 413 | OutArcIt& operator++() { |
| 414 | graph->nextOut(*this); |
| 415 | return *this; |
| 416 | } |
| 417 | |
| 418 | }; |
| 419 | |
| 420 | |
| 421 | class InArcIt : public Arc { |
422 | 422 | const Graph* graph; |
423 | 423 | public: |
… |
… |
|
427 | 427 | InArcIt(Invalid i) : Arc(i) { } |
428 | 428 | |
429 | | InArcIt(const Graph& _graph, const Node& node) |
430 | | : graph(&_graph) { |
431 | | _graph.firstIn(*this, node); |
432 | | } |
433 | | |
434 | | InArcIt(const Graph& _graph, const Arc& arc) : |
435 | | Arc(arc), graph(&_graph) {} |
436 | | |
437 | | InArcIt& operator++() { |
438 | | graph->nextIn(*this); |
439 | | return *this; |
440 | | } |
441 | | |
442 | | }; |
443 | | |
444 | | |
445 | | class EdgeIt : public Parent::Edge { |
| 429 | InArcIt(const Graph& _graph, const Node& node) |
| 430 | : graph(&_graph) { |
| 431 | _graph.firstIn(*this, node); |
| 432 | } |
| 433 | |
| 434 | InArcIt(const Graph& _graph, const Arc& arc) : |
| 435 | Arc(arc), graph(&_graph) {} |
| 436 | |
| 437 | InArcIt& operator++() { |
| 438 | graph->nextIn(*this); |
| 439 | return *this; |
| 440 | } |
| 441 | |
| 442 | }; |
| 443 | |
| 444 | |
| 445 | class EdgeIt : public Parent::Edge { |
446 | 446 | const Graph* graph; |
447 | 447 | public: |
… |
… |
|
452 | 452 | |
453 | 453 | explicit EdgeIt(const Graph& _graph) : graph(&_graph) { |
454 | | _graph.first(static_cast<Edge&>(*this)); |
455 | | } |
456 | | |
457 | | EdgeIt(const Graph& _graph, const Edge& e) : |
458 | | Edge(e), graph(&_graph) { } |
459 | | |
460 | | EdgeIt& operator++() { |
461 | | graph->next(*this); |
462 | | return *this; |
| 454 | _graph.first(static_cast<Edge&>(*this)); |
| 455 | } |
| 456 | |
| 457 | EdgeIt(const Graph& _graph, const Edge& e) : |
| 458 | Edge(e), graph(&_graph) { } |
| 459 | |
| 460 | EdgeIt& operator++() { |
| 461 | graph->next(*this); |
| 462 | return *this; |
463 | 463 | } |
464 | 464 | |
… |
… |
|
476 | 476 | |
477 | 477 | IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) { |
478 | | _graph.firstInc(*this, direction, n); |
| 478 | _graph.firstInc(*this, direction, n); |
479 | 479 | } |
480 | 480 | |
481 | 481 | IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n) |
482 | | : graph(&_graph), Edge(ue) { |
483 | | direction = (_graph.source(ue) == n); |
| 482 | : graph(&_graph), Edge(ue) { |
| 483 | direction = (_graph.source(ue) == n); |
484 | 484 | } |
485 | 485 | |
486 | 486 | IncEdgeIt& operator++() { |
487 | | graph->nextInc(*this, direction); |
488 | | return *this; |
| 487 | graph->nextInc(*this, direction); |
| 488 | return *this; |
489 | 489 | } |
490 | 490 | }; |
… |
… |
|
533 | 533 | |
534 | 534 | template <typename _Value> |
535 | | class ArcMap |
| 535 | class ArcMap |
536 | 536 | : public MapExtender<DefaultMap<Graph, Arc, _Value> > { |
537 | 537 | typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent; |
538 | 538 | |
539 | 539 | public: |
540 | | explicit ArcMap(const Graph& _g) |
541 | | : Parent(_g) {} |
542 | | ArcMap(const Graph& _g, const _Value& _v) |
543 | | : Parent(_g, _v) {} |
| 540 | explicit ArcMap(const Graph& _g) |
| 541 | : Parent(_g) {} |
| 542 | ArcMap(const Graph& _g, const _Value& _v) |
| 543 | : Parent(_g, _v) {} |
544 | 544 | |
545 | 545 | ArcMap& operator=(const ArcMap& cmap) { |
546 | | return operator=<ArcMap>(cmap); |
| 546 | return operator=<ArcMap>(cmap); |
547 | 547 | } |
548 | 548 | |
… |
… |
|
550 | 550 | ArcMap& operator=(const CMap& cmap) { |
551 | 551 | Parent::operator=(cmap); |
552 | | return *this; |
| 552 | return *this; |
553 | 553 | } |
554 | 554 | |
… |
… |
|
557 | 557 | |
558 | 558 | template <typename _Value> |
559 | | class EdgeMap |
| 559 | class EdgeMap |
560 | 560 | : public MapExtender<DefaultMap<Graph, Edge, _Value> > { |
561 | 561 | typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent; |
562 | 562 | |
563 | 563 | public: |
564 | | explicit EdgeMap(const Graph& _g) |
565 | | : Parent(_g) {} |
566 | | |
567 | | EdgeMap(const Graph& _g, const _Value& _v) |
568 | | : Parent(_g, _v) {} |
| 564 | explicit EdgeMap(const Graph& _g) |
| 565 | : Parent(_g) {} |
| 566 | |
| 567 | EdgeMap(const Graph& _g, const _Value& _v) |
| 568 | : Parent(_g, _v) {} |
569 | 569 | |
570 | 570 | EdgeMap& operator=(const EdgeMap& cmap) { |
571 | | return operator=<EdgeMap>(cmap); |
| 571 | return operator=<EdgeMap>(cmap); |
572 | 572 | } |
573 | 573 | |
… |
… |
|
575 | 575 | EdgeMap& operator=(const CMap& cmap) { |
576 | 576 | Parent::operator=(cmap); |
577 | | return *this; |
| 577 | return *this; |
578 | 578 | } |
579 | 579 | |
… |
… |
|
592 | 592 | return edge; |
593 | 593 | } |
594 | | |
| 594 | |
595 | 595 | void clear() { |
596 | 596 | notifier(Arc()).clear(); |
… |
… |
|
618 | 618 | arc_notifier.clear(); |
619 | 619 | } |
620 | | |
| 620 | |
621 | 621 | }; |
622 | 622 | |
-
r566
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r513
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
97 | 97 | GetSystemTime(&time); |
98 | 98 | char buf1[11], buf2[9], buf3[5]; |
99 | | if (GetDateFormat(MY_LOCALE, 0, &time, |
| 99 | if (GetDateFormat(MY_LOCALE, 0, &time, |
100 | 100 | ("ddd MMM dd"), buf1, 11) && |
101 | 101 | GetTimeFormat(MY_LOCALE, 0, &time, |
-
r758
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
385 | 385 | /// |
386 | 386 | /// Note that this implementation does not conform to the |
387 | | /// \ref concepts::Heap "heap concept" due to the lack of some |
| 387 | /// \ref concepts::Heap "heap concept" due to the lack of some |
388 | 388 | /// functionality. |
389 | 389 | /// |
-
r941
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
134 | 134 | UNBOUNDED |
135 | 135 | }; |
136 | | |
| 136 | |
137 | 137 | private: |
138 | 138 | |
… |
… |
|
185 | 185 | |
186 | 186 | public: |
187 | | |
| 187 | |
188 | 188 | /// \brief Constant for infinite upper bounds (capacities). |
189 | 189 | /// |
… |
… |
|
212 | 212 | CostVector &_pi; |
213 | 213 | IntVector &_pred; |
214 | | |
| 214 | |
215 | 215 | IntVector _proc_nodes; |
216 | 216 | CostVector _dist; |
217 | | |
| 217 | |
218 | 218 | public: |
219 | 219 | |
… |
… |
|
440 | 440 | return *this; |
441 | 441 | } |
442 | | |
| 442 | |
443 | 443 | /// @} |
444 | 444 | |
… |
… |
|
576 | 576 | _cost.resize(_res_arc_num); |
577 | 577 | _supply.resize(_node_num); |
578 | | |
| 578 | |
579 | 579 | _res_cap.resize(_res_arc_num); |
580 | 580 | _pi.resize(_node_num); |
… |
… |
|
620 | 620 | _reverse[bi] = fi; |
621 | 621 | } |
622 | | |
| 622 | |
623 | 623 | // Reset parameters |
624 | 624 | resetParams(); |
… |
… |
|
729 | 729 | } |
730 | 730 | if (_sum_supply > 0) return INFEASIBLE; |
731 | | |
| 731 | |
732 | 732 | // Initialize vectors |
733 | 733 | for (int i = 0; i != _root; ++i) { |
… |
… |
|
777 | 777 | } |
778 | 778 | } |
779 | | |
| 779 | |
780 | 780 | // Handle GEQ supply type |
781 | 781 | if (_sum_supply < 0) { |
… |
… |
|
845 | 845 | for (int i = 0; i != _node_num; ++i) { |
846 | 846 | _pi[i] -= pr; |
847 | | } |
848 | | } |
849 | | |
| 847 | } |
| 848 | } |
| 849 | |
850 | 850 | return pt; |
851 | 851 | } |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
122 | 122 | int _message_level; |
123 | 123 | |
124 | | |
| 124 | |
125 | 125 | |
126 | 126 | }; |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
60 | 60 | /// \brief The type of supply map. |
61 | 61 | /// |
62 | | /// The type of the map that stores the signed supply values of the |
63 | | /// nodes. |
| 62 | /// The type of the map that stores the signed supply values of the |
| 63 | /// nodes. |
64 | 64 | /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
65 | 65 | typedef SM SupplyMap; |
… |
… |
|
142 | 142 | \geq sup(u) \quad \forall u\in V, \f] |
143 | 143 | \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f] |
144 | | |
| 144 | |
145 | 145 | The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be |
146 | 146 | zero or negative in order to have a feasible solution (since the sum |
… |
… |
|
152 | 152 | constraints have to be satisfied with equality, i.e. all demands |
153 | 153 | have to be satisfied and all supplies have to be used. |
154 | | |
| 154 | |
155 | 155 | If you need the opposite inequalities in the supply/demand constraints |
156 | 156 | (i.e. the total demand is less than the total supply and all the demands |
… |
… |
|
338 | 338 | /// \param graph The digraph the algorithm runs on. |
339 | 339 | /// \param lower The lower bounds for the flow values on the arcs. |
340 | | /// \param upper The upper bounds (capacities) for the flow values |
| 340 | /// \param upper The upper bounds (capacities) for the flow values |
341 | 341 | /// on the arcs. |
342 | 342 | /// \param supply The signed supply values of the nodes. |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
139 | 139 | |
140 | 140 | virtual void _messageLevel(MessageLevel); |
141 | | |
| 141 | |
142 | 142 | public: |
143 | 143 | |
-
r833
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
435 | 435 | private: |
436 | 436 | ///Copy constructor |
437 | | NodeMap(const NodeMap& nm) : |
| 437 | NodeMap(const NodeMap& nm) : |
438 | 438 | ReferenceMap<Node, T, T&, const T&>(nm) { } |
439 | 439 | ///Assignment operator |
-
r833
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
44 | 44 | /// run properly, of course. |
45 | 45 | /// An actual graph implementation like \ref ListGraph or |
46 | | /// \ref SmartGraph may have additional functionality. |
| 46 | /// \ref SmartGraph may have additional functionality. |
47 | 47 | /// |
48 | 48 | /// The undirected graphs also fulfill the concept of \ref Digraph |
… |
… |
|
86 | 86 | /// |
87 | 87 | /// Undirected graphs should be tagged with \c UndirectedTag. |
88 | | /// |
| 88 | /// |
89 | 89 | /// This tag helps the \c enable_if technics to make compile time |
90 | 90 | /// specializations for undirected graphs. |
… |
… |
|
361 | 361 | |
362 | 362 | /// Converison to \c Edge |
363 | | |
| 363 | |
364 | 364 | /// Converison to \c Edge. |
365 | 365 | /// |
-
r833
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
39 | 39 | /// \note This class is a template class so that we can use it to |
40 | 40 | /// create graph skeleton classes. The reason for this is that \c Node |
41 | | /// and \c Arc (or \c Edge) types should \e not derive from the same |
| 41 | /// and \c Arc (or \c Edge) types should \e not derive from the same |
42 | 42 | /// base class. For \c Node you should instantiate it with character |
43 | 43 | /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'. |
… |
… |
|
90 | 90 | /// |
91 | 91 | /// This operator defines an ordering of the items. |
92 | | /// It makes possible to use graph item types as key types in |
| 92 | /// It makes possible to use graph item types as key types in |
93 | 93 | /// associative containers (e.g. \c std::map). |
94 | 94 | /// |
… |
… |
|
123 | 123 | /// This class describes the base interface of directed graph types. |
124 | 124 | /// All digraph %concepts have to conform to this class. |
125 | | /// It just provides types for nodes and arcs and functions |
| 125 | /// It just provides types for nodes and arcs and functions |
126 | 126 | /// to get the source and the target nodes of arcs. |
127 | 127 | class BaseDigraphComponent { |
… |
… |
|
427 | 427 | /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types. |
428 | 428 | /// |
429 | | /// This class describes the concept of \c NodeIt, \c ArcIt and |
| 429 | /// This class describes the concept of \c NodeIt, \c ArcIt and |
430 | 430 | /// \c EdgeIt subtypes of digraph and graph types. |
431 | 431 | template <typename GR, typename Item> |
… |
… |
|
467 | 467 | /// next item. |
468 | 468 | GraphItemIt& operator++() { return *this; } |
469 | | |
| 469 | |
470 | 470 | /// \brief Equality operator |
471 | 471 | /// |
… |
… |
|
502 | 502 | }; |
503 | 503 | |
504 | | /// \brief Concept class for \c InArcIt, \c OutArcIt and |
| 504 | /// \brief Concept class for \c InArcIt, \c OutArcIt and |
505 | 505 | /// \c IncEdgeIt types. |
506 | 506 | /// |
507 | | /// This class describes the concept of \c InArcIt, \c OutArcIt |
| 507 | /// This class describes the concept of \c InArcIt, \c OutArcIt |
508 | 508 | /// and \c IncEdgeIt subtypes of digraph and graph types. |
509 | 509 | /// |
510 | 510 | /// \note Since these iterator classes do not inherit from the same |
511 | 511 | /// base class, there is an additional template parameter (selector) |
512 | | /// \c sel. For \c InArcIt you should instantiate it with character |
| 512 | /// \c sel. For \c InArcIt you should instantiate it with character |
513 | 513 | /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'. |
514 | 514 | template <typename GR, |
… |
… |
|
531 | 531 | GraphIncIt(const GraphIncIt& it) : Item(it) {} |
532 | 532 | |
533 | | /// \brief Constructor that sets the iterator to the first |
| 533 | /// \brief Constructor that sets the iterator to the first |
534 | 534 | /// incoming or outgoing arc. |
535 | 535 | /// |
536 | | /// Constructor that sets the iterator to the first arc |
| 536 | /// Constructor that sets the iterator to the first arc |
537 | 537 | /// incoming to or outgoing from the given node. |
538 | 538 | explicit GraphIncIt(const GR&, const Base&) {} |
… |
… |
|
805 | 805 | /// \brief Return the first edge incident to the given node. |
806 | 806 | /// |
807 | | /// This function gives back the first edge incident to the given |
| 807 | /// This function gives back the first edge incident to the given |
808 | 808 | /// node. The bool parameter gives back the direction for which the |
809 | | /// source node of the directed arc representing the edge is the |
| 809 | /// source node of the directed arc representing the edge is the |
810 | 810 | /// given node. |
811 | 811 | void firstInc(Edge&, bool&, const Node&) const {} |
… |
… |
|
814 | 814 | /// given node. |
815 | 815 | /// |
816 | | /// This function gives back the next edge incident to the given |
| 816 | /// This function gives back the next edge incident to the given |
817 | 817 | /// node. The bool parameter should be used as \c firstInc() use it. |
818 | 818 | void nextInc(Edge&, bool&) const {} |
… |
… |
|
991 | 991 | /// |
992 | 992 | /// This class describes the concept of standard graph maps, i.e. |
993 | | /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
| 993 | /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
994 | 994 | /// graph types, which can be used for associating data to graph items. |
995 | 995 | /// The standard graph maps must conform to the ReferenceMap concept. |
… |
… |
|
1046 | 1046 | _Map m1(g); |
1047 | 1047 | _Map m2(g,t); |
1048 | | |
| 1048 | |
1049 | 1049 | // Copy constructor |
1050 | 1050 | // _Map m3(m); |
… |
… |
|
1069 | 1069 | /// |
1070 | 1070 | /// This class describes the interface of mappable directed graphs. |
1071 | | /// It extends \ref BaseDigraphComponent with the standard digraph |
| 1071 | /// It extends \ref BaseDigraphComponent with the standard digraph |
1072 | 1072 | /// map classes, namely \c NodeMap and \c ArcMap. |
1073 | 1073 | /// This concept is part of the Digraph concept. |
… |
… |
|
1206 | 1206 | /// |
1207 | 1207 | /// This class describes the interface of mappable undirected graphs. |
1208 | | /// It extends \ref MappableDigraphComponent with the standard graph |
| 1208 | /// It extends \ref MappableDigraphComponent with the standard graph |
1209 | 1209 | /// map class for edges (\c EdgeMap). |
1210 | 1210 | /// This concept is part of the Graph concept. |
… |
… |
|
1291 | 1291 | /// |
1292 | 1292 | /// This class describes the interface of extendable directed graphs. |
1293 | | /// It extends \ref BaseDigraphComponent with functions for adding |
| 1293 | /// It extends \ref BaseDigraphComponent with functions for adding |
1294 | 1294 | /// nodes and arcs to the digraph. |
1295 | 1295 | /// This concept requires \ref AlterableDigraphComponent. |
… |
… |
|
1335 | 1335 | /// |
1336 | 1336 | /// This class describes the interface of extendable undirected graphs. |
1337 | | /// It extends \ref BaseGraphComponent with functions for adding |
| 1337 | /// It extends \ref BaseGraphComponent with functions for adding |
1338 | 1338 | /// nodes and edges to the graph. |
1339 | 1339 | /// This concept requires \ref AlterableGraphComponent. |
… |
… |
|
1379 | 1379 | /// |
1380 | 1380 | /// This class describes the interface of erasable directed graphs. |
1381 | | /// It extends \ref BaseDigraphComponent with functions for removing |
| 1381 | /// It extends \ref BaseDigraphComponent with functions for removing |
1382 | 1382 | /// nodes and arcs from the digraph. |
1383 | 1383 | /// This concept requires \ref AlterableDigraphComponent. |
… |
… |
|
1392 | 1392 | /// \brief Erase a node from the digraph. |
1393 | 1393 | /// |
1394 | | /// This function erases the given node from the digraph and all arcs |
| 1394 | /// This function erases the given node from the digraph and all arcs |
1395 | 1395 | /// connected to the node. |
1396 | 1396 | void erase(const Node&) {} |
… |
… |
|
1418 | 1418 | /// |
1419 | 1419 | /// This class describes the interface of erasable undirected graphs. |
1420 | | /// It extends \ref BaseGraphComponent with functions for removing |
| 1420 | /// It extends \ref BaseGraphComponent with functions for removing |
1421 | 1421 | /// nodes and edges from the graph. |
1422 | 1422 | /// This concept requires \ref AlterableGraphComponent. |
-
r883
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
93 | 93 | #else |
94 | 94 | explicit Heap(ItemIntMap&) {} |
95 | | #endif |
| 95 | #endif |
96 | 96 | |
97 | 97 | /// \brief Constructor. |
… |
… |
|
107 | 107 | #else |
108 | 108 | explicit Heap(ItemIntMap&, const CMP&) {} |
109 | | #endif |
| 109 | #endif |
110 | 110 | |
111 | 111 | /// \brief The number of items stored in the heap. |
… |
… |
|
139 | 139 | #else |
140 | 140 | void push(const Item&, const Prio&) {} |
141 | | #endif |
| 141 | #endif |
142 | 142 | |
143 | 143 | /// \brief Return the item having minimum priority. |
… |
… |
|
169 | 169 | #else |
170 | 170 | void erase(const Item&) {} |
171 | | #endif |
| 171 | #endif |
172 | 172 | |
173 | 173 | /// \brief The priority of the given item. |
… |
… |
|
180 | 180 | #else |
181 | 181 | Prio operator[](const Item&) const { return Prio(); } |
182 | | #endif |
| 182 | #endif |
183 | 183 | |
184 | 184 | /// \brief Set the priority of an item or insert it, if it is |
… |
… |
|
195 | 195 | #else |
196 | 196 | void set(const Item&, const Prio&) {} |
197 | | #endif |
| 197 | #endif |
198 | 198 | |
199 | 199 | /// \brief Decrease the priority of an item to the given value. |
… |
… |
|
207 | 207 | #else |
208 | 208 | void decrease(const Item&, const Prio&) {} |
209 | | #endif |
| 209 | #endif |
210 | 210 | |
211 | 211 | /// \brief Increase the priority of an item to the given value. |
… |
… |
|
219 | 219 | #else |
220 | 220 | void increase(const Item&, const Prio&) {} |
221 | | #endif |
| 221 | #endif |
222 | 222 | |
223 | 223 | /// \brief Return the state of an item. |
… |
… |
|
233 | 233 | #else |
234 | 234 | State state(const Item&) const { return PRE_HEAP; } |
235 | | #endif |
| 235 | #endif |
236 | 236 | |
237 | 237 | /// \brief Set the state of an item in the heap. |
… |
… |
|
246 | 246 | #else |
247 | 247 | void state(const Item&, State) {} |
248 | | #endif |
| 248 | #endif |
249 | 249 | |
250 | 250 | |
-
r695
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
259 | 259 | /// \return \c true if the digraph is strongly connected. |
260 | 260 | /// \note By definition, the empty digraph is strongly connected. |
261 | | /// |
| 261 | /// |
262 | 262 | /// \see countStronglyConnectedComponents(), stronglyConnectedComponents() |
263 | 263 | /// \see connected() |
… |
… |
|
311 | 311 | /// \ingroup graph_properties |
312 | 312 | /// |
313 | | /// \brief Count the number of strongly connected components of a |
| 313 | /// \brief Count the number of strongly connected components of a |
314 | 314 | /// directed graph |
315 | 315 | /// |
… |
… |
|
745 | 745 | /// \brief Check whether an undirected graph is bi-node-connected. |
746 | 746 | /// |
747 | | /// This function checks whether the given undirected graph is |
| 747 | /// This function checks whether the given undirected graph is |
748 | 748 | /// bi-node-connected, i.e. any two edges are on same circle. |
749 | 749 | /// |
… |
… |
|
759 | 759 | /// \ingroup graph_properties |
760 | 760 | /// |
761 | | /// \brief Count the number of bi-node-connected components of an |
| 761 | /// \brief Count the number of bi-node-connected components of an |
762 | 762 | /// undirected graph. |
763 | 763 | /// |
… |
… |
|
813 | 813 | /// \retval compMap A writable edge map. The values will be set from 0 |
814 | 814 | /// to the number of the bi-node-connected components minus one. Each |
815 | | /// value of the map will be set exactly once, and the values of a |
| 815 | /// value of the map will be set exactly once, and the values of a |
816 | 816 | /// certain component will be set continuously. |
817 | 817 | /// \return The number of bi-node-connected components. |
… |
… |
|
859 | 859 | /// |
860 | 860 | /// \param graph The undirected graph. |
861 | | /// \retval cutMap A writable node map. The values will be set to |
| 861 | /// \retval cutMap A writable node map. The values will be set to |
862 | 862 | /// \c true for the nodes that separate two or more components |
863 | 863 | /// (exactly once for each cut node), and will not be changed for |
… |
… |
|
1086 | 1086 | /// \brief Check whether an undirected graph is bi-edge-connected. |
1087 | 1087 | /// |
1088 | | /// This function checks whether the given undirected graph is |
| 1088 | /// This function checks whether the given undirected graph is |
1089 | 1089 | /// bi-edge-connected, i.e. any two nodes are connected with at least |
1090 | 1090 | /// two edge-disjoint paths. |
… |
… |
|
1193 | 1193 | /// |
1194 | 1194 | /// This function finds the bi-edge-connected cut edges in the given |
1195 | | /// undirected graph. |
| 1195 | /// undirected graph. |
1196 | 1196 | /// |
1197 | 1197 | /// The bi-edge-connected components are the classes of an equivalence |
… |
… |
|
1350 | 1350 | /// \param digraph The digraph. |
1351 | 1351 | /// \retval order A readable and writable node map. The values will be |
1352 | | /// set from 0 to the number of the nodes in the digraph minus one. |
| 1352 | /// set from 0 to the number of the nodes in the digraph minus one. |
1353 | 1353 | /// Each value of the map will be set exactly once, and the values will |
1354 | 1354 | /// be set descending order. |
-
r718
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
1240 | 1240 | protected: |
1241 | 1241 | |
1242 | | class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type { |
| 1242 | class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type |
| 1243 | { |
1243 | 1244 | typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent; |
1244 | 1245 | |
… |
… |
|
1279 | 1280 | }; |
1280 | 1281 | |
1281 | | protected: |
| 1282 | protected: |
1282 | 1283 | |
1283 | 1284 | const Digraph &_g; |
-
r941
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
93 | 93 | /// push/augment and relabel operations for finding a \ref min_cost_flow |
94 | 94 | /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation, |
95 | | /// \ref goldberg97efficient, \ref bunnagel98efficient. |
| 95 | /// \ref goldberg97efficient, \ref bunnagel98efficient. |
96 | 96 | /// It is a highly efficient primal-dual solution method, which |
97 | 97 | /// can be viewed as the generalization of the \ref Preflow |
… |
… |
|
190 | 190 | /// paths from a node with excess to a node with deficit. |
191 | 191 | AUGMENT, |
192 | | /// Partial augment operations are used, i.e. flow is moved on |
| 192 | /// Partial augment operations are used, i.e. flow is moved on |
193 | 193 | /// admissible paths started from a node with excess, but the |
194 | 194 | /// lengths of these paths are limited. This method can be viewed |
… |
… |
|
209 | 209 | |
210 | 210 | private: |
211 | | |
| 211 | |
212 | 212 | template <typename KT, typename VT> |
213 | 213 | class StaticVectorMap { |
… |
… |
|
215 | 215 | typedef KT Key; |
216 | 216 | typedef VT Value; |
217 | | |
| 217 | |
218 | 218 | StaticVectorMap(std::vector<Value>& v) : _v(v) {} |
219 | | |
| 219 | |
220 | 220 | const Value& operator[](const Key& key) const { |
221 | 221 | return _v[StaticDigraph::id(key)]; |
… |
… |
|
225 | 225 | return _v[StaticDigraph::id(key)]; |
226 | 226 | } |
227 | | |
| 227 | |
228 | 228 | void set(const Key& key, const Value& val) { |
229 | 229 | _v[StaticDigraph::id(key)] = val; |
… |
… |
|
284 | 284 | IntVector _rank; |
285 | 285 | int _max_rank; |
286 | | |
| 286 | |
287 | 287 | // Data for a StaticDigraph structure |
288 | 288 | typedef std::pair<int, int> IntPair; |
… |
… |
|
292 | 292 | LargeCostArcMap _cost_map; |
293 | 293 | LargeCostNodeMap _pi_map; |
294 | | |
| 294 | |
295 | 295 | public: |
296 | | |
| 296 | |
297 | 297 | /// \brief Constant for infinite upper bounds (capacities). |
298 | 298 | /// |
… |
… |
|
349 | 349 | LEMON_ASSERT(std::numeric_limits<Cost>::is_signed, |
350 | 350 | "The cost type of CostScaling must be signed"); |
351 | | |
| 351 | |
352 | 352 | // Reset data structures |
353 | 353 | reset(); |
… |
… |
|
465 | 465 | return *this; |
466 | 466 | } |
467 | | |
| 467 | |
468 | 468 | /// @} |
469 | 469 | |
… |
… |
|
567 | 567 | _scost[j] = 0; |
568 | 568 | _scost[_reverse[j]] = 0; |
569 | | } |
| 569 | } |
570 | 570 | _have_lower = false; |
571 | 571 | return *this; |
… |
… |
|
602 | 602 | _scost.resize(_res_arc_num); |
603 | 603 | _supply.resize(_res_node_num); |
604 | | |
| 604 | |
605 | 605 | _res_cap.resize(_res_arc_num); |
606 | 606 | _cost.resize(_res_arc_num); |
… |
… |
|
650 | 650 | _reverse[bi] = fi; |
651 | 651 | } |
652 | | |
| 652 | |
653 | 653 | // Reset parameters |
654 | 654 | resetParams(); |
… |
… |
|
759 | 759 | } |
760 | 760 | if (_sum_supply > 0) return INFEASIBLE; |
761 | | |
| 761 | |
762 | 762 | |
763 | 763 | // Initialize vectors |
… |
… |
|
766 | 766 | _excess[i] = _supply[i]; |
767 | 767 | } |
768 | | |
| 768 | |
769 | 769 | // Remove infinite upper bounds and check negative arcs |
770 | 770 | const Value MAX = std::numeric_limits<Value>::max(); |
… |
… |
|
886 | 886 | } |
887 | 887 | } |
888 | | |
| 888 | |
889 | 889 | return OPTIMAL; |
890 | 890 | } |
… |
… |
|
895 | 895 | const int MAX_PATH_LENGTH = 4; |
896 | 896 | |
897 | | // Initialize data structures for buckets |
| 897 | // Initialize data structures for buckets |
898 | 898 | _max_rank = _alpha * _res_node_num; |
899 | 899 | _buckets.resize(_max_rank); |
… |
… |
|
901 | 901 | _bucket_prev.resize(_res_node_num + 1); |
902 | 902 | _rank.resize(_res_node_num + 1); |
903 | | |
| 903 | |
904 | 904 | // Execute the algorithm |
905 | 905 | switch (method) { |
… |
… |
|
940 | 940 | } |
941 | 941 | } |
942 | | |
| 942 | |
943 | 943 | // Initialize a cost scaling phase |
944 | 944 | void initPhase() { |
… |
… |
|
958 | 958 | } |
959 | 959 | } |
960 | | |
| 960 | |
961 | 961 | // Find active nodes (i.e. nodes with positive excess) |
962 | 962 | for (int u = 0; u != _res_node_num; ++u) { |
… |
… |
|
969 | 969 | } |
970 | 970 | } |
971 | | |
| 971 | |
972 | 972 | // Early termination heuristic |
973 | 973 | bool earlyTermination() { |
… |
… |
|
999 | 999 | void globalUpdate() { |
1000 | 1000 | int bucket_end = _root + 1; |
1001 | | |
| 1001 | |
1002 | 1002 | // Initialize buckets |
1003 | 1003 | for (int r = 0; r != _max_rank; ++r) { |
… |
… |
|
1025 | 1025 | int u = _buckets[r]; |
1026 | 1026 | _buckets[r] = _bucket_next[u]; |
1027 | | |
| 1027 | |
1028 | 1028 | // Search the incomming arcs of u |
1029 | 1029 | LargeCost pi_u = _pi[u]; |
… |
… |
|
1040 | 1040 | if (nrc < LargeCost(_max_rank)) |
1041 | 1041 | new_rank_v = r + 1 + int(nrc); |
1042 | | |
| 1042 | |
1043 | 1043 | // Change the rank of v |
1044 | 1044 | if (new_rank_v < old_rank_v) { |
1045 | 1045 | _rank[v] = new_rank_v; |
1046 | 1046 | _next_out[v] = _first_out[v]; |
1047 | | |
| 1047 | |
1048 | 1048 | // Remove v from its old bucket |
1049 | 1049 | if (old_rank_v < _max_rank) { |
… |
… |
|
1055 | 1055 | } |
1056 | 1056 | } |
1057 | | |
| 1057 | |
1058 | 1058 | // Insert v to its new bucket |
1059 | 1059 | _bucket_next[v] = _buckets[new_rank_v]; |
… |
… |
|
1073 | 1073 | if (total_excess <= 0) break; |
1074 | 1074 | } |
1075 | | |
| 1075 | |
1076 | 1076 | // Relabel nodes |
1077 | 1077 | for (int u = 0; u != _res_node_num; ++u) { |
… |
… |
|
1093 | 1093 | (_res_node_num + _sup_node_num * _sup_node_num)); |
1094 | 1094 | int next_update_limit = global_update_freq; |
1095 | | |
| 1095 | |
1096 | 1096 | int relabel_cnt = 0; |
1097 | | |
| 1097 | |
1098 | 1098 | // Perform cost scaling phases |
1099 | 1099 | std::vector<int> path; |
… |
… |
|
1105 | 1105 | if (earlyTermination()) break; |
1106 | 1106 | } |
1107 | | |
| 1107 | |
1108 | 1108 | // Initialize current phase |
1109 | 1109 | initPhase(); |
1110 | | |
| 1110 | |
1111 | 1111 | // Perform partial augment and relabel operations |
1112 | 1112 | while (true) { |
… |
… |
|
1197 | 1197 | |
1198 | 1198 | int relabel_cnt = 0; |
1199 | | |
| 1199 | |
1200 | 1200 | // Perform cost scaling phases |
1201 | 1201 | BoolVector hyper(_res_node_num, false); |
… |
… |
|
1208 | 1208 | if (earlyTermination()) break; |
1209 | 1209 | } |
1210 | | |
| 1210 | |
1211 | 1211 | // Initialize current phase |
1212 | 1212 | initPhase(); |
… |
… |
|
1223 | 1223 | last_out = _first_out[n+1]; |
1224 | 1224 | pi_n = _pi[n]; |
1225 | | |
| 1225 | |
1226 | 1226 | // Perform push operations if there are admissible arcs |
1227 | 1227 | if (_excess[n] > 0) { |
… |
… |
|
1237 | 1237 | LargeCost pi_t = _pi[t]; |
1238 | 1238 | for (int ta = _next_out[t]; ta != last_out_t; ++ta) { |
1239 | | if (_res_cap[ta] > 0 && |
| 1239 | if (_res_cap[ta] > 0 && |
1240 | 1240 | _cost[ta] + pi_t - _pi[_target[ta]] < 0) |
1241 | 1241 | ahead += _res_cap[ta]; |
… |
… |
|
1288 | 1288 | ++relabel_cnt; |
1289 | 1289 | } |
1290 | | |
| 1290 | |
1291 | 1291 | // Remove nodes that are not active nor hyper |
1292 | 1292 | remove_nodes: |
… |
… |
|
1296 | 1296 | _active_nodes.pop_front(); |
1297 | 1297 | } |
1298 | | |
| 1298 | |
1299 | 1299 | // Global update heuristic |
1300 | 1300 | if (relabel_cnt >= next_update_limit) { |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
112 | 112 | } |
113 | 113 | |
114 | | int CplexBase::_addRow(Value lb, ExprIterator b, |
| 114 | int CplexBase::_addRow(Value lb, ExprIterator b, |
115 | 115 | ExprIterator e, Value ub) { |
116 | 116 | int i = CPXgetnumrows(cplexEnv(), _prob); |
… |
… |
|
490 | 490 | |
491 | 491 | void CplexBase::_applyMessageLevel() { |
492 | | CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, |
| 492 | CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, |
493 | 493 | _message_enabled ? CPX_ON : CPX_OFF); |
494 | 494 | } |
-
r942
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
143 | 143 | |
144 | 144 | TEMPLATE_DIGRAPH_TYPEDEFS(GR); |
145 | | |
| 145 | |
146 | 146 | typedef std::vector<int> IntVector; |
147 | 147 | typedef std::vector<double> DoubleVector; |
… |
… |
|
152 | 152 | |
153 | 153 | private: |
154 | | |
| 154 | |
155 | 155 | template <typename KT, typename VT> |
156 | 156 | class StaticVectorMap { |
… |
… |
|
158 | 158 | typedef KT Key; |
159 | 159 | typedef VT Value; |
160 | | |
| 160 | |
161 | 161 | StaticVectorMap(std::vector<Value>& v) : _v(v) {} |
162 | | |
| 162 | |
163 | 163 | const Value& operator[](const Key& key) const { |
164 | 164 | return _v[StaticDigraph::id(key)]; |
… |
… |
|
168 | 168 | return _v[StaticDigraph::id(key)]; |
169 | 169 | } |
170 | | |
| 170 | |
171 | 171 | void set(const Key& key, const Value& val) { |
172 | 172 | _v[StaticDigraph::id(key)] = val; |
… |
… |
|
222 | 222 | CostArcMap _cost_map; |
223 | 223 | CostNodeMap _pi_map; |
224 | | |
| 224 | |
225 | 225 | public: |
226 | | |
| 226 | |
227 | 227 | /// \brief Constant for infinite upper bounds (capacities). |
228 | 228 | /// |
… |
… |
|
367 | 367 | return *this; |
368 | 368 | } |
369 | | |
| 369 | |
370 | 370 | /// @} |
371 | 371 | |
… |
… |
|
467 | 467 | _cost[j] = 0; |
468 | 468 | _cost[_reverse[j]] = 0; |
469 | | } |
| 469 | } |
470 | 470 | _have_lower = false; |
471 | 471 | return *this; |
… |
… |
|
509 | 509 | _cost.resize(_res_arc_num); |
510 | 510 | _supply.resize(_res_node_num); |
511 | | |
| 511 | |
512 | 512 | _res_cap.resize(_res_arc_num); |
513 | 513 | _pi.resize(_res_node_num); |
… |
… |
|
555 | 555 | _reverse[bi] = fi; |
556 | 556 | } |
557 | | |
| 557 | |
558 | 558 | // Reset parameters |
559 | 559 | resetParams(); |
… |
… |
|
664 | 664 | } |
665 | 665 | if (_sum_supply > 0) return INFEASIBLE; |
666 | | |
| 666 | |
667 | 667 | |
668 | 668 | // Initialize vectors |
… |
… |
|
671 | 671 | } |
672 | 672 | ValueVector excess(_supply); |
673 | | |
| 673 | |
674 | 674 | // Remove infinite upper bounds and check negative arcs |
675 | 675 | const Value MAX = std::numeric_limits<Value>::max(); |
… |
… |
|
771 | 771 | } |
772 | 772 | } |
773 | | |
| 773 | |
774 | 774 | return OPTIMAL; |
775 | 775 | } |
776 | | |
| 776 | |
777 | 777 | // Build a StaticDigraph structure containing the current |
778 | 778 | // residual network |
… |
… |
|
830 | 830 | const int BF_FIRST_LIMIT = 2; |
831 | 831 | const double BF_LIMIT_FACTOR = 1.5; |
832 | | |
| 832 | |
833 | 833 | typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap; |
834 | 834 | typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph; |
… |
… |
|
837 | 837 | ::template SetDistMap<CostNodeMap> |
838 | 838 | ::template SetPredMap<PredMap>::Create BF; |
839 | | |
| 839 | |
840 | 840 | // Build the residual network |
841 | 841 | _arc_vec.clear(); |
… |
… |
|
927 | 927 | typedef typename HowardMmc<StaticDigraph, CostArcMap> |
928 | 928 | ::template SetPath<SPath>::Create MMC; |
929 | | |
| 929 | |
930 | 930 | SPath cycle; |
931 | 931 | MMC mmc(_sgr, _cost_map); |
… |
… |
|
950 | 950 | } |
951 | 951 | |
952 | | // Rebuild the residual network |
| 952 | // Rebuild the residual network |
953 | 953 | buildResidualNetwork(); |
954 | 954 | } |
… |
… |
|
1144 | 1144 | Cost cycle_cost = mmc.cycleCost(); |
1145 | 1145 | int cycle_size = mmc.cycleSize(); |
1146 | | |
| 1146 | |
1147 | 1147 | // Compute feasible potentials for the current epsilon |
1148 | 1148 | for (int i = 0; i != int(_cost_vec.size()); ++i) { |
… |
… |
|
1156 | 1156 | pi[u] = static_cast<double>(_pi[u]) / cycle_size; |
1157 | 1157 | } |
1158 | | |
| 1158 | |
1159 | 1159 | iter = limit; |
1160 | 1160 | } |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
83 | 83 | |
84 | 84 | ///The type of the map that indicates which nodes are reached. |
85 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 85 | ///It must conform to |
| 86 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
86 | 87 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
87 | 88 | ///Instantiates a \c ReachedMap. |
… |
… |
|
271 | 272 | ///\ref named-templ-param "Named parameter" for setting |
272 | 273 | ///\c ReachedMap type. |
273 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 274 | ///It must conform to |
| 275 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
274 | 276 | template <class T> |
275 | 277 | struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > { |
… |
… |
|
803 | 805 | |
804 | 806 | ///The type of the map that indicates which nodes are reached. |
805 | | ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 807 | ///It must conform to |
| 808 | ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
806 | 809 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
807 | 810 | ///Instantiates a ReachedMap. |
… |
… |
|
1208 | 1211 | /// |
1209 | 1212 | /// The type of the map that indicates which nodes are reached. |
1210 | | /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
| 1213 | /// It must conform to the |
| 1214 | /// \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
1211 | 1215 | typedef typename Digraph::template NodeMap<bool> ReachedMap; |
1212 | 1216 | |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r631
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
62 | 62 | |
63 | 63 | ///This function starts seeking the beginning of the given file for the |
64 | | ///problem type and size info. |
| 64 | ///problem type and size info. |
65 | 65 | ///The found data is returned in a special struct that can be evaluated |
66 | 66 | ///and passed to the appropriate reader function. |
… |
… |
|
213 | 213 | std::numeric_limits<Capacity>::infinity() : |
214 | 214 | std::numeric_limits<Capacity>::max(); |
215 | | |
| 215 | |
216 | 216 | while (is >> c) { |
217 | 217 | switch (c) { |
… |
… |
|
238 | 238 | e = g.addArc(nodes[i], nodes[j]); |
239 | 239 | capacity.set(e, _cap); |
240 | | } |
| 240 | } |
241 | 241 | else if (desc.type==DimacsDescriptor::MAX) { |
242 | 242 | is >> i >> j >> _cap; |
… |
… |
|
363 | 363 | g.addArc(s,t); |
364 | 364 | } |
365 | | |
| 365 | |
366 | 366 | /// \brief DIMACS plain (di)graph reader function. |
367 | 367 | /// |
368 | 368 | /// This function reads a plain (di)graph without any designated nodes |
369 | | /// and maps (e.g. a matching instance) from DIMACS format, i.e. from |
| 369 | /// and maps (e.g. a matching instance) from DIMACS format, i.e. from |
370 | 370 | /// DIMACS files having a line starting with |
371 | 371 | /// \code |
… |
… |
|
393 | 393 | nodes[k] = g.addNode(); |
394 | 394 | } |
395 | | |
| 395 | |
396 | 396 | while (is >> c) { |
397 | 397 | switch (c) { |
-
r834
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r695
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
27 | 27 | /// \ingroup graph_properties |
28 | 28 | /// \file |
29 | | /// \brief Euler tour iterators and a function for checking the \e Eulerian |
| 29 | /// \brief Euler tour iterators and a function for checking the \e Eulerian |
30 | 30 | /// property. |
31 | 31 | /// |
… |
… |
|
42 | 42 | /// |
43 | 43 | ///For example, if the given digraph has an Euler tour (i.e it has only one |
44 | | ///non-trivial component and the in-degree is equal to the out-degree |
| 44 | ///non-trivial component and the in-degree is equal to the out-degree |
45 | 45 | ///for all nodes), then the following code will put the arcs of \c g |
46 | 46 | ///to the vector \c et according to an Euler tour of \c g. |
… |
… |
|
139 | 139 | ///and \c Edge types of the graph. |
140 | 140 | /// |
141 | | ///For example, if the given graph has an Euler tour (i.e it has only one |
| 141 | ///For example, if the given graph has an Euler tour (i.e it has only one |
142 | 142 | ///non-trivial component and the degree of each node is even), |
143 | 143 | ///the following code will print the arc IDs according to an |
… |
… |
|
148 | 148 | /// } |
149 | 149 | ///\endcode |
150 | | ///Although this iterator is for undirected graphs, it still returns |
| 150 | ///Although this iterator is for undirected graphs, it still returns |
151 | 151 | ///arcs in order to indicate the direction of the tour. |
152 | 152 | ///(But arcs convert to edges, of course.) |
… |
… |
|
234 | 234 | /// Postfix incrementation. |
235 | 235 | /// |
236 | | ///\warning This incrementation returns an \c Arc (which converts to |
| 236 | ///\warning This incrementation returns an \c Arc (which converts to |
237 | 237 | ///an \c Edge), not an \ref EulerIt, as one may expect. |
238 | 238 | Arc operator++(int) |
-
r955
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
2010 | 2010 | /// \brief Run the algorithm. |
2011 | 2011 | /// |
2012 | | /// This method runs the \c %MaxWeightedPerfectFractionalMatching |
| 2012 | /// This method runs the \c %MaxWeightedPerfectFractionalMatching |
2013 | 2013 | /// algorithm. |
2014 | 2014 | /// |
-
r834
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
204 | 204 | /// \brief Returns the node with the given index. |
205 | 205 | /// |
206 | | /// Returns the node with the given index. Since this structure is |
| 206 | /// Returns the node with the given index. Since this structure is |
207 | 207 | /// completely static, the nodes can be indexed with integers from |
208 | 208 | /// the range <tt>[0..nodeNum()-1]</tt>. |
… |
… |
|
213 | 213 | /// \brief Returns the index of the given node. |
214 | 214 | /// |
215 | | /// Returns the index of the given node. Since this structure is |
| 215 | /// Returns the index of the given node. Since this structure is |
216 | 216 | /// completely static, the nodes can be indexed with integers from |
217 | 217 | /// the range <tt>[0..nodeNum()-1]</tt>. |
… |
… |
|
583 | 583 | /// \brief Returns the node with the given index. |
584 | 584 | /// |
585 | | /// Returns the node with the given index. Since this structure is |
| 585 | /// Returns the node with the given index. Since this structure is |
586 | 586 | /// completely static, the nodes can be indexed with integers from |
587 | 587 | /// the range <tt>[0..nodeNum()-1]</tt>. |
… |
… |
|
592 | 592 | /// \brief Returns the index of the given node. |
593 | 593 | /// |
594 | | /// Returns the index of the given node. Since this structure is |
| 594 | /// Returns the index of the given node. Since this structure is |
595 | 595 | /// completely static, the nodes can be indexed with integers from |
596 | 596 | /// the range <tt>[0..nodeNum()-1]</tt>. |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
60 | 60 | } |
61 | 61 | |
62 | | int GlpkBase::_addRow(Value lo, ExprIterator b, |
| 62 | int GlpkBase::_addRow(Value lo, ExprIterator b, |
63 | 63 | ExprIterator e, Value up) { |
64 | 64 | int i = glp_add_rows(lp, 1); |
… |
… |
|
69 | 69 | } else { |
70 | 70 | glp_set_row_bnds(lp, i, GLP_UP, lo, up); |
71 | | } |
| 71 | } |
72 | 72 | } else { |
73 | 73 | if (up == INF) { |
74 | 74 | glp_set_row_bnds(lp, i, GLP_LO, lo, up); |
75 | | } else if (lo != up) { |
| 75 | } else if (lo != up) { |
76 | 76 | glp_set_row_bnds(lp, i, GLP_DB, lo, up); |
77 | 77 | } else { |
-
r902
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
31 | 31 | class VoidPtr { |
32 | 32 | private: |
33 | | void *_ptr; |
| 33 | void *_ptr; |
34 | 34 | public: |
35 | 35 | VoidPtr() : _ptr(0) {} |
… |
… |
|
39 | 39 | |
40 | 40 | template <typename T> |
41 | | VoidPtr& operator=(T* ptr) { |
42 | | _ptr = reinterpret_cast<void*>(ptr); |
| 41 | VoidPtr& operator=(T* ptr) { |
| 42 | _ptr = reinterpret_cast<void*>(ptr); |
43 | 43 | return *this; |
44 | 44 | } |
… |
… |
|
125 | 125 | } |
126 | 126 | }; |
127 | | |
| 127 | |
128 | 128 | static FreeEnvHelper freeEnvHelper; |
129 | 129 | |
130 | 130 | protected: |
131 | | |
| 131 | |
132 | 132 | int _message_level; |
133 | | |
| 133 | |
134 | 134 | public: |
135 | 135 | |
-
r833
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
28 | 28 | |
29 | 29 | /// \ingroup min_cut |
30 | | /// \file |
| 30 | /// \file |
31 | 31 | /// \brief Gomory-Hu cut tree in graphs. |
32 | 32 | |
… |
… |
|
39 | 39 | /// The Gomory-Hu tree is a tree on the node set of a given graph, but it |
40 | 40 | /// may contain edges which are not in the original graph. It has the |
41 | | /// property that the minimum capacity edge of the path between two nodes |
| 41 | /// property that the minimum capacity edge of the path between two nodes |
42 | 42 | /// in this tree has the same weight as the minimum cut in the graph |
43 | 43 | /// between these nodes. Moreover the components obtained by removing |
… |
… |
|
45 | 45 | /// Therefore once this tree is computed, the minimum cut between any pair |
46 | 46 | /// of nodes can easily be obtained. |
47 | | /// |
| 47 | /// |
48 | 48 | /// The algorithm calculates \e n-1 distinct minimum cuts (currently with |
49 | 49 | /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall |
… |
… |
|
61 | 61 | #ifdef DOXYGEN |
62 | 62 | template <typename GR, |
63 | | typename CAP> |
| 63 | typename CAP> |
64 | 64 | #else |
65 | 65 | template <typename GR, |
66 | | typename CAP = typename GR::template EdgeMap<int> > |
| 66 | typename CAP = typename GR::template EdgeMap<int> > |
67 | 67 | #endif |
68 | 68 | class GomoryHu { |
… |
… |
|
75 | 75 | /// The value type of capacities |
76 | 76 | typedef typename Capacity::Value Value; |
77 | | |
| 77 | |
78 | 78 | private: |
79 | 79 | |
… |
… |
|
90 | 90 | void createStructures() { |
91 | 91 | if (!_pred) { |
92 | | _pred = new typename Graph::template NodeMap<Node>(_graph); |
| 92 | _pred = new typename Graph::template NodeMap<Node>(_graph); |
93 | 93 | } |
94 | 94 | if (!_weight) { |
95 | | _weight = new typename Graph::template NodeMap<Value>(_graph); |
| 95 | _weight = new typename Graph::template NodeMap<Value>(_graph); |
96 | 96 | } |
97 | 97 | if (!_order) { |
98 | | _order = new typename Graph::template NodeMap<int>(_graph); |
| 98 | _order = new typename Graph::template NodeMap<int>(_graph); |
99 | 99 | } |
100 | 100 | } |
… |
… |
|
102 | 102 | void destroyStructures() { |
103 | 103 | if (_pred) { |
104 | | delete _pred; |
| 104 | delete _pred; |
105 | 105 | } |
106 | 106 | if (_weight) { |
107 | | delete _weight; |
| 107 | delete _weight; |
108 | 108 | } |
109 | 109 | if (_order) { |
110 | | delete _order; |
111 | | } |
112 | | } |
113 | | |
| 110 | delete _order; |
| 111 | } |
| 112 | } |
| 113 | |
114 | 114 | public: |
115 | 115 | |
… |
… |
|
119 | 119 | /// \param graph The undirected graph the algorithm runs on. |
120 | 120 | /// \param capacity The edge capacity map. |
121 | | GomoryHu(const Graph& graph, const Capacity& capacity) |
| 121 | GomoryHu(const Graph& graph, const Capacity& capacity) |
122 | 122 | : _graph(graph), _capacity(capacity), |
123 | | _pred(0), _weight(0), _order(0) |
| 123 | _pred(0), _weight(0), _order(0) |
124 | 124 | { |
125 | 125 | checkConcept<concepts::ReadMap<Edge, Value>, Capacity>(); |
… |
… |
|
135 | 135 | |
136 | 136 | private: |
137 | | |
| 137 | |
138 | 138 | // Initialize the internal data structures |
139 | 139 | void init() { |
… |
… |
|
146 | 146 | } |
147 | 147 | (*_pred)[_root] = INVALID; |
148 | | (*_weight)[_root] = std::numeric_limits<Value>::max(); |
| 148 | (*_weight)[_root] = std::numeric_limits<Value>::max(); |
149 | 149 | } |
150 | 150 | |
… |
… |
|
155 | 155 | |
156 | 156 | for (NodeIt n(_graph); n != INVALID; ++n) { |
157 | | if (n == _root) continue; |
158 | | |
159 | | Node pn = (*_pred)[n]; |
160 | | fa.source(n); |
161 | | fa.target(pn); |
162 | | |
163 | | fa.runMinCut(); |
164 | | |
165 | | (*_weight)[n] = fa.flowValue(); |
166 | | |
167 | | for (NodeIt nn(_graph); nn != INVALID; ++nn) { |
168 | | if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) { |
169 | | (*_pred)[nn] = n; |
170 | | } |
171 | | } |
172 | | if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) { |
173 | | (*_pred)[n] = (*_pred)[pn]; |
174 | | (*_pred)[pn] = n; |
175 | | (*_weight)[n] = (*_weight)[pn]; |
176 | | (*_weight)[pn] = fa.flowValue(); |
177 | | } |
| 157 | if (n == _root) continue; |
| 158 | |
| 159 | Node pn = (*_pred)[n]; |
| 160 | fa.source(n); |
| 161 | fa.target(pn); |
| 162 | |
| 163 | fa.runMinCut(); |
| 164 | |
| 165 | (*_weight)[n] = fa.flowValue(); |
| 166 | |
| 167 | for (NodeIt nn(_graph); nn != INVALID; ++nn) { |
| 168 | if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) { |
| 169 | (*_pred)[nn] = n; |
| 170 | } |
| 171 | } |
| 172 | if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) { |
| 173 | (*_pred)[n] = (*_pred)[pn]; |
| 174 | (*_pred)[pn] = n; |
| 175 | (*_weight)[n] = (*_weight)[pn]; |
| 176 | (*_weight)[pn] = fa.flowValue(); |
| 177 | } |
178 | 178 | } |
179 | 179 | |
… |
… |
|
182 | 182 | |
183 | 183 | for (NodeIt n(_graph); n != INVALID; ++n) { |
184 | | std::vector<Node> st; |
185 | | Node nn = n; |
186 | | while ((*_order)[nn] == -1) { |
187 | | st.push_back(nn); |
188 | | nn = (*_pred)[nn]; |
189 | | } |
190 | | while (!st.empty()) { |
191 | | (*_order)[st.back()] = index++; |
192 | | st.pop_back(); |
193 | | } |
| 184 | std::vector<Node> st; |
| 185 | Node nn = n; |
| 186 | while ((*_order)[nn] == -1) { |
| 187 | st.push_back(nn); |
| 188 | nn = (*_pred)[nn]; |
| 189 | } |
| 190 | while (!st.empty()) { |
| 191 | (*_order)[st.back()] = index++; |
| 192 | st.pop_back(); |
| 193 | } |
194 | 194 | } |
195 | 195 | } |
… |
… |
|
198 | 198 | |
199 | 199 | ///\name Execution Control |
200 | | |
| 200 | |
201 | 201 | ///@{ |
202 | 202 | |
… |
… |
|
208 | 208 | start(); |
209 | 209 | } |
210 | | |
| 210 | |
211 | 211 | /// @} |
212 | 212 | |
… |
… |
|
233 | 233 | /// Gomory-Hu tree. |
234 | 234 | /// |
235 | | /// This function returns the weight of the predecessor edge of the |
| 235 | /// This function returns the weight of the predecessor edge of the |
236 | 236 | /// given node in the Gomory-Hu tree. |
237 | 237 | /// If \c node is the root of the tree, the result is undefined. |
… |
… |
|
255 | 255 | /// |
256 | 256 | /// This function returns the minimum cut value between the nodes |
257 | | /// \c s and \c t. |
| 257 | /// \c s and \c t. |
258 | 258 | /// It finds the nearest common ancestor of the given nodes in the |
259 | 259 | /// Gomory-Hu tree and calculates the minimum weight edge on the |
… |
… |
|
264 | 264 | Node sn = s, tn = t; |
265 | 265 | Value value = std::numeric_limits<Value>::max(); |
266 | | |
| 266 | |
267 | 267 | while (sn != tn) { |
268 | | if ((*_order)[sn] < (*_order)[tn]) { |
269 | | if ((*_weight)[tn] <= value) value = (*_weight)[tn]; |
270 | | tn = (*_pred)[tn]; |
271 | | } else { |
272 | | if ((*_weight)[sn] <= value) value = (*_weight)[sn]; |
273 | | sn = (*_pred)[sn]; |
274 | | } |
| 268 | if ((*_order)[sn] < (*_order)[tn]) { |
| 269 | if ((*_weight)[tn] <= value) value = (*_weight)[tn]; |
| 270 | tn = (*_pred)[tn]; |
| 271 | } else { |
| 272 | if ((*_weight)[sn] <= value) value = (*_weight)[sn]; |
| 273 | sn = (*_pred)[sn]; |
| 274 | } |
275 | 275 | } |
276 | 276 | return value; |
… |
… |
|
303 | 303 | Node rn = INVALID; |
304 | 304 | Value value = std::numeric_limits<Value>::max(); |
305 | | |
| 305 | |
306 | 306 | while (sn != tn) { |
307 | | if ((*_order)[sn] < (*_order)[tn]) { |
308 | | if ((*_weight)[tn] <= value) { |
309 | | rn = tn; |
| 307 | if ((*_order)[sn] < (*_order)[tn]) { |
| 308 | if ((*_weight)[tn] <= value) { |
| 309 | rn = tn; |
310 | 310 | s_root = false; |
311 | | value = (*_weight)[tn]; |
312 | | } |
313 | | tn = (*_pred)[tn]; |
314 | | } else { |
315 | | if ((*_weight)[sn] <= value) { |
316 | | rn = sn; |
| 311 | value = (*_weight)[tn]; |
| 312 | } |
| 313 | tn = (*_pred)[tn]; |
| 314 | } else { |
| 315 | if ((*_weight)[sn] <= value) { |
| 316 | rn = sn; |
317 | 317 | s_root = true; |
318 | | value = (*_weight)[sn]; |
319 | | } |
320 | | sn = (*_pred)[sn]; |
321 | | } |
| 318 | value = (*_weight)[sn]; |
| 319 | } |
| 320 | sn = (*_pred)[sn]; |
| 321 | } |
322 | 322 | } |
323 | 323 | |
… |
… |
|
330 | 330 | std::vector<Node> st; |
331 | 331 | for (NodeIt n(_graph); n != INVALID; ++n) { |
332 | | st.clear(); |
| 332 | st.clear(); |
333 | 333 | Node nn = n; |
334 | | while (!reached[nn]) { |
335 | | st.push_back(nn); |
336 | | nn = (*_pred)[nn]; |
337 | | } |
338 | | while (!st.empty()) { |
339 | | cutMap.set(st.back(), cutMap[nn]); |
340 | | st.pop_back(); |
341 | | } |
342 | | } |
343 | | |
| 334 | while (!reached[nn]) { |
| 335 | st.push_back(nn); |
| 336 | nn = (*_pred)[nn]; |
| 337 | } |
| 338 | while (!st.empty()) { |
| 339 | cutMap.set(st.back(), cutMap[nn]); |
| 340 | st.pop_back(); |
| 341 | } |
| 342 | } |
| 343 | |
344 | 344 | return value; |
345 | 345 | } |
… |
… |
|
350 | 350 | |
351 | 351 | /// Iterate on the nodes of a minimum cut |
352 | | |
| 352 | |
353 | 353 | /// This iterator class lists the nodes of a minimum cut found by |
354 | 354 | /// GomoryHu. Before using it, you must allocate a GomoryHu class |
… |
… |
|
443 | 443 | } |
444 | 444 | }; |
445 | | |
| 445 | |
446 | 446 | friend class MinCutEdgeIt; |
447 | | |
| 447 | |
448 | 448 | /// Iterate on the edges of a minimum cut |
449 | | |
| 449 | |
450 | 450 | /// This iterator class lists the edges of a minimum cut found by |
451 | 451 | /// GomoryHu. Before using it, you must allocate a GomoryHu class |
… |
… |
|
480 | 480 | } |
481 | 481 | } |
482 | | |
| 482 | |
483 | 483 | public: |
484 | 484 | /// Constructor |
… |
… |
|
549 | 549 | } |
550 | 550 | /// Postfix incrementation |
551 | | |
| 551 | |
552 | 552 | /// Postfix incrementation. |
553 | 553 | /// |
-
r909
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r934
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
32 | 32 | /// \brief Implementation of the Hao-Orlin algorithm. |
33 | 33 | /// |
34 | | /// Implementation of the Hao-Orlin algorithm for finding a minimum cut |
| 34 | /// Implementation of the Hao-Orlin algorithm for finding a minimum cut |
35 | 35 | /// in a digraph. |
36 | 36 | |
… |
… |
|
42 | 42 | /// |
43 | 43 | /// This class implements the Hao-Orlin algorithm for finding a minimum |
44 | | /// value cut in a directed graph \f$D=(V,A)\f$. |
| 44 | /// value cut in a directed graph \f$D=(V,A)\f$. |
45 | 45 | /// It takes a fixed node \f$ source \in V \f$ and |
46 | 46 | /// consists of two phases: in the first phase it determines a |
… |
… |
|
59 | 59 | /// For an undirected graph you can run just the first phase of the |
60 | 60 | /// algorithm or you can use the algorithm of Nagamochi and Ibaraki, |
61 | | /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ |
| 61 | /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ |
62 | 62 | /// time. It is implemented in the NagamochiIbaraki algorithm class. |
63 | 63 | /// |
… |
… |
|
77 | 77 | class HaoOrlin { |
78 | 78 | public: |
79 | | |
| 79 | |
80 | 80 | /// The digraph type of the algorithm |
81 | 81 | typedef GR Digraph; |
… |
… |
|
865 | 865 | /// |
866 | 866 | /// This function initializes the internal data structures. It creates |
867 | | /// the maps and some bucket structures for the algorithm. |
| 867 | /// the maps and some bucket structures for the algorithm. |
868 | 868 | /// The given node is used as the source node for the push-relabel |
869 | 869 | /// algorithm. |
… |
… |
|
945 | 945 | /// \brief Run the algorithm. |
946 | 946 | /// |
947 | | /// This function runs the algorithm. It uses the given \c source node, |
| 947 | /// This function runs the algorithm. It uses the given \c source node, |
948 | 948 | /// finds a proper \c target node and then calls the \ref init(), |
949 | 949 | /// \ref calculateOut() and \ref calculateIn(). |
… |
… |
|
959 | 959 | /// The result of the %HaoOrlin algorithm |
960 | 960 | /// can be obtained using these functions.\n |
961 | | /// \ref run(), \ref calculateOut() or \ref calculateIn() |
| 961 | /// \ref run(), \ref calculateOut() or \ref calculateIn() |
962 | 962 | /// should be called before using them. |
963 | 963 | |
… |
… |
|
968 | 968 | /// This function returns the value of the minimum cut. |
969 | 969 | /// |
970 | | /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() |
| 970 | /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() |
971 | 971 | /// must be called before using this function. |
972 | 972 | Value minCutValue() const { |
… |
… |
|
987 | 987 | /// \return The value of the minimum cut. |
988 | 988 | /// |
989 | | /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() |
| 989 | /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() |
990 | 990 | /// must be called before using this function. |
991 | 991 | template <typename CutMap> |
-
r942
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
344 | 344 | init(); |
345 | 345 | findComponents(); |
346 | | |
| 346 | |
347 | 347 | // Find the minimum cycle mean in the components |
348 | 348 | for (int comp = 0; comp < _comp_num; ++comp) { |
349 | 349 | if (!initComponent(comp)) continue; |
350 | 350 | processRounds(); |
351 | | |
| 351 | |
352 | 352 | // Update the best cycle (global minimum mean cycle) |
353 | | if ( _curr_found && (!_best_found || |
| 353 | if ( _curr_found && (!_best_found || |
354 | 354 | _curr_cost * _best_size < _best_cost * _curr_size) ) { |
355 | 355 | _best_found = true; |
… |
… |
|
504 | 504 | if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) { |
505 | 505 | return false; |
506 | | } |
| 506 | } |
507 | 507 | for (int i = 0; i < n; ++i) { |
508 | 508 | _data[(*_nodes)[i]].resize(n + 1, PathData(INF)); |
… |
… |
|
577 | 577 | } |
578 | 578 | } |
579 | | |
| 579 | |
580 | 580 | // Check early termination |
581 | 581 | bool checkTermination(int k) { |
… |
… |
|
587 | 587 | int size; |
588 | 588 | Node u; |
589 | | |
| 589 | |
590 | 590 | // Search for cycles that are already found |
591 | 591 | _curr_found = false; |
… |
… |
|
608 | 608 | level[u] = Pair(i, j); |
609 | 609 | if (j != 0) { |
610 | | u = _gr.source(_data[u][j].pred); |
611 | | } |
| 610 | u = _gr.source(_data[u][j].pred); |
| 611 | } |
612 | 612 | } |
613 | 613 | } |
-
r942
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
122 | 122 | { |
123 | 123 | public: |
124 | | |
| 124 | |
125 | 125 | /// The type of the digraph |
126 | 126 | typedef typename TR::Digraph Digraph; |
… |
… |
|
153 | 153 | |
154 | 154 | TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
155 | | |
| 155 | |
156 | 156 | // The digraph the algorithm runs on |
157 | 157 | const Digraph &_gr; |
… |
… |
|
180 | 180 | std::vector<Node>* _nodes; |
181 | 181 | typename Digraph::template NodeMap<std::vector<Arc> > _in_arcs; |
182 | | |
| 182 | |
183 | 183 | // Queue used for BFS search |
184 | 184 | std::vector<Node> _queue; |
… |
… |
|
186 | 186 | |
187 | 187 | Tolerance _tolerance; |
188 | | |
| 188 | |
189 | 189 | // Infinite constant |
190 | 190 | const LargeCost INF; |
191 | 191 | |
192 | 192 | public: |
193 | | |
| 193 | |
194 | 194 | /// \name Named Template Parameters |
195 | 195 | /// @{ |
… |
… |
|
229 | 229 | typedef HowardMmc<GR, CM, SetPathTraits<T> > Create; |
230 | 230 | }; |
231 | | |
| 231 | |
232 | 232 | /// @} |
233 | 233 | |
… |
… |
|
335 | 335 | init(); |
336 | 336 | findComponents(); |
337 | | |
| 337 | |
338 | 338 | // Find the minimum cycle mean in the components |
339 | 339 | for (int comp = 0; comp < _comp_num; ++comp) { |
… |
… |
|
446 | 446 | _cycle_path->clear(); |
447 | 447 | } |
448 | | |
| 448 | |
449 | 449 | // Find strongly connected components and initialize _comp_nodes |
450 | 450 | // and _in_arcs |
-
r942
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
192 | 192 | |
193 | 193 | Tolerance _tolerance; |
194 | | |
| 194 | |
195 | 195 | // Infinite constant |
196 | 196 | const LargeCost INF; |
… |
… |
|
340 | 340 | init(); |
341 | 341 | findComponents(); |
342 | | |
| 342 | |
343 | 343 | // Find the minimum cycle mean in the components |
344 | 344 | for (int comp = 0; comp < _comp_num; ++comp) { |
… |
… |
|
490 | 490 | if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) { |
491 | 491 | return false; |
492 | | } |
| 492 | } |
493 | 493 | for (int i = 0; i < n; ++i) { |
494 | 494 | _data[(*_nodes)[i]].resize(n + 1, PathData(INF)); |
-
r833
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
563 | 563 | friend DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is); |
564 | 564 | template <typename TDGR> |
565 | | friend DigraphReader<TDGR> digraphReader(TDGR& digraph, |
| 565 | friend DigraphReader<TDGR> digraphReader(TDGR& digraph, |
566 | 566 | const std::string& fn); |
567 | 567 | template <typename TDGR> |
… |
… |
|
1188 | 1188 | |
1189 | 1189 | }; |
1190 | | |
| 1190 | |
1191 | 1191 | /// \ingroup lemon_io |
1192 | 1192 | /// |
… |
… |
|
1195 | 1195 | /// This function just returns a \ref DigraphReader class. |
1196 | 1196 | /// |
1197 | | /// With this function a digraph can be read from an |
| 1197 | /// With this function a digraph can be read from an |
1198 | 1198 | /// \ref lgf-format "LGF" file or input stream with several maps and |
1199 | 1199 | /// attributes. For example, there is network flow problem on a |
… |
… |
|
1250 | 1250 | template <typename GR> |
1251 | 1251 | class GraphReader; |
1252 | | |
| 1252 | |
1253 | 1253 | template <typename TGR> |
1254 | 1254 | GraphReader<TGR> graphReader(TGR& graph, std::istream& is = std::cin); |
… |
… |
|
1387 | 1387 | friend GraphReader<TGR> graphReader(TGR& graph, std::istream& is); |
1388 | 1388 | template <typename TGR> |
1389 | | friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); |
| 1389 | friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); |
1390 | 1390 | template <typename TGR> |
1391 | 1391 | friend GraphReader<TGR> graphReader(TGR& graph, const char *fn); |
… |
… |
|
2064 | 2064 | /// \brief Return a \ref GraphReader class |
2065 | 2065 | /// |
2066 | | /// This function just returns a \ref GraphReader class. |
2067 | | /// |
2068 | | /// With this function a graph can be read from an |
| 2066 | /// This function just returns a \ref GraphReader class. |
| 2067 | /// |
| 2068 | /// With this function a graph can be read from an |
2069 | 2069 | /// \ref lgf-format "LGF" file or input stream with several maps and |
2070 | 2070 | /// attributes. For example, there is weighted matching problem on a |
-
r646
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
352 | 352 | |
353 | 353 | template <typename TDGR> |
354 | | DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
| 354 | DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
355 | 355 | std::ostream& os = std::cout); |
356 | 356 | template <typename TDGR> |
… |
… |
|
505 | 505 | |
506 | 506 | template <typename TDGR> |
507 | | friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
| 507 | friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
508 | 508 | std::ostream& os); |
509 | 509 | template <typename TDGR> |
… |
… |
|
918 | 918 | /// \brief Return a \ref DigraphWriter class |
919 | 919 | /// |
920 | | /// This function just returns a \ref DigraphWriter class. |
| 920 | /// This function just returns a \ref DigraphWriter class. |
921 | 921 | /// |
922 | 922 | /// With this function a digraph can be write to a file or output |
… |
… |
|
958 | 958 | /// \sa digraphWriter(const TDGR& digraph, std::ostream& os) |
959 | 959 | template <typename TDGR> |
960 | | DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
| 960 | DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, |
961 | 961 | const std::string& fn) { |
962 | 962 | DigraphWriter<TDGR> tmp(digraph, fn); |
… |
… |
|
1102 | 1102 | friend GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os); |
1103 | 1103 | template <typename TGR> |
1104 | | friend GraphWriter<TGR> graphWriter(const TGR& graph, |
| 1104 | friend GraphWriter<TGR> graphWriter(const TGR& graph, |
1105 | 1105 | const std::string& fn); |
1106 | 1106 | template <typename TGR> |
1107 | 1107 | friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn); |
1108 | | |
| 1108 | |
1109 | 1109 | GraphWriter(GraphWriter& other) |
1110 | 1110 | : _os(other._os), local_os(other.local_os), _graph(other._graph), |
… |
… |
|
1557 | 1557 | /// \brief Return a \ref GraphWriter class |
1558 | 1558 | /// |
1559 | | /// This function just returns a \ref GraphWriter class. |
| 1559 | /// This function just returns a \ref GraphWriter class. |
1560 | 1560 | /// |
1561 | 1561 | /// With this function a graph can be write to a file or output |
-
r835
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
447 | 447 | ///invalidated for the outgoing arcs of node \c v and \c InArcIt |
448 | 448 | ///iterators are invalidated for the incomming arcs of \c v. |
449 | | ///Moreover all iterators referencing node \c v or the removed |
| 449 | ///Moreover all iterators referencing node \c v or the removed |
450 | 450 | ///loops are also invalidated. Other iterators remain valid. |
451 | 451 | /// |
… |
… |
|
553 | 553 | /// restore() function. |
554 | 554 | /// |
555 | | /// \note After a state is restored, you cannot restore a later state, |
| 555 | /// \note After a state is restored, you cannot restore a later state, |
556 | 556 | /// i.e. you cannot add the removed nodes and arcs again using |
557 | 557 | /// another Snapshot instance. |
… |
… |
|
1308 | 1308 | /// or changeV(), thus all edge and arc iterators whose base node is |
1309 | 1309 | /// \c b are invalidated. |
1310 | | /// Moreover all iterators referencing node \c b or the removed |
| 1310 | /// Moreover all iterators referencing node \c b or the removed |
1311 | 1311 | /// loops are also invalidated. Other iterators remain valid. |
1312 | 1312 | /// |
… |
… |
|
1365 | 1365 | /// using the restore() function. |
1366 | 1366 | /// |
1367 | | /// \note After a state is restored, you cannot restore a later state, |
| 1367 | /// \note After a state is restored, you cannot restore a later state, |
1368 | 1368 | /// i.e. you cannot add the removed nodes and edges again using |
1369 | 1369 | /// another Snapshot instance. |
-
r674
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
85 | 85 | #elif LEMON_HAVE_CLP |
86 | 86 | # define DEFAULT_LP CLP |
87 | | typedef ClpLp Lp; |
| 87 | typedef ClpLp Lp; |
88 | 88 | #endif |
89 | 89 | #endif |
-
r557
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r903
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
83 | 83 | MESSAGE_VERBOSE |
84 | 84 | }; |
85 | | |
| 85 | |
86 | 86 | |
87 | 87 | ///The floating point type used by the solver |
… |
… |
|
115 | 115 | typedef True LpCol; |
116 | 116 | /// Default constructor |
117 | | |
| 117 | |
118 | 118 | /// \warning The default constructor sets the Col to an |
119 | 119 | /// undefined value. |
120 | 120 | Col() {} |
121 | 121 | /// Invalid constructor \& conversion. |
122 | | |
| 122 | |
123 | 123 | /// This constructor initializes the Col to be invalid. |
124 | | /// \sa Invalid for more details. |
| 124 | /// \sa Invalid for more details. |
125 | 125 | Col(const Invalid&) : _id(-1) {} |
126 | 126 | /// Equality operator |
… |
… |
|
157 | 157 | public: |
158 | 158 | /// Default constructor |
159 | | |
| 159 | |
160 | 160 | /// \warning The default constructor sets the iterator |
161 | 161 | /// to an undefined value. |
162 | 162 | ColIt() {} |
163 | 163 | /// Sets the iterator to the first Col |
164 | | |
| 164 | |
165 | 165 | /// Sets the iterator to the first Col. |
166 | 166 | /// |
… |
… |
|
170 | 170 | } |
171 | 171 | /// Invalid constructor \& conversion |
172 | | |
| 172 | |
173 | 173 | /// Initialize the iterator to be invalid. |
174 | 174 | /// \sa Invalid for more details. |
175 | 175 | ColIt(const Invalid&) : Col(INVALID) {} |
176 | 176 | /// Next column |
177 | | |
| 177 | |
178 | 178 | /// Assign the iterator to the next column. |
179 | 179 | /// |
… |
… |
|
210 | 210 | typedef True LpRow; |
211 | 211 | /// Default constructor |
212 | | |
| 212 | |
213 | 213 | /// \warning The default constructor sets the Row to an |
214 | 214 | /// undefined value. |
215 | 215 | Row() {} |
216 | 216 | /// Invalid constructor \& conversion. |
217 | | |
| 217 | |
218 | 218 | /// This constructor initializes the Row to be invalid. |
219 | | /// \sa Invalid for more details. |
| 219 | /// \sa Invalid for more details. |
220 | 220 | Row(const Invalid&) : _id(-1) {} |
221 | 221 | /// Equality operator |
… |
… |
|
225 | 225 | bool operator==(Row r) const {return _id == r._id;} |
226 | 226 | /// Inequality operator |
227 | | |
| 227 | |
228 | 228 | /// \sa operator==(Row r) |
229 | 229 | /// |
… |
… |
|
252 | 252 | public: |
253 | 253 | /// Default constructor |
254 | | |
| 254 | |
255 | 255 | /// \warning The default constructor sets the iterator |
256 | 256 | /// to an undefined value. |
257 | 257 | RowIt() {} |
258 | 258 | /// Sets the iterator to the first Row |
259 | | |
| 259 | |
260 | 260 | /// Sets the iterator to the first Row. |
261 | 261 | /// |
… |
… |
|
265 | 265 | } |
266 | 266 | /// Invalid constructor \& conversion |
267 | | |
| 267 | |
268 | 268 | /// Initialize the iterator to be invalid. |
269 | 269 | /// \sa Invalid for more details. |
270 | 270 | RowIt(const Invalid&) : Row(INVALID) {} |
271 | 271 | /// Next row |
272 | | |
| 272 | |
273 | 273 | /// Assign the iterator to the next row. |
274 | 274 | /// |
… |
… |
|
348 | 348 | typedef True SolverExpr; |
349 | 349 | /// Default constructor |
350 | | |
| 350 | |
351 | 351 | /// Construct an empty expression, the coefficients and |
352 | 352 | /// the constant component are initialized to zero. |
… |
… |
|
449 | 449 | |
450 | 450 | ///Iterator over the expression |
451 | | |
452 | | ///The iterator iterates over the terms of the expression. |
453 | | /// |
| 451 | |
| 452 | ///The iterator iterates over the terms of the expression. |
| 453 | /// |
454 | 454 | ///\code |
455 | 455 | ///double s=0; |
… |
… |
|
465 | 465 | |
466 | 466 | /// Sets the iterator to the first term |
467 | | |
| 467 | |
468 | 468 | /// Sets the iterator to the first term of the expression. |
469 | 469 | /// |
… |
… |
|
482 | 482 | const Value& operator*() const { return _it->second; } |
483 | 483 | /// Next term |
484 | | |
| 484 | |
485 | 485 | /// Assign the iterator to the next term. |
486 | 486 | /// |
… |
… |
|
494 | 494 | |
495 | 495 | /// Const iterator over the expression |
496 | | |
497 | | ///The iterator iterates over the terms of the expression. |
498 | | /// |
| 496 | |
| 497 | ///The iterator iterates over the terms of the expression. |
| 498 | /// |
499 | 499 | ///\code |
500 | 500 | ///double s=0; |
… |
… |
|
510 | 510 | |
511 | 511 | /// Sets the iterator to the first term |
512 | | |
| 512 | |
513 | 513 | /// Sets the iterator to the first term of the expression. |
514 | 514 | /// |
… |
… |
|
525 | 525 | |
526 | 526 | /// Next term |
527 | | |
| 527 | |
528 | 528 | /// Assign the iterator to the next term. |
529 | 529 | /// |
… |
… |
|
674 | 674 | typedef True SolverExpr; |
675 | 675 | /// Default constructor |
676 | | |
| 676 | |
677 | 677 | /// Construct an empty expression, the coefficients are |
678 | 678 | /// initialized to zero. |
… |
… |
|
709 | 709 | } |
710 | 710 | /// \brief Removes the coefficients which's absolute value does |
711 | | /// not exceed \c epsilon. |
| 711 | /// not exceed \c epsilon. |
712 | 712 | void simplify(Value epsilon = 0.0) { |
713 | 713 | std::map<int, Value>::iterator it=comps.begin(); |
… |
… |
|
758 | 758 | |
759 | 759 | ///Iterator over the expression |
760 | | |
761 | | ///The iterator iterates over the terms of the expression. |
762 | | /// |
| 760 | |
| 761 | ///The iterator iterates over the terms of the expression. |
| 762 | /// |
763 | 763 | ///\code |
764 | 764 | ///double s=0; |
… |
… |
|
774 | 774 | |
775 | 775 | /// Sets the iterator to the first term |
776 | | |
| 776 | |
777 | 777 | /// Sets the iterator to the first term of the expression. |
778 | 778 | /// |
… |
… |
|
792 | 792 | |
793 | 793 | /// Next term |
794 | | |
| 794 | |
795 | 795 | /// Assign the iterator to the next term. |
796 | 796 | /// |
… |
… |
|
804 | 804 | |
805 | 805 | ///Iterator over the expression |
806 | | |
807 | | ///The iterator iterates over the terms of the expression. |
808 | | /// |
| 806 | |
| 807 | ///The iterator iterates over the terms of the expression. |
| 808 | /// |
809 | 809 | ///\code |
810 | 810 | ///double s=0; |
… |
… |
|
820 | 820 | |
821 | 821 | /// Sets the iterator to the first term |
822 | | |
| 822 | |
823 | 823 | /// Sets the iterator to the first term of the expression. |
824 | 824 | /// |
… |
… |
|
835 | 835 | |
836 | 836 | /// Next term |
837 | | |
| 837 | |
838 | 838 | /// Assign the iterator to the next term. |
839 | 839 | /// |
… |
… |
|
1230 | 1230 | Row r; |
1231 | 1231 | c.expr().simplify(); |
1232 | | r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, |
| 1232 | r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, |
1233 | 1233 | ExprIterator(c.expr().comps.begin(), cols), |
1234 | 1234 | ExprIterator(c.expr().comps.end(), cols), |
… |
… |
|
1818 | 1818 | enum VarStatus { |
1819 | 1819 | /// The variable is in the basis |
1820 | | BASIC, |
| 1820 | BASIC, |
1821 | 1821 | /// The variable is free, but not basic |
1822 | 1822 | FREE, |
1823 | | /// The variable has active lower bound |
| 1823 | /// The variable has active lower bound |
1824 | 1824 | LOWER, |
1825 | 1825 | /// The variable has active upper bound |
… |
… |
|
1900 | 1900 | } |
1901 | 1901 | /// Returns a component of the primal ray |
1902 | | |
| 1902 | |
1903 | 1903 | /// The primal ray is solution of the modified primal problem, |
1904 | 1904 | /// where we change each finite bound to 0, and we looking for a |
… |
… |
|
1934 | 1934 | |
1935 | 1935 | /// Returns a component of the dual ray |
1936 | | |
| 1936 | |
1937 | 1937 | /// The dual ray is solution of the modified primal problem, where |
1938 | 1938 | /// we change each finite bound to 0 (i.e. the objective function |
… |
… |
|
2076 | 2076 | } |
2077 | 2077 | ///The value of the objective function |
2078 | | |
| 2078 | |
2079 | 2079 | ///\return |
2080 | 2080 | ///- \ref INF or -\ref INF means either infeasibility or unboundedness |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
24 | 24 | ///\file |
25 | 25 | ///\brief Skeleton file to implement LP/MIP solver interfaces |
26 | | /// |
| 26 | /// |
27 | 27 | ///The classes in this file do nothing, but they can serve as skeletons when |
28 | 28 | ///implementing an interface to new solvers. |
… |
… |
|
30 | 30 | |
31 | 31 | ///A skeleton class to implement LP/MIP solver base interface |
32 | | |
| 32 | |
33 | 33 | ///This class does nothing, but it can serve as a skeleton when |
34 | 34 | ///implementing an interface to new solvers. |
-
r839
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
234 | 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() |
… |
… |
|
1917 | 1917 | /// \c InverseMap or \c operator()(), and the values of the map can be |
1918 | 1918 | /// accessed with an STL compatible forward iterator (\c ValueIt). |
1919 | | /// |
| 1919 | /// |
1920 | 1920 | /// This map is intended to be used when all associated values are |
1921 | 1921 | /// different (the map is actually invertable) or there are only a few |
1922 | 1922 | /// items with the same value. |
1923 | | /// Otherwise consider to use \c IterableValueMap, which is more |
| 1923 | /// Otherwise consider to use \c IterableValueMap, which is more |
1924 | 1924 | /// suitable and more efficient for such cases. It provides iterators |
1925 | 1925 | /// to traverse the items with the same associated value, but |
… |
… |
|
2003 | 2003 | typename Container::const_iterator it; |
2004 | 2004 | }; |
2005 | | |
| 2005 | |
2006 | 2006 | /// Alias for \c ValueIt |
2007 | 2007 | typedef ValueIt ValueIterator; |
… |
… |
|
2062 | 2062 | return it != _inv_map.end() ? it->second : INVALID; |
2063 | 2063 | } |
2064 | | |
| 2064 | |
2065 | 2065 | /// \brief Returns the number of items with the given value. |
2066 | 2066 | /// |
… |
… |
|
2379 | 2379 | return RangeIdMap<GR, K>(graph); |
2380 | 2380 | } |
2381 | | |
| 2381 | |
2382 | 2382 | /// \brief Dynamic iterable \c bool map. |
2383 | 2383 | /// |
… |
… |
|
2639 | 2639 | /// \param value The value. |
2640 | 2640 | ItemIt(const IterableBoolMap& map, bool value) |
2641 | | : Parent(value ? |
| 2641 | : Parent(value ? |
2642 | 2642 | (map._sep > 0 ? |
2643 | 2643 | map._array[map._sep - 1] : INVALID) : |
… |
… |
|
3787 | 3787 | typedef typename To::Key Item; |
3788 | 3788 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3789 | | |
| 3789 | |
3790 | 3790 | for (ItemIt it(gr); it != INVALID; ++it) { |
3791 | 3791 | to.set(it, from[it]); |
… |
… |
|
3795 | 3795 | /// \brief Compare two graph maps. |
3796 | 3796 | /// |
3797 | | /// This function compares the values of two graph maps. It returns |
| 3797 | /// This function compares the values of two graph maps. It returns |
3798 | 3798 | /// \c true if the maps assign the same value for all items in the graph. |
3799 | 3799 | /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal |
… |
… |
|
3807 | 3807 | typedef typename Map2::Key Item; |
3808 | 3808 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3809 | | |
| 3809 | |
3810 | 3810 | for (ItemIt it(gr); it != INVALID; ++it) { |
3811 | 3811 | if (!(map1[it] == map2[it])) return false; |
-
r955
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
1624 | 1624 | (*_delta4_index)[i] = _delta4->PRE_HEAP; |
1625 | 1625 | } |
1626 | | |
| 1626 | |
1627 | 1627 | _unmatched = _node_num; |
1628 | 1628 | |
… |
… |
|
1679 | 1679 | _blossom_node_list.clear(); |
1680 | 1680 | _blossom_potential.clear(); |
1681 | | |
| 1681 | |
1682 | 1682 | if (_fractional == 0) { |
1683 | 1683 | _fractional = new FractionalMatching(_graph, _weight, false); |
… |
… |
|
1751 | 1751 | subblossoms[--num] = _blossom_set->find(v); |
1752 | 1752 | _delta1->push(v, _fractional->nodeValue(v)); |
1753 | | v = _graph.target(_fractional->matching(v)); |
| 1753 | v = _graph.target(_fractional->matching(v)); |
1754 | 1754 | } |
1755 | | |
1756 | | int surface = |
| 1755 | |
| 1756 | int surface = |
1757 | 1757 | _blossom_set->join(subblossoms.begin(), subblossoms.end()); |
1758 | 1758 | (*_blossom_data)[surface].status = EVEN; |
… |
… |
|
1761 | 1761 | (*_blossom_data)[surface].pot = 0; |
1762 | 1762 | (*_blossom_data)[surface].offset = 0; |
1763 | | |
| 1763 | |
1764 | 1764 | _tree_set->insert(surface); |
1765 | 1765 | ++_unmatched; |
… |
… |
|
1811 | 1811 | } |
1812 | 1812 | } |
1813 | | |
| 1813 | |
1814 | 1814 | if (!(*_node_data)[ni].heap.empty()) { |
1815 | 1815 | _blossom_set->decrease(n, (*_node_data)[ni].heap.prio()); |
… |
… |
|
2270 | 2270 | int _unmatched; |
2271 | 2271 | |
2272 | | typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap> |
| 2272 | typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap> |
2273 | 2273 | FractionalMatching; |
2274 | 2274 | FractionalMatching *_fractional; |
… |
… |
|
3096 | 3096 | _blossom_node_list.clear(); |
3097 | 3097 | _blossom_potential.clear(); |
3098 | | |
| 3098 | |
3099 | 3099 | if (_fractional == 0) { |
3100 | 3100 | _fractional = new FractionalMatching(_graph, _weight, false); |
… |
… |
|
3162 | 3162 | while (n != v) { |
3163 | 3163 | subblossoms[--num] = _blossom_set->find(v); |
3164 | | v = _graph.target(_fractional->matching(v)); |
| 3164 | v = _graph.target(_fractional->matching(v)); |
3165 | 3165 | } |
3166 | | |
3167 | | int surface = |
| 3166 | |
| 3167 | int surface = |
3168 | 3168 | _blossom_set->join(subblossoms.begin(), subblossoms.end()); |
3169 | 3169 | (*_blossom_data)[surface].status = EVEN; |
… |
… |
|
3172 | 3172 | (*_blossom_data)[surface].pot = 0; |
3173 | 3173 | (*_blossom_data)[surface].offset = 0; |
3174 | | |
| 3174 | |
3175 | 3175 | _tree_set->insert(surface); |
3176 | 3176 | ++_unmatched; |
… |
… |
|
3222 | 3222 | } |
3223 | 3223 | } |
3224 | | |
| 3224 | |
3225 | 3225 | if (!(*_node_data)[ni].heap.empty()) { |
3226 | 3226 | _blossom_set->decrease(n, (*_node_data)[ni].heap.prio()); |
-
r558
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
57 | 57 | |
58 | 58 | ///Check whether the parameter is NaN or not |
59 | | |
| 59 | |
60 | 60 | ///This function checks whether the parameter is NaN or not. |
61 | 61 | ///Is should be equivalent with std::isnan(), but it is not |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
129 | 129 | public: |
130 | 130 | |
131 | | /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" |
132 | | /// of the algorithm. |
| 131 | /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" |
| 132 | /// of the algorithm. |
133 | 133 | typedef TR Traits; |
134 | 134 | /// The type of the underlying digraph. |
… |
… |
|
437 | 437 | /// \ref named-templ-param "Named parameter" for setting |
438 | 438 | /// \c PredMap type. |
439 | | /// It must meet the \ref concepts::WriteMap "WriteMap" concept, |
| 439 | /// It must meet the \ref concepts::WriteMap "WriteMap" concept, |
440 | 440 | /// and its value type must be the \c Arc type of the digraph. |
441 | 441 | template <class T> |
-
r936
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
98 | 98 | UNBOUNDED |
99 | 99 | }; |
100 | | |
| 100 | |
101 | 101 | /// \brief Constants for selecting the type of the supply constraints. |
102 | 102 | /// |
… |
… |
|
116 | 116 | LEQ |
117 | 117 | }; |
118 | | |
| 118 | |
119 | 119 | /// \brief Constants for selecting the pivot rule. |
120 | 120 | /// |
… |
… |
|
159 | 159 | ALTERING_LIST |
160 | 160 | }; |
161 | | |
| 161 | |
162 | 162 | private: |
163 | 163 | |
… |
… |
|
228 | 228 | int stem, par_stem, new_stem; |
229 | 229 | Value delta; |
230 | | |
| 230 | |
231 | 231 | const Value MAX; |
232 | 232 | |
233 | 233 | public: |
234 | | |
| 234 | |
235 | 235 | /// \brief Constant for infinite upper bounds (capacities). |
236 | 236 | /// |
… |
… |
|
499 | 499 | } |
500 | 500 | if (_curr_length == 0) return false; |
501 | | |
502 | | search_end: |
| 501 | |
| 502 | search_end: |
503 | 503 | _minor_count = 1; |
504 | 504 | _next_arc = e; |
… |
… |
|
609 | 609 | } |
610 | 610 | if (_curr_length == 0) return false; |
611 | | |
| 611 | |
612 | 612 | search_end: |
613 | 613 | |
… |
… |
|
635 | 635 | /// \param graph The digraph the algorithm runs on. |
636 | 636 | /// \param arc_mixing Indicate if the arcs have to be stored in a |
637 | | /// mixed order in the internal data structure. |
| 637 | /// mixed order in the internal data structure. |
638 | 638 | /// In special cases, it could lead to better overall performance, |
639 | 639 | /// but it is usually slower. Therefore it is disabled by default. |
… |
… |
|
650 | 650 | LEMON_ASSERT(std::numeric_limits<Cost>::is_signed, |
651 | 651 | "The cost type of NetworkSimplex must be signed"); |
652 | | |
| 652 | |
653 | 653 | // Reset data structures |
654 | 654 | reset(); |
… |
… |
|
764 | 764 | return *this; |
765 | 765 | } |
766 | | |
| 766 | |
767 | 767 | /// \brief Set the type of the supply constraints. |
768 | 768 | /// |
… |
… |
|
790 | 790 | /// This function runs the algorithm. |
791 | 791 | /// The paramters can be specified using functions \ref lowerMap(), |
792 | | /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), |
| 792 | /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), |
793 | 793 | /// \ref supplyType(). |
794 | 794 | /// For example, |
… |
… |
|
945 | 945 | } |
946 | 946 | } |
947 | | |
| 947 | |
948 | 948 | // Reset parameters |
949 | 949 | resetParams(); |
950 | 950 | return *this; |
951 | 951 | } |
952 | | |
| 952 | |
953 | 953 | /// @} |
954 | 954 | |
… |
… |
|
1090 | 1090 | _state[i] = STATE_LOWER; |
1091 | 1091 | } |
1092 | | |
| 1092 | |
1093 | 1093 | // Set data for the artificial root node |
1094 | 1094 | _root = _node_num; |
… |
… |
|
1264 | 1264 | for (int u = second; u != join; u = _parent[u]) { |
1265 | 1265 | e = _pred[u]; |
1266 | | d = _forward[u] ? |
| 1266 | d = _forward[u] ? |
1267 | 1267 | (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e]; |
1268 | 1268 | if (d <= delta) { |
… |
… |
|
1568 | 1568 | } |
1569 | 1569 | } |
1570 | | |
| 1570 | |
1571 | 1571 | // Check feasibility |
1572 | 1572 | for (int e = _search_arc_num; e != _all_arc_num; ++e) { |
… |
… |
|
1585 | 1585 | } |
1586 | 1586 | } |
1587 | | |
| 1587 | |
1588 | 1588 | // Shift potentials to meet the requirements of the GEQ/LEQ type |
1589 | 1589 | // optimality conditions |
-
r868
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
967 | 967 | }; |
968 | 968 | |
969 | | |
| 969 | |
970 | 970 | template <typename From, typename To, |
971 | 971 | bool revEnable = RevPathTagIndicator<From>::value> |
… |
… |
|
973 | 973 | static void copy(const From& from, To& to) { |
974 | 974 | PathCopySelectorForward<From, To>::copy(from, to); |
975 | | } |
| 975 | } |
976 | 976 | }; |
977 | 977 | |
… |
… |
|
980 | 980 | static void copy(const From& from, To& to) { |
981 | 981 | PathCopySelectorBackward<From, To>::copy(from, to); |
982 | | } |
| 982 | } |
983 | 983 | }; |
984 | 984 | |
-
r896
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
141 | 141 | class PlanarityChecking { |
142 | 142 | private: |
143 | | |
| 143 | |
144 | 144 | TEMPLATE_GRAPH_TYPEDEFS(Graph); |
145 | 145 | |
… |
… |
|
147 | 147 | |
148 | 148 | private: |
149 | | |
| 149 | |
150 | 150 | typedef typename Graph::template NodeMap<Arc> PredMap; |
151 | | |
| 151 | |
152 | 152 | typedef typename Graph::template EdgeMap<bool> TreeMap; |
153 | | |
| 153 | |
154 | 154 | typedef typename Graph::template NodeMap<int> OrderMap; |
155 | 155 | typedef std::vector<Node> OrderList; |
… |
… |
|
222 | 222 | |
223 | 223 | for (typename MergeRoots::Value::iterator it = |
224 | | merge_roots[node].begin(); |
| 224 | merge_roots[node].begin(); |
225 | 225 | it != merge_roots[node].end(); ++it) { |
226 | 226 | int rn = *it; |
… |
… |
|
433 | 433 | |
434 | 434 | bool rd; |
435 | | if (!external(xnode, rorder, child_lists, |
| 435 | if (!external(xnode, rorder, child_lists, |
436 | 436 | ancestor_map, low_map)) { |
437 | 437 | rd = true; |
-
r891
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r834
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
187 | 187 | ///\ref SmartDigraph is a simple and fast digraph implementation. |
188 | 188 | ///It is also quite memory efficient but at the price |
189 | | ///that it does not support node and arc deletion |
| 189 | ///that it does not support node and arc deletion |
190 | 190 | ///(except for the Snapshot feature). |
191 | 191 | /// |
… |
… |
|
336 | 336 | ///arcs from a SmartDigraph structure. |
337 | 337 | /// |
338 | | ///\note After a state is restored, you cannot restore a later state, |
| 338 | ///\note After a state is restored, you cannot restore a later state, |
339 | 339 | ///i.e. you cannot add the removed nodes and arcs again using |
340 | 340 | ///another Snapshot instance. |
… |
… |
|
615 | 615 | /// \ref SmartGraph is a simple and fast graph implementation. |
616 | 616 | /// It is also quite memory efficient but at the price |
617 | | /// that it does not support node and edge deletion |
| 617 | /// that it does not support node and edge deletion |
618 | 618 | /// (except for the Snapshot feature). |
619 | 619 | /// |
… |
… |
|
762 | 762 | ///edges from a SmartGraph structure. |
763 | 763 | /// |
764 | | ///\note After a state is restored, you cannot restore a later state, |
| 764 | ///\note After a state is restored, you cannot restore a later state, |
765 | 765 | ///i.e. you cannot add the removed nodes and edges again using |
766 | 766 | ///another Snapshot instance. |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
288 | 288 | |
289 | 289 | _clear_temporals(); |
290 | | |
| 290 | |
291 | 291 | _applyMessageLevel(); |
292 | 292 | |
-
r793
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r834
|
r956
|
|
1 | | /* -*- C++ -*- |
| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 | * |
3 | | * This file is a part of LEMON, a generic C++ optimization library |
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2008 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
32 | 32 | public: |
33 | 33 | |
34 | | StaticDigraphBase() |
35 | | : built(false), node_num(0), arc_num(0), |
| 34 | StaticDigraphBase() |
| 35 | : built(false), node_num(0), arc_num(0), |
36 | 36 | node_first_out(NULL), node_first_in(NULL), |
37 | | arc_source(NULL), arc_target(NULL), |
| 37 | arc_source(NULL), arc_target(NULL), |
38 | 38 | arc_next_in(NULL), arc_next_out(NULL) {} |
39 | | |
| 39 | |
40 | 40 | ~StaticDigraphBase() { |
41 | 41 | if (built) { |
… |
… |
|
63 | 63 | |
64 | 64 | class Arc { |
65 | | friend class StaticDigraphBase; |
| 65 | friend class StaticDigraphBase; |
66 | 66 | protected: |
67 | 67 | int id; |
… |
… |
|
84 | 84 | static void next(Arc& e) { --e.id; } |
85 | 85 | |
86 | | void firstOut(Arc& e, const Node& n) const { |
87 | | e.id = node_first_out[n.id] != node_first_out[n.id + 1] ? |
| 86 | void firstOut(Arc& e, const Node& n) const { |
| 87 | e.id = node_first_out[n.id] != node_first_out[n.id + 1] ? |
88 | 88 | node_first_out[n.id] : -1; |
89 | 89 | } |
… |
… |
|
114 | 114 | typedef typename Digraph::Arc Arc; |
115 | 115 | |
116 | | ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef) |
| 116 | ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef) |
117 | 117 | : digraph(_graph), nodeRef(_nodeRef) {} |
118 | | |
| 118 | |
119 | 119 | bool operator()(const Arc& left, const Arc& right) const { |
120 | | return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)]; |
| 120 | return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)]; |
121 | 121 | } |
122 | 122 | private: |
… |
… |
|
124 | 124 | const NodeRefMap& nodeRef; |
125 | 125 | }; |
126 | | |
| 126 | |
127 | 127 | public: |
128 | 128 | |
129 | 129 | typedef True BuildTag; |
130 | | |
| 130 | |
131 | 131 | void clear() { |
132 | 132 | if (built) { |
… |
… |
|
142 | 142 | arc_num = 0; |
143 | 143 | } |
144 | | |
| 144 | |
145 | 145 | template <typename Digraph, typename NodeRefMap, typename ArcRefMap> |
146 | 146 | void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) { |
… |
… |
|
184 | 184 | int target = nodeRef[digraph.target(*it)].id; |
185 | 185 | arcRef[*it] = Arc(arc_index); |
186 | | arc_source[arc_index] = source; |
| 186 | arc_source[arc_index] = source; |
187 | 187 | arc_target[arc_index] = target; |
188 | 188 | arc_next_in[arc_index] = node_first_in[target]; |
… |
… |
|
198 | 198 | node_first_out[node_num] = arc_num; |
199 | 199 | } |
200 | | |
| 200 | |
201 | 201 | template <typename ArcListIterator> |
202 | 202 | void build(int n, ArcListIterator first, ArcListIterator last) { |
… |
… |
|
213 | 213 | arc_next_out = new int[arc_num]; |
214 | 214 | arc_next_in = new int[arc_num]; |
215 | | |
| 215 | |
216 | 216 | for (int i = 0; i != node_num; ++i) { |
217 | 217 | node_first_in[i] = -1; |
218 | | } |
219 | | |
| 218 | } |
| 219 | |
220 | 220 | int arc_index = 0; |
221 | 221 | for (int i = 0; i != node_num; ++i) { |
… |
… |
|
283 | 283 | /// Since this digraph structure is completely static, its nodes and arcs |
284 | 284 | /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt> |
285 | | /// and <tt>[0..arcNum()-1]</tt>, respectively. |
| 285 | /// and <tt>[0..arcNum()-1]</tt>, respectively. |
286 | 286 | /// The index of an item is the same as its ID, it can be obtained |
287 | 287 | /// using the corresponding \ref index() or \ref concepts::Digraph::id() |
… |
… |
|
300 | 300 | |
301 | 301 | typedef ExtendedStaticDigraphBase Parent; |
302 | | |
| 302 | |
303 | 303 | public: |
304 | | |
| 304 | |
305 | 305 | /// \brief Constructor |
306 | 306 | /// |
… |
… |
|
350 | 350 | /// This method also makes possible to copy a digraph to a StaticDigraph |
351 | 351 | /// structure using \ref DigraphCopy. |
352 | | /// |
| 352 | /// |
353 | 353 | /// \param digraph An existing digraph to be copied. |
354 | 354 | /// \param nodeRef The node references will be copied into this map. |
… |
… |
|
371 | 371 | Parent::build(digraph, nodeRef, arcRef); |
372 | 372 | } |
373 | | |
| 373 | |
374 | 374 | /// \brief Build the digraph from an arc list. |
375 | 375 | /// |
… |
… |
|
422 | 422 | using Parent::fastNextOut; |
423 | 423 | using Parent::fastLastOut; |
424 | | |
| 424 | |
425 | 425 | public: |
426 | 426 | |
… |
… |
|
433 | 433 | |
434 | 434 | OutArcIt(const StaticDigraph& digraph, const Node& node) { |
435 | | digraph.fastFirstOut(*this, node); |
436 | | digraph.fastLastOut(last, node); |
| 435 | digraph.fastFirstOut(*this, node); |
| 436 | digraph.fastLastOut(last, node); |
437 | 437 | if (last == *this) *this = INVALID; |
438 | 438 | } |
… |
… |
|
444 | 444 | } |
445 | 445 | |
446 | | OutArcIt& operator++() { |
| 446 | OutArcIt& operator++() { |
447 | 447 | StaticDigraph::fastNextOut(*this); |
448 | 448 | if (last == *this) *this = INVALID; |
449 | | return *this; |
| 449 | return *this; |
450 | 450 | } |
451 | 451 | |
-
r941
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
… |
… |
|
66 | 66 | /// and it must have an \c addBack() function. |
67 | 67 | typedef lemon::Path<Digraph> Path; |
68 | | |
| 68 | |
69 | 69 | /// The cross reference type used for the heap. |
70 | 70 | typedef typename GR::template NodeMap<int> HeapCrossRef; |
… |
… |
|
159 | 159 | Node _s; |
160 | 160 | Node _t; |
161 | | |
| 161 | |
162 | 162 | PotentialMap _dist; |
163 | 163 | std::vector<Node> _proc_nodes; |
… |
… |
|
168 | 168 | ResidualDijkstra(Suurballe &srb) : |
169 | 169 | _graph(srb._graph), _length(srb._length), |
170 | | _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred), |
| 170 | _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred), |
171 | 171 | _s(srb._s), _t(srb._t), _dist(_graph) {} |
172 | | |
| 172 | |
173 | 173 | // Run the algorithm and return true if a path is found |
174 | 174 | // from the source node to the target node. |
… |
… |
|
178 | 178 | |
179 | 179 | private: |
180 | | |
| 180 | |
181 | 181 | // Execute the algorithm for the first time (the flow and potential |
182 | 182 | // functions have to be identically zero). |
… |
… |
|
349 | 349 | typedef Suurballe<GR, LEN, SetPathTraits<T> > Create; |
350 | 350 | }; |
351 | | |
| 351 | |
352 | 352 | template <typename H, typename CR> |
353 | 353 | struct SetHeapTraits : public Traits { |
… |
… |
|
360 | 360 | /// |
361 | 361 | /// \ref named-templ-param "Named parameter" for setting \c Heap |
362 | | /// and \c HeapCrossRef types with automatic allocation. |
| 362 | /// and \c HeapCrossRef types with automatic allocation. |
363 | 363 | /// They will be used for internal Dijkstra computations. |
364 | 364 | /// The heap type must conform to the \ref lemon::concepts::Heap "Heap" |
… |
… |
|
398 | 398 | // The pred arc map |
399 | 399 | PredMap _pred; |
400 | | |
| 400 | |
401 | 401 | // Data for full init |
402 | 402 | PotentialMap *_init_dist; |
… |
… |
|
556 | 556 | dijk.distMap(*_init_dist).predMap(*_init_pred); |
557 | 557 | dijk.run(s); |
558 | | |
| 558 | |
559 | 559 | _full_init = true; |
560 | 560 | } |
… |
… |
|
600 | 600 | _t = t; |
601 | 601 | ResidualDijkstra dijkstra(*this); |
602 | | |
| 602 | |
603 | 603 | // Initialization |
604 | 604 | for (ArcIt e(_graph); e != INVALID; ++e) { |
… |
… |
|
614 | 614 | (*_flow)[e] = 1; |
615 | 615 | u = _graph.source(e); |
616 | | } |
| 616 | } |
617 | 617 | _path_num = 1; |
618 | 618 | } else { |
-
r954
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
-
r917
|
r956
|
|
3 | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 | * |
5 | | * Copyright (C) 2003-2009 |
| 5 | * Copyright (C) 2003-2010 |
6 | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 | * |