[Lemon-commits] [lemon_svn] marci: r369 - in hugo/trunk/src/work: . marci
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:39:04 CET 2006
Author: marci
Date: Tue Mar 30 09:07:44 2004
New Revision: 369
Modified:
hugo/trunk/src/work/edmonds_karp.h
hugo/trunk/src/work/marci/graph_wrapper.h
Log:
ResGraphWrapper ...
Modified: hugo/trunk/src/work/edmonds_karp.h
==============================================================================
--- hugo/trunk/src/work/edmonds_karp.h (original)
+++ hugo/trunk/src/work/edmonds_karp.h Tue Mar 30 09:07:44 2004
@@ -313,26 +313,174 @@
return _augment;
}
+// template<typename MutableGraph> bool augmentOnBlockingFlow() {
+// bool _augment=false;
+
+// AugGraph res_graph(*G, *flow, *capacity);
+
+// typedef typename AugGraph::NodeMap<bool> ReachedMap;
+// BfsIterator5< AugGraph /*, AugOutEdgeIt*/, ReachedMap > bfs(res_graph);
+
+// bfs.pushAndSetReached(s);
+// typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
+// while ( !bfs.finished() ) {
+// AugOutEdgeIt e=bfs;
+// if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
+// dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
+// }
+
+// ++bfs;
+// } //computing distances from s in the residual graph
+
+// MutableGraph F;
+// typename AugGraph::NodeMap<typename MutableGraph::Node>
+// res_graph_to_F(res_graph);
+// for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
+// res_graph_to_F.set(n, F.addNode());
+// }
+
+// typename MutableGraph::Node sF=res_graph_to_F.get(s);
+// typename MutableGraph::Node tF=res_graph_to_F.get(t);
+
+// typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
+// typename MutableGraph::EdgeMap<Number> residual_capacity(F);
+
+// //Making F to the graph containing the edges of the residual graph
+// //which are in some shortest paths
+// for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
+// if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
+// typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
+// original_edge.update();
+// original_edge.set(f, e);
+// residual_capacity.update();
+// residual_capacity.set(f, res_graph.free(e));
+// }
+// }
+
+// bool __augment=true;
+
+// while (__augment) {
+// __augment=false;
+// //computing blocking flow with dfs
+// typedef typename TrivGraphWrapper<MutableGraph>::NodeMap<bool> BlockingReachedMap;
+// DfsIterator5< TrivGraphWrapper<MutableGraph>/*, typename MutableGraph::OutEdgeIt*/, BlockingReachedMap > dfs(F);
+// typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
+// pred.set(sF, typename MutableGraph::Edge(INVALID));
+// //invalid iterators for sources
+
+// typename MutableGraph::NodeMap<Number> free(F);
+
+// dfs.pushAndSetReached(sF);
+// while (!dfs.finished()) {
+// ++dfs;
+// if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
+// if (dfs.isBNodeNewlyReached()) {
+// typename MutableGraph::Node v=F.aNode(dfs);
+// typename MutableGraph::Node w=F.bNode(dfs);
+// pred.set(w, dfs);
+// if (F.valid(pred.get(v))) {
+// free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
+// } else {
+// free.set(w, residual_capacity.get(dfs));
+// }
+// if (w==tF) {
+// __augment=true;
+// _augment=true;
+// break;
+// }
+
+// } else {
+// F.erase(typename MutableGraph::OutEdgeIt(dfs));
+// }
+// }
+// }
+
+// if (__augment) {
+// typename MutableGraph::Node n=tF;
+// Number augment_value=free.get(tF);
+// while (F.valid(pred.get(n))) {
+// typename MutableGraph::Edge e=pred.get(n);
+// res_graph.augment(original_edge.get(e), augment_value);
+// n=F.tail(e);
+// if (residual_capacity.get(e)==augment_value)
+// F.erase(e);
+// else
+// residual_capacity.set(e, residual_capacity.get(e)-augment_value);
+// }
+// }
+
+// }
+
+// return _augment;
+// }
+
+ template<typename GraphWrapper>
+ class DistanceMap {
+ protected:
+ GraphWrapper gw;
+ typename GraphWrapper::NodeMap<int> dist;
+ public:
+ DistanceMap(GraphWrapper& _gw) : gw(_gw), dist(_gw, _gw.nodeNum()) { }
+ //NodeMap(const ListGraph& _G, T a) :
+ //G(_G), container(G.node_id, a) { }
+ void set(const typename GraphWrapper::Node& n, int a) { dist[n]=a; }
+ int get(const typename GraphWrapper::Node& n) const { return dist[n]; }
+ bool get(const typename GraphWrapper::Edge& e) const {
+ return (dist.get(gw.tail(e))<dist.get(gw.head(e)));
+ }
+ //typename std::vector<T>::reference operator[](Node n) {
+ //return container[/*G.id(n)*/n.node->id]; }
+ //typename std::vector<T>::const_reference operator[](Node n) const {
+ //return container[/*G.id(n)*/n.node->id];
+ };
+
template<typename MutableGraph> bool augmentOnBlockingFlow() {
bool _augment=false;
AugGraph res_graph(*G, *flow, *capacity);
typedef typename AugGraph::NodeMap<bool> ReachedMap;
- BfsIterator5< AugGraph /*, AugOutEdgeIt*/, ReachedMap > bfs(res_graph);
+ BfsIterator5< AugGraph, ReachedMap > bfs(res_graph);
bfs.pushAndSetReached(s);
- typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
+ //typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
+ DistanceMap<AugGraph> dist(res_graph);
while ( !bfs.finished() ) {
AugOutEdgeIt e=bfs;
if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
}
-
++bfs;
} //computing distances from s in the residual graph
+// MutableGraph F;
+// typename AugGraph::NodeMap<typename MutableGraph::Node>
+// res_graph_to_F(res_graph);
+// for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
+// res_graph_to_F.set(n, F.addNode());
+// }
+
+// typename MutableGraph::Node sF=res_graph_to_F.get(s);
+// typename MutableGraph::Node tF=res_graph_to_F.get(t);
+
+// typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
+// typename MutableGraph::EdgeMap<Number> residual_capacity(F);
+
+// //Making F to the graph containing the edges of the residual graph
+// //which are in some shortest paths
+// for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
+// if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
+// typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
+// original_edge.update();
+// original_edge.set(f, e);
+// residual_capacity.update();
+// residual_capacity.set(f, res_graph.free(e));
+// }
+// }
+
MutableGraph F;
+ typedef SubGraphWrapper<AugGraph, DistanceMap<AugGraph> > FilterResGraph;
+ FilterResGraph filter_res_graph(res_graph, dist);
typename AugGraph::NodeMap<typename MutableGraph::Node>
res_graph_to_F(res_graph);
for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
@@ -363,7 +511,7 @@
__augment=false;
//computing blocking flow with dfs
typedef typename TrivGraphWrapper<MutableGraph>::NodeMap<bool> BlockingReachedMap;
- DfsIterator5< TrivGraphWrapper<MutableGraph>/*, typename MutableGraph::OutEdgeIt*/, BlockingReachedMap > dfs(F);
+ DfsIterator5< TrivGraphWrapper<MutableGraph>, BlockingReachedMap > dfs(F);
typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
pred.set(sF, typename MutableGraph::Edge(INVALID));
//invalid iterators for sources
@@ -413,6 +561,7 @@
return _augment;
}
+
template<typename MutableGraph> bool augmentOnBlockingFlow1() {
bool _augment=false;
@@ -420,7 +569,7 @@
//bfs for distances on the residual graph
typedef typename AugGraph::NodeMap<bool> ReachedMap;
- BfsIterator5< AugGraph /*, AugOutEdgeIt*/, ReachedMap > bfs(res_graph);
+ BfsIterator5< AugGraph, ReachedMap > bfs(res_graph);
bfs.pushAndSetReached(s);
typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
Modified: hugo/trunk/src/work/marci/graph_wrapper.h
==============================================================================
--- hugo/trunk/src/work/marci/graph_wrapper.h (original)
+++ hugo/trunk/src/work/marci/graph_wrapper.h Tue Mar 30 09:07:44 2004
@@ -91,7 +91,7 @@
GraphWrapper gw;
public:
- typedef typename GraphWrapper::BaseGraph BaseGraph;
+ //typedef typename GraphWrapper::BaseGraph BaseGraph;
typedef typename GraphWrapper::Node Node;
typedef typename GraphWrapper::NodeIt NodeIt;
@@ -105,8 +105,8 @@
//GraphWrapperSkeleton() : gw() { }
GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { }
- void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); }
- BaseGraph& getGraph() const { return gw.getGraph(); }
+ //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); }
+ //BaseGraph& getGraph() const { return gw.getGraph(); }
template<typename I> I& first(I& i) const { return gw.first(i); }
template<typename I, typename P> I& first(I& i, const P& p) const {
@@ -342,6 +342,48 @@
{ return GraphWrapperSkeleton<GraphWrapper>::head(e); }
};
+ //Subgraph on the same node-set and partial edge-set
+ template<typename GraphWrapper, typename EdgeFilterMap>
+ class SubGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> {
+ protected:
+ EdgeFilterMap* filter_map;
+ public:
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt;
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge;
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::EdgeIt EdgeIt;
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt InEdgeIt;
+ typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt OutEdgeIt;
+
+ SubGraphWrapper(GraphWrapper _gw, EdgeFilterMap& _filter_map) :
+ GraphWrapperSkeleton<GraphWrapper>(_gw), filter_map(&_filter_map) { }
+
+ template<typename I> I& first(I& i) const {
+ gw.first(i);
+ while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
+ return i;
+ }
+ template<typename I, typename P> I& first(I& i, const P& p) const {
+ gw.first(i, p);
+ while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
+ return i;
+ }
+
+ //template<typename I> I getNext(const I& i) const {
+ // return gw.getNext(i);
+ //}
+ template<typename I> I& next(I &i) const {
+ gw.next(i);
+ while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
+ return i;
+ }
+
+ template< typename It > It first() const {
+ It e; this->first(e); return e; }
+
+ template< typename It > It first(const Node& v) const {
+ It e; this->first(e, v); return e; }
+ };
// template<typename GraphWrapper>
// class UndirGraphWrapper {
@@ -858,6 +900,9 @@
// }
};
+ //FIXME This is just for having InEdgeIt
+ typedef void InEdgeIt;
+
class EdgeIt : public Edge {
friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
typename Graph::NodeIt v;
@@ -1005,6 +1050,11 @@
Node bNode(OutEdgeIt e) const {
return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); }
+ int nodeNum() const { return gw.nodeNum(); }
+ //FIXME
+ //int edgeNum() const { return gw.edgeNum(); }
+
+
int id(Node v) const { return gw.id(v); }
bool valid(Node n) const { return gw.valid(n); }
More information about the Lemon-commits
mailing list