| ... | ... |
@@ -31,13 +31,13 @@ |
| 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 |
/// |
| ... | ... |
@@ -45,12 +45,12 @@ |
| 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 |
|
| ... | ... |
@@ -63,7 +63,7 @@ |
| 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 |
/// |
| ... | ... |
@@ -73,7 +73,7 @@ |
| 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. |
| ... | ... |
@@ -91,44 +91,46 @@ |
| 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: |
| ... | ... |
@@ -188,7 +190,7 @@ |
| 188 | 190 |
|
| 189 | 191 |
typedef Preflow Create; |
| 190 | 192 |
|
| 191 |
///\name Named |
|
| 193 |
///\name Named Template Parameters |
|
| 192 | 194 |
|
| 193 | 195 |
///@{
|
| 194 | 196 |
|
| ... | ... |
@@ -205,7 +207,7 @@ |
| 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> > {
|
| ... | ... |
@@ -226,7 +228,11 @@ |
| 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> > {
|
| ... | ... |
@@ -243,11 +249,17 @@ |
| 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, |
| ... | ... |
@@ -280,7 +292,7 @@ |
| 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() {
|
| ... | ... |
@@ -290,7 +302,7 @@ |
| 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; |
| ... | ... |
@@ -299,7 +311,11 @@ |
| 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; |
| ... | ... |
@@ -309,17 +325,32 @@ |
| 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; |
| ... | ... |
@@ -329,31 +360,16 @@ |
| 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. |
| ... | ... |
@@ -362,27 +378,26 @@ |
| 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 |
|
| ... | ... |
@@ -436,14 +451,15 @@ |
| 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(); |
| ... | ... |
@@ -536,7 +552,8 @@ |
| 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 |
|
| ... | ... |
@@ -702,12 +719,12 @@ |
| 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 |
|
| ... | ... |
@@ -863,38 +880,76 @@ |
| 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) {
|
| ... | ... |
@@ -902,14 +957,6 @@ |
| 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 |
} |
0 comments (0 inline)