[Lemon-commits] [lemon_svn] athos: r2968 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 21:51:32 CET 2006
Author: athos
Date: Mon Oct 2 16:41:53 2006
New Revision: 2968
Modified:
hugo/trunk/lemon/hao_orlin.h
Log:
Improved documentation.
Modified: hugo/trunk/lemon/hao_orlin.h
==============================================================================
--- hugo/trunk/lemon/hao_orlin.h (original)
+++ hugo/trunk/lemon/hao_orlin.h Mon Oct 2 16:41:53 2006
@@ -40,26 +40,31 @@
/// \ingroup flowalgs
///
- /// \brief %Hao-Orlin algorithm for calculate minimum cut in directed graphs.
+ /// \brief %Hao-Orlin algorithm to find a minimum cut in directed graphs.
///
- /// Hao-Orlin calculates the minimum cut in directed graphs. It
- /// separates the nodes of the graph into two disjoint sets,
- /// \f$ V_{out} \f$ and \f$ V_{in} \f$. This separation is the minimum
- /// cut if the summary of the edge capacities which source is in
- /// \f$ V_{out} \f$ and the target is in \f$ V_{in} \f$ is the
- /// minimum. The algorithm is a modified push-relabel preflow
- /// algorithm and it calculates the minimum cut in \f$ O(n^3) \f$
- /// time. The purpose of such algorithm is testing network
- /// reliability. For sparse undirected graph you can use the
- /// algorithm of Nagamochi and Ibaraki which solves the undirected
- /// problem in \f$ O(ne + n^2 \log(n)) \f$ time and it is implemented in the
- /// MinCut algorithm class.
+ /// Hao-Orlin calculates a minimum cut in a directed graph \f$
+ /// D=(V,A) \f$. It takes a fixed node \f$ source \in V \f$ and consists
+ /// of two phases: in the first phase it determines a minimum cut
+ /// with \f$ source \f$ on the source-side (i.e. a set \f$ X\subsetneq V
+ /// \f$ with \f$ source \in X \f$ and minimal out-degree) and in the
+ /// second phase it determines a minimum cut with \f$ source \f$ on the
+ /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with \f$ source \notin X \f$
+ /// and minimal out-degree). Obviously, the smaller of these two
+ /// cuts will be a minimum cut of \f$ D \f$. The algorithm is a
+ /// modified push-relabel preflow algorithm and our implementation
+ /// calculates the minimum cut in \f$ O(n^3) \f$ time (we use the
+ /// highest-label rule). The purpose of such an algorithm is testing
+ /// network reliability. For an undirected graph with \f$ n \f$
+ /// nodes and \f$ e \f$ edges you can use the algorithm of Nagamochi
+ /// and Ibaraki which solves the undirected problem in \f$ O(ne +
+ /// n^2 \log(n)) \f$ time: it is implemented in the MinCut algorithm
+ /// class.
///
/// \param _Graph is the graph type of the algorithm.
/// \param _CapacityMap is an edge map of capacities which should
/// be any numreric type. The default type is _Graph::EdgeMap<int>.
/// \param _Tolerance is the handler of the inexact computation. The
- /// default type for it is Tolerance<typename CapacityMap::Value>.
+ /// default type for this is Tolerance<typename CapacityMap::Value>.
///
/// \author Attila Bernath and Balazs Dezso
#ifdef DOXYGEN
@@ -478,7 +483,7 @@
///
/// Initializes the internal data structures. It creates
/// the maps, residual graph adaptor and some bucket structures
- /// for the algorithm. The \c source node is used as the push-relabel
+ /// for the algorithm. Node \c source is used as the push-relabel
/// algorithm's source.
void init(const Node& source) {
_source = source;
@@ -526,11 +531,12 @@
}
- /// \brief Calculates the minimum cut with the \c source node
- /// in the \f$ V_{out} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// source-side.
///
- /// Calculates the minimum cut with the \c source node
- /// in the \f$ V_{out} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// source-side (i.e. a set \f$ X\subsetneq V \f$ with \f$ source \in X
+ /// \f$ and minimal out-degree).
void calculateOut() {
for (NodeIt it(*_graph); it != INVALID; ++it) {
if (it != _source) {
@@ -540,21 +546,23 @@
}
}
- /// \brief Calculates the minimum cut with the \c source node
- /// in the \f$ V_{out} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// source-side.
///
- /// Calculates the minimum cut with the \c source node
- /// in the \f$ V_{out} \f$. The \c target is the initial target
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// source-side (i.e. a set \f$ X\subsetneq V \f$ with \f$ source \in X
+ /// \f$ and minimal out-degree). The \c target is the initial target
/// for the push-relabel algorithm.
void calculateOut(const Node& target) {
findMinCut(target, true, *_out_res_graph, *_out_current_edge);
}
- /// \brief Calculates the minimum cut with the \c source node
- /// in the \f$ V_{in} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// sink-side.
///
- /// Calculates the minimum cut with the \c source node
- /// in the \f$ V_{in} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with \f$ source \notin X
+ /// \f$ and minimal out-degree).
void calculateIn() {
for (NodeIt it(*_graph); it != INVALID; ++it) {
if (it != _source) {
@@ -564,21 +572,22 @@
}
}
- /// \brief Calculates the minimum cut with the \c source node
- /// in the \f$ V_{in} \f$.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// sink-side.
///
- /// Calculates the minimum cut with the \c source node
- /// in the \f$ V_{in} \f$. The \c target is the initial target
- /// for the push-relabel algorithm.
+ /// \brief Calculates a minimum cut with \f$ source \f$ on the
+ /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with \f$ source \notin
+ /// X \f$ and minimal out-degree). The \c target is the initial
+ /// target for the push-relabel algorithm.
void calculateIn(const Node& target) {
findMinCut(target, false, *_in_res_graph, *_in_current_edge);
}
/// \brief Runs the algorithm.
///
- /// Runs the algorithm. It finds a proper \c source and \c target
- /// and then calls the \ref init(), \ref calculateOut() and \ref
- /// calculateIn().
+ /// Runs the algorithm. It finds nodes \c source and \c target
+ /// arbitrarily and then calls \ref init(), \ref calculateOut()
+ /// and \ref calculateIn().
void run() {
init();
for (NodeIt it(*_graph); it != INVALID; ++it) {
@@ -592,8 +601,9 @@
/// \brief Runs the algorithm.
///
- /// Runs the algorithm. It finds a proper \c target and then calls
- /// the \ref init(), \ref calculateOut() and \ref calculateIn().
+ /// Runs the algorithm. It uses the given \c source node, finds a
+ /// proper \c target and then calls the \ref init(), \ref
+ /// calculateOut() and \ref calculateIn().
void run(const Node& s) {
init(s);
for (NodeIt it(*_graph); it != INVALID; ++it) {
@@ -633,12 +643,13 @@
}
- /// \brief Returns a minimum value cut.
+ /// \brief Returns a minimum cut.
///
/// Sets \c nodeMap to the characteristic vector of a minimum
- /// value cut. The nodes in \f$ V_{out} \f$ will be set true and
- /// the nodes in \f$ V_{in} \f$ will be set false.
- /// \pre nodeMap should be a bool-valued node-map.
+ /// value cut: it will give a nonempty set \f$ X\subsetneq V \f$
+ /// with minimal out-degree (i.e. \c nodeMap will be true exactly
+ /// for the nodes of \f$ X \f$. \pre nodeMap should be a
+ /// bool-valued node-map.
template <typename NodeMap>
Value minCut(NodeMap& nodeMap) const {
for (NodeIt it(*_graph); it != INVALID; ++it) {
More information about the Lemon-commits
mailing list