... | ... |
@@ -22,122 +22,124 @@ |
22 | 22 |
#include <lemon/tolerance.h> |
23 | 23 |
#include <lemon/elevator.h> |
24 | 24 |
|
25 | 25 |
/// \file |
26 | 26 |
/// \ingroup max_flow |
27 | 27 |
/// \brief Implementation of the preflow algorithm. |
28 | 28 |
|
29 | 29 |
namespace lemon { |
30 | 30 |
|
31 | 31 |
/// \brief Default traits class of Preflow class. |
32 | 32 |
/// |
33 | 33 |
/// Default traits class of Preflow class. |
34 |
/// \param _Graph Digraph type. |
|
35 |
/// \param _CapacityMap Type of capacity map. |
|
36 |
|
|
34 |
/// \tparam _Digraph Digraph type. |
|
35 |
/// \tparam _CapacityMap Capacity map type. |
|
36 |
template <typename _Digraph, typename _CapacityMap> |
|
37 | 37 |
struct PreflowDefaultTraits { |
38 | 38 |
|
39 |
/// \brief The digraph type the algorithm runs on. |
|
40 |
typedef _Graph Digraph; |
|
39 |
/// \brief The type of the digraph the algorithm runs on. |
|
40 |
typedef _Digraph Digraph; |
|
41 | 41 |
|
42 | 42 |
/// \brief The type of the map that stores the arc capacities. |
43 | 43 |
/// |
44 | 44 |
/// The type of the map that stores the arc capacities. |
45 | 45 |
/// It must meet the \ref concepts::ReadMap "ReadMap" concept. |
46 | 46 |
typedef _CapacityMap CapacityMap; |
47 | 47 |
|
48 |
/// \brief The type of the |
|
48 |
/// \brief The type of the flow values. |
|
49 | 49 |
typedef typename CapacityMap::Value Value; |
50 | 50 |
|
51 |
/// \brief The |
|
51 |
/// \brief The type of the map that stores the flow values. |
|
52 | 52 |
/// |
53 |
/// The |
|
53 |
/// The type of the map that stores the flow values. |
|
54 | 54 |
/// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept. |
55 | 55 |
typedef typename Digraph::template ArcMap<Value> FlowMap; |
56 | 56 |
|
57 | 57 |
/// \brief Instantiates a FlowMap. |
58 | 58 |
/// |
59 | 59 |
/// This function instantiates a \ref FlowMap. |
60 | 60 |
/// \param digraph The digraph, to which we would like to define |
61 | 61 |
/// the flow map. |
62 | 62 |
static FlowMap* createFlowMap(const Digraph& digraph) { |
63 | 63 |
return new FlowMap(digraph); |
64 | 64 |
} |
65 | 65 |
|
66 |
/// \brief The |
|
66 |
/// \brief The elevator type used by Preflow algorithm. |
|
67 | 67 |
/// |
68 | 68 |
/// The elevator type used by Preflow algorithm. |
69 | 69 |
/// |
70 | 70 |
/// \sa Elevator |
71 | 71 |
/// \sa LinkedElevator |
72 | 72 |
typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator; |
73 | 73 |
|
74 | 74 |
/// \brief Instantiates an Elevator. |
75 | 75 |
/// |
76 |
/// This function instantiates |
|
76 |
/// This function instantiates an \ref Elevator. |
|
77 | 77 |
/// \param digraph The digraph, to which we would like to define |
78 | 78 |
/// the elevator. |
79 | 79 |
/// \param max_level The maximum level of the elevator. |
80 | 80 |
static Elevator* createElevator(const Digraph& digraph, int max_level) { |
81 | 81 |
return new Elevator(digraph, max_level); |
82 | 82 |
} |
83 | 83 |
|
84 | 84 |
/// \brief The tolerance used by the algorithm |
85 | 85 |
/// |
86 | 86 |
/// The tolerance used by the algorithm to handle inexact computation. |
87 | 87 |
typedef lemon::Tolerance<Value> Tolerance; |
88 | 88 |
|
89 | 89 |
}; |
90 | 90 |
|
91 | 91 |
|
92 | 92 |
/// \ingroup max_flow |
93 | 93 |
/// |
94 |
/// \brief %Preflow |
|
94 |
/// \brief %Preflow algorithm class. |
|
95 | 95 |
/// |
96 |
/// This class provides an implementation of the Goldberg's \e |
|
97 |
/// preflow \e algorithm producing a flow of maximum value in a |
|
98 |
/// |
|
96 |
/// This class provides an implementation of Goldberg-Tarjan's \e preflow |
|
97 |
/// \e push-relabel algorithm producing a flow of maximum value in a |
|
98 |
/// digraph. The preflow algorithms are the fastest known maximum |
|
99 | 99 |
/// flow algorithms. The current implementation use a mixture of the |
100 | 100 |
/// \e "highest label" and the \e "bound decrease" heuristics. |
101 | 101 |
/// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$. |
102 | 102 |
/// |
103 |
/// The algorithm consists from two phases. After the first phase |
|
104 |
/// the maximal flow value and the minimum cut can be obtained. The |
|
105 |
/// |
|
103 |
/// The algorithm consists of two phases. After the first phase |
|
104 |
/// the maximum flow value and the minimum cut is obtained. The |
|
105 |
/// second phase constructs a feasible maximum flow on each arc. |
|
106 | 106 |
/// |
107 |
/// \param _Graph The digraph type the algorithm runs on. |
|
108 |
/// \param _CapacityMap The flow map type. |
|
109 |
/// \param _Traits Traits class to set various data types used by |
|
110 |
/// the algorithm. The default traits class is \ref |
|
111 |
/// PreflowDefaultTraits. See \ref PreflowDefaultTraits for the |
|
112 |
/// documentation of a %Preflow traits class. |
|
113 |
/// |
|
114 |
///\author Jacint Szabo and Balazs Dezso |
|
107 |
/// \tparam _Digraph The type of the digraph the algorithm runs on. |
|
108 |
/// \tparam _CapacityMap The type of the capacity map. The default map |
|
109 |
/// type is \ref concepts::Digraph::ArcMap "_Digraph::ArcMap<int>". |
|
115 | 110 |
#ifdef DOXYGEN |
116 |
template <typename |
|
111 |
template <typename _Digraph, typename _CapacityMap, typename _Traits> |
|
117 | 112 |
#else |
118 |
template <typename _Graph, |
|
119 |
typename _CapacityMap = typename _Graph::template ArcMap<int>, |
|
120 |
|
|
113 |
template <typename _Digraph, |
|
114 |
typename _CapacityMap = typename _Digraph::template ArcMap<int>, |
|
115 |
typename _Traits = PreflowDefaultTraits<_Digraph, _CapacityMap> > |
|
121 | 116 |
#endif |
122 | 117 |
class Preflow { |
123 | 118 |
public: |
124 | 119 |
|
120 |
///The \ref PreflowDefaultTraits "traits class" of the algorithm. |
|
125 | 121 |
typedef _Traits Traits; |
122 |
///The type of the digraph the algorithm runs on. |
|
126 | 123 |
typedef typename Traits::Digraph Digraph; |
124 |
///The type of the capacity map. |
|
127 | 125 |
typedef typename Traits::CapacityMap CapacityMap; |
126 |
///The type of the flow values. |
|
128 | 127 |
typedef typename Traits::Value Value; |
129 | 128 |
|
129 |
///The type of the flow map. |
|
130 | 130 |
typedef typename Traits::FlowMap FlowMap; |
131 |
///The type of the elevator. |
|
131 | 132 |
typedef typename Traits::Elevator Elevator; |
133 |
///The type of the tolerance. |
|
132 | 134 |
typedef typename Traits::Tolerance Tolerance; |
133 | 135 |
|
134 | 136 |
private: |
135 | 137 |
|
136 | 138 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
137 | 139 |
|
138 | 140 |
const Digraph& _graph; |
139 | 141 |
const CapacityMap* _capacity; |
140 | 142 |
|
141 | 143 |
int _node_num; |
142 | 144 |
|
143 | 145 |
Node _source, _target; |
... | ... |
@@ -179,84 +181,94 @@ |
179 | 181 |
if (_local_level) { |
180 | 182 |
delete _level; |
181 | 183 |
} |
182 | 184 |
if (_excess) { |
183 | 185 |
delete _excess; |
184 | 186 |
} |
185 | 187 |
} |
186 | 188 |
|
187 | 189 |
public: |
188 | 190 |
|
189 | 191 |
typedef Preflow Create; |
190 | 192 |
|
191 |
///\name Named |
|
193 |
///\name Named Template Parameters |
|
192 | 194 |
|
193 | 195 |
///@{ |
194 | 196 |
|
195 | 197 |
template <typename _FlowMap> |
196 | 198 |
struct SetFlowMapTraits : public Traits { |
197 | 199 |
typedef _FlowMap FlowMap; |
198 | 200 |
static FlowMap *createFlowMap(const Digraph&) { |
199 | 201 |
LEMON_ASSERT(false, "FlowMap is not initialized"); |
200 | 202 |
return 0; // ignore warnings |
201 | 203 |
} |
202 | 204 |
}; |
203 | 205 |
|
204 | 206 |
/// \brief \ref named-templ-param "Named parameter" for setting |
205 | 207 |
/// FlowMap type |
206 | 208 |
/// |
207 | 209 |
/// \ref named-templ-param "Named parameter" for setting FlowMap |
208 |
/// type |
|
210 |
/// type. |
|
209 | 211 |
template <typename _FlowMap> |
210 | 212 |
struct SetFlowMap |
211 | 213 |
: public Preflow<Digraph, CapacityMap, SetFlowMapTraits<_FlowMap> > { |
212 | 214 |
typedef Preflow<Digraph, CapacityMap, |
213 | 215 |
SetFlowMapTraits<_FlowMap> > Create; |
214 | 216 |
}; |
215 | 217 |
|
216 | 218 |
template <typename _Elevator> |
217 | 219 |
struct SetElevatorTraits : public Traits { |
218 | 220 |
typedef _Elevator Elevator; |
219 | 221 |
static Elevator *createElevator(const Digraph&, int) { |
220 | 222 |
LEMON_ASSERT(false, "Elevator is not initialized"); |
221 | 223 |
return 0; // ignore warnings |
222 | 224 |
} |
223 | 225 |
}; |
224 | 226 |
|
225 | 227 |
/// \brief \ref named-templ-param "Named parameter" for setting |
226 | 228 |
/// Elevator type |
227 | 229 |
/// |
228 | 230 |
/// \ref named-templ-param "Named parameter" for setting Elevator |
229 |
/// type |
|
231 |
/// type. If this named parameter is used, then an external |
|
232 |
/// elevator object must be passed to the algorithm using the |
|
233 |
/// \ref elevator(Elevator&) "elevator()" function before calling |
|
234 |
/// \ref run() or \ref init(). |
|
235 |
/// \sa SetStandardElevator |
|
230 | 236 |
template <typename _Elevator> |
231 | 237 |
struct SetElevator |
232 | 238 |
: public Preflow<Digraph, CapacityMap, SetElevatorTraits<_Elevator> > { |
233 | 239 |
typedef Preflow<Digraph, CapacityMap, |
234 | 240 |
SetElevatorTraits<_Elevator> > Create; |
235 | 241 |
}; |
236 | 242 |
|
237 | 243 |
template <typename _Elevator> |
238 | 244 |
struct SetStandardElevatorTraits : public Traits { |
239 | 245 |
typedef _Elevator Elevator; |
240 | 246 |
static Elevator *createElevator(const Digraph& digraph, int max_level) { |
241 | 247 |
return new Elevator(digraph, max_level); |
242 | 248 |
} |
243 | 249 |
}; |
244 | 250 |
|
245 | 251 |
/// \brief \ref named-templ-param "Named parameter" for setting |
246 |
/// Elevator type |
|
252 |
/// Elevator type with automatic allocation |
|
247 | 253 |
/// |
248 | 254 |
/// \ref named-templ-param "Named parameter" for setting Elevator |
249 |
/// type. The Elevator should be standard constructor interface, ie. |
|
250 |
/// the digraph and the maximum level should be passed to it. |
|
255 |
/// type with automatic allocation. |
|
256 |
/// The Elevator should have standard constructor interface to be |
|
257 |
/// able to automatically created by the algorithm (i.e. the |
|
258 |
/// digraph and the maximum level should be passed to it). |
|
259 |
/// However an external elevator object could also be passed to the |
|
260 |
/// algorithm with the \ref elevator(Elevator&) "elevator()" function |
|
261 |
/// before calling \ref run() or \ref init(). |
|
262 |
/// \sa SetElevator |
|
251 | 263 |
template <typename _Elevator> |
252 | 264 |
struct SetStandardElevator |
253 | 265 |
: public Preflow<Digraph, CapacityMap, |
254 | 266 |
SetStandardElevatorTraits<_Elevator> > { |
255 | 267 |
typedef Preflow<Digraph, CapacityMap, |
256 | 268 |
SetStandardElevatorTraits<_Elevator> > Create; |
257 | 269 |
}; |
258 | 270 |
|
259 | 271 |
/// @} |
260 | 272 |
|
261 | 273 |
protected: |
262 | 274 |
|
... | ... |
@@ -264,134 +276,137 @@ |
264 | 276 |
|
265 | 277 |
public: |
266 | 278 |
|
267 | 279 |
|
268 | 280 |
/// \brief The constructor of the class. |
269 | 281 |
/// |
270 | 282 |
/// The constructor of the class. |
271 | 283 |
/// \param digraph The digraph the algorithm runs on. |
272 | 284 |
/// \param capacity The capacity of the arcs. |
273 | 285 |
/// \param source The source node. |
274 | 286 |
/// \param target The target node. |
275 | 287 |
Preflow(const Digraph& digraph, const CapacityMap& capacity, |
276 |
|
|
288 |
Node source, Node target) |
|
277 | 289 |
: _graph(digraph), _capacity(&capacity), |
278 | 290 |
_node_num(0), _source(source), _target(target), |
279 | 291 |
_flow(0), _local_flow(false), |
280 | 292 |
_level(0), _local_level(false), |
281 | 293 |
_excess(0), _tolerance(), _phase() {} |
282 | 294 |
|
283 |
/// \brief |
|
295 |
/// \brief Destructor. |
|
284 | 296 |
/// |
285 | 297 |
/// Destructor. |
286 | 298 |
~Preflow() { |
287 | 299 |
destroyStructures(); |
288 | 300 |
} |
289 | 301 |
|
290 | 302 |
/// \brief Sets the capacity map. |
291 | 303 |
/// |
292 | 304 |
/// Sets the capacity map. |
293 |
/// \return |
|
305 |
/// \return <tt>(*this)</tt> |
|
294 | 306 |
Preflow& capacityMap(const CapacityMap& map) { |
295 | 307 |
_capacity = ↦ |
296 | 308 |
return *this; |
297 | 309 |
} |
298 | 310 |
|
299 | 311 |
/// \brief Sets the flow map. |
300 | 312 |
/// |
301 | 313 |
/// Sets the flow map. |
302 |
/// |
|
314 |
/// If you don't use this function before calling \ref run() or |
|
315 |
/// \ref init(), an instance will be allocated automatically. |
|
316 |
/// The destructor deallocates this automatically allocated map, |
|
317 |
/// of course. |
|
318 |
/// \return <tt>(*this)</tt> |
|
303 | 319 |
Preflow& flowMap(FlowMap& map) { |
304 | 320 |
if (_local_flow) { |
305 | 321 |
delete _flow; |
306 | 322 |
_local_flow = false; |
307 | 323 |
} |
308 | 324 |
_flow = ↦ |
309 | 325 |
return *this; |
310 | 326 |
} |
311 | 327 |
|
312 |
/// \brief |
|
328 |
/// \brief Sets the source node. |
|
313 | 329 |
/// |
314 |
/// \return The flow map. |
|
315 |
const FlowMap& flowMap() { |
|
316 |
|
|
330 |
/// Sets the source node. |
|
331 |
/// \return <tt>(*this)</tt> |
|
332 |
Preflow& source(const Node& node) { |
|
333 |
_source = node; |
|
334 |
return *this; |
|
317 | 335 |
} |
318 | 336 |
|
319 |
/// \brief Sets the |
|
337 |
/// \brief Sets the target node. |
|
320 | 338 |
/// |
321 |
/// Sets the elevator. |
|
322 |
/// \return \c (*this) |
|
339 |
/// Sets the target node. |
|
340 |
/// \return <tt>(*this)</tt> |
|
341 |
Preflow& target(const Node& node) { |
|
342 |
_target = node; |
|
343 |
return *this; |
|
344 |
} |
|
345 |
|
|
346 |
/// \brief Sets the elevator used by algorithm. |
|
347 |
/// |
|
348 |
/// Sets the elevator used by algorithm. |
|
349 |
/// If you don't use this function before calling \ref run() or |
|
350 |
/// \ref init(), an instance will be allocated automatically. |
|
351 |
/// The destructor deallocates this automatically allocated elevator, |
|
352 |
/// of course. |
|
353 |
/// \return <tt>(*this)</tt> |
|
323 | 354 |
Preflow& elevator(Elevator& elevator) { |
324 | 355 |
if (_local_level) { |
325 | 356 |
delete _level; |
326 | 357 |
_local_level = false; |
327 | 358 |
} |
328 | 359 |
_level = &elevator; |
329 | 360 |
return *this; |
330 | 361 |
} |
331 | 362 |
|
332 |
/// \brief Returns the elevator. |
|
363 |
/// \brief Returns a const reference to the elevator. |
|
333 | 364 |
/// |
334 |
/// |
|
365 |
/// Returns a const reference to the elevator. |
|
366 |
/// |
|
367 |
/// \pre Either \ref run() or \ref init() must be called before |
|
368 |
/// using this function. |
|
335 | 369 |
const Elevator& elevator() { |
336 | 370 |
return *_level; |
337 | 371 |
} |
338 | 372 |
|
339 |
/// \brief Sets the source node. |
|
340 |
/// |
|
341 |
/// Sets the source node. |
|
342 |
/// \return \c (*this) |
|
343 |
Preflow& source(const Node& node) { |
|
344 |
_source = node; |
|
345 |
return *this; |
|
346 |
} |
|
347 |
|
|
348 |
/// \brief Sets the target node. |
|
349 |
/// |
|
350 |
/// Sets the target node. |
|
351 |
/// \return \c (*this) |
|
352 |
Preflow& target(const Node& node) { |
|
353 |
_target = node; |
|
354 |
return *this; |
|
355 |
} |
|
356 |
|
|
357 | 373 |
/// \brief Sets the tolerance used by algorithm. |
358 | 374 |
/// |
359 | 375 |
/// Sets the tolerance used by algorithm. |
360 | 376 |
Preflow& tolerance(const Tolerance& tolerance) const { |
361 | 377 |
_tolerance = tolerance; |
362 | 378 |
return *this; |
363 | 379 |
} |
364 | 380 |
|
365 |
/// \brief Returns the tolerance |
|
381 |
/// \brief Returns a const reference to the tolerance. |
|
366 | 382 |
/// |
367 |
/// Returns the tolerance |
|
383 |
/// Returns a const reference to the tolerance. |
|
368 | 384 |
const Tolerance& tolerance() const { |
369 | 385 |
return tolerance; |
370 | 386 |
} |
371 | 387 |
|
372 |
/// \name Execution control The simplest way to execute the |
|
373 |
/// algorithm is to use one of the member functions called \c |
|
374 |
/// run(). |
|
375 |
/// \n |
|
376 |
/// If you need more control on initial solution or |
|
377 |
/// execution then you have to call one \ref init() function and then |
|
378 |
/// |
|
388 |
/// \name Execution Control |
|
389 |
/// The simplest way to execute the preflow algorithm is to use |
|
390 |
/// \ref run() or \ref runMinCut().\n |
|
391 |
/// If you need more control on the initial solution or the execution, |
|
392 |
/// first you have to call one of the \ref init() functions, then |
|
393 |
/// \ref startFirstPhase() and if you need it \ref startSecondPhase(). |
|
379 | 394 |
|
380 | 395 |
///@{ |
381 | 396 |
|
382 | 397 |
/// \brief Initializes the internal data structures. |
383 | 398 |
/// |
384 |
/// Initializes the internal data structures. |
|
385 |
/// |
|
399 |
/// Initializes the internal data structures and sets the initial |
|
400 |
/// flow to zero on each arc. |
|
386 | 401 |
void init() { |
387 | 402 |
createStructures(); |
388 | 403 |
|
389 | 404 |
_phase = true; |
390 | 405 |
for (NodeIt n(_graph); n != INVALID; ++n) { |
391 | 406 |
_excess->set(n, 0); |
392 | 407 |
} |
393 | 408 |
|
394 | 409 |
for (ArcIt e(_graph); e != INVALID; ++e) { |
395 | 410 |
_flow->set(e, 0); |
396 | 411 |
} |
397 | 412 |
|
... | ... |
@@ -427,32 +442,33 @@ |
427 | 442 |
if (_tolerance.positive((*_capacity)[e])) { |
428 | 443 |
Node u = _graph.target(e); |
429 | 444 |
if ((*_level)[u] == _level->maxLevel()) continue; |
430 | 445 |
_flow->set(e, (*_capacity)[e]); |
431 | 446 |
_excess->set(u, (*_excess)[u] + (*_capacity)[e]); |
432 | 447 |
if (u != _target && !_level->active(u)) { |
433 | 448 |
_level->activate(u); |
434 | 449 |
} |
435 | 450 |
} |
436 | 451 |
} |
437 | 452 |
} |
438 | 453 |
|
439 |
/// \brief Initializes the internal data structures |
|
454 |
/// \brief Initializes the internal data structures using the |
|
455 |
/// given flow map. |
|
440 | 456 |
/// |
441 | 457 |
/// Initializes the internal data structures and sets the initial |
442 | 458 |
/// flow to the given \c flowMap. The \c flowMap should contain a |
443 |
/// flow or at least a preflow, ie. in each node excluding the |
|
444 |
/// target the incoming flow should greater or equal to the |
|
459 |
/// flow or at least a preflow, i.e. at each node excluding the |
|
460 |
/// source node the incoming flow should greater or equal to the |
|
445 | 461 |
/// outgoing flow. |
446 |
/// \return |
|
462 |
/// \return \c false if the given \c flowMap is not a preflow. |
|
447 | 463 |
template <typename FlowMap> |
448 | 464 |
bool init(const FlowMap& flowMap) { |
449 | 465 |
createStructures(); |
450 | 466 |
|
451 | 467 |
for (ArcIt e(_graph); e != INVALID; ++e) { |
452 | 468 |
_flow->set(e, flowMap[e]); |
453 | 469 |
} |
454 | 470 |
|
455 | 471 |
for (NodeIt n(_graph); n != INVALID; ++n) { |
456 | 472 |
Value excess = 0; |
457 | 473 |
for (InArcIt e(_graph, n); e != INVALID; ++e) { |
458 | 474 |
excess += (*_flow)[e]; |
... | ... |
@@ -527,25 +543,26 @@ |
527 | 543 |
} |
528 | 544 |
return true; |
529 | 545 |
} |
530 | 546 |
|
531 | 547 |
/// \brief Starts the first phase of the preflow algorithm. |
532 | 548 |
/// |
533 | 549 |
/// The preflow algorithm consists of two phases, this method runs |
534 | 550 |
/// the first phase. After the first phase the maximum flow value |
535 | 551 |
/// and a minimum value cut can already be computed, although a |
536 | 552 |
/// maximum flow is not yet obtained. So after calling this method |
537 | 553 |
/// \ref flowValue() returns the value of a maximum flow and \ref |
538 | 554 |
/// minCut() returns a minimum cut. |
539 |
/// \pre One of the \ref init() functions |
|
555 |
/// \pre One of the \ref init() functions must be called before |
|
556 |
/// using this function. |
|
540 | 557 |
void startFirstPhase() { |
541 | 558 |
_phase = true; |
542 | 559 |
|
543 | 560 |
Node n = _level->highestActive(); |
544 | 561 |
int level = _level->highestActiveLevel(); |
545 | 562 |
while (n != INVALID) { |
546 | 563 |
int num = _node_num; |
547 | 564 |
|
548 | 565 |
while (num > 0 && n != INVALID) { |
549 | 566 |
Value excess = (*_excess)[n]; |
550 | 567 |
int new_level = _level->maxLevel(); |
551 | 568 |
|
... | ... |
@@ -693,30 +710,30 @@ |
693 | 710 |
level = _level->highestActiveLevel(); |
694 | 711 |
} else { |
695 | 712 |
n = _level->activeOn(level); |
696 | 713 |
} |
697 | 714 |
--num; |
698 | 715 |
} |
699 | 716 |
} |
700 | 717 |
} |
701 | 718 |
|
702 | 719 |
/// \brief Starts the second phase of the preflow algorithm. |
703 | 720 |
/// |
704 | 721 |
/// The preflow algorithm consists of two phases, this method runs |
705 |
/// the second phase. After calling \ref init() and \ref |
|
706 |
/// startFirstPhase() and then \ref startSecondPhase(), \ref |
|
707 |
/// |
|
722 |
/// the second phase. After calling one of the \ref init() functions |
|
723 |
/// and \ref startFirstPhase() and then \ref startSecondPhase(), |
|
724 |
/// \ref flowMap() returns a maximum flow, \ref flowValue() returns the |
|
708 | 725 |
/// value of a maximum flow, \ref minCut() returns a minimum cut |
709 |
/// \pre The \ref init() and startFirstPhase() functions should be |
|
710 |
/// called before. |
|
726 |
/// \pre One of the \ref init() functions and \ref startFirstPhase() |
|
727 |
/// must be called before using this function. |
|
711 | 728 |
void startSecondPhase() { |
712 | 729 |
_phase = false; |
713 | 730 |
|
714 | 731 |
typename Digraph::template NodeMap<bool> reached(_graph); |
715 | 732 |
for (NodeIt n(_graph); n != INVALID; ++n) { |
716 | 733 |
reached.set(n, (*_level)[n] < _level->maxLevel()); |
717 | 734 |
} |
718 | 735 |
|
719 | 736 |
_level->initStart(); |
720 | 737 |
_level->initAddItem(_source); |
721 | 738 |
|
722 | 739 |
std::vector<Node> queue; |
... | ... |
@@ -854,64 +871,94 @@ |
854 | 871 |
/// \code |
855 | 872 |
/// pf.init(); |
856 | 873 |
/// pf.startFirstPhase(); |
857 | 874 |
/// \endcode |
858 | 875 |
void runMinCut() { |
859 | 876 |
init(); |
860 | 877 |
startFirstPhase(); |
861 | 878 |
} |
862 | 879 |
|
863 | 880 |
/// @} |
864 | 881 |
|
865 | 882 |
/// \name Query Functions |
866 |
/// The |
|
883 |
/// The results of the preflow algorithm can be obtained using these |
|
867 | 884 |
/// functions.\n |
868 |
/// Before the use of these functions, |
|
869 |
/// either run() or start() must be called. |
|
885 |
/// Either one of the \ref run() "run*()" functions or one of the |
|
886 |
/// \ref startFirstPhase() "start*()" functions should be called |
|
887 |
/// before using them. |
|
870 | 888 |
|
871 | 889 |
///@{ |
872 | 890 |
|
873 | 891 |
/// \brief Returns the value of the maximum flow. |
874 | 892 |
/// |
875 | 893 |
/// Returns the value of the maximum flow by returning the excess |
876 |
/// of the target node \c t. This value equals to the value of |
|
877 |
/// the maximum flow already after the first phase. |
|
894 |
/// of the target node. This value equals to the value of |
|
895 |
/// the maximum flow already after the first phase of the algorithm. |
|
896 |
/// |
|
897 |
/// \pre Either \ref run() or \ref init() must be called before |
|
898 |
/// using this function. |
|
878 | 899 |
Value flowValue() const { |
879 | 900 |
return (*_excess)[_target]; |
880 | 901 |
} |
881 | 902 |
|
882 |
/// \brief Returns |
|
903 |
/// \brief Returns the flow on the given arc. |
|
883 | 904 |
/// |
884 |
/// Returns true when the node is on the source side of minimum |
|
885 |
/// cut. This method can be called both after running \ref |
|
905 |
/// Returns the flow on the given arc. This method can |
|
906 |
/// be called after the second phase of the algorithm. |
|
907 |
/// |
|
908 |
/// \pre Either \ref run() or \ref init() must be called before |
|
909 |
/// using this function. |
|
910 |
Value flow(const Arc& arc) const { |
|
911 |
return (*_flow)[arc]; |
|
912 |
} |
|
913 |
|
|
914 |
/// \brief Returns a const reference to the flow map. |
|
915 |
/// |
|
916 |
/// Returns a const reference to the arc map storing the found flow. |
|
917 |
/// This method can be called after the second phase of the algorithm. |
|
918 |
/// |
|
919 |
/// \pre Either \ref run() or \ref init() must be called before |
|
920 |
/// using this function. |
|
921 |
const FlowMap& flowMap() { |
|
922 |
return *_flow; |
|
923 |
} |
|
924 |
|
|
925 |
/// \brief Returns \c true when the node is on the source side of the |
|
926 |
/// minimum cut. |
|
927 |
/// |
|
928 |
/// Returns true when the node is on the source side of the found |
|
929 |
/// minimum cut. This method can be called both after running \ref |
|
886 | 930 |
/// startFirstPhase() and \ref startSecondPhase(). |
931 |
/// |
|
932 |
/// \pre Either \ref run() or \ref init() must be called before |
|
933 |
/// using this function. |
|
887 | 934 |
bool minCut(const Node& node) const { |
888 | 935 |
return ((*_level)[node] == _level->maxLevel()) == _phase; |
889 | 936 |
} |
890 | 937 |
|
891 |
/// \brief |
|
938 |
/// \brief Gives back a minimum value cut. |
|
892 | 939 |
/// |
893 |
/// Sets the \c cutMap to the characteristic vector of a minimum value |
|
894 |
/// cut. This method can be called both after running \ref |
|
895 |
/// startFirstPhase() and \ref startSecondPhase(). The result after second |
|
896 |
/// phase could be changed slightly if inexact computation is used. |
|
897 |
/// |
|
940 |
/// Sets \c cutMap to the characteristic vector of a minimum value |
|
941 |
/// cut. \c cutMap should be a \ref concepts::WriteMap "writable" |
|
942 |
/// node map with \c bool (or convertible) value type. |
|
943 |
/// |
|
944 |
/// This method can be called both after running \ref startFirstPhase() |
|
945 |
/// and \ref startSecondPhase(). The result after the second phase |
|
946 |
/// could be slightly different if inexact computation is used. |
|
947 |
/// |
|
948 |
/// \note This function calls \ref minCut() for each node, so it runs in |
|
949 |
/// \f$O(n)\f$ time. |
|
950 |
/// |
|
951 |
/// \pre Either \ref run() or \ref init() must be called before |
|
952 |
/// using this function. |
|
898 | 953 |
template <typename CutMap> |
899 | 954 |
void minCutMap(CutMap& cutMap) const { |
900 | 955 |
for (NodeIt n(_graph); n != INVALID; ++n) { |
901 | 956 |
cutMap.set(n, minCut(n)); |
902 | 957 |
} |
903 | 958 |
} |
904 | 959 |
|
905 |
/// \brief Returns the flow on the arc. |
|
906 |
/// |
|
907 |
/// Sets the \c flowMap to the flow on the arcs. This method can |
|
908 |
/// be called after the second phase of algorithm. |
|
909 |
Value flow(const Arc& arc) const { |
|
910 |
return (*_flow)[arc]; |
|
911 |
} |
|
912 |
|
|
913 | 960 |
/// @} |
914 | 961 |
}; |
915 | 962 |
} |
916 | 963 |
|
917 | 964 |
#endif |
0 comments (0 inline)