[Lemon-commits] [lemon_svn] marci: r617 - in hugo/trunk/src/work: jacint marci
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:40:35 CET 2006
Author: marci
Date: Thu Apr 29 12:16:46 2004
New Revision: 617
Modified:
hugo/trunk/src/work/jacint/preflow.h
hugo/trunk/src/work/marci/edmonds_karp.h
Log:
preflow, maxflow comp
Modified: hugo/trunk/src/work/jacint/preflow.h
==============================================================================
--- hugo/trunk/src/work/jacint/preflow.h (original)
+++ hugo/trunk/src/work/jacint/preflow.h Thu Apr 29 12:16:46 2004
@@ -59,7 +59,7 @@
typedef typename Graph::template NodeMap<Node> NNMap;
typedef typename std::vector<Node> VecNode;
- const Graph& G;
+ const Graph* g;
Node s;
Node t;
const CapMap* capacity;
@@ -79,7 +79,7 @@
Preflow(const Graph& _G, Node _s, Node _t, const CapMap& _capacity,
FlowMap& _flow) :
- G(_G), s(_s), t(_t), capacity(&_capacity),
+ g(&_G), s(_s), t(_t), capacity(&_capacity),
flow(&_flow), n(_G.nodeNum()), level(_G), excess(_G,0) {}
void run() {
@@ -109,13 +109,13 @@
VecStack active(n);
- NNMap left(G,INVALID);
- NNMap right(G,INVALID);
+ NNMap left(*g, INVALID);
+ NNMap right(*g, INVALID);
VecNode level_list(n,INVALID);
//List of the nodes in level i<n, set to n.
NodeIt v;
- for(G.first(v); G.valid(v); G.next(v)) level.set(v,n);
+ for(g->first(v); g->valid(v); g->next(v)) level.set(v,n);
//setting each node to level n
switch ( fe ) {
@@ -123,13 +123,13 @@
{
//counting the excess
NodeIt v;
- for(G.first(v); G.valid(v); G.next(v)) {
+ for(g->first(v); g->valid(v); g->next(v)) {
T exc=0;
InEdgeIt e;
- for(G.first(e,v); G.valid(e); G.next(e)) exc+=(*flow)[e];
+ for(g->first(e,v); g->valid(e); g->next(e)) exc+=(*flow)[e];
OutEdgeIt f;
- for(G.first(f,v); G.valid(f); G.next(f)) exc-=(*flow)[f];
+ for(g->first(f,v); g->valid(f); g->next(f)) exc-=(*flow)[f];
excess.set(v,exc);
@@ -145,9 +145,9 @@
T exc=0;
InEdgeIt e;
- for(G.first(e,t); G.valid(e); G.next(e)) exc+=(*flow)[e];
+ for(g->first(e,t); g->valid(e); g->next(e)) exc+=(*flow)[e];
OutEdgeIt f;
- for(G.first(f,t); G.valid(f); G.next(f)) exc-=(*flow)[f];
+ for(g->first(f,t); g->valid(f); g->next(f)) exc-=(*flow)[f];
excess.set(t,exc);
@@ -216,9 +216,9 @@
int l=level[v]+1;
InEdgeIt e;
- for(G.first(e,v); G.valid(e); G.next(e)) {
+ for(g->first(e,v); g->valid(e); g->next(e)) {
if ( (*capacity)[e] == (*flow)[e] ) continue;
- Node u=G.tail(e);
+ Node u=g->tail(e);
if ( level[u] >= n ) {
bfs_queue.push(u);
level.set(u, l);
@@ -227,9 +227,9 @@
}
OutEdgeIt f;
- for(G.first(f,v); G.valid(f); G.next(f)) {
+ for(g->first(f,v); g->valid(f); g->next(f)) {
if ( 0 == (*flow)[f] ) continue;
- Node u=G.head(f);
+ Node u=g->head(f);
if ( level[u] >= n ) {
bfs_queue.push(u);
level.set(u, l);
@@ -269,9 +269,12 @@
template<typename _CutMap>
void actMinCut(_CutMap& M) {
NodeIt v;
- for(G.first(v); G.valid(v); G.next(v))
- if ( level[v] < n ) M.set(v,false);
- else M.set(v,true);
+ for(g->first(v); g->valid(v); g->next(v))
+ if ( level[v] < n ) {
+ M.set(v,false);
+ } else {
+ M.set(v,true);
+ }
}
@@ -292,8 +295,8 @@
queue.pop();
OutEdgeIt e;
- for(G.first(e,w) ; G.valid(e); G.next(e)) {
- Node v=G.head(e);
+ for(g->first(e,w) ; g->valid(e); g->next(e)) {
+ Node v=g->head(e);
if (!M[v] && (*flow)[e] < (*capacity)[e] ) {
queue.push(v);
M.set(v, true);
@@ -301,8 +304,8 @@
}
InEdgeIt f;
- for(G.first(f,w) ; G.valid(f); G.next(f)) {
- Node v=G.tail(f);
+ for(g->first(f,w) ; g->valid(f); g->next(f)) {
+ Node v=g->tail(f);
if (!M[v] && (*flow)[f] > 0 ) {
queue.push(v);
M.set(v, true);
@@ -322,7 +325,7 @@
void maxMinCut(_CutMap& M) {
NodeIt v;
- for(G.first(v) ; G.valid(v); G.next(v)) {
+ for(g->first(v) ; g->valid(v); g->next(v)) {
M.set(v, true);
}
@@ -337,8 +340,8 @@
InEdgeIt e;
- for(G.first(e,w) ; G.valid(e); G.next(e)) {
- Node v=G.tail(e);
+ for(g->first(e,w) ; g->valid(e); g->next(e)) {
+ Node v=g->tail(e);
if (M[v] && (*flow)[e] < (*capacity)[e] ) {
queue.push(v);
M.set(v, false);
@@ -346,8 +349,8 @@
}
OutEdgeIt f;
- for(G.first(f,w) ; G.valid(f); G.next(f)) {
- Node v=G.head(f);
+ for(g->first(f,w) ; g->valid(f); g->next(f)) {
+ Node v=g->head(f);
if (M[v] && (*flow)[f] > 0 ) {
queue.push(v);
M.set(v, false);
@@ -385,10 +388,10 @@
int newlevel=n; //bound on the next level of w
OutEdgeIt e;
- for(G.first(e,w); G.valid(e); G.next(e)) {
+ for(g->first(e,w); g->valid(e); g->next(e)) {
if ( (*flow)[e] == (*capacity)[e] ) continue;
- Node v=G.head(e);
+ Node v=g->head(e);
if( lev > level[v] ) { //Push is allowed now
@@ -418,10 +421,10 @@
if ( exc > 0 ) {
InEdgeIt e;
- for(G.first(e,w); G.valid(e); G.next(e)) {
+ for(g->first(e,w); g->valid(e); g->next(e)) {
if( (*flow)[e] == 0 ) continue;
- Node v=G.tail(e);
+ Node v=g->tail(e);
if( lev > level[v] ) { //Push is allowed now
@@ -474,12 +477,12 @@
int l=level[v]+1;
InEdgeIt e;
- for(G.first(e,v); G.valid(e); G.next(e)) {
- Node w=G.tail(e);
+ for(g->first(e,v); g->valid(e); g->next(e)) {
+ Node w=g->tail(e);
if ( level[w] == n && w != s ) {
bfs_queue.push(w);
Node first=level_list[l];
- if ( G.valid(first) ) left.set(first,w);
+ if ( g->valid(first) ) left.set(first,w);
right.set(w,first);
level_list[l]=w;
level.set(w, l);
@@ -489,11 +492,11 @@
//the starting flow
OutEdgeIt e;
- for(G.first(e,s); G.valid(e); G.next(e))
+ for(g->first(e,s); g->valid(e); g->next(e))
{
T c=(*capacity)[e];
if ( c == 0 ) continue;
- Node w=G.head(e);
+ Node w=g->head(e);
if ( level[w] < n ) {
if ( excess[w] == 0 && w!=t ) active[level[w]].push(w);
flow->set(e, c);
@@ -518,13 +521,13 @@
int l=level[v]+1;
InEdgeIt e;
- for(G.first(e,v); G.valid(e); G.next(e)) {
+ for(g->first(e,v); g->valid(e); g->next(e)) {
if ( (*capacity)[e] == (*flow)[e] ) continue;
- Node w=G.tail(e);
+ Node w=g->tail(e);
if ( level[w] == n && w != s ) {
bfs_queue.push(w);
Node first=level_list[l];
- if ( G.valid(first) ) left.set(first,w);
+ if ( g->valid(first) ) left.set(first,w);
right.set(w,first);
level_list[l]=w;
level.set(w, l);
@@ -532,13 +535,13 @@
}
OutEdgeIt f;
- for(G.first(f,v); G.valid(f); G.next(f)) {
+ for(g->first(f,v); g->valid(f); g->next(f)) {
if ( 0 == (*flow)[f] ) continue;
- Node w=G.head(f);
+ Node w=g->head(f);
if ( level[w] == n && w != s ) {
bfs_queue.push(w);
Node first=level_list[l];
- if ( G.valid(first) ) left.set(first,w);
+ if ( g->valid(first) ) left.set(first,w);
right.set(w,first);
level_list[l]=w;
level.set(w, l);
@@ -549,11 +552,11 @@
//the starting flow
OutEdgeIt e;
- for(G.first(e,s); G.valid(e); G.next(e))
+ for(g->first(e,s); g->valid(e); g->next(e))
{
T rem=(*capacity)[e]-(*flow)[e];
if ( rem == 0 ) continue;
- Node w=G.head(e);
+ Node w=g->head(e);
if ( level[w] < n ) {
if ( excess[w] == 0 && w!=t ) active[level[w]].push(w);
flow->set(e, (*capacity)[e]);
@@ -562,10 +565,10 @@
}
InEdgeIt f;
- for(G.first(f,s); G.valid(f); G.next(f))
+ for(g->first(f,s); g->valid(f); g->next(f))
{
if ( (*flow)[f] == 0 ) continue;
- Node w=G.tail(f);
+ Node w=g->tail(f);
if ( level[w] < n ) {
if ( excess[w] == 0 && w!=t ) active[level[w]].push(w);
excess.set(w, excess[w]+(*flow)[f]);
@@ -589,8 +592,8 @@
Node left_n=left[w];
//unlacing starts
- if ( G.valid(right_n) ) {
- if ( G.valid(left_n) ) {
+ if ( g->valid(right_n) ) {
+ if ( g->valid(left_n) ) {
right.set(left_n, right_n);
left.set(right_n, left_n);
} else {
@@ -598,7 +601,7 @@
left.set(right_n, INVALID);
}
} else {
- if ( G.valid(left_n) ) {
+ if ( g->valid(left_n) ) {
right.set(left_n, INVALID);
} else {
level_list[lev]=INVALID;
@@ -606,12 +609,12 @@
}
//unlacing ends
- if ( !G.valid(level_list[lev]) ) {
+ if ( !g->valid(level_list[lev]) ) {
//gapping starts
for (int i=lev; i!=k ; ) {
Node v=level_list[++i];
- while ( G.valid(v) ) {
+ while ( g->valid(v) ) {
level.set(v,n);
v=right[v];
}
@@ -637,7 +640,7 @@
if ( what_heur ) b=newlevel;
if ( k < newlevel ) ++k; //now k=newlevel
Node first=level_list[newlevel];
- if ( G.valid(first) ) left.set(first,w);
+ if ( g->valid(first) ) left.set(first,w);
right.set(w,first);
left.set(w,INVALID);
level_list[newlevel]=w;
Modified: hugo/trunk/src/work/marci/edmonds_karp.h
==============================================================================
--- hugo/trunk/src/work/marci/edmonds_karp.h (original)
+++ hugo/trunk/src/work/marci/edmonds_karp.h Thu Apr 29 12:16:46 2004
@@ -10,244 +10,10 @@
#include <invalid.h>
#include <graph_wrapper.h>
#include <maps.h>
+#include <for_each_macros.h>
namespace hugo {
-// template<typename Graph, typename Number, typename CapacityMap, typename FlowMap>
-// class ResGraph {
-// public:
-// typedef typename Graph::Node Node;
-// typedef typename Graph::NodeIt NodeIt;
-// private:
-// typedef typename Graph::SymEdgeIt OldSymEdgeIt;
-// const Graph& G;
-// const CapacityMap& capacity;
-// FlowMap& flow;
-// public:
-// ResGraph(const Graph& _G, const CapacityMap& _capacity, FlowMap& _flow) :
-// G(_G), capacity(_capacity), flow(_flow) { }
-
-// class Edge;
-// class OutEdgeIt;
-// friend class Edge;
-// friend class OutEdgeIt;
-
-// class Edge {
-// friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
-// protected:
-// const ResGraph<Graph, Number, FlowMap, CapacityMap>* resG;
-// OldSymEdgeIt sym;
-// public:
-// Edge() { }
-// //Edge(const Edge& e) : resG(e.resG), sym(e.sym) { }
-// Number free() const {
-// if (resG->G.aNode(sym)==resG->G.tail(sym)) {
-// return (resG->capacity.get(sym)-resG->flow.get(sym));
-// } else {
-// return (resG->flow.get(sym));
-// }
-// }
-// bool valid() const { return sym.valid(); }
-// void augment(Number a) const {
-// if (resG->G.aNode(sym)==resG->G.tail(sym)) {
-// resG->flow.set(sym, resG->flow.get(sym)+a);
-// //resG->flow[sym]+=a;
-// } else {
-// resG->flow.set(sym, resG->flow.get(sym)-a);
-// //resG->flow[sym]-=a;
-// }
-// }
-// };
-
-// class OutEdgeIt : public Edge {
-// friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
-// public:
-// OutEdgeIt() { }
-// //OutEdgeIt(const OutEdgeIt& e) { resG=e.resG; sym=e.sym; }
-// private:
-// OutEdgeIt(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) {
-// resG=&_resG;
-// sym=resG->G.template first<OldSymEdgeIt>(v);
-// while( sym.valid() && !(free()>0) ) { ++sym; }
-// }
-// public:
-// OutEdgeIt& operator++() {
-// ++sym;
-// while( sym.valid() && !(free()>0) ) { ++sym; }
-// return *this;
-// }
-// };
-
-// void /*getF*/first(OutEdgeIt& e, Node v) const {
-// e=OutEdgeIt(*this, v);
-// }
-// void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
-
-// template< typename It >
-// It first() const {
-// It e;
-// /*getF*/first(e);
-// return e;
-// }
-
-// template< typename It >
-// It first(Node v) const {
-// It e;
-// /*getF*/first(e, v);
-// return e;
-// }
-
-// Node tail(Edge e) const { return G.aNode(e.sym); }
-// Node head(Edge e) const { return G.bNode(e.sym); }
-
-// Node aNode(OutEdgeIt e) const { return G.aNode(e.sym); }
-// Node bNode(OutEdgeIt e) const { return G.bNode(e.sym); }
-
-// int id(Node v) const { return G.id(v); }
-
-// template <typename S>
-// class NodeMap {
-// typename Graph::NodeMap<S> node_map;
-// public:
-// NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
-// NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
-// void set(Node nit, S a) { node_map.set(nit, a); }
-// S get(Node nit) const { return node_map.get(nit); }
-// S& operator[](Node nit) { return node_map[nit]; }
-// const S& operator[](Node nit) const { return node_map[nit]; }
-// };
-
-// };
-
-
-// template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
-// class ResGraph2 {
-// public:
-// typedef typename Graph::Node Node;
-// typedef typename Graph::NodeIt NodeIt;
-// private:
-// //typedef typename Graph::SymEdgeIt OldSymEdgeIt;
-// typedef typename Graph::OutEdgeIt OldOutEdgeIt;
-// typedef typename Graph::InEdgeIt OldInEdgeIt;
-
-// const Graph& G;
-// FlowMap& flow;
-// const CapacityMap& capacity;
-// public:
-// ResGraph2(const Graph& _G, FlowMap& _flow,
-// const CapacityMap& _capacity) :
-// G(_G), flow(_flow), capacity(_capacity) { }
-
-// class Edge;
-// class OutEdgeIt;
-// friend class Edge;
-// friend class OutEdgeIt;
-
-// class Edge {
-// friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
-// protected:
-// const ResGraph2<Graph, Number, FlowMap, CapacityMap>* resG;
-// //OldSymEdgeIt sym;
-// OldOutEdgeIt out;
-// OldInEdgeIt in;
-// bool out_or_in; //true, iff out
-// public:
-// Edge() : out_or_in(true) { }
-// Number free() const {
-// if (out_or_in) {
-// return (resG->capacity.get(out)-resG->flow.get(out));
-// } else {
-// return (resG->flow.get(in));
-// }
-// }
-// bool valid() const {
-// return out_or_in && out.valid() || in.valid(); }
-// void augment(Number a) const {
-// if (out_or_in) {
-// resG->flow.set(out, resG->flow.get(out)+a);
-// } else {
-// resG->flow.set(in, resG->flow.get(in)-a);
-// }
-// }
-// };
-
-// class OutEdgeIt : public Edge {
-// friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
-// public:
-// OutEdgeIt() { }
-// private:
-// OutEdgeIt(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) {
-// resG=&_resG;
-// out=resG->G.template first<OldOutEdgeIt>(v);
-// while( out.valid() && !(free()>0) ) { ++out; }
-// if (!out.valid()) {
-// out_or_in=0;
-// in=resG->G.template first<OldInEdgeIt>(v);
-// while( in.valid() && !(free()>0) ) { ++in; }
-// }
-// }
-// public:
-// OutEdgeIt& operator++() {
-// if (out_or_in) {
-// Node v=resG->G.aNode(out);
-// ++out;
-// while( out.valid() && !(free()>0) ) { ++out; }
-// if (!out.valid()) {
-// out_or_in=0;
-// in=resG->G.template first<OldInEdgeIt>(v);
-// while( in.valid() && !(free()>0) ) { ++in; }
-// }
-// } else {
-// ++in;
-// while( in.valid() && !(free()>0) ) { ++in; }
-// }
-// return *this;
-// }
-// };
-
-// void /*getF*/first(OutEdgeIt& e, Node v) const {
-// e=OutEdgeIt(*this, v);
-// }
-// void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
-
-// template< typename It >
-// It first() const {
-// It e;
-// /*getF*/first(e);
-// return e;
-// }
-
-// template< typename It >
-// It first(Node v) const {
-// It e;
-// /*getF*/first(e, v);
-// return e;
-// }
-
-// Node tail(Edge e) const {
-// return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
-// Node head(Edge e) const {
-// return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
-
-// Node aNode(OutEdgeIt e) const {
-// return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
-// Node bNode(OutEdgeIt e) const {
-// return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
-
-// int id(Node v) const { return G.id(v); }
-
-// template <typename S>
-// class NodeMap {
-// typename Graph::NodeMap<S> node_map;
-// public:
-// NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
-// NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
-// void set(Node nit, S a) { node_map.set(nit, a); }
-// S get(Node nit) const { return node_map.get(nit); }
-// };
-// };
-
-
template <typename Graph, typename Number,
typename CapacityMap, typename FlowMap>
class MaxFlow {
@@ -265,18 +31,23 @@
typedef ResGraphWrapper<const Graph, Number, CapacityMap, FlowMap> ResGW;
typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;
typedef typename ResGW::Edge ResGWEdge;
+ //typedef typename ResGW::template NodeMap<bool> ReachedMap;
+ typedef typename Graph::template NodeMap<bool> ReachedMap;
+ ReachedMap level;
+ //reached is called level because of compatibility with preflow
public:
MaxFlow(const Graph& _g, Node _s, Node _t, const CapacityMap& _capacity,
FlowMap& _flow) :
- g(&_g), s(_s), t(_t), capacity(&_capacity), flow(&_flow) { }
+ g(&_g), s(_s), t(_t), capacity(&_capacity), flow(&_flow), level(_g) { }
bool augmentOnShortestPath() {
ResGW res_graph(*g, *capacity, *flow);
bool _augment=false;
- BfsIterator< ResGW, typename ResGW::template NodeMap<bool> >
- bfs(res_graph);
+ //ReachedMap level(res_graph);
+ FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0);
+ BfsIterator<ResGW, ReachedMap> bfs(res_graph, level);
bfs.pushAndSetReached(s);
typename ResGW::template NodeMap<ResGWEdge> pred(res_graph);
@@ -342,8 +113,9 @@
ResGW res_graph(*g, *capacity, *flow);
- BfsIterator< ResGW, typename ResGW::template NodeMap<bool> >
- bfs(res_graph);
+ //ReachedMap level(res_graph);
+ FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0);
+ BfsIterator<ResGW, ReachedMap> bfs(res_graph, level);
bfs.pushAndSetReached(s);
//typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
@@ -454,8 +226,9 @@
ResGW res_graph(*g, *capacity, *flow);
//bfs for distances on the residual graph
- BfsIterator< ResGW, typename ResGW::template NodeMap<bool> >
- bfs(res_graph);
+ //ReachedMap level(res_graph);
+ FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0);
+ BfsIterator<ResGW, ReachedMap> bfs(res_graph, level);
bfs.pushAndSetReached(s);
typename ResGW::template NodeMap<int>
dist(res_graph); //filled up with 0's
@@ -560,9 +333,10 @@
bool _augment=false;
ResGW res_graph(*g, *capacity, *flow);
-
- BfsIterator< ResGW, typename ResGW::template NodeMap<bool> >
- bfs(res_graph);
+
+ //ReachedMap level(res_graph);
+ FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0);
+ BfsIterator<ResGW, ReachedMap> bfs(res_graph, level);
bfs.pushAndSetReached(s);
DistanceMap<ResGW> dist(res_graph);
More information about the Lemon-commits
mailing list