.
3 preflow_push_max_flow_h
5 Runs a preflow push algorithm with the modification,
6 that we do not push on nodes with level at least n.
7 Moreover, if a level gets empty, we set all nodes above that
8 level to level n. Hence, in the end, we arrive at a maximum preflow
9 with value of a max flow value. An empty level gives a minimum cut.
13 void run() : runs the algorithm
15 The following functions should be used after run() was already run.
17 T maxflow() : returns the value of a maximum flow
19 void mincut(CutMap& M) : sets M to the characteristic vector of a
20 minimum cut. M should be a map of bools initialized to false.
24 #ifndef PREFLOW_PUSH_MAX_FLOW_H
25 #define PREFLOW_PUSH_MAX_FLOW_H
33 #include <reverse_bfs.h>
38 template <typename Graph, typename T,
39 typename FlowMap=typename Graph::EdgeMap<T>, typename CapMap=typename Graph::EdgeMap<T>,
40 typename IntMap=typename Graph::NodeMap<int>, typename TMap=typename Graph::NodeMap<T> >
41 class preflow_push_max_flow {
43 typedef typename Graph::NodeIt NodeIt;
44 typedef typename Graph::EachNodeIt EachNodeIt;
45 typedef typename Graph::OutEdgeIt OutEdgeIt;
46 typedef typename Graph::InEdgeIt InEdgeIt;
53 int empty_level; //an empty level in the end of run()
58 preflow_push_max_flow(Graph& _G, NodeIt _s, NodeIt _t, CapMap& _capacity) :
59 G(_G), s(_s), t(_t), level(_G), capacity(_capacity) { }
63 The run() function runs a modified version of the
64 highest label preflow-push, which only
65 finds a maximum preflow, hence giving the value of a maximum flow.
72 b is a bound on the highest level of an active node.
79 std::vector<int> numb(n);
81 The number of nodes on level i < n. It is
82 initialized to n+1, because of the reverse_bfs-part.
85 std::vector<std::stack<NodeIt> > stack(n);
86 //Stack of the active nodes in level i.
89 /*Reverse_bfs from t, to find the starting level.*/
91 std::queue<NodeIt> bfs_queue;
94 while (!bfs_queue.empty()) {
96 NodeIt v=bfs_queue.front();
100 for(InEdgeIt e=G.template first<InEdgeIt>(v); e.valid(); ++e) {
102 if ( level.get(w) == n ) {
114 /* Starting flow. It is everywhere 0 at the moment. */
115 for(OutEdgeIt e=G.template first<OutEdgeIt>(s); e.valid(); ++e)
117 if ( capacity.get(e) == 0 ) continue;
119 if ( level.get(w) < n ) {
120 if ( excess.get(w) == 0 && w!=t ) stack[level.get(w)].push(w);
121 flow.set(e, capacity.get(e));
122 excess.set(w, excess.get(w)+capacity.get(e));
132 Push/relabel on the highest level active nodes.
134 /*While there exists an active node.*/
136 if ( stack[b].empty() ) {
141 NodeIt w=stack[b].top(); //w is a highest label active node.
143 int lev=level.get(w);
144 int exc=excess.get(w);
145 int newlevel=2*n-2; //In newlevel we bound the next level of w.
147 // if ( level.get(w) < n ) { //Nem tudom ez mukodik-e
148 for(OutEdgeIt e=G.template first<OutEdgeIt>(w); e.valid(); ++e) {
150 if ( flow.get(e) == capacity.get(e) ) continue;
154 if( lev > level.get(v) ) {
155 /*Push is allowed now*/
157 if ( excess.get(v)==0 && v != s && v !=t )
158 stack[level.get(v)].push(v);
159 /*v becomes active.*/
161 int cap=capacity.get(e);
165 if ( remcap >= exc ) {
166 /*A nonsaturating push.*/
168 flow.set(e, flo+exc);
169 excess.set(v, excess.get(v)+exc);
174 /*A saturating push.*/
177 excess.set(v, excess.get(v)+remcap);
180 } else if ( newlevel > level.get(v) ) newlevel = level.get(v);
186 for( InEdgeIt e=G.template first<InEdgeIt>(w); e.valid(); ++e) {
188 if( flow.get(e) == 0 ) continue;
192 if( lev > level.get(v) ) {
193 /*Push is allowed now*/
195 if ( excess.get(v)==0 && v != s && v !=t)
196 stack[level.get(v)].push(v);
197 /*v becomes active.*/
202 /*A nonsaturating push.*/
204 flow.set(e, flo-exc);
205 excess.set(v, excess.get(v)+exc);
209 /*A saturating push.*/
211 excess.set(v, excess.get(v)+flo);
215 } else if ( newlevel > level.get(v) ) newlevel = level.get(v);
219 } // if w still has excess after the out edge for cycle
229 //now 'lev' is the old level of w
230 level.set(w,++newlevel);
233 if ( !numb[lev] && lev < A*n ) { //If the level of w gets empty.
235 for (EachNodeIt v=G.template first<EachNodeIt>(); v.valid() ; ++v) {
236 if (level.get(v) > lev ) level.set(v,n);
238 for (int i=lev+1 ; i!=n ; ++i) numb[i]=0;
239 if ( newlevel < n ) newlevel=n;
240 } else if ( newlevel < n ) {
242 stack[newlevel].push(w);
256 We count empty_level. The nodes above this level is a mincut.
259 if(numb[empty_level]) ++empty_level;
268 Returns the maximum value of a flow.
278 Returns a minimum cut.
280 template<typename CutMap>
281 void mincut(CutMap& M) {
283 for (EachNodeIt v=G.template first<EachNodeIt>(); v.valid(); ++v) {
284 if ( level.get(v) > empty_level ) M.set(v, true);