[Lemon-commits] [lemon_svn] marci: r457 - hugo/trunk/src/work/marci
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:39:33 CET 2006
Author: marci
Date: Fri Apr 16 15:05:08 2004
New Revision: 457
Modified:
hugo/trunk/src/work/marci/graph_wrapper.h
Log:
kicsit takaritottam, es szepitettem es, es maga a csuda, de azer nem
teljesen mer' meg kell csinalni vele dolgokat.
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 Fri Apr 16 15:05:08 2004
@@ -105,7 +105,6 @@
};
class OutEdgeIt {
friend class GraphWrapper<Graph>;
-// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
typename Graph::OutEdgeIt e;
public:
OutEdgeIt() { }
@@ -117,7 +116,6 @@
};
class InEdgeIt {
friend class GraphWrapper<Graph>;
-// typedef typename Graph::InEdgeIt GraphInEdgeIt;
typename Graph::InEdgeIt e;
public:
InEdgeIt() { }
@@ -130,7 +128,6 @@
//typedef typename Graph::SymEdgeIt SymEdgeIt;
class EdgeIt {
friend class GraphWrapper<Graph>;
-// typedef typename Graph::EdgeIt GraphEdgeIt;
typename Graph::EdgeIt e;
public:
EdgeIt() { }
@@ -152,25 +149,11 @@
EdgeIt& first(EdgeIt& i) const {
i=EdgeIt(*this); return i;
}
-// template<typename I> I& first(I& i) const {
-// i=I(*this);
-// return i;
-// }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// i=I(*this, p);
-// return i;
-// }
-
+
NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
-// template<typename I> I& next(I &i) const { graph->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; }
Node head(const Edge& e) const {
return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
@@ -181,11 +164,6 @@
return graph->valid(static_cast<typename Graph::Node>(n)); }
bool valid(const Edge& e) const {
return graph->valid(static_cast<typename Graph::Edge>(e)); }
-// template<typename I> bool valid(const I& i) const {
-// return graph->valid(i); }
-
- //template<typename I> void setInvalid(const I &i);
- //{ return graph->setInvalid(i); }
int nodeNum() const { return graph->nodeNum(); }
int edgeNum() const { return graph->edgeNum(); }
@@ -194,10 +172,6 @@
Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
-// template<typename I> Node aNode(const I& e) const {
-// return Node(graph->aNode(e.e)); }
-// template<typename I> Node bNode(const I& e) const {
-// return Node(graph->bNode(e.e)); }
Node addNode() const { return Node(graph->addNode()); }
Edge addEdge(const Node& tail, const Node& head) const {
@@ -205,7 +179,6 @@
void erase(const Node& i) const { graph->erase(i); }
void erase(const Edge& i) const { graph->erase(i); }
-// template<typename I> void erase(const I& i) const { graph->erase(i); }
void clear() const { graph->clear(); }
@@ -226,109 +199,65 @@
};
};
+ /// A graph wrapper which reverses the orientation of the edges.
-// template<typename Graph>
-// class RevGraphWrapper
-// {
-// protected:
-// Graph* graph;
-
-// public:
-// typedef Graph ParentGraph;
-
-// typedef typename Graph::Node Node;
-// typedef typename Graph::NodeIt NodeIt;
-
-// typedef typename Graph::Edge Edge;
-// typedef typename Graph::OutEdgeIt InEdgeIt;
-// typedef typename Graph::InEdgeIt OutEdgeIt;
-// //typedef typename Graph::SymEdgeIt SymEdgeIt;
-// typedef typename Graph::EdgeIt EdgeIt;
-
-// //RevGraphWrapper() : graph(0) { }
-// RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
-
-// void setGraph(Graph& _graph) { graph = &_graph; }
-// Graph& getGraph() const { return (*graph); }
-
-// template<typename I> I& first(I& i) const { return graph->first(i); }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// return graph->first(i, p); }
-
-// template<typename I> I& next(I &i) const { return graph->next(i); }
-
-// template< typename It > It first() const {
-// It e; first(e); return e; }
-
-// template< typename It > It first(const Node& v) const {
-// It e; first(e, v); return e; }
-
-// Node head(const Edge& e) const { return graph->tail(e); }
-// Node tail(const Edge& e) const { return graph->head(e); }
-
-// template<typename I> bool valid(const I& i) const
-// { return graph->valid(i); }
-
-// //template<typename I> void setInvalid(const I &i);
-// //{ return graph->setInvalid(i); }
-
-// template<typename I> Node aNode(const I& e) const {
-// return graph->aNode(e); }
-// template<typename I> Node bNode(const I& e) const {
-// return graph->bNode(e); }
-
-// Node addNode() const { return graph->addNode(); }
-// Edge addEdge(const Node& tail, const Node& head) const {
-// return graph->addEdge(tail, head); }
-
-// int nodeNum() const { return graph->nodeNum(); }
-// int edgeNum() const { return graph->edgeNum(); }
-
-// template<typename I> void erase(const I& i) const { graph->erase(i); }
-
-// void clear() const { graph->clear(); }
-
-// template<typename T> class NodeMap : public Graph::NodeMap<T> {
-// public:
-// NodeMap(const RevGraphWrapper<Graph>& _G) :
-// Graph::NodeMap<T>(_G.getGraph()) { }
-// NodeMap(const RevGraphWrapper<Graph>& _G, T a) :
-// Graph::NodeMap<T>(_G.getGraph(), a) { }
-// };
-
-// template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
-// public:
-// EdgeMap(const RevGraphWrapper<Graph>& _G) :
-// Graph::EdgeMap<T>(_G.getGraph()) { }
-// EdgeMap(const RevGraphWrapper<Graph>& _G, T a) :
-// Graph::EdgeMap<T>(_G.getGraph(), a) { }
-// };
-// };
-
-
+ /// A graph wrapper which reverses the orientation of the edges.
template<typename Graph>
class RevGraphWrapper : public GraphWrapper<Graph> {
public:
+
+ RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
+
typedef typename GraphWrapper<Graph>::Node Node;
typedef typename GraphWrapper<Graph>::Edge Edge;
- //FIXME
//If Graph::OutEdgeIt is not defined
//and we do not want to use RevGraphWrapper::InEdgeIt,
- //this won't work, because of typedef
- //OR
- //graphs have to define their non-existing iterators to void
- //Unfortunately all the typedefs are instantiated in templates,
- //unlike other stuff
- typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
- typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
+ //the typdef techinque does not work.
+ //Unfortunately all the typedefs are instantiated in templates.
+ //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
+ //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
-// RevGraphWrapper() : GraphWrapper<Graph>() { }
- RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
+ class OutEdgeIt {
+ friend class GraphWrapper<Graph>;
+ friend class RevGraphWrapper<Graph>;
+ typename Graph::OutEdgeIt e;
+ public:
+ OutEdgeIt() { }
+ OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
+ OutEdgeIt(const Invalid& i) : e(i) { }
+ OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
+ e(*(_G.graph), typename Graph::Node(_n)) { }
+ operator Edge() const { return Edge(typename Graph::Edge(e)); }
+ };
+ class InEdgeIt {
+ friend class GraphWrapper<Graph>;
+ friend class RevGraphWrapper<Graph>;
+ typename Graph::InEdgeIt e;
+ public:
+ InEdgeIt() { }
+ InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
+ InEdgeIt(const Invalid& i) : e(i) { }
+ InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) :
+ e(*(_G.graph), typename Graph::Node(_n)) { }
+ operator Edge() const { return Edge(typename Graph::Edge(e)); }
+ };
+
+ using GraphWrapper<Graph>::first;
+ OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
+ i=OutEdgeIt(*this, p); return i;
+ }
+ InEdgeIt& first(InEdgeIt& i, const Node& p) const {
+ i=InEdgeIt(*this, p); return i;
+ }
- Node head(const Edge& e) const
- { return GraphWrapper<Graph>::tail(e); }
- Node tail(const Edge& e) const
- { return GraphWrapper<Graph>::head(e); }
+ using GraphWrapper<Graph>::next;
+ OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
+ InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
+
+ Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
+ Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
+ Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
+ Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
};
/// Wrapper for hiding nodes and edges from a graph.
@@ -344,7 +273,7 @@
NodeFilterMap* node_filter_map;
EdgeFilterMap* edge_filter_map;
public:
-// SubGraphWrapper() : GraphWrapper<Graph>(), filter_map(0) { }
+
SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
EdgeFilterMap& _edge_filter_map) :
GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
@@ -366,24 +295,10 @@
}
operator Node() const { return Node(typename Graph::Node(n)); }
};
-// class NodeIt : public Graph::NodeIt {
-// // typedef typename Graph::NodeIt GraphNodeIt;
-// public:
-// NodeIt() { }
-// NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
-// NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
-// NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
-// Graph::NodeIt(*(_G.graph)) {
-// while (_G.graph->valid((*this)/*.GraphNodeIt*/) &&
-// !(*(_G.node_filter_map))[(*this)/*.GraphNodeIt*/])
-// _G.graph->next((*this)/*.GraphNodeIt*/);
-// }
-// };
typedef typename GraphWrapper<Graph>::Edge Edge;
class OutEdgeIt {
friend class GraphWrapper<Graph>;
friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
-// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
typename Graph::OutEdgeIt e;
public:
OutEdgeIt() { }
@@ -400,7 +315,6 @@
class InEdgeIt {
friend class GraphWrapper<Graph>;
friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
-// typedef typename Graph::InEdgeIt GraphInEdgeIt;
typename Graph::InEdgeIt e;
public:
InEdgeIt() { }
@@ -418,7 +332,6 @@
class EdgeIt {
friend class GraphWrapper<Graph>;
friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
-// typedef typename Graph::EdgeIt GraphEdgeIt;
typename Graph::EdgeIt e;
public:
EdgeIt() { }
@@ -431,51 +344,6 @@
}
operator Edge() const { return Edge(typename Graph::Edge(e)); }
};
-// operator Edge() const { return Edge(typename Graph::Edge(e)); }
-// };
-// class OutEdgeIt : public Graph::OutEdgeIt {
-// // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
-// public:
-// OutEdgeIt() { }
-// OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
-// OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
-// OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>&
-// _G, const Node& n) :
-// Graph::OutEdgeIt(*(_G.graph), n) {
-// while (_G.graph->valid((*this)/*.GraphOutEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphOutEdgeIt*/])
-// _G.graph->next((*this)/*.GraphOutEdgeIt*/);
-// }
-// };
-// class InEdgeIt : public Graph::InEdgeIt {
-// // typedef typename Graph::InEdgeIt GraphInEdgeIt;
-// public:
-// InEdgeIt() { }
-// InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
-// InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
-// InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
-// const Node& n) :
-// Graph::InEdgeIt(*(_G.graph), n) {
-// while (_G.graph->valid((*this)/*.GraphInEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphInEdgeIt*/])
-// _G.graph->next((*this)/*.GraphInEdgeIt*/);
-// }
-// };
-// // //typedef typename Graph::SymEdgeIt SymEdgeIt;
-// class EdgeIt : public Graph::EdgeIt {
-// // typedef typename Graph::EdgeIt GraphEdgeIt;
-// public:
-// EdgeIt() { }
-// EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
-// EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
-// EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
-// Graph::EdgeIt(*(_G.graph)) {
-// while (_G.graph->valid((*this)/*.GraphEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphEdgeIt*/])
-// _G.graph->next((*this)/*.GraphEdgeIt*/);
-// }
-// };
-
NodeIt& first(NodeIt& i) const {
i=NodeIt(*this); return i;
@@ -490,19 +358,6 @@
i=EdgeIt(*this); return i;
}
-// template<typename I> I& first(I& i) const {
-// graph->first(i);
-// //while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// graph->first(i, p);
-// // while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-
NodeIt& next(NodeIt& i) const {
graph->next(i.n);
while (graph->valid(i) && !(*node_filter_map)[i.n]) { graph->next(i.n); }
@@ -524,13 +379,6 @@
return i;
}
-// template<typename I> I& next(I &i) const {
-// graph->next(i);
-// // while (graph->valid(i) && !filter_map-get(i)) { graph->next(i); }
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-
Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
@@ -544,201 +392,21 @@
bool hidden(const Node& n) const { return (*node_filter_map)[n]; }
bool hidden(const Edge& e) const { return (*edge_filter_map)[e]; }
-
-// 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; }
};
-// //Subgraph on the same node-set and partial edge-set
-// template<typename Graph, typename NodeFilterMap,
-// typename EdgeFilterMap>
-// class SubGraphWrapper : public GraphWrapper<Graph> {
-// protected:
-// NodeFilterMap* node_filter_map;
-// EdgeFilterMap* edge_filter_map;
-// public:
-// // SubGraphWrapper() : GraphWrapper<Graph>(), filter_map(0) { }
-// SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
-// EdgeFilterMap& _edge_filter_map) :
-// GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
-// edge_filter_map(&_edge_filter_map) { }
-
-
-// typedef typename Graph::Node Node;
-// class NodeIt : public Graph::NodeIt {
-// // typedef typename Graph::NodeIt GraphNodeIt;
-// public:
-// NodeIt() { }
-// NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
-// NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
-// NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
-// Graph::NodeIt(*(_G.graph)) {
-// while (_G.graph->valid((*this)/*.GraphNodeIt*/) &&
-// !(*(_G.node_filter_map))[(*this)/*.GraphNodeIt*/])
-// _G.graph->next((*this)/*.GraphNodeIt*/);
-// }
-// };
-// typedef typename Graph::Edge Edge;
-// class OutEdgeIt : public Graph::OutEdgeIt {
-// // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
-// public:
-// OutEdgeIt() { }
-// OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
-// OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
-// OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>&
-// _G, const Node& n) :
-// Graph::OutEdgeIt(*(_G.graph), n) {
-// while (_G.graph->valid((*this)/*.GraphOutEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphOutEdgeIt*/])
-// _G.graph->next((*this)/*.GraphOutEdgeIt*/);
-// }
-// };
-// class InEdgeIt : public Graph::InEdgeIt {
-// // typedef typename Graph::InEdgeIt GraphInEdgeIt;
-// public:
-// InEdgeIt() { }
-// InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
-// InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
-// InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
-// const Node& n) :
-// Graph::InEdgeIt(*(_G.graph), n) {
-// while (_G.graph->valid((*this)/*.GraphInEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphInEdgeIt*/])
-// _G.graph->next((*this)/*.GraphInEdgeIt*/);
-// }
-// };
-// // //typedef typename Graph::SymEdgeIt SymEdgeIt;
-// class EdgeIt : public Graph::EdgeIt {
-// // typedef typename Graph::EdgeIt GraphEdgeIt;
-// public:
-// EdgeIt() { }
-// EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
-// EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
-// EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
-// Graph::EdgeIt(*(_G.graph)) {
-// while (_G.graph->valid((*this)/*.GraphEdgeIt*/) &&
-// !(*(_G.edge_filter_map))[(*this)/*.GraphEdgeIt*/])
-// _G.graph->next((*this)/*.GraphEdgeIt*/);
-// }
-// };
-
-// NodeIt& first(NodeIt& i) const {
-// i=NodeIt(*this);
-// return i;
-// }
-// OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
-// i=OutEdgeIt(*this, n);
-// return i;
-// }
-// InEdgeIt& first(InEdgeIt& i, const Node& n) const {
-// i=InEdgeIt(*this, n);
-// return i;
-// }
-// EdgeIt& first(EdgeIt& i) const {
-// i=EdgeIt(*this);
-// return i;
-// }
-
-// // template<typename I> I& first(I& i) const {
-// // graph->first(i);
-// // //while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
-// // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// // return i;
-// // }
-// // template<typename I, typename P> I& first(I& i, const P& p) const {
-// // graph->first(i, p);
-// // // while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
-// // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// // return i;
-// // }
-
-// NodeIt& next(NodeIt& i) const {
-// graph->next(i);
-// while (graph->valid(i) && !(*node_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-// OutEdgeIt& next(OutEdgeIt& i) const {
-// graph->next(i);
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-// InEdgeIt& next(InEdgeIt& i) const {
-// graph->next(i);
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-// EdgeIt& next(EdgeIt& i) const {
-// graph->next(i);
-// while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
-// return i;
-// }
-
-// // template<typename I> I& next(I &i) const {
-// // graph->next(i);
-// // // while (graph->valid(i) && !filter_map-get(i)) { graph->next(i); }
-// // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->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; }
-// };
+ /// A wrapper for getting an undirected graph by forgetting the orientation of a directed one.
+ /// A wrapper for getting an undirected graph by forgetting the orientation of a directed one.
template<typename Graph>
class UndirGraphWrapper : public GraphWrapper<Graph> {
-// protected:
-// typedef typename Graph::Edge GraphEdge;
-// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
-// typedef typename Graph::InEdgeIt GraphInEdgeIt;
public:
typedef typename GraphWrapper<Graph>::Node Node;
typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
typedef typename GraphWrapper<Graph>::Edge Edge;
typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
-// UndirGraphWrapper() : GraphWrapper<Graph>() { }
UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
-
-// class Edge {
-// friend class UndirGraphWrapper<Graph>;
-// protected:
-// bool out_or_in; //true iff out
-// GraphOutEdgeIt out;
-// GraphInEdgeIt in;
-// public:
-// Edge() : out_or_in(), out(), in() { }
-// Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
-// operator GraphEdge() const {
-// if (out_or_in) return(out); else return(in);
-// }
-// //FIXME
-// //2 edges are equal if they "refer" to the same physical edge
-// //is it good?
-// friend bool operator==(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in);
-// //return (u.out_or_in && u.out==v.out);
-// else
-// if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in);
-// //return (!u.out_or_in && u.in==v.in);
-// }
-// friend bool operator!=(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in);
-// //return (!u.out_or_in || u.out!=v.out);
-// else
-// if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in);
-// //return (u.out_or_in || u.in!=v.in);
-// }
-// };
-
class OutEdgeIt {
friend class UndirGraphWrapper<Graph>;
bool out_or_in; //true iff out
@@ -755,44 +423,14 @@
if (out_or_in) return Edge(out); else return Edge(in);
}
};
-// class OutEdgeIt : public Edge {
-// friend class UndirGraphWrapper<Graph>;
-// public:
-// OutEdgeIt() : Edge() { }
-// OutEdgeIt(const Invalid& i) : Edge(i) { }
-// OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& n)
-// : Edge() {
-// out_or_in=true; _G.graph->first(out, n);
-// if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, n); }
-// }
-// };
//FIXME InEdgeIt
typedef OutEdgeIt InEdgeIt;
-// class EdgeIt : public Edge {
-// friend class UndirGraphWrapper<Graph>;
-// protected:
-// NodeIt v;
-// public:
-// EdgeIt() : Edge() { }
-// EdgeIt(const Invalid& i) : Edge(i) { }
-// EdgeIt(const UndirGraphWrapper<Graph>& _G)
-// : Edge() {
-// out_or_in=true;
-// //Node v;
-// _G.first(v);
-// if (_G.valid(v)) _G.graph->first(out); else out=INVALID;
-// while (_G.valid(v) && !_G.graph->valid(out)) {
-// _G.graph->next(v);
-// if (_G.valid(v)) _G.graph->first(out);
-// }
-// }
-// };
-
- NodeIt& first(NodeIt& i) const {
- i=NodeIt(*this); return i;
- }
+ using GraphWrapper<Graph>::first;
+// NodeIt& first(NodeIt& i) const {
+// i=NodeIt(*this); return i;
+// }
OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
i=OutEdgeIt(*this, p); return i;
}
@@ -800,18 +438,15 @@
// InEdgeIt& first(InEdgeIt& i, const Node& p) const {
// i=InEdgeIt(*this, p); return i;
// }
- EdgeIt& first(EdgeIt& i) const {
- i=EdgeIt(*this); return i;
- }
+// EdgeIt& first(EdgeIt& i) const {
+// i=EdgeIt(*this); return i;
+// }
-// template<typename I> I& first(I& i) const { graph->first(i); return i; }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// graph->first(i, p); return i; }
-
- NodeIt& next(NodeIt& n) const {
- GraphWrapper<Graph>::next(n);
- return n;
- }
+ using GraphWrapper<Graph>::next;
+// NodeIt& next(NodeIt& n) const {
+// GraphWrapper<Graph>::next(n);
+// return n;
+// }
OutEdgeIt& next(OutEdgeIt& e) const {
if (e.out_or_in) {
typename Graph::Node n=graph->tail(e.out);
@@ -823,148 +458,25 @@
return e;
}
//FIXME InEdgeIt
- EdgeIt& next(EdgeIt& e) const {
- GraphWrapper<Graph>::next(n);
-// graph->next(e.e);
- return e;
- }
-
-// template<typename I> I& next(I &i) const { graph->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; }
-
-// Node head(const Edge& e) const { return gw.head(e); }
-// Node tail(const Edge& e) const { return gw.tail(e); }
-
-// template<typename I> bool valid(const I& i) const
-// { return gw.valid(i); }
-
-// int nodeNum() const { return gw.nodeNum(); }
-// int edgeNum() const { return gw.edgeNum(); }
-
-// template<typename I> Node aNode(const I& e) const {
-// return graph->aNode(e); }
-// template<typename I> Node bNode(const I& e) const {
-// return graph->bNode(e); }
+// EdgeIt& next(EdgeIt& e) const {
+// GraphWrapper<Graph>::next(n);
+// // graph->next(e.e);
+// return e;
+// }
Node aNode(const OutEdgeIt& e) const {
if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
Node bNode(const OutEdgeIt& e) const {
if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
+ };
-// Node addNode() const { return gw.addNode(); }
-
-// FIXME: ez igy nem jo, mert nem
-// Edge addEdge(const Node& tail, const Node& head) const {
-// return graph->addEdge(tail, head); }
-
-// template<typename I> void erase(const I& i) const { gw.erase(i); }
-
-// void clear() const { gw.clear(); }
-
-// template<typename T> class NodeMap : public Graph::NodeMap<T> {
-// public:
-// NodeMap(const UndirGraphWrapper<Graph>& _G) :
-// Graph::NodeMap<T>(_G.gw) { }
-// NodeMap(const UndirGraphWrapper<Graph>& _G, T a) :
-// Graph::NodeMap<T>(_G.gw, a) { }
-// };
-
-// template<typename T> class EdgeMap :
-// public GraphWrapperSkeleton<Graph>::EdgeMap<T> {
-// public:
-// EdgeMap(const UndirGraphWrapper<Graph>& _G) :
-// GraphWrapperSkeleton<Graph>::EdgeMap<T>(_G.gw) { }
-// EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) :
-// Graph::EdgeMap<T>(_G.gw, a) { }
-// };
- };
-
-
-
-
-
-// template<typename Graph>
-// class SymGraphWrapper
-// {
-// Graph* graph;
-
-// public:
-// typedef Graph ParentGraph;
-
-// typedef typename Graph::Node Node;
-// typedef typename Graph::Edge Edge;
-
-// typedef typename Graph::NodeIt NodeIt;
-
-// //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
-// //iranyitatlant, ami van
-// //mert csak 1 dolgot lehet be typedef-elni
-// typedef typename Graph::OutEdgeIt SymEdgeIt;
-// //typedef typename Graph::InEdgeIt SymEdgeIt;
-// //typedef typename Graph::SymEdgeIt SymEdgeIt;
-// typedef typename Graph::EdgeIt EdgeIt;
-
-// int nodeNum() const { return graph->nodeNum(); }
-// int edgeNum() const { return graph->edgeNum(); }
-
-// template<typename I> I& first(I& i) const { return graph->first(i); }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// return graph->first(i, p); }
-// //template<typename I> I next(const I i); { return graph->goNext(i); }
-// //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
-
-// template< typename It > It first() const {
-// It e; first(e); return e; }
-
-// template< typename It > It first(Node v) const {
-// It e; first(e, v); return e; }
-
-// Node head(const Edge& e) const { return graph->head(e); }
-// Node tail(const Edge& e) const { return graph->tail(e); }
-
-// template<typename I> Node aNode(const I& e) const {
-// return graph->aNode(e); }
-// template<typename I> Node bNode(const I& e) const {
-// return graph->bNode(e); }
-
-// //template<typename I> bool valid(const I i);
-// //{ return graph->valid(i); }
-
-// //template<typename I> void setInvalid(const I &i);
-// //{ return graph->setInvalid(i); }
-
-// Node addNode() { return graph->addNode(); }
-// Edge addEdge(const Node& tail, const Node& head) {
-// return graph->addEdge(tail, head); }
-
-// template<typename I> void erase(const I& i) { graph->erase(i); }
-
-// void clear() { graph->clear(); }
-
-// template<typename T> class NodeMap : public Graph::NodeMap<T> { };
-// template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
-
-// void setGraph(Graph& _graph) { graph = &_graph; }
-// Graph& getGraph() { return (*graph); }
-
-// //SymGraphWrapper() : graph(0) { }
-// SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
-// };
-
-
-
+ /// A wrapper for composing the residual graph for directed flow and circulation problems.
+ /// A wrapper for composing the residual graph for directed flow and circulation problems.
template<typename Graph, typename Number,
typename CapacityMap, typename FlowMap>
class ResGraphWrapper : public GraphWrapper<Graph> {
protected:
-// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
-// typedef typename Graph::InEdgeIt GraphInEdgeIt;
-// typedef typename Graph::Edge GraphEdge;
const CapacityMap* capacity;
FlowMap* flow;
public:
@@ -1002,33 +514,7 @@
static_cast<typename Graph::Edge>(v));
}
};
-// class Edge {
-// friend class ResGraphWrapper<Graph, Number,lksd FlowMap, CapacityMap>;
-// protected:
-// bool out_or_in; //true, iff out
-// GraphOutEdgeIt out;
-// GraphInEdgeIt in;
-// public:
-// Edge() : out_or_in(true) { }
-// Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
-// // bool valid() const {
-// // return out_or_in && out.valid() || in.valid(); }
-// friend bool operator==(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// return (u.out_or_in && u.out==v.out);
-// else
-// return (!u.out_or_in && u.in==v.in);
-// }
-// friend bool operator!=(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// return (!u.out_or_in || u.out!=v.out);
-// else
-// return (u.out_or_in || u.in!=v.in);
-// }
-// operator GraphEdge() const {
-// if (out_or_in) return(out); else return(in);
-// }
-// };
+
class OutEdgeIt {
friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
protected:
@@ -1062,43 +548,6 @@
return Edge(in, this->forward);
}
};
-// class OutEdgeIt : public Edge {
-// friend class ResGraphWrapper<Graph, Number, FkklowMap, CapacityMap>;
-// public:
-// OutEdgeIt() { }
-// //FIXME
-// OutEdgeIt(const Edge& e) : Edge(e) { }
-// OutEdgeIt(const Invalid& i) : Edge(i) { }
-// OutEdgeIt(const ResGraphWrapper<Graph, Number, FdfvlowMap, CapacityMap>& resG, Node v) : Edge() {
-// resG.graph->first(out, v);
-// while( resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// if (!resG.graph->valid(out)) {
-// out_or_in=0;
-// resG.graph->first(in, v);
-// while( resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// }
-// }
-// public:
-// OutEdgeIt& operator++() {
-// if (out_or_in) {
-// Node v=/*resG->*/G->aNode(out);
-// ++out;
-// while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// if (!out.valid()) {
-// out_or_in=0;
-// G->first(in, v);
-// while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// }
-// } else {
-// ++in;
-// while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// }
-// return *this;
-// }
-// };
-
- //FIXME This is just for having InEdgeIt
-// class InEdgeIt : public Edge { };
class InEdgeIt {
friend class ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
@@ -1156,70 +605,11 @@
return Edge(e, this->forward);
}
};
-// class EdgeIt : public Edge {
-// friend class ResGraphWrapper<Graph, Number, FflowMap, CapacityMap>;
-// NodeIt v;
-// public:
-// EdgeIt() { }
-// //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
-// EdgeIt(const Invalid& i) : Edge(i) { }
-// EdgeIt(const ResGraphWrapper<Graph, Number, FlfowMap, CapacityMap>& resG) : Edge() {
-// resG.graph->first(v);
-// if (resG.graph->valid(v)) resG.graph->first(out, v); else out=INVALID;
-// while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// while (resG.graph->valid(v) && !resG.graph->valid(out)) {
-// resG.graph->next(v);
-// if (resG.graph->valid(v)) resG.graph->first(out, v);
-// while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// }
-// if (!resG.graph->valid(out)) {
-// out_or_in=0;
-// resG.graph->first(v);
-// if (resG.graph->valid(v)) resG.graph->first(in, v); else in=INVALID;
-// while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// while (resG.graph->valid(v) && !resG.graph->valid(in)) {
-// resG.graph->next(v);
-// if (resG.graph->valid(v)) resG.graph->first(in, v);
-// while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// }
-// }
-// }
-// EdgeIt& operator++() {
-// if (out_or_in) {
-// ++out;
-// while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// while (v.valid() && !out.valid()) {
-// ++v;
-// if (v.valid()) G->first(out, v);
-// while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// }
-// if (!out.valid()) {
-// out_or_in=0;
-// G->first(v);
-// if (v.valid()) G->first(in, v); else in=GraphInEdgeIt();
-// while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// while (v.valid() && !in.valid()) {
-// ++v;
-// if (v.valid()) G->first(in, v);
-// while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// }
-// }
-// } else {
-// ++in;
-// while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// while (v.valid() && !in.valid()) {
-// ++v;
-// if (v.valid()) G->first(in, v);
-// while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// }
-// }
-// return *this;
-// }
-// };
- NodeIt& first(NodeIt& i) const {
- i=NodeIt(*this); return i;
- }
+ using GraphWrapper<Graph>::first;
+// NodeIt& first(NodeIt& i) const {
+// i=NodeIt(*this); return i;
+// }
OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
i=OutEdgeIt(*this, p); return i;
}
@@ -1230,8 +620,9 @@
EdgeIt& first(EdgeIt& i) const {
i=EdgeIt(*this); return i;
}
-
- NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
+
+ using GraphWrapper<Graph>::next;
+// NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
OutEdgeIt& next(OutEdgeIt& e) const {
if (e.forward) {
Node v=graph->aNode(e.out);
@@ -1280,52 +671,6 @@
}
return e;
}
-// EdgeIt& next(EdgeIt& e) const {
-// if (e.out_or_in) {
-// graph->next(e.out);
-// while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
-// while (graph->valid(e.v) && !graph->valid(e.out)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.out, e.v);
-// while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
-// }
-// if (!graph->valid(e.out)) {
-// e.out_or_in=0;
-// graph->first(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=INVALID;
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// while (graph->valid(e.v) && !graph->valid(e.in)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// }
-// } else {
-// graph->next(e.in);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// while (graph->valid(e.v) && !graph->valid(e.in)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// }
-// return e;
-// }
-
-
-// template< typename It >
-// It first() const {
-// It e;
-// first(e);
-// return e;
-// }
-
-// template< typename It >
-// It first(Node v) const {
-// It e;
-// first(e, v);
-// return e;
-// }
Node tail(Edge e) const {
return ((e.forward) ? graph->tail(e) : graph->head(e)); }
@@ -1337,8 +682,9 @@
Node bNode(OutEdgeIt e) const {
return ((e.forward) ? graph->bNode(e.out) : graph->bNode(e.in)); }
- int nodeNum() const { return graph->nodeNum(); }
+// int nodeNum() const { return graph->nodeNum(); }
//FIXME
+ void edgeNum() const { }
//int edgeNum() const { return graph->edgeNum(); }
@@ -1378,24 +724,6 @@
// return ((*flow)[in]);
// }
-// template<typename T> class NodeMap : public Graph::NodeMap<T> {
-// public:
-// NodeMap(const ResGraphWrapper<Graph, Number, FlovwMap, CapacityMap>& _G)
-// : Graph::NodeMap<T>(_G.gw) { }
-// NodeMap(const ResGraphWrapper<Graph, Number, FlowvMap, CapacityMap>& _G,
-// T a) : Graph::NodeMap<T>(_G.gw, a) { }
-// };
-
-// template <typename T>
-// class NodeMap {
-// typename Graph::NodeMap<T> node_map;
-// public:
-// NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
-// NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
-// void set(Node nit, T a) { node_map.set(nit, a); }
-// T get(Node nit) const { return node_map.get(nit); }
-// };
-
template <typename T>
class EdgeMap {
typename Graph::EdgeMap<T> forward_map, backward_map;
@@ -1423,337 +751,9 @@
};
};
-
-
-// template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
-// class ResGraphWrapper : public GraphWrapper<Graph> {
-// protected:
-// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
-// typedef typename Graph::InEdgeIt GraphInEdgeIt;
-// typedef typename Graph::Edge GraphEdge;
-// FlowMap* flow;
-// const CapacityMap* capacity;
-// public:
-
-// ResGraphWrapper(Graph& _graph, FlowMap& _flow,
-// const CapacityMap& _capacity) :
-// GraphWrapper<Graph>(_graph), flow(&_flow), capacity(&_capacity) { }
-
-// class Edge;
-// class OutEdgeIt;
-// friend class Edge;
-// friend class OutEdgeIt;
-
-// typedef typename GraphWrapper<Graph>::Node Node;
-// typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
-// class Edge {
-// friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
-// protected:
-// bool out_or_in; //true, iff out
-// GraphOutEdgeIt out;
-// GraphInEdgeIt in;
-// public:
-// Edge() : out_or_in(true) { }
-// Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
-// // bool valid() const {
-// // return out_or_in && out.valid() || in.valid(); }
-// friend bool operator==(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// return (u.out_or_in && u.out==v.out);
-// else
-// return (!u.out_or_in && u.in==v.in);
-// }
-// friend bool operator!=(const Edge& u, const Edge& v) {
-// if (v.out_or_in)
-// return (!u.out_or_in || u.out!=v.out);
-// else
-// return (u.out_or_in || u.in!=v.in);
-// }
-// operator GraphEdge() const {
-// if (out_or_in) return(out); else return(in);
-// }
-// };
-// class OutEdgeIt : public Edge {
-// friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
-// public:
-// OutEdgeIt() { }
-// //FIXME
-// OutEdgeIt(const Edge& e) : Edge(e) { }
-// OutEdgeIt(const Invalid& i) : Edge(i) { }
-// OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() {
-// resG.graph->first(out, v);
-// while( resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// if (!resG.graph->valid(out)) {
-// out_or_in=0;
-// resG.graph->first(in, v);
-// while( resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// }
-// }
-// // public:
-// // OutEdgeIt& operator++() {
-// // if (out_or_in) {
-// // Node v=/*resG->*/G->aNode(out);
-// // ++out;
-// // while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// // if (!out.valid()) {
-// // out_or_in=0;
-// // G->first(in, v);
-// // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // }
-// // } else {
-// // ++in;
-// // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // }
-// // return *this;
-// // }
-// };
-
-// //FIXME This is just for having InEdgeIt
-// // class InEdgeIt : public Edge { };
-
-// class EdgeIt : public Edge {
-// friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
-// NodeIt v;
-// public:
-// EdgeIt() { }
-// //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
-// EdgeIt(const Invalid& i) : Edge(i) { }
-// EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() {
-// resG.graph->first(v);
-// if (resG.graph->valid(v)) resG.graph->first(out, v); else out=INVALID;
-// while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// while (resG.graph->valid(v) && !resG.graph->valid(out)) {
-// resG.graph->next(v);
-// if (resG.graph->valid(v)) resG.graph->first(out, v);
-// while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
-// }
-// if (!resG.graph->valid(out)) {
-// out_or_in=0;
-// resG.graph->first(v);
-// if (resG.graph->valid(v)) resG.graph->first(in, v); else in=INVALID;
-// while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// while (resG.graph->valid(v) && !resG.graph->valid(in)) {
-// resG.graph->next(v);
-// if (resG.graph->valid(v)) resG.graph->first(in, v);
-// while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
-// }
-// }
-// }
-// // EdgeIt& operator++() {
-// // if (out_or_in) {
-// // ++out;
-// // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// // while (v.valid() && !out.valid()) {
-// // ++v;
-// // if (v.valid()) G->first(out, v);
-// // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
-// // }
-// // if (!out.valid()) {
-// // out_or_in=0;
-// // G->first(v);
-// // if (v.valid()) G->first(in, v); else in=GraphInEdgeIt();
-// // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // while (v.valid() && !in.valid()) {
-// // ++v;
-// // if (v.valid()) G->first(in, v);
-// // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // }
-// // }
-// // } else {
-// // ++in;
-// // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // while (v.valid() && !in.valid()) {
-// // ++v;
-// // if (v.valid()) G->first(in, v);
-// // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
-// // }
-// // }
-// // return *this;
-// // }
-// };
-
-// NodeIt& first(NodeIt& i) const {
-// i=NodeIt(*this);
-// return i;
-// }
-// OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
-// i=OutEdgeIt(*this, p);
-// return i;
-// }
-// //FIXME Not yet implemented
-// //InEdgeIt& first(InEdgeIt& i, const Node& p) const {
-// //i=InEdgeIt(*this, p);
-// // return i;
-// //}
-// EdgeIt& first(EdgeIt& e) const {
-// e=EdgeIt(*this);
-// return e;
-// }
-
-// NodeIt& next(NodeIt& n) const { graph->next(n); return n; }
-// OutEdgeIt& next(OutEdgeIt& e) const {
-// if (e.out_or_in) {
-// Node v=graph->aNode(e.out);
-// graph->next(e.out);
-// while( graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
-// if (!graph->valid(e.out)) {
-// e.out_or_in=0;
-// graph->first(e.in, v);
-// while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// } else {
-// graph->next(e.in);
-// while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// return e;
-// }
-// //FIXME Not yet implemented
-// //InEdgeIt& next(InEdgeIt& e) const {
-// // return e;
-// //}
-// EdgeIt& next(EdgeIt& e) const {
-// if (e.out_or_in) {
-// graph->next(e.out);
-// while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
-// while (graph->valid(e.v) && !graph->valid(e.out)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.out, e.v);
-// while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
-// }
-// if (!graph->valid(e.out)) {
-// e.out_or_in=0;
-// graph->first(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=INVALID;
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// while (graph->valid(e.v) && !graph->valid(e.in)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// }
-// } else {
-// graph->next(e.in);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// while (graph->valid(e.v) && !graph->valid(e.in)) {
-// graph->next(e.v);
-// if (graph->valid(e.v)) graph->first(e.in, e.v);
-// while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
-// }
-// }
-// return e;
-// }
-
+ /// ErasingFirstGraphWrapper for blocking flows.
-// template< typename It >
-// It first() const {
-// It e;
-// first(e);
-// return e;
-// }
-
-// template< typename It >
-// It first(Node v) const {
-// It e;
-// first(e, v);
-// return e;
-// }
-
-// Node tail(Edge e) const {
-// return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
-// Node head(Edge e) const {
-// return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
-
-// Node aNode(OutEdgeIt e) const {
-// return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
-// Node bNode(OutEdgeIt e) const {
-// return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
-
-// int nodeNum() const { return graph->nodeNum(); }
-// //FIXME
-// //int edgeNum() const { return graph->edgeNum(); }
-
-
-// int id(Node v) const { return graph->id(v); }
-
-// bool valid(Node n) const { return graph->valid(n); }
-// bool valid(Edge e) const {
-// return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
-
-// void augment(const Edge& e, Number a) const {
-// if (e.out_or_in)
-// // flow->set(e.out, flow->get(e.out)+a);
-// flow->set(e.out, (*flow)[e.out]+a);
-// else
-// // flow->set(e.in, flow->get(e.in)-a);
-// flow->set(e.in, (*flow)[e.in]-a);
-// }
-
-// Number resCap(const Edge& e) const {
-// if (e.out_or_in)
-// // return (capacity->get(e.out)-flow->get(e.out));
-// return ((*capacity)[e.out]-(*flow)[e.out]);
-// else
-// // return (flow->get(e.in));
-// return ((*flow)[e.in]);
-// }
-
-// Number resCap(GraphOutEdgeIt out) const {
-// // return (capacity->get(out)-flow->get(out));
-// return ((*capacity)[out]-(*flow)[out]);
-// }
-
-// Number resCap(GraphInEdgeIt in) const {
-// // return (flow->get(in));
-// return ((*flow)[in]);
-// }
-
-// // template<typename T> class NodeMap : public Graph::NodeMap<T> {
-// // public:
-// // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G)
-// // : Graph::NodeMap<T>(_G.gw) { }
-// // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G,
-// // T a) : Graph::NodeMap<T>(_G.gw, a) { }
-// // };
-
-// // template <typename T>
-// // class NodeMap {
-// // typename Graph::NodeMap<T> node_map;
-// // public:
-// // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
-// // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
-// // void set(Node nit, T a) { node_map.set(nit, a); }
-// // T get(Node nit) const { return node_map.get(nit); }
-// // };
-
-// template <typename T>
-// class EdgeMap {
-// typename Graph::EdgeMap<T> forward_map, backward_map;
-// public:
-// EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
-// EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
-// void set(Edge e, T a) {
-// if (e.out_or_in)
-// forward_map.set(e.out, a);
-// else
-// backward_map.set(e.in, a);
-// }
-// T operator[](Edge e) const {
-// if (e.out_or_in)
-// return forward_map[e.out];
-// else
-// return backward_map[e.in];
-// }
-// // T get(Edge e) const {
-// // if (e.out_or_in)
-// // return forward_map.get(e.out);
-// // else
-// // return backward_map.get(e.in);
-// // }
-// };
-// };
-
-
- //ErasingFirstGraphWrapper for blocking flows
+ /// ErasingFirstGraphWrapper for blocking flows.
template<typename Graph, typename FirstOutEdgesMap>
class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
protected:
@@ -1764,18 +764,18 @@
GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
typedef typename GraphWrapper<Graph>::Node Node;
- class NodeIt {
- friend class GraphWrapper<Graph>;
- friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
- typename Graph::NodeIt n;
- public:
- NodeIt() { }
- NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
- NodeIt(const Invalid& i) : n(i) { }
- NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
- n(*(_G.graph)) { }
- operator Node() const { return Node(typename Graph::Node(n)); }
- };
+// class NodeIt {
+// friend class GraphWrapper<Graph>;
+// friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
+// typename Graph::NodeIt n;
+// public:
+// NodeIt() { }
+// NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
+// NodeIt(const Invalid& i) : n(i) { }
+// NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
+// n(*(_G.graph)) { }
+// operator Node() const { return Node(typename Graph::Node(n)); }
+// };
typedef typename GraphWrapper<Graph>::Edge Edge;
class OutEdgeIt {
friend class GraphWrapper<Graph>;
@@ -1820,9 +820,10 @@
operator Edge() const { return Edge(typename Graph::Edge(e)); }
};
- NodeIt& first(NodeIt& i) const {
- i=NodeIt(*this); return i;
- }
+ using GraphWrapper<Graph>::first;
+// NodeIt& first(NodeIt& i) const {
+// i=NodeIt(*this); return i;
+// }
OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
i=OutEdgeIt(*this, p); return i;
}
@@ -1833,21 +834,8 @@
i=EdgeIt(*this); return i;
}
-// template<typename I> I& first(I& i) const {
-// graph->first(i);
-// return i;
-// }
-// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
-// // e=first_out_edges->get(n);
-// e=(*first_out_edges)[n];
-// return e;
-// }
-// template<typename I, typename P> I& first(I& i, const P& p) const {
-// graph->first(i, p);
-// return i;
-// }
-
- NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
+ using GraphWrapper<Graph>::next;
+// NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }
@@ -1857,17 +845,6 @@
Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
-// template<typename I> I& next(I &i) const {
-// graph->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; }
-
void erase(const OutEdgeIt& e) const {
OutEdgeIt f=e;
this->next(f);
@@ -1875,268 +852,6 @@
}
};
-// //ErasingFirstGraphWrapper for blocking flows
-// template<typename Graph, typename FirstOutEdgesMap>
-// class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
-// protected:
-// FirstOutEdgesMap* first_out_edges;
-// public:
-// ErasingFirstGraphWrapper(Graph& _graph,
-// FirstOutEdgesMap& _first_out_edges) :
-// GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
-
-// typedef typename Graph::Node Node;
-// class NodeIt : public Graph::NodeIt {
-// public:
-// NodeIt() { }
-// NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
-// NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
-// NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
-// Graph::NodeIt(*(_G.graph)) { }
-// };
-// typedef typename Graph::Edge Edge;
-// class OutEdgeIt : public Graph::OutEdgeIt {
-// public:
-// OutEdgeIt() { }
-// OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
-// OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
-// OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
-// const Node& n) :
-// Graph::OutEdgeIt((*_G.first_out_edges)[n]) { }
-// };
-// class InEdgeIt : public Graph::InEdgeIt {
-// public:
-// InEdgeIt() { }
-// InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
-// InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
-// InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
-// const Node& n) :
-// Graph::InEdgeIt(*(_G.graph), n) { }
-// };
-// //typedef typename Graph::SymEdgeIt SymEdgeIt;
-// class EdgeIt : public Graph::EdgeIt {
-// public:
-// EdgeIt() { }
-// EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
-// EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
-// EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
-// Graph::EdgeIt(*(_G.graph)) { }
-// };
-
-// NodeIt& first(NodeIt& i) const {
-// i=NodeIt(*this);
-// return i;
-// }
-// OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
-// i=OutEdgeIt(*this, n);
-// // i=(*first_out_edges)[n];
-// return i;
-// }
-// InEdgeIt& first(InEdgeIt& i, const Node& n) const {
-// i=InEdgeIt(*this, n);
-// return i;
-// }
-// EdgeIt& first(EdgeIt& i) const {
-// i=EdgeIt(*this);
-// return i;
-// }
-
-// // template<typename I> I& first(I& i) const {
-// // graph->first(i);
-// // return i;
-// // }
-// // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
-// // // e=first_out_edges->get(n);
-// // e=(*first_out_edges)[n];
-// // return e;
-// // }
-// // template<typename I, typename P> I& first(I& i, const P& p) const {
-// // graph->first(i, p);
-// // return i;
-// // }
-
-// NodeIt& next(NodeIt& i) const {
-// graph->next(i);
-// return i;
-// }
-// OutEdgeIt& next(OutEdgeIt& i) const {
-// graph->next(i);
-// return i;
-// }
-// InEdgeIt& next(InEdgeIt& i) const {
-// graph->next(i);
-// return i;
-// }
-// EdgeIt& next(EdgeIt& i) const {
-// graph->next(i);
-// return i;
-// }
-
-// // template<typename I> I& next(I &i) const {
-// // graph->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; }
-
-// void erase(const OutEdgeIt& e) const {
-// OutEdgeIt f=e;
-// this->next(f);
-// first_out_edges->set(this->tail(e), f);
-// }
-// };
-
-
-// // FIXME: comparison should be made better!!!
-// template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
-// class ResGraphWrapper
-// {
-// Graph* graph;
-
-// public:
-// typedef Graph ParentGraph;
-
-// typedef typename Graph::Node Node;
-// typedef typename Graph::Edge Edge;
-
-// typedef typename Graph::NodeIt NodeIt;
-
-// class OutEdgeIt {
-// public:
-// //Graph::Node n;
-// bool out_or_in;
-// typename Graph::OutEdgeIt o;
-// typename Graph::InEdgeIt i;
-// };
-// class InEdgeIt {
-// public:
-// //Graph::Node n;
-// bool out_or_in;
-// typename Graph::OutEdgeIt o;
-// typename Graph::InEdgeIt i;
-// };
-// typedef typename Graph::SymEdgeIt SymEdgeIt;
-// typedef typename Graph::EdgeIt EdgeIt;
-
-// int nodeNum() const { return gw.nodeNum(); }
-// int edgeNum() const { return gw.edgeNum(); }
-
-// Node& first(Node& n) const { return gw.first(n); }
-
-// // Edge and SymEdge is missing!!!!
-// // Edge <-> In/OutEdgeIt conversion is missing!!!!
-
-// //FIXME
-// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const
-// {
-// e.n=n;
-// gw.first(e.o,n);
-// while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
-// gw.goNext(e.o);
-// if(!gw.valid(e.o)) {
-// gw.first(e.i,n);
-// while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
-// gw.goNext(e.i);
-// }
-// return e;
-// }
-// /*
-// OutEdgeIt &goNext(OutEdgeIt &e)
-// {
-// if(gw.valid(e.o)) {
-// while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
-// gw.goNext(e.o);
-// if(gw.valid(e.o)) return e;
-// else gw.first(e.i,e.n);
-// }
-// else {
-// while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
-// gw.goNext(e.i);
-// return e;
-// }
-// }
-// OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
-// */
-// //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);}
-
-// //FIXME
-// InEdgeIt& first(InEdgeIt& e, const Node& n) const
-// {
-// e.n=n;
-// gw.first(e.i,n);
-// while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
-// gw.goNext(e.i);
-// if(!gw.valid(e.i)) {
-// gw.first(e.o,n);
-// while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
-// gw.goNext(e.o);
-// }
-// return e;
-// }
-// /*
-// InEdgeIt &goNext(InEdgeIt &e)
-// {
-// if(gw.valid(e.i)) {
-// while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
-// gw.goNext(e.i);
-// if(gw.valid(e.i)) return e;
-// else gw.first(e.o,e.n);
-// }
-// else {
-// while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
-// gw.goNext(e.o);
-// return e;
-// }
-// }
-// InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
-// */
-// //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);}
-
-// //template<typename I> I &goNext(I &i); { return gw.goNext(i); }
-// //template<typename I> I next(const I i); { return gw.goNext(i); }
-
-// template< typename It > It first() const {
-// It e; first(e); return e; }
-
-// template< typename It > It first(Node v) const {
-// It e; first(e, v); return e; }
-
-// Node head(const Edge& e) const { return gw.head(e); }
-// Node tail(const Edge& e) const { return gw.tail(e); }
-
-// template<typename I> Node aNode(const I& e) const {
-// return gw.aNode(e); }
-// template<typename I> Node bNode(const I& e) const {
-// return gw.bNode(e); }
-
-// //template<typename I> bool valid(const I i);
-// //{ return gw.valid(i); }
-
-// //template<typename I> void setInvalid(const I &i);
-// //{ return gw.setInvalid(i); }
-
-// Node addNode() { return gw.addNode(); }
-// Edge addEdge(const Node& tail, const Node& head) {
-// return gw.addEdge(tail, head); }
-
-// template<typename I> void erase(const I& i) { gw.erase(i); }
-
-// void clear() { gw.clear(); }
-
-// template<typename S> class NodeMap : public Graph::NodeMap<S> { };
-// template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
-
-// void setGraph(Graph& _graph) { graph = &_graph; }
-// Graph& getGraph() { return (*graph); }
-
-// //ResGraphWrapper() : graph(0) { }
-// ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
-// };
-
} //namespace hugo
#endif //HUGO_GRAPH_WRAPPER_H
More information about the Lemon-commits
mailing list