All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
List of all members | Public Types | Public Member Functions
HaoOrlin< GR, CAP, TOL > Class Template Reference

Detailed Description

template<typename GR, typename CAP, typename TOL>
class lemon::HaoOrlin< GR, CAP, TOL >

This class implements the Hao-Orlin algorithm for finding a minimum value cut in a directed graph $D=(V,A)$. It takes a fixed node $ source \in V $ and consists of two phases: in the first phase it determines a minimum cut with $ source $ on the source-side (i.e. a set $ X\subsetneq V $ with $ source \in X $ and minimal outgoing capacity) and in the second phase it determines a minimum cut with $ source $ on the sink-side (i.e. a set $ X\subsetneq V $ with $ source \notin X $ and minimal outgoing capacity). Obviously, the smaller of these two cuts will be a minimum cut of $ D $. The algorithm is a modified preflow push-relabel algorithm. Our implementation calculates the minimum cut in $ O(n^2\sqrt{m}) $ time (we use the highest-label rule), or in $O(nm)$ for unit capacities. A notable use of this algorithm is testing network reliability.

For an undirected graph you can run just the first phase of the algorithm or you can use the algorithm of Nagamochi and Ibaraki, which solves the undirected problem in $ O(nm + n^2 \log n) $ time. It is implemented in the NagamochiIbaraki algorithm class.

Template Parameters
GRThe type of the digraph the algorithm runs on.
CAPThe type of the arc map containing the capacities, which can be any numreric type. The default map type is GR::ArcMap<int>.
TOLTolerance class for handling inexact computations. The default tolerance type is Tolerance<CAP::Value>.

#include <lemon/hao_orlin.h>

Public Types

typedef GR Digraph
 The digraph type of the algorithm.
 
typedef CAP CapacityMap
 The capacity map type of the algorithm.
 
typedef TOL Tolerance
 The tolerance type of the algorithm.
 

Public Member Functions

 HaoOrlin (const Digraph &graph, const CapacityMap &capacity, const Tolerance &tolerance=Tolerance())
 Constructor. More...
 
HaoOrlintolerance (const Tolerance &tolerance)
 Set the tolerance used by the algorithm. More...
 
const Tolerancetolerance () const
 Returns a const reference to the tolerance. More...
 
Execution Control

The simplest way to execute the algorithm is to use one of the member functions called run().
If you need better control on the execution, you have to call one of the init() functions first, then calculateOut() and/or calculateIn().

void init ()
 Initialize the internal data structures. More...
 
void init (const Node &source)
 Initialize the internal data structures. More...
 
void calculateOut ()
 Calculate a minimum cut with $ source $ on the source-side. More...
 
void calculateIn ()
 Calculate a minimum cut with $ source $ on the sink-side. More...
 
void run ()
 Run the algorithm. More...
 
void run (const Node &s)
 Run the algorithm. More...
 
Query Functions

The result of the HaoOrlin algorithm can be obtained using these functions.
run(), calculateOut() or calculateIn() should be called before using them.

Value minCutValue () const
 Return the value of the minimum cut. More...
 
template<typename CutMap >
Value minCutMap (CutMap &cutMap) const
 Return a minimum cut. More...
 

Constructor & Destructor Documentation

HaoOrlin ( const Digraph graph,
const CapacityMap capacity,
const Tolerance tolerance = Tolerance() 
)
inline

Constructor of the algorithm class.

Member Function Documentation

HaoOrlin& tolerance ( const Tolerance tolerance)
inline

This function sets the tolerance object used by the algorithm.

Returns
(*this)
const Tolerance& tolerance ( ) const
inline

This function returns a const reference to the tolerance object used by the algorithm.

void init ( )
inline

This function initializes the internal data structures. It creates the maps and some bucket structures for the algorithm. The first node is used as the source node for the push-relabel algorithm.

void init ( const Node &  source)
inline

This function initializes the internal data structures. It creates the maps and some bucket structures for the algorithm. The given node is used as the source node for the push-relabel algorithm.

void calculateOut ( )
inline

This function calculates a minimum cut with $ source $ on the source-side (i.e. a set $ X\subsetneq V $ with $ source \in X $ and minimal outgoing capacity). It updates the stored cut if (and only if) the newly found one is better.

Precondition
init() must be called before using this function.
void calculateIn ( )
inline

This function calculates a minimum cut with $ source $ on the sink-side (i.e. a set $ X\subsetneq V $ with $ source \notin X $ and minimal outgoing capacity). It updates the stored cut if (and only if) the newly found one is better.

Precondition
init() must be called before using this function.
void run ( )
inline

This function runs the algorithm. It chooses source node, then calls init(), calculateOut() and calculateIn().

void run ( const Node &  s)
inline

This function runs the algorithm. It calls init(), calculateOut() and calculateIn() with the given source node.

Value minCutValue ( ) const
inline

This function returns the value of the best cut found by the previously called run(), calculateOut() or calculateIn().

Precondition
run(), calculateOut() or calculateIn() must be called before using this function.
Value minCutMap ( CutMap &  cutMap) const
inline

This function gives the best cut found by the previously called run(), calculateOut() or calculateIn().

It sets cutMap to the characteristic vector of the found minimum value cut - a non-empty set $ X\subsetneq V $ of minimum outgoing capacity (i.e. cutMap will be true exactly for the nodes of $ X $).

Parameters
cutMapA writable node map with bool (or convertible) value type.
Returns
The value of the minimum cut.
Precondition
run(), calculateOut() or calculateIn() must be called before using this function.