stoer_wagner_min_cut
Determines a min-cut and the min-cut weight of a connected, undirected graph.
Complexity: O(V * E + V2 log V)
Defined in: <boost/graph/stoer_wagner_min_cut.hpp>
Description
A cut of a graph G is a partition of the vertices into two, non-empty sets. The weight of such a partition is the number of edges between the two sets if G is unweighted, or the sum of the weights of all edges between the two sets if G is weighted. A min-cut is a cut having the least weight.
Sometimes a graph has multiple min-cuts, but all have the same weight. The stoer_wagner_min_cut function implements the
Stoer-Wagner algorithm and determines exactly one of the min-cuts as well as its weight.
|
The |
Overloads
(1) Fully Positional
namespace boost::graph {
template <class UndirectedGraph, class WeightMap, class ParityMap,
class VertexAssignmentMap, class KeyedUpdatablePriorityQueue,
class IndexMap>
typename property_traits<WeightMap>::value_type
stoer_wagner_min_cut(
const UndirectedGraph& g, WeightMap weights,
ParityMap parities, VertexAssignmentMap assignments,
KeyedUpdatablePriorityQueue& pq, IndexMap index_map);
}
| Direction | Parameter | Description |
|---|---|---|
IN |
|
A connected, undirected graph. The graph type must be a model of Vertex List Graph and Incidence Graph. |
IN |
|
The weight or length of each edge in the graph. The |
OUT |
|
Records which of the two min-cut sets each vertex belongs to, by setting the
parity to |
UTIL |
|
Work space mapping each vertex to the vertex it is assigned to. Must be a model of Read/Write Property Map. The key and value types must be the graph’s vertex descriptor type. No particular meaning should be derived from its values after completion. |
UTIL |
|
A max priority queue keyed on the reach counts. It must be a model of Keyed Updatable Queue and a max-Updatable Priority Queue. The value type must be the graph’s vertex descriptor and the key type must be the weight type. It must be empty when passed in. |
IN |
|
Maps each vertex to an integer in the range |
Example
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/stoer_wagner_min_cut.hpp>
#include <boost/property_map/property_map.hpp>
#include <iostream>
struct EdgeProps { int weight; };
using Graph = boost::adjacency_list< boost::vecS, boost::vecS, boost::undirectedS,
boost::no_property, EdgeProps >;
int main() {
Graph g{4};
boost::add_edge(0, 1, EdgeProps{2}, g);
boost::add_edge(0, 2, EdgeProps{3}, g);
boost::add_edge(1, 2, EdgeProps{3}, g);
boost::add_edge(1, 3, EdgeProps{2}, g);
boost::add_edge(2, 3, EdgeProps{4}, g);
auto weight_map = get(&EdgeProps::weight, g);
// only the min-cut weight is needed here, so discard the partition
int cut = boost::graph::stoer_wagner_min_cut(g, weight_map, boost::dummy_property_map());
std::cout << "Stoer-Wagner min cut: " << cut << "\n";
}
Stoer-Wagner min cut: 5
(2) Five arguments overload
The index map is the least interesting argument, so this form defaults it to get(vertex_index, g). Requires the graph to have an interior vertex_index_t property.
namespace boost::graph {
template <class UndirectedGraph, class WeightMap, class ParityMap,
class VertexAssignmentMap, class KeyedUpdatablePriorityQueue>
typename property_traits<WeightMap>::value_type
stoer_wagner_min_cut(
const UndirectedGraph& g, WeightMap weights,
ParityMap parities, VertexAssignmentMap assignments,
KeyedUpdatablePriorityQueue& pq);
}
(3) Three arguments overload
Building the assignment map and the priority queue is the cumbersome part, so this form defaults them along with the index map. Pass boost::dummy_property_map() for parities when only the min-cut weight is needed.
namespace boost::graph {
template <class UndirectedGraph, class WeightMap, class ParityMap>
typename property_traits<WeightMap>::value_type
stoer_wagner_min_cut(const UndirectedGraph& g, WeightMap weights, ParityMap parities);
}
(4) Six arguments overload (deprecated)
|
Deprecated: this overload moved to |
namespace boost {
template <class UndirectedGraph, class WeightMap, class ParityMap,
class VertexAssignmentMap, class KeyedUpdatablePriorityQueue,
class IndexMap>
typename property_traits<WeightMap>::value_type
stoer_wagner_min_cut(
const UndirectedGraph& g, WeightMap weights,
ParityMap parities, VertexAssignmentMap assignments,
KeyedUpdatablePriorityQueue& pq, IndexMap index_map);
}
Identical to overload (1) except for its namespace. Kept in boost:: for backward compatibility.
(5) Named parameter version (deprecated)
|
Deprecated: the named parameter interface is deprecated. Use the positional
|
template <class UndirectedGraph, class WeightMap,
class P, class T, class R>
weight_type stoer_wagner_min_cut(
const UndirectedGraph& g,
WeightMap weights,
const bgl_named_params<P, T, R>& params = all defaults);
| Direction | Parameter | Description |
|---|---|---|
IN |
|
A connected, undirected graph. The graph type must be a model of Vertex List Graph and Incidence Graph. |
IN |
|
The weight or length of each edge in the graph. The |
| Direction | Named Parameter | Description / Default |
|---|---|---|
OUT |
|
The algorithm computes a min-cut, which divides the set of vertices into
two, non-empty sets. The |
IN |
|
This maps each vertex to an integer in the range [0, |
UTIL |
|
|
UTIL |
|
|
UTIL |
|
This parameter only has an effect when the default max-priority queue is
used. |
UTIL |
|
This parameter only has an effect when the default max-priority queue is
used. |