2 * lemon/min_cut.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Research Group on Combinatorial Optimization, EGRES).
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
17 #ifndef LEMON_MIN_CUT_H
18 #define LEMON_MIN_CUT_H
23 /// \brief Maximum cardinality search and min cut in undirected graphs.
25 #include <lemon/list_graph.h>
26 #include <lemon/bin_heap.h>
27 #include <lemon/bucket_heap.h>
29 #include <lemon/bits/invalid.h>
30 #include <lemon/error.h>
31 #include <lemon/maps.h>
37 namespace _min_cut_bits {
39 template <typename CapacityMap>
41 template <typename Key, typename Value, typename Ref>
43 typedef BinHeap<Key, Value, Ref, std::greater<Value> > Heap;
47 template <typename CapacityKey>
48 struct HeapSelector<ConstMap<CapacityKey, Const<int, 1> > > {
49 template <typename Key, typename Value, typename Ref>
51 typedef BucketHeap<Key, Ref, false > Heap;
57 /// \brief Default traits class of MaxCardinalitySearch class.
59 /// Default traits class of MaxCardinalitySearch class.
60 /// \param Graph Graph type.
61 /// \param CapacityMap Type of length map.
62 template <typename _Graph, typename _CapacityMap>
63 struct MaxCardinalitySearchDefaultTraits {
64 /// The graph type the algorithm runs on.
67 /// \brief The type of the map that stores the edge capacities.
69 /// The type of the map that stores the edge capacities.
70 /// It must meet the \ref concept::ReadMap "ReadMap" concept.
71 typedef _CapacityMap CapacityMap;
73 /// \brief The type of the capacity of the edges.
74 typedef typename CapacityMap::Value Value;
76 /// \brief The cross reference type used by heap.
78 /// The cross reference type used by heap.
79 /// Usually it is \c Graph::NodeMap<int>.
80 typedef typename Graph::template NodeMap<int> HeapCrossRef;
82 /// \brief Instantiates a HeapCrossRef.
84 /// This function instantiates a \ref HeapCrossRef.
85 /// \param graph is the graph, to which we would like to define the
87 static HeapCrossRef *createHeapCrossRef(const Graph &graph) {
88 return new HeapCrossRef(graph);
91 /// \brief The heap type used by MaxCardinalitySearch algorithm.
93 /// The heap type used by MaxCardinalitySearch algorithm. It should
94 /// maximalize the priorities. The default heap type is
95 /// the \ref BinHeap, but it is specialized when the
96 /// CapacityMap is ConstMap<Graph::Node, Const<int, 1> >
99 /// \sa MaxCardinalitySearch
100 typedef typename _min_cut_bits
101 ::HeapSelector<CapacityMap>
102 ::template Selector<typename Graph::Node, Value, HeapCrossRef>
105 /// \brief Instantiates a Heap.
107 /// This function instantiates a \ref Heap.
108 /// \param crossref The cross reference of the heap.
109 static Heap *createHeap(HeapCrossRef& crossref) {
110 return new Heap(crossref);
113 /// \brief The type of the map that stores whether a nodes is processed.
115 /// The type of the map that stores whether a nodes is processed.
116 /// It must meet the \ref concept::WriteMap "WriteMap" concept.
117 /// By default it is a NullMap.
118 typedef NullMap<typename Graph::Node, bool> ProcessedMap;
120 /// \brief Instantiates a ProcessedMap.
122 /// This function instantiates a \ref ProcessedMap.
123 /// \param graph is the graph, to which
124 /// we would like to define the \ref ProcessedMap
126 static ProcessedMap *createProcessedMap(const Graph &graph)
128 static ProcessedMap *createProcessedMap(const Graph &)
131 return new ProcessedMap();
134 /// \brief The type of the map that stores the cardinalties of the nodes.
136 /// The type of the map that stores the cardinalities of the nodes.
137 /// It must meet the \ref concept::WriteMap "WriteMap" concept.
138 typedef typename Graph::template NodeMap<Value> CardinalityMap;
140 /// \brief Instantiates a CardinalityMap.
142 /// This function instantiates a \ref CardinalityMap.
143 /// \param graph is the graph, to which we would like to define the \ref
145 static CardinalityMap *createCardinalityMap(const Graph &graph) {
146 return new CardinalityMap(graph);
151 /// \ingroup topology
153 /// \brief Maximum Cardinality Search algorithm class.
155 /// This class provides an efficient implementation of Maximum Cardinality
156 /// Search algorithm. The maximum cardinality search chooses first time any
157 /// node of the graph. Then every time it chooses the node which is connected
158 /// to the processed nodes at most in the sum of capacities on the out
159 /// edges. If there is a cut in the graph the algorithm should choose
160 /// again any unprocessed node of the graph. Each node cardinality is
161 /// the sum of capacities on the out edges to the nodes which are processed
162 /// before the given node.
164 /// The edge capacities are passed to the algorithm using a
165 /// \ref concept::ReadMap "ReadMap", so it is easy to change it to any
166 /// kind of capacity.
168 /// The type of the capacity is determined by the \ref
169 /// concept::ReadMap::Value "Value" of the capacity map.
171 /// It is also possible to change the underlying priority heap.
174 /// \param _Graph The graph type the algorithm runs on. The default value
175 /// is \ref ListGraph. The value of Graph is not used directly by
176 /// the search algorithm, it is only passed to
177 /// \ref MaxCardinalitySearchDefaultTraits.
178 /// \param _CapacityMap This read-only EdgeMap determines the capacities of
179 /// the edges. It is read once for each edge, so the map may involve in
180 /// relatively time consuming process to compute the edge capacity if
181 /// it is necessary. The default map type is \ref
182 /// concept::Graph::EdgeMap "Graph::EdgeMap<int>". The value
183 /// of CapacityMap is not used directly by search algorithm, it is only
184 /// passed to \ref MaxCardinalitySearchDefaultTraits.
185 /// \param _Traits Traits class to set various data types used by the
186 /// algorithm. The default traits class is
187 /// \ref MaxCardinalitySearchDefaultTraits
188 /// "MaxCardinalitySearchDefaultTraits<_Graph, _CapacityMap>".
189 /// See \ref MaxCardinalitySearchDefaultTraits
190 /// for the documentation of a MaxCardinalitySearch traits class.
192 /// \author Balazs Dezso
195 template <typename _Graph, typename _CapacityMap, typename _Traits>
197 template <typename _Graph = ListUGraph,
198 typename _CapacityMap = typename _Graph::template EdgeMap<int>,
200 MaxCardinalitySearchDefaultTraits<_Graph, _CapacityMap> >
202 class MaxCardinalitySearch {
204 /// \brief \ref Exception for uninitialized parameters.
206 /// This error represents problems in the initialization
207 /// of the parameters of the algorithms.
208 class UninitializedParameter : public lemon::UninitializedParameter {
210 virtual const char* what() const throw() {
211 return "lemon::MaxCardinalitySearch::UninitializedParameter";
215 typedef _Traits Traits;
216 ///The type of the underlying graph.
217 typedef typename Traits::Graph Graph;
219 ///The type of the capacity of the edges.
220 typedef typename Traits::CapacityMap::Value Value;
221 ///The type of the map that stores the edge capacities.
222 typedef typename Traits::CapacityMap CapacityMap;
223 ///The type of the map indicating if a node is processed.
224 typedef typename Traits::ProcessedMap ProcessedMap;
225 ///The type of the map that stores the cardinalities of the nodes.
226 typedef typename Traits::CardinalityMap CardinalityMap;
227 ///The cross reference type used for the current heap.
228 typedef typename Traits::HeapCrossRef HeapCrossRef;
229 ///The heap type used by the algorithm. It maximize the priorities.
230 typedef typename Traits::Heap Heap;
232 /// Pointer to the underlying graph.
234 /// Pointer to the capacity map
235 const CapacityMap *_capacity;
236 ///Pointer to the map of cardinality.
237 CardinalityMap *_cardinality;
238 ///Indicates if \ref _cardinality is locally allocated (\c true) or not.
239 bool local_cardinality;
240 ///Pointer to the map of processed status of the nodes.
241 ProcessedMap *_processed;
242 ///Indicates if \ref _processed is locally allocated (\c true) or not.
243 bool local_processed;
244 ///Pointer to the heap cross references.
245 HeapCrossRef *_heap_cross_ref;
246 ///Indicates if \ref _heap_cross_ref is locally allocated (\c true) or not.
247 bool local_heap_cross_ref;
248 ///Pointer to the heap.
250 ///Indicates if \ref _heap is locally allocated (\c true) or not.
255 typedef MaxCardinalitySearch Create;
257 ///\name Named template parameters
262 struct DefCardinalityMapTraits : public Traits {
263 typedef T CardinalityMap;
264 static CardinalityMap *createCardinalityMap(const Graph &)
266 throw UninitializedParameter();
269 /// \brief \ref named-templ-param "Named parameter" for setting
270 /// CardinalityMap type
272 /// \ref named-templ-param "Named parameter" for setting CardinalityMap
275 struct DefCardinalityMap
276 : public MaxCardinalitySearch<Graph, CapacityMap,
277 DefCardinalityMapTraits<T> > {
278 typedef MaxCardinalitySearch<Graph, CapacityMap,
279 DefCardinalityMapTraits<T> > Create;
283 struct DefProcessedMapTraits : public Traits {
284 typedef T ProcessedMap;
285 static ProcessedMap *createProcessedMap(const Graph &) {
286 throw UninitializedParameter();
289 /// \brief \ref named-templ-param "Named parameter" for setting
290 /// ProcessedMap type
292 /// \ref named-templ-param "Named parameter" for setting ProcessedMap type
295 struct DefProcessedMap
296 : public MaxCardinalitySearch<Graph, CapacityMap,
297 DefProcessedMapTraits<T> > {
298 typedef MaxCardinalitySearch<Graph, CapacityMap,
299 DefProcessedMapTraits<T> > Create;
302 template <class H, class CR>
303 struct DefHeapTraits : public Traits {
304 typedef CR HeapCrossRef;
306 static HeapCrossRef *createHeapCrossRef(const Graph &) {
307 throw UninitializedParameter();
309 static Heap *createHeap(HeapCrossRef &) {
310 throw UninitializedParameter();
313 /// \brief \ref named-templ-param "Named parameter" for setting heap
314 /// and cross reference type
316 /// \ref named-templ-param "Named parameter" for setting heap and cross
318 template <class H, class CR = typename Graph::template NodeMap<int> >
320 : public MaxCardinalitySearch<Graph, CapacityMap,
321 DefHeapTraits<H, CR> > {
322 typedef MaxCardinalitySearch< Graph, CapacityMap,
323 DefHeapTraits<H, CR> > Create;
326 template <class H, class CR>
327 struct DefStandardHeapTraits : public Traits {
328 typedef CR HeapCrossRef;
330 static HeapCrossRef *createHeapCrossRef(const Graph &graph) {
331 return new HeapCrossRef(graph);
333 static Heap *createHeap(HeapCrossRef &crossref) {
334 return new Heap(crossref);
338 /// \brief \ref named-templ-param "Named parameter" for setting heap and
339 /// cross reference type with automatic allocation
341 /// \ref named-templ-param "Named parameter" for setting heap and cross
342 /// reference type. It can allocate the heap and the cross reference
343 /// object if the cross reference's constructor waits for the graph as
344 /// parameter and the heap's constructor waits for the cross reference.
345 template <class H, class CR = typename Graph::template NodeMap<int> >
346 struct DefStandardHeap
347 : public MaxCardinalitySearch<Graph, CapacityMap,
348 DefStandardHeapTraits<H, CR> > {
349 typedef MaxCardinalitySearch<Graph, CapacityMap,
350 DefStandardHeapTraits<H, CR> >
359 MaxCardinalitySearch() {}
363 /// \brief Constructor.
365 ///\param graph the graph the algorithm will run on.
366 ///\param capacity the capacity map used by the algorithm.
367 MaxCardinalitySearch(const Graph& graph, const CapacityMap& capacity) :
368 _graph(&graph), _capacity(&capacity),
369 _cardinality(0), local_cardinality(false),
370 _processed(0), local_processed(false),
371 _heap_cross_ref(0), local_heap_cross_ref(false),
372 _heap(0), local_heap(false)
375 /// \brief Destructor.
376 ~MaxCardinalitySearch() {
377 if(local_cardinality) delete _cardinality;
378 if(local_processed) delete _processed;
379 if(local_heap_cross_ref) delete _heap_cross_ref;
380 if(local_heap) delete _heap;
383 /// \brief Sets the capacity map.
385 /// Sets the capacity map.
386 /// \return <tt> (*this) </tt>
387 MaxCardinalitySearch &capacityMap(const CapacityMap &m) {
392 /// \brief Sets the map storing the cardinalities calculated by the
395 /// Sets the map storing the cardinalities calculated by the algorithm.
396 /// If you don't use this function before calling \ref run(),
397 /// it will allocate one. The destuctor deallocates this
398 /// automatically allocated map, of course.
399 /// \return <tt> (*this) </tt>
400 MaxCardinalitySearch &cardinalityMap(CardinalityMap &m) {
401 if(local_cardinality) {
403 local_cardinality=false;
409 /// \brief Sets the map storing the processed nodes.
411 /// Sets the map storing the processed nodes.
412 /// If you don't use this function before calling \ref run(),
413 /// it will allocate one. The destuctor deallocates this
414 /// automatically allocated map, of course.
415 /// \return <tt> (*this) </tt>
416 MaxCardinalitySearch &processedMap(ProcessedMap &m)
418 if(local_processed) {
420 local_processed=false;
426 /// \brief Sets the heap and the cross reference used by algorithm.
428 /// Sets the heap and the cross reference used by algorithm.
429 /// If you don't use this function before calling \ref run(),
430 /// it will allocate one. The destuctor deallocates this
431 /// automatically allocated map, of course.
432 /// \return <tt> (*this) </tt>
433 MaxCardinalitySearch &heap(Heap& heap, HeapCrossRef &crossRef) {
434 if(local_heap_cross_ref) {
435 delete _heap_cross_ref;
436 local_heap_cross_ref = false;
438 _heap_cross_ref = &crossRef;
449 typedef typename Graph::Node Node;
450 typedef typename Graph::NodeIt NodeIt;
451 typedef typename Graph::Edge Edge;
452 typedef typename Graph::InEdgeIt InEdgeIt;
456 local_cardinality = true;
457 _cardinality = Traits::createCardinalityMap(*_graph);
460 local_processed = true;
461 _processed = Traits::createProcessedMap(*_graph);
463 if (!_heap_cross_ref) {
464 local_heap_cross_ref = true;
465 _heap_cross_ref = Traits::createHeapCrossRef(*_graph);
469 _heap = Traits::createHeap(*_heap_cross_ref);
473 void finalizeNodeData(Node node, Value capacity) {
474 _processed->set(node, true);
475 _cardinality->set(node, capacity);
479 /// \name Execution control
480 /// The simplest way to execute the algorithm is to use
481 /// one of the member functions called \c run(...).
483 /// If you need more control on the execution,
484 /// first you must call \ref init(), then you can add several source nodes
485 /// with \ref addSource().
486 /// Finally \ref start() will perform the actual path
491 /// \brief Initializes the internal data structures.
493 /// Initializes the internal data structures.
497 for (NodeIt it(*_graph) ; it != INVALID ; ++it) {
498 _processed->set(it, false);
499 _heap_cross_ref->set(it, Heap::PRE_HEAP);
503 /// \brief Adds a new source node.
505 /// Adds a new source node to the priority heap.
507 /// It checks if the node has not yet been added to the heap.
508 void addSource(Node source, Value capacity = 0) {
509 if(_heap->state(source) == Heap::PRE_HEAP) {
510 _heap->push(source, capacity);
514 /// \brief Processes the next node in the priority heap
516 /// Processes the next node in the priority heap.
518 /// \return The processed node.
520 /// \warning The priority heap must not be empty!
521 Node processNextNode() {
522 Node node = _heap->top();
523 finalizeNodeData(node, _heap->prio());
526 for (InEdgeIt it(*_graph, node); it != INVALID; ++it) {
527 Node source = _graph->source(it);
528 switch (_heap->state(source)) {
530 _heap->push(source, (*_capacity)[it]);
533 _heap->decrease(source, (*_heap)[source] + (*_capacity)[it]);
535 case Heap::POST_HEAP:
542 /// \brief Next node to be processed.
544 /// Next node to be processed.
546 /// \return The next node to be processed or INVALID if the
547 /// priority heap is empty.
549 return _heap->empty() ? _heap->top() : INVALID;
552 /// \brief Returns \c false if there are nodes
553 /// to be processed in the priority heap
555 /// Returns \c false if there are nodes
556 /// to be processed in the priority heap
557 bool emptyQueue() { return _heap->empty(); }
558 /// \brief Returns the number of the nodes to be processed
559 /// in the priority heap
561 /// Returns the number of the nodes to be processed in the priority heap
562 int queueSize() { return _heap->size(); }
564 /// \brief Executes the algorithm.
566 /// Executes the algorithm.
568 ///\pre init() must be called and at least one node should be added
569 /// with addSource() before using this function.
571 /// This method runs the Maximum Cardinality Search algorithm from the
574 while ( !_heap->empty() ) processNextNode();
577 /// \brief Executes the algorithm until \c dest is reached.
579 /// Executes the algorithm until \c dest is reached.
581 /// \pre init() must be called and at least one node should be added
582 /// with addSource() before using this function.
584 /// This method runs the %MaxCardinalitySearch algorithm from the source
586 void start(Node dest) {
587 while ( !_heap->empty() && _heap->top()!=dest ) processNextNode();
588 if ( !_heap->empty() ) finalizeNodeData(_heap->top(), _heap->prio());
591 /// \brief Executes the algorithm until a condition is met.
593 /// Executes the algorithm until a condition is met.
595 /// \pre init() must be called and at least one node should be added
596 /// with addSource() before using this function.
598 /// \param nm must be a bool (or convertible) node map. The algorithm
599 /// will stop when it reaches a node \c v with <tt>nm[v]==true</tt>.
600 template <typename NodeBoolMap>
601 void start(const NodeBoolMap &nm) {
602 while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
603 if ( !_heap->empty() ) finalizeNodeData(_heap->top(),_heap->prio());
606 /// \brief Runs the maximal cardinality search algorithm from node \c s.
608 /// This method runs the %MaxCardinalitySearch algorithm from a root
611 ///\note d.run(s) is just a shortcut of the following code.
623 /// \brief Runs the maximal cardinality search algorithm for the
626 /// This method runs the %MaxCardinalitySearch algorithm from all
627 /// unprocessed node of the graph.
629 ///\note d.run(s) is just a shortcut of the following code.
632 /// for (NodeIt it(graph); it != INVALID; ++it) {
633 /// if (!d.reached(it)) {
641 for (NodeIt it(*_graph); it != INVALID; ++it) {
651 /// \name Query Functions
652 /// The result of the maximum cardinality search algorithm can be
653 /// obtained using these functions.
655 /// Before the use of these functions, either run() or start() must be
660 /// \brief The cardinality of a node.
662 /// Returns the cardinality of a node.
663 /// \pre \ref run() must be called before using this function.
664 /// \warning If node \c v in unreachable from the root the return value
665 /// of this funcion is undefined.
666 Value cardinality(Node node) const { return (*_cardinality)[node]; }
668 /// \brief Returns a reference to the NodeMap of cardinalities.
670 /// Returns a reference to the NodeMap of cardinalities. \pre \ref run()
671 /// must be called before using this function.
672 const CardinalityMap &cardinalityMap() const { return *_cardinality;}
674 /// \brief Checks if a node is reachable from the root.
676 /// Returns \c true if \c v is reachable from the root.
677 /// \warning The source nodes are inditated as unreached.
678 /// \pre \ref run() must be called before using this function.
679 bool reached(Node v) { return (*_heap_cross_ref)[v] != Heap::PRE_HEAP; }
681 /// \brief Checks if a node is processed.
683 /// Returns \c true if \c v is processed, i.e. the shortest
684 /// path to \c v has already found.
685 /// \pre \ref run() must be called before using this function.
686 bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
691 /// \brief Default traits class of MinCut class.
693 /// Default traits class of MinCut class.
694 /// \param Graph Graph type.
695 /// \param CapacityMap Type of length map.
696 template <typename _Graph, typename _CapacityMap>
697 struct MinCutDefaultTraits {
698 /// \brief The type of the capacity of the edges.
699 typedef typename _CapacityMap::Value Value;
701 /// The graph type the algorithm runs on.
702 typedef _Graph Graph;
704 /// The AuxGraph type which is an Graph
705 typedef ListUGraph AuxGraph;
707 /// \brief Instantiates a AuxGraph.
709 /// This function instantiates a \ref AuxGraph.
710 static AuxGraph *createAuxGraph() {
711 return new AuxGraph();
714 /// \brief The type of the map that stores the edge capacities.
716 /// The type of the map that stores the edge capacities.
717 /// It must meet the \ref concept::ReadMap "ReadMap" concept.
718 typedef _CapacityMap CapacityMap;
720 /// \brief Instantiates a CapacityMap.
722 /// This function instantiates a \ref CapacityMap.
724 static CapacityMap *createCapacityMap(const Graph& graph)
726 static CapacityMap *createCapacityMap(const Graph&)
729 throw UninitializedParameter();
732 /// \brief The AuxCapacityMap type
734 /// The type of the map that stores the auxing edge capacities.
735 typedef AuxGraph::UEdgeMap<Value> AuxCapacityMap;
737 /// \brief Instantiates a AuxCapacityMap.
739 /// This function instantiates a \ref AuxCapacityMap.
740 static AuxCapacityMap *createAuxCapacityMap(const AuxGraph& graph) {
741 return new AuxCapacityMap(graph);
744 /// \brief The cross reference type used by heap.
746 /// The cross reference type used by heap.
747 /// Usually it is \c Graph::NodeMap<int>.
748 typedef AuxGraph::NodeMap<int> HeapCrossRef;
750 /// \brief Instantiates a HeapCrossRef.
752 /// This function instantiates a \ref HeapCrossRef.
753 /// \param graph is the graph, to which we would like to define the
755 static HeapCrossRef *createHeapCrossRef(const AuxGraph &graph) {
756 return new HeapCrossRef(graph);
759 /// \brief The heap type used by MinCut algorithm.
761 /// The heap type used by MinCut algorithm. It should
762 /// maximalize the priorities and the heap's key type is
763 /// the aux graph's node.
767 typedef typename _min_cut_bits
768 ::HeapSelector<CapacityMap>
769 ::template Selector<typename AuxGraph::Node, Value, HeapCrossRef>
772 /// \brief Instantiates a Heap.
774 /// This function instantiates a \ref Heap.
775 /// \param crossref The cross reference of the heap.
776 static Heap *createHeap(HeapCrossRef& crossref) {
777 return new Heap(crossref);
780 /// \brief Map from the AuxGraph's node type to the Graph's node type.
782 /// Map from the AuxGraph's node type to the Graph's node type.
783 typedef typename AuxGraph
784 ::template NodeMap<typename Graph::Node> NodeRefMap;
786 /// \brief Instantiates a NodeRefMap.
788 /// This function instantiates a \ref NodeRefMap.
789 static NodeRefMap *createNodeRefMap(const AuxGraph& graph) {
790 return new NodeRefMap(graph);
793 /// \brief Map from the Graph's node type to the Graph's node type.
795 /// Map from the Graph's node type to the Graph's node type.
796 typedef typename Graph
797 ::template NodeMap<typename Graph::Node> ListRefMap;
799 /// \brief Instantiates a ListRefMap.
801 /// This function instantiates a \ref ListRefMap.
802 static ListRefMap *createListRefMap(const Graph& graph) {
803 return new ListRefMap(graph);
809 namespace _min_cut_bits {
810 template <typename _Key>
816 LastTwoMap(int _num) : num(_num) {}
817 void set(const Key& key, bool val) {
824 Key operator[](int index) const { return keys[index]; }
831 /// \ingroup topology
833 /// \brief Calculates the min cut in an undirected graph.
835 /// Calculates the min cut in an undirected graph.
836 /// The algorithm separates the graph's nodes into two partitions with the
837 /// min sum of edge capacities between the two partitions. The
838 /// algorithm can be used to test the network reliability specifically
839 /// to test how many links have to be destroyed in the network to split it
840 /// at least two distinict subnetwork.
842 /// The complexity of the algorithm is \f$ O(ne\log(n)) \f$ but with
843 /// Fibonacci heap it can be decreased to \f$ O(ne+n^2\log(n)) \f$. When
844 /// the neutral capacity map is used then it uses BucketHeap which
845 /// results \f$ O(ne) \f$ time complexity.
847 template <typename _Graph, typename _CapacityMap, typename _Traits>
849 template <typename _Graph = ListUGraph,
850 typename _CapacityMap = typename _Graph::template UEdgeMap<int>,
851 typename _Traits = MinCutDefaultTraits<_Graph, _CapacityMap> >
855 /// \brief \ref Exception for uninitialized parameters.
857 /// This error represents problems in the initialization
858 /// of the parameters of the algorithms.
859 class UninitializedParameter : public lemon::UninitializedParameter {
861 virtual const char* what() const throw() {
862 return "lemon::MinCut::UninitializedParameter";
869 typedef _Traits Traits;
870 /// The type of the underlying graph.
871 typedef typename Traits::Graph Graph;
873 /// The type of the capacity of the edges.
874 typedef typename Traits::CapacityMap::Value Value;
875 /// The type of the map that stores the edge capacities.
876 typedef typename Traits::CapacityMap CapacityMap;
877 /// The type of the aux graph
878 typedef typename Traits::AuxGraph AuxGraph;
879 /// The type of the aux capacity map
880 typedef typename Traits::AuxCapacityMap AuxCapacityMap;
881 /// The cross reference type used for the current heap.
882 typedef typename Traits::HeapCrossRef HeapCrossRef;
883 /// The heap type used by the max cardinality algorithm.
884 typedef typename Traits::Heap Heap;
885 /// The node refrefernces between the original and aux graph type.
886 typedef typename Traits::NodeRefMap NodeRefMap;
887 /// The list node refrefernces in the original graph type.
888 typedef typename Traits::ListRefMap ListRefMap;
892 ///\name Named template parameters
896 struct DefNeutralCapacityTraits : public Traits {
897 typedef ConstMap<typename Graph::UEdge, Const<int, 1> > CapacityMap;
898 static CapacityMap *createCapacityMap(const Graph&) {
899 return new CapacityMap();
902 /// \brief \ref named-templ-param "Named parameter" for setting
903 /// the capacity type to constMap<UEdge, int, 1>()
905 /// \ref named-templ-param "Named parameter" for setting
906 /// the capacity type to constMap<UEdge, int, 1>()
907 struct DefNeutralCapacity
908 : public MinCut<Graph, CapacityMap, DefNeutralCapacityTraits> {
909 typedef MinCut<Graph, CapacityMap, DefNeutralCapacityTraits> Create;
913 template <class H, class CR>
914 struct DefHeapTraits : public Traits {
915 typedef CR HeapCrossRef;
917 static HeapCrossRef *createHeapCrossRef(const AuxGraph &) {
918 throw UninitializedParameter();
920 static Heap *createHeap(HeapCrossRef &) {
921 throw UninitializedParameter();
924 /// \brief \ref named-templ-param "Named parameter" for setting heap
925 /// and cross reference type
927 /// \ref named-templ-param "Named parameter" for setting heap and cross
929 template <class H, class CR = typename Graph::template NodeMap<int> >
931 : public MinCut<Graph, CapacityMap, DefHeapTraits<H, CR> > {
932 typedef MinCut< Graph, CapacityMap, DefHeapTraits<H, CR> > Create;
935 template <class H, class CR>
936 struct DefStandardHeapTraits : public Traits {
937 typedef CR HeapCrossRef;
939 static HeapCrossRef *createHeapCrossRef(const AuxGraph &graph) {
940 return new HeapCrossRef(graph);
942 static Heap *createHeap(HeapCrossRef &crossref) {
943 return new Heap(crossref);
947 /// \brief \ref named-templ-param "Named parameter" for setting heap and
948 /// cross reference type with automatic allocation
950 /// \ref named-templ-param "Named parameter" for setting heap and cross
951 /// reference type. It can allocate the heap and the cross reference
952 /// object if the cross reference's constructor waits for the graph as
953 /// parameter and the heap's constructor waits for the cross reference.
954 template <class H, class CR = typename Graph::template NodeMap<int> >
955 struct DefStandardHeap
956 : public MinCut<Graph, CapacityMap, DefStandardHeapTraits<H, CR> > {
957 typedef MinCut<Graph, CapacityMap, DefStandardHeapTraits<H, CR> >
965 /// Pointer to the underlying graph.
967 /// Pointer to the capacity map
968 const CapacityMap *_capacity;
969 /// \brief Indicates if \ref _capacity is locally allocated
970 /// (\c true) or not.
973 /// Pointer to the aux graph.
974 AuxGraph *_aux_graph;
975 /// \brief Indicates if \ref _aux_graph is locally allocated
976 /// (\c true) or not.
977 bool local_aux_graph;
978 /// Pointer to the aux capacity map
979 AuxCapacityMap *_aux_capacity;
980 /// \brief Indicates if \ref _aux_capacity is locally allocated
981 /// (\c true) or not.
982 bool local_aux_capacity;
983 /// Pointer to the heap cross references.
984 HeapCrossRef *_heap_cross_ref;
985 /// \brief Indicates if \ref _heap_cross_ref is locally allocated
986 /// (\c true) or not.
987 bool local_heap_cross_ref;
988 /// Pointer to the heap.
990 /// Indicates if \ref _heap is locally allocated (\c true) or not.
993 /// The min cut value.
995 /// The number of the nodes of the aux graph.
997 /// The first and last node of the min cut in the next list;
998 typename Graph::Node _first_node, _last_node;
1000 /// \brief The first and last element in the list associated
1001 /// to the aux graph node.
1002 NodeRefMap *_first, *_last;
1003 /// \brief The next node in the node lists.
1006 void create_structures() {
1008 local_capacity = true;
1009 _capacity = Traits::createCapacityMap(*_graph);
1012 local_aux_graph = true;
1013 _aux_graph = Traits::createAuxGraph();
1015 if(!_aux_capacity) {
1016 local_aux_capacity = true;
1017 _aux_capacity = Traits::createAuxCapacityMap(*_aux_graph);
1020 _first = Traits::createNodeRefMap(*_aux_graph);
1021 _last = Traits::createNodeRefMap(*_aux_graph);
1023 _next = Traits::createListRefMap(*_graph);
1025 typename Graph::template NodeMap<typename AuxGraph::Node> ref(*_graph);
1027 for (typename Graph::NodeIt it(*_graph); it != INVALID; ++it) {
1028 _next->set(it, INVALID);
1029 typename AuxGraph::Node node = _aux_graph->addNode();
1030 _first->set(node, it);
1031 _last->set(node, it);
1035 for (typename Graph::UEdgeIt it(*_graph); it != INVALID; ++it) {
1036 if (_graph->source(it) == _graph->target(it)) continue;
1037 typename AuxGraph::UEdge uedge =
1038 _aux_graph->addEdge(ref[_graph->source(it)],
1039 ref[_graph->target(it)]);
1040 _aux_capacity->set(uedge, (*_capacity)[it]);
1044 if (!_heap_cross_ref) {
1045 local_heap_cross_ref = true;
1046 _heap_cross_ref = Traits::createHeapCrossRef(*_aux_graph);
1050 _heap = Traits::createHeap(*_heap_cross_ref);
1056 typedef MinCut Create;
1059 /// \brief Constructor.
1061 ///\param graph the graph the algorithm will run on.
1062 ///\param capacity the capacity map used by the algorithm.
1063 MinCut(const Graph& graph, const CapacityMap& capacity)
1065 _capacity(&capacity), local_capacity(false),
1066 _aux_graph(0), local_aux_graph(false),
1067 _aux_capacity(0), local_aux_capacity(false),
1068 _heap_cross_ref(0), local_heap_cross_ref(false),
1069 _heap(0), local_heap(false),
1070 _first(0), _last(0), _next(0) {}
1072 /// \brief Constructor.
1074 /// This constructor can be used only when the Traits class
1075 /// defines how can we instantiate a local capacity map.
1076 /// If the DefNeutralCapacity used the algorithm automatically
1077 /// construct the capacity map.
1079 ///\param graph the graph the algorithm will run on.
1080 MinCut(const Graph& graph)
1082 _capacity(0), local_capacity(false),
1083 _aux_graph(0), local_aux_graph(false),
1084 _aux_capacity(0), local_aux_capacity(false),
1085 _heap_cross_ref(0), local_heap_cross_ref(false),
1086 _heap(0), local_heap(false),
1087 _first(0), _last(0), _next(0) {}
1089 /// \brief Destructor.
1093 if (local_heap) delete _heap;
1094 if (local_heap_cross_ref) delete _heap_cross_ref;
1095 if (_first) delete _first;
1096 if (_last) delete _last;
1097 if (_next) delete _next;
1098 if (local_aux_capacity) delete _aux_capacity;
1099 if (local_aux_graph) delete _aux_graph;
1100 if (local_capacity) delete _capacity;
1103 /// \brief Sets the heap and the cross reference used by algorithm.
1105 /// Sets the heap and the cross reference used by algorithm.
1106 /// If you don't use this function before calling \ref run(),
1107 /// it will allocate one. The destuctor deallocates this
1108 /// automatically allocated heap and cross reference, of course.
1109 /// \return <tt> (*this) </tt>
1110 MinCut &heap(Heap& heap, HeapCrossRef &crossRef)
1112 if (local_heap_cross_ref) {
1113 delete _heap_cross_ref;
1114 local_heap_cross_ref=false;
1116 _heap_cross_ref = &crossRef;
1125 /// \brief Sets the aux graph.
1127 /// Sets the aux graph used by algorithm.
1128 /// If you don't use this function before calling \ref run(),
1129 /// it will allocate one. The destuctor deallocates this
1130 /// automatically allocated graph, of course.
1131 /// \return <tt> (*this) </tt>
1132 MinCut &auxGraph(AuxGraph& aux_graph)
1134 if(local_aux_graph) {
1136 local_aux_graph=false;
1138 _aux_graph = &aux_graph;
1142 /// \brief Sets the aux capacity map.
1144 /// Sets the aux capacity map used by algorithm.
1145 /// If you don't use this function before calling \ref run(),
1146 /// it will allocate one. The destuctor deallocates this
1147 /// automatically allocated graph, of course.
1148 /// \return <tt> (*this) </tt>
1149 MinCut &auxCapacityMap(AuxCapacityMap& aux_capacity_map)
1151 if(local_aux_capacity) {
1152 delete _aux_capacity;
1153 local_aux_capacity=false;
1155 _aux_capacity = &aux_capacity_map;
1159 /// \name Execution control
1160 /// The simplest way to execute the algorithm is to use
1161 /// one of the member functions called \c run().
1163 /// If you need more control on the execution,
1164 /// first you must call \ref init() and then call the start()
1165 /// or proper times the processNextPhase() member functions.
1169 /// \brief Initializes the internal data structures.
1171 /// Initializes the internal data structures.
1173 create_structures();
1174 _first_node = _last_node = INVALID;
1175 _node_num = countNodes(*_graph);
1178 /// \brief Processes the next phase
1180 /// Processes the next phase in the algorithm. The function
1181 /// should be called countNodes(graph) - 1 times to get
1182 /// surely the min cut in the graph. The
1184 ///\return %True when the algorithm finished.
1185 bool processNextPhase() {
1186 if (_node_num <= 1) return true;
1187 using namespace _min_cut_bits;
1189 typedef typename AuxGraph::Node Node;
1190 typedef typename AuxGraph::NodeIt NodeIt;
1191 typedef typename AuxGraph::UEdge UEdge;
1192 typedef typename AuxGraph::IncEdgeIt IncEdgeIt;
1194 typedef typename MaxCardinalitySearch<AuxGraph, AuxCapacityMap>::
1195 template DefHeap<Heap, HeapCrossRef>::
1196 template DefCardinalityMap<NullMap<Node, Value> >::
1197 template DefProcessedMap<LastTwoMap<Node> >::
1198 Create MaxCardinalitySearch;
1200 MaxCardinalitySearch mcs(*_aux_graph, *_aux_capacity);
1201 for (NodeIt it(*_aux_graph); it != INVALID; ++it) {
1202 _heap_cross_ref->set(it, Heap::PRE_HEAP);
1204 mcs.heap(*_heap, *_heap_cross_ref);
1206 LastTwoMap<Node> last_two_nodes(_node_num);
1207 mcs.processedMap(last_two_nodes);
1209 NullMap<Node, Value> cardinality;
1210 mcs.cardinalityMap(cardinality);
1214 Node new_node = _aux_graph->addNode();
1216 typename AuxGraph::template NodeMap<UEdge> edges(*_aux_graph, INVALID);
1218 Node first_node = last_two_nodes[0];
1219 Node second_node = last_two_nodes[1];
1221 _next->set((*_last)[first_node], (*_first)[second_node]);
1222 _first->set(new_node, (*_first)[first_node]);
1223 _last->set(new_node, (*_last)[second_node]);
1225 Value current_cut = 0;
1226 for (IncEdgeIt it(*_aux_graph, first_node); it != INVALID; ++it) {
1227 Node node = _aux_graph->runningNode(it);
1228 current_cut += (*_aux_capacity)[it];
1229 if (node == second_node) continue;
1230 if (edges[node] == INVALID) {
1231 edges[node] = _aux_graph->addEdge(new_node, node);
1232 (*_aux_capacity)[edges[node]] = (*_aux_capacity)[it];
1234 (*_aux_capacity)[edges[node]] += (*_aux_capacity)[it];
1238 if (_first_node == INVALID || current_cut < _min_cut) {
1239 _first_node = (*_first)[first_node];
1240 _last_node = (*_last)[first_node];
1241 _min_cut = current_cut;
1244 _aux_graph->erase(first_node);
1246 for (IncEdgeIt it(*_aux_graph, second_node); it != INVALID; ++it) {
1247 Node node = _aux_graph->runningNode(it);
1248 if (edges[node] == INVALID) {
1249 edges[node] = _aux_graph->addEdge(new_node, node);
1250 (*_aux_capacity)[edges[node]] = (*_aux_capacity)[it];
1252 (*_aux_capacity)[edges[node]] += (*_aux_capacity)[it];
1255 _aux_graph->erase(second_node);
1258 return _node_num == 1;
1261 /// \brief Executes the algorithm.
1263 /// Executes the algorithm.
1265 /// \pre init() must be called
1267 while (!processNextPhase());
1271 /// \brief Runs %MinCut algorithm.
1273 /// This method runs the %Min cut algorithm
1275 /// \note mc.run(s) is just a shortcut of the following code.
1287 /// \name Query Functions
1288 /// The result of the %MinCut algorithm can be obtained using these
1290 /// Before the use of these functions,
1291 /// either run() or start() must be called.
1295 /// \brief Returns the min cut value.
1297 /// Returns the min cut value if the algorithm finished.
1298 /// After the first processNextPhase() it is a value of a
1299 /// valid cut in the graph.
1300 Value minCut() const {
1304 /// \brief Returns a min cut in a NodeMap.
1306 /// It sets the nodes of one of the two partitions to true in
1307 /// the given BoolNodeMap. The map contains a valid cut if the
1308 /// map have been set false previously.
1309 template <typename NodeMap>
1310 Value quickMinCut(NodeMap& nodeMap) const {
1311 for (typename Graph::Node it = _first_node;
1312 it != _last_node; it = (*_next)[it]) {
1313 nodeMap.set(it, true);
1315 nodeMap.set(_last_node, true);
1319 /// \brief Returns a min cut in a NodeMap.
1321 /// It sets the nodes of one of the two partitions to true and
1322 /// the other partition to false. The function first set all of the
1323 /// nodes to false and after it call the quickMinCut() member.
1324 template <typename NodeMap>
1325 Value minCut(NodeMap& nodeMap) const {
1326 for (typename Graph::NodeIt it(*_graph); it != INVALID; ++it) {
1327 nodeMap.set(it, false);
1329 quickMinCut(nodeMap);
1333 /// \brief Returns a min cut in an EdgeMap.
1335 /// If an undirected edge is in a min cut then it will be
1336 /// set to true and the others will be set to false in the given map.
1337 template <typename EdgeMap>
1338 Value cutEdges(EdgeMap& edgeMap) const {
1339 typename Graph::template NodeMap<bool> cut(*_graph, false);
1341 for (typename Graph::EdgeIt it(*_graph); it != INVALID; ++it) {
1342 edgeMap.set(it, cut[_graph->source(it)] ^ cut[_graph->target(it)]);