marci@281: // -*- c++ -*- alpar@921: #ifndef LEMON_GRAPH_WRAPPER_H alpar@921: #define LEMON_GRAPH_WRAPPER_H marci@281: marci@281: #include marci@281: alpar@921: namespace lemon { marci@281: marci@281: template marci@281: class TrivGraphWrapper { marci@281: protected: marci@281: Graph* graph; marci@281: marci@281: public: marci@281: typedef Graph BaseGraph; marci@281: marci@281: typedef typename Graph::Node Node; marci@281: class NodeIt : public Graph::NodeIt { marci@281: public: marci@281: NodeIt() { } marci@281: NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { } marci@281: NodeIt(const Invalid& i) : Graph::NodeIt(i) { } marci@281: NodeIt(const TrivGraphWrapper& _G) : marci@281: Graph::NodeIt(*(_G.graph)) { } marci@281: }; marci@281: typedef typename Graph::Edge Edge; marci@281: //typedef typename Graph::OutEdgeIt OutEdgeIt; marci@281: class OutEdgeIt : public Graph::OutEdgeIt { marci@281: public: marci@281: OutEdgeIt() { } marci@281: OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { } marci@281: OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { } marci@281: OutEdgeIt(const TrivGraphWrapper& _G, const Node& n) : marci@281: Graph::OutEdgeIt(*(_G.graph), n) { } marci@281: }; marci@281: //typedef typename Graph::InEdgeIt InEdgeIt; marci@281: class InEdgeIt : public Graph::InEdgeIt { marci@281: public: marci@281: InEdgeIt() { } marci@281: InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { } marci@281: InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { } marci@281: InEdgeIt(const TrivGraphWrapper& _G, const Node& n) : marci@281: Graph::InEdgeIt(*(_G.graph), n) { } marci@281: }; marci@281: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: //typedef typename Graph::EdgeIt EdgeIt; marci@281: class EdgeIt : public Graph::EdgeIt { marci@281: public: marci@281: EdgeIt() { } marci@281: EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { } marci@281: EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { } marci@281: EdgeIt(const TrivGraphWrapper& _G) : marci@281: Graph::EdgeIt(*(_G.graph)) { } marci@281: }; marci@281: marci@281: //TrivGraphWrapper() : graph(0) { } marci@281: TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: marci@281: // void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // Graph& getGraph() const { return (*graph); } marci@281: marci@281: NodeIt& first(NodeIt& i) const { marci@281: i=NodeIt(*this); marci@281: return i; marci@281: } marci@281: EdgeIt& first(EdgeIt& i) const { marci@281: i=EdgeIt(*this); marci@281: return i; marci@281: } marci@281: // template I& first(I& i) const { marci@281: // //return graph->first(i); marci@281: // i=I(*this); marci@281: // return i; marci@281: // } marci@281: OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { marci@281: i=OutEdgeIt(*this, p); marci@281: return i; marci@281: } marci@281: InEdgeIt& first(InEdgeIt& i, const Node& p) const { marci@281: i=InEdgeIt(*this, p); marci@281: return i; marci@281: } marci@281: // template I& first(I& i, const P& p) const { marci@281: // //return graph->first(i, p); marci@281: // i=I(*this, p); marci@281: // return i; marci@281: // } marci@281: marci@281: // template I getNext(const I& i) const { marci@281: // return graph->getNext(i); } marci@281: template I& next(I &i) const { graph->next(i); return i; } marci@281: marci@281: template< typename It > It first() const { marci@281: It e; first(e); return e; } marci@281: marci@281: template< typename It > It first(const Node& v) const { marci@281: It e; first(e, v); return e; } marci@281: marci@281: Node head(const Edge& e) const { return graph->head(e); } marci@281: Node tail(const Edge& e) const { return graph->tail(e); } marci@281: marci@281: template bool valid(const I& i) const marci@281: { return graph->valid(i); } marci@281: marci@281: //template void setInvalid(const I &i); marci@281: //{ return graph->setInvalid(i); } marci@281: marci@281: int nodeNum() const { return graph->nodeNum(); } marci@281: int edgeNum() const { return graph->edgeNum(); } marci@281: marci@281: template Node aNode(const I& e) const { marci@281: return graph->aNode(e); } marci@281: template Node bNode(const I& e) const { marci@281: return graph->bNode(e); } marci@281: marci@281: Node addNode() const { return graph->addNode(); } marci@281: Edge addEdge(const Node& tail, const Node& head) const { marci@281: return graph->addEdge(tail, head); } marci@281: marci@281: template void erase(const I& i) const { graph->erase(i); } marci@281: marci@281: void clear() const { graph->clear(); } marci@281: marci@281: template class NodeMap : public Graph::NodeMap { marci@281: public: marci@281: NodeMap(const TrivGraphWrapper& _G) : marci@281: Graph::NodeMap(*(_G.graph)) { } marci@281: NodeMap(const TrivGraphWrapper& _G, T a) : marci@281: Graph::NodeMap(*(_G.graph), a) { } marci@281: }; marci@281: marci@281: template class EdgeMap : public Graph::EdgeMap { marci@281: public: marci@281: EdgeMap(const TrivGraphWrapper& _G) : marci@281: Graph::EdgeMap(*(_G.graph)) { } marci@281: EdgeMap(const TrivGraphWrapper& _G, T a) : marci@281: Graph::EdgeMap(*(_G.graph), a) { } marci@281: }; marci@281: marci@281: template class NodeMapWrapper { marci@281: protected: marci@281: Map* map; marci@281: public: marci@281: NodeMapWrapper(Map& _map) : map(&_map) { } marci@281: //template marci@281: void set(Node n, T a) { map->set(n, a); } marci@281: //template marci@281: T get(Node n) const { return map->get(n); } marci@281: }; marci@281: marci@281: template class EdgeMapWrapper { marci@281: protected: marci@281: Map* map; marci@281: public: marci@281: EdgeMapWrapper(Map& _map) : map(&_map) { } marci@281: //template marci@281: void set(Edge n, T a) { map->set(n, a); } marci@281: //template marci@281: T get(Edge n) const { return map->get(n); } marci@281: }; marci@281: }; marci@281: marci@281: template alpar@880: class GraphWrapper { marci@281: protected: marci@281: GraphWrapper gw; marci@281: marci@281: public: marci@281: //typedef typename GraphWrapper::BaseGraph BaseGraph; marci@281: marci@281: // typedef typename GraphWrapper::Node Node; marci@281: // typedef typename GraphWrapper::NodeIt NodeIt; marci@281: marci@281: // typedef typename GraphWrapper::Edge Edge; marci@281: // typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; marci@281: // typedef typename GraphWrapper::InEdgeIt InEdgeIt; marci@281: // //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; marci@281: // typedef typename GraphWrapper::EdgeIt EdgeIt; marci@281: marci@281: typedef typename GraphWrapper::Node Node; marci@281: class NodeIt : public GraphWrapper::NodeIt { marci@281: public: marci@281: NodeIt() { } marci@281: NodeIt(const typename GraphWrapper::NodeIt& n) : marci@281: GraphWrapper::NodeIt(n) { } marci@281: NodeIt(const Invalid& i) : GraphWrapper::NodeIt(i) { } alpar@880: NodeIt(const GraphWrapper& _G) : marci@281: GraphWrapper::NodeIt(_G.gw) { } marci@281: }; marci@281: typedef typename GraphWrapper::Edge Edge; marci@281: //typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; marci@281: class OutEdgeIt : public GraphWrapper::OutEdgeIt { marci@281: public: marci@281: OutEdgeIt() { } marci@281: OutEdgeIt(const typename GraphWrapper::OutEdgeIt& e) : marci@281: GraphWrapper::OutEdgeIt(e) { } marci@281: OutEdgeIt(const Invalid& i) : GraphWrapper::OutEdgeIt(i) { } alpar@880: OutEdgeIt(const GraphWrapper& _G, const Node& n) : marci@281: GraphWrapper::OutEdgeIt(_G.gw, n) { } marci@281: }; marci@281: //typedef typename GraphWrapper::InEdgeIt InEdgeIt; marci@281: class InEdgeIt : public GraphWrapper::InEdgeIt { marci@281: public: marci@281: InEdgeIt() { } marci@281: InEdgeIt(const typename GraphWrapper::InEdgeIt& e) : marci@281: GraphWrapper::InEdgeIt(e) { } marci@281: InEdgeIt(const Invalid& i) : GraphWrapper::InEdgeIt(i) { } alpar@880: InEdgeIt(const GraphWrapper& _G, const Node& n) : marci@281: GraphWrapper::InEdgeIt(_G.gw, n) { } marci@281: }; marci@281: //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; marci@281: //typedef typename GraphWrapper::EdgeIt EdgeIt; marci@281: class EdgeIt : public GraphWrapper::EdgeIt { marci@281: public: marci@281: EdgeIt() { } marci@281: EdgeIt(const typename GraphWrapper::EdgeIt& e) : marci@281: GraphWrapper::EdgeIt(e) { } marci@281: EdgeIt(const Invalid& i) : GraphWrapper::EdgeIt(i) { } alpar@880: EdgeIt(const GraphWrapper& _G) : marci@281: GraphWrapper::EdgeIt(_G.gw) { } marci@281: }; marci@281: marci@281: alpar@880: //GraphWrapper() : gw() { } alpar@880: GraphWrapper(GraphWrapper _gw) : gw(_gw) { } marci@281: marci@281: //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); } marci@281: //BaseGraph& getGraph() const { return gw.getGraph(); } marci@281: marci@281: template I& first(I& i) const { marci@281: i=I(*this); marci@281: return i; marci@281: } marci@281: template I& first(I& i, const P& p) const { marci@281: i=I(*this, p); marci@281: return i; marci@281: } marci@281: marci@281: // template I getNext(const I& i) const { return gw.getNext(i); } marci@281: template I& next(I &i) const { gw.next(i); return i; } marci@281: marci@281: template< typename It > It first() const { marci@281: It e; this->first(e); return e; } marci@281: marci@281: template< typename It > It first(const Node& v) const { marci@281: It e; this->first(e, v); return e; } marci@281: marci@281: Node head(const Edge& e) const { return gw.head(e); } marci@281: Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: template bool valid(const I& i) const { return gw.valid(i); } marci@281: marci@281: //template void setInvalid(const I &i); marci@281: //{ return graph->setInvalid(i); } marci@281: marci@281: int nodeNum() const { return gw.nodeNum(); } marci@281: int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: template Node aNode(const I& e) const { return gw.aNode(e); } marci@281: template Node bNode(const I& e) const { return gw.bNode(e); } marci@281: marci@281: Node addNode() const { return gw.addNode(); } marci@281: Edge addEdge(const Node& tail, const Node& head) const { marci@281: return gw.addEdge(tail, head); } marci@281: marci@281: template void erase(const I& i) const { gw.erase(i); } marci@281: marci@281: void clear() const { gw.clear(); } marci@281: marci@281: template class NodeMap : public GraphWrapper::NodeMap { marci@281: public: alpar@880: NodeMap(const GraphWrapper& _G) : marci@281: GraphWrapper::NodeMap(_G.gw) { } alpar@880: NodeMap(const GraphWrapper& _G, T a) : marci@281: GraphWrapper::NodeMap(_G.gw, a) { } marci@281: }; marci@281: marci@281: template class EdgeMap : public GraphWrapper::EdgeMap { marci@281: public: alpar@880: EdgeMap(const GraphWrapper& _G) : marci@281: GraphWrapper::EdgeMap(_G.gw) { } alpar@880: EdgeMap(const GraphWrapper& _G, T a) : marci@281: GraphWrapper::EdgeMap(_G.gw, a) { } marci@281: }; marci@281: }; marci@281: marci@281: // template marci@281: // class RevGraphWrapper marci@281: // { marci@281: // protected: marci@281: // Graph* graph; marci@281: marci@281: // public: marci@281: // typedef Graph BaseGraph; marci@281: marci@281: // typedef typename Graph::Node Node; marci@281: // typedef typename Graph::NodeIt NodeIt; marci@281: marci@281: // typedef typename Graph::Edge Edge; marci@281: // typedef typename Graph::OutEdgeIt InEdgeIt; marci@281: // typedef typename Graph::InEdgeIt OutEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // //RevGraphWrapper() : graph(0) { } marci@281: // RevGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: marci@281: // void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // Graph& getGraph() const { return (*graph); } marci@281: marci@281: // template I& first(I& i) const { return graph->first(i); } marci@281: // template I& first(I& i, const P& p) const { marci@281: // return graph->first(i, p); } marci@281: marci@281: // template I getNext(const I& i) const { marci@281: // return graph->getNext(i); } marci@281: // template I& next(I &i) const { return graph->next(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(const Node& v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // Node head(const Edge& e) const { return graph->tail(e); } marci@281: // Node tail(const Edge& e) const { return graph->head(e); } marci@281: marci@281: // template bool valid(const I& i) const marci@281: // { return graph->valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return graph->setInvalid(i); } marci@281: marci@281: // template Node aNode(const I& e) const { marci@281: // return graph->aNode(e); } marci@281: // template Node bNode(const I& e) const { marci@281: // return graph->bNode(e); } marci@281: marci@281: // Node addNode() const { return graph->addNode(); } marci@281: // Edge addEdge(const Node& tail, const Node& head) const { marci@281: // return graph->addEdge(tail, head); } marci@281: marci@281: // int nodeNum() const { return graph->nodeNum(); } marci@281: // int edgeNum() const { return graph->edgeNum(); } marci@281: marci@281: // template void erase(const I& i) const { graph->erase(i); } marci@281: marci@281: // void clear() const { graph->clear(); } marci@281: marci@281: // template class NodeMap : public Graph::NodeMap { marci@281: // public: marci@281: // NodeMap(const RevGraphWrapper& _G) : marci@281: // Graph::NodeMap(_G.getGraph()) { } marci@281: // NodeMap(const RevGraphWrapper& _G, T a) : marci@281: // Graph::NodeMap(_G.getGraph(), a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : public Graph::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const RevGraphWrapper& _G) : marci@281: // Graph::EdgeMap(_G.getGraph()) { } marci@281: // EdgeMap(const RevGraphWrapper& _G, T a) : marci@281: // Graph::EdgeMap(_G.getGraph(), a) { } marci@281: // }; marci@281: // }; marci@281: marci@281: // template*/ > marci@281: // class RevGraphWrapper : alpar@880: // public GraphWrapper/*GraphWrapper< TrivGraphWrapper >*/ { marci@281: // protected: marci@281: // //Graph* graph; marci@281: marci@281: // public: marci@281: // //typedef Graph BaseGraph; marci@281: marci@281: // //typedef typename Graph::Node Node; marci@281: // //typedef typename Graph::NodeIt NodeIt; marci@281: marci@281: // //typedef typename Graph::Edge Edge; alpar@880: // typedef typename GraphWrapper/*typename GraphWrapper< TrivGraphWrapper >*/::OutEdgeIt InEdgeIt; alpar@880: // typedef typename GraphWrapper/*typename GraphWrapper< TrivGraphWrapper >*/::InEdgeIt OutEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // //typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // //RevGraphWrapper() : graph(0) { } alpar@880: // RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapper< TrivGraphWrapper >*/(_gw/*TrivGraphWrapper(_graph)*/) { } marci@281: marci@281: // //void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // //Graph& getGraph() const { return (*graph); } marci@281: marci@281: // //template I& first(I& i) const { return graph->first(i); } marci@281: // //template I& first(I& i, const P& p) const { marci@281: // // return graph->first(i, p); } marci@281: marci@281: // //template I getNext(const I& i) const { marci@281: // // return graph->getNext(i); } marci@281: // //template I& next(I &i) const { return graph->next(i); } marci@281: marci@281: // //template< typename It > It first() const { marci@281: // // It e; first(e); return e; } marci@281: marci@281: // //template< typename It > It first(const Node& v) const { marci@281: // // It e; first(e, v); return e; } marci@281: marci@281: // //Node head(const Edge& e) const { return graph->tail(e); } marci@281: // //Node tail(const Edge& e) const { return graph->head(e); } marci@281: marci@281: // //template bool valid(const I& i) const marci@281: // // { return graph->valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return graph->setInvalid(i); } marci@281: marci@281: // //template Node aNode(const I& e) const { marci@281: // // return graph->aNode(e); } marci@281: // //template Node bNode(const I& e) const { marci@281: // // return graph->bNode(e); } marci@281: marci@281: // //Node addNode() const { return graph->addNode(); } marci@281: // //Edge addEdge(const Node& tail, const Node& head) const { marci@281: // // return graph->addEdge(tail, head); } marci@281: marci@281: // //int nodeNum() const { return graph->nodeNum(); } marci@281: // //int edgeNum() const { return graph->edgeNum(); } marci@281: marci@281: // //template void erase(const I& i) const { graph->erase(i); } marci@281: marci@281: // //void clear() const { graph->clear(); } marci@281: marci@281: // template class NodeMap : alpar@880: // public GraphWrapper/*< TrivGraphWrapper >*/::NodeMap marci@281: // { marci@281: // public: marci@281: // NodeMap(const RevGraphWrapper& _gw) : alpar@880: // GraphWrapper/*< TrivGraphWrapper >*/::NodeMap(_gw) { } marci@281: // NodeMap(const RevGraphWrapper& _gw, T a) : alpar@880: // GraphWrapper/*< TrivGraphWrapper >*/::NodeMap(_gw, a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : alpar@880: // public GraphWrapper/*< TrivGraphWrapper >*/::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const RevGraphWrapper& _gw) : alpar@880: // GraphWrapper/*< TrivGraphWrapper >*/::EdgeMap(_gw) { } marci@281: // EdgeMap(const RevGraphWrapper& _gw, T a) : alpar@880: // GraphWrapper/*< TrivGraphWrapper >*/::EdgeMap(_gw, a) { } marci@281: // }; marci@281: // }; marci@281: marci@281: template alpar@880: class RevGraphWrapper : public GraphWrapper { marci@281: public: alpar@880: typedef typename GraphWrapper::Node Node; alpar@880: typedef typename GraphWrapper::Edge Edge; marci@281: //FIXME marci@281: //If GraphWrapper::OutEdgeIt is not defined marci@281: //and we do not want to use RevGraphWrapper::InEdgeIt, marci@281: //this won't work, because of typedef marci@281: //OR marci@281: //graphs have to define their non-existing iterators to void marci@281: //Unfortunately all the typedefs are instantiated in templates, marci@281: //unlike other stuff alpar@880: typedef typename GraphWrapper::OutEdgeIt InEdgeIt; alpar@880: typedef typename GraphWrapper::InEdgeIt OutEdgeIt; marci@281: marci@281: RevGraphWrapper(GraphWrapper _gw) : alpar@880: GraphWrapper(_gw) { } marci@281: marci@281: Node head(const Edge& e) const alpar@880: { return GraphWrapper::tail(e); } marci@281: Node tail(const Edge& e) const alpar@880: { return GraphWrapper::head(e); } marci@281: }; marci@281: marci@281: //Subgraph on the same node-set and partial edge-set marci@281: template alpar@880: class SubGraphWrapper : public GraphWrapper { marci@281: protected: marci@281: EdgeFilterMap* filter_map; marci@281: public: alpar@880: typedef typename GraphWrapper::Node Node; alpar@880: typedef typename GraphWrapper::NodeIt NodeIt; alpar@880: typedef typename GraphWrapper::Edge Edge; alpar@880: typedef typename GraphWrapper::EdgeIt EdgeIt; alpar@880: typedef typename GraphWrapper::InEdgeIt InEdgeIt; alpar@880: typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; marci@281: marci@281: SubGraphWrapper(GraphWrapper _gw, EdgeFilterMap& _filter_map) : alpar@880: GraphWrapper(_gw), filter_map(&_filter_map) { } marci@281: marci@281: template I& first(I& i) const { marci@281: gw.first(i); marci@281: while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: template I& first(I& i, const P& p) const { marci@281: gw.first(i, p); marci@281: while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: marci@281: //template I getNext(const I& i) const { marci@281: // return gw.getNext(i); marci@281: //} marci@281: template I& next(I &i) const { marci@281: gw.next(i); marci@281: while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: marci@281: template< typename It > It first() const { marci@281: It e; this->first(e); return e; } marci@281: marci@281: template< typename It > It first(const Node& v) const { marci@281: It e; this->first(e, v); return e; } marci@281: }; marci@281: marci@281: // template marci@281: // class UndirGraphWrapper { marci@281: // protected: marci@281: // //Graph* graph; marci@281: // GraphWrapper gw; marci@281: marci@281: // public: marci@281: // typedef GraphWrapper BaseGraph; marci@281: marci@281: // typedef typename GraphWrapper::Node Node; marci@281: // typedef typename GraphWrapper::NodeIt NodeIt; marci@281: marci@281: // //typedef typename Graph::Edge Edge; marci@281: // //typedef typename Graph::OutEdgeIt OutEdgeIt; marci@281: // //typedef typename Graph::InEdgeIt InEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // //typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // //private: marci@281: // typedef typename GraphWrapper::Edge GraphEdge; marci@281: // typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt; marci@281: // typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt; marci@281: // //public: marci@281: marci@281: // //UndirGraphWrapper() : graph(0) { } marci@281: // UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } marci@281: marci@281: // //void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // //Graph& getGraph() const { return (*graph); } marci@281: marci@281: // class Edge { marci@281: // friend class UndirGraphWrapper; marci@281: // bool out_or_in; //true iff out marci@281: // GraphOutEdgeIt out; marci@281: // GraphInEdgeIt in; marci@281: // public: marci@281: // Edge() : out_or_in(), out(), in() { } marci@281: // Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } marci@281: // operator GraphEdge() const { marci@281: // if (out_or_in) return(out); else return(in); marci@281: // } marci@281: // friend bool operator==(const Edge& u, const Edge& v) { marci@281: // if (v.out_or_in) marci@281: // return (u.out_or_in && u.out==v.out); marci@281: // else marci@281: // return (!u.out_or_in && u.in==v.in); marci@281: // } marci@281: // friend bool operator!=(const Edge& u, const Edge& v) { marci@281: // if (v.out_or_in) marci@281: // return (!u.out_or_in || u.out!=v.out); marci@281: // else marci@281: // return (u.out_or_in || u.in!=v.in); marci@281: // } marci@281: // }; marci@281: marci@281: // class OutEdgeIt : public Edge { marci@281: // friend class UndirGraphWrapper; marci@281: // public: marci@281: // OutEdgeIt() : Edge() { } marci@281: // OutEdgeIt(const Invalid& i) : Edge(i) { } marci@281: // OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) marci@281: // : Edge() { marci@281: // out_or_in=true; marci@281: // _G.gw.first(out, n); marci@281: // if (!(_G.gw.valid(out))) { marci@281: // out_or_in=false; marci@281: // _G.gw.first(in, n); marci@281: // } marci@281: // } marci@281: // }; marci@281: marci@281: // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@281: // e.out_or_in=true; marci@281: // gw.first(e.out, n); marci@281: // if (!(gw.valid(e.out))) { marci@281: // e.out_or_in=false; marci@281: // gw.first(e.in, n); marci@281: // } marci@281: // return e; marci@281: // } marci@281: marci@281: // OutEdgeIt& next(OutEdgeIt& e) const { marci@281: // if (e.out_or_in) { marci@281: // Node n=gw.tail(e.out); marci@281: // gw.next(e.out); marci@281: // if (!gw.valid(e.out)) { marci@281: // e.out_or_in=false; marci@281: // gw.first(e.in, n); marci@281: // } marci@281: // } else { marci@281: // gw.next(e.in); marci@281: // } marci@281: // return e; marci@281: // } marci@281: marci@281: // Node aNode(const OutEdgeIt& e) const { marci@281: // if (e.out_or_in) return gw.tail(e); else return gw.head(e); } marci@281: // Node bNode(const OutEdgeIt& e) const { marci@281: // if (e.out_or_in) return gw.head(e); else return gw.tail(e); } marci@281: marci@281: // typedef OutEdgeIt InEdgeIt; marci@281: marci@281: // template I& first(I& i) const { return gw.first(i); } marci@281: // // template I& first(I& i, const P& p) const { marci@281: // // return graph->first(i, p); } marci@281: marci@281: // template I getNext(const I& i) const { marci@281: // return gw.getNext(i); } marci@281: // template I& next(I &i) const { return gw.next(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(const Node& v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // Node head(const Edge& e) const { return gw.head(e); } marci@281: // Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: // template bool valid(const I& i) const marci@281: // { return gw.valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return graph->setInvalid(i); } marci@281: marci@281: // int nodeNum() const { return gw.nodeNum(); } marci@281: // int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: // // template Node aNode(const I& e) const { marci@281: // // return graph->aNode(e); } marci@281: // // template Node bNode(const I& e) const { marci@281: // // return graph->bNode(e); } marci@281: marci@281: // Node addNode() const { return gw.addNode(); } marci@281: // // FIXME: ez igy nem jo, mert nem marci@281: // // Edge addEdge(const Node& tail, const Node& head) const { marci@281: // // return graph->addEdge(tail, head); } marci@281: marci@281: // template void erase(const I& i) const { gw.erase(i); } marci@281: marci@281: // void clear() const { gw.clear(); } marci@281: marci@281: // template class NodeMap : public GraphWrapper::NodeMap { marci@281: // public: marci@281: // NodeMap(const UndirGraphWrapper& _G) : marci@281: // GraphWrapper::NodeMap(_G.gw) { } marci@281: // NodeMap(const UndirGraphWrapper& _G, T a) : marci@281: // GraphWrapper::NodeMap(_G.gw, a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : public GraphWrapper::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const UndirGraphWrapper& _G) : marci@281: // GraphWrapper::EdgeMap(_G.gw) { } marci@281: // EdgeMap(const UndirGraphWrapper& _G, T a) : marci@281: // GraphWrapper::EdgeMap(_G.gw, a) { } marci@281: // }; marci@281: // }; marci@281: marci@281: marci@281: template alpar@880: class UndirGraphWrapper : public GraphWrapper { marci@281: protected: marci@281: // GraphWrapper gw; marci@281: marci@281: public: marci@281: //typedef GraphWrapper BaseGraph; marci@281: alpar@880: typedef typename GraphWrapper::Node Node; alpar@880: typedef typename GraphWrapper::NodeIt NodeIt; marci@281: marci@281: //private: marci@281: //FIXME ezeknek valojaban a GraphWrapper megfelelo dolgai kellene hogy marci@281: //legyenek, at kell irni alpar@880: typedef typename /*GraphWrapper*/ marci@281: GraphWrapper::Edge GraphEdge; alpar@880: typedef typename /*GraphWrapper*/ marci@281: GraphWrapper::OutEdgeIt GraphOutEdgeIt; alpar@880: typedef typename /*GraphWrapper*/ marci@281: GraphWrapper::InEdgeIt GraphInEdgeIt; marci@281: //public: marci@281: marci@281: //UndirGraphWrapper() : graph(0) { } marci@281: UndirGraphWrapper(GraphWrapper _gw) : alpar@880: GraphWrapper(_gw) { } marci@281: marci@281: //UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } marci@281: marci@281: //void setGraph(Graph& _graph) { graph = &_graph; } marci@281: //Graph& getGraph() const { return (*graph); } marci@281: marci@281: class Edge { marci@281: friend class UndirGraphWrapper; marci@281: protected: marci@281: bool out_or_in; //true iff out marci@281: GraphOutEdgeIt out; marci@281: GraphInEdgeIt in; marci@281: public: marci@281: Edge() : out_or_in(), out(), in() { } marci@281: Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } marci@281: operator GraphEdge() const { marci@281: if (out_or_in) return(out); else return(in); marci@281: } marci@281: //FIXME marci@281: //2 edges are equal if they "refer" to the same physical edge marci@281: //is it good? marci@281: friend bool operator==(const Edge& u, const Edge& v) { marci@281: if (v.out_or_in) marci@281: if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in); marci@281: //return (u.out_or_in && u.out==v.out); marci@281: else marci@281: if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in); marci@281: //return (!u.out_or_in && u.in==v.in); marci@281: } marci@281: friend bool operator!=(const Edge& u, const Edge& v) { marci@281: if (v.out_or_in) marci@281: if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in); marci@281: //return (!u.out_or_in || u.out!=v.out); marci@281: else marci@281: if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in); marci@281: //return (u.out_or_in || u.in!=v.in); marci@281: } marci@281: }; marci@281: marci@281: class OutEdgeIt : public Edge { marci@281: friend class UndirGraphWrapper; marci@281: public: marci@281: OutEdgeIt() : Edge() { } marci@281: OutEdgeIt(const Invalid& i) : Edge(i) { } marci@281: OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) marci@281: : Edge() { marci@281: out_or_in=true; _G.gw.first(out, n); marci@281: if (!(_G.gw.valid(out))) { out_or_in=false; _G.gw.first(in, n); } marci@281: } marci@281: }; marci@281: marci@281: typedef OutEdgeIt InEdgeIt; marci@281: marci@281: class EdgeIt : public Edge { marci@281: friend class UndirGraphWrapper; marci@281: protected: marci@281: NodeIt v; marci@281: public: marci@281: EdgeIt() : Edge() { } marci@281: EdgeIt(const Invalid& i) : Edge(i) { } marci@281: EdgeIt(const UndirGraphWrapper& _G) marci@281: : Edge() { marci@281: out_or_in=true; marci@281: //Node v; marci@281: _G.first(v); marci@281: if (_G.valid(v)) _G.gw.first(out); else out=INVALID; marci@281: while (_G.valid(v) && !_G.gw.valid(out)) { marci@281: _G.gw.next(v); marci@281: if (_G.valid(v)) _G.gw.first(out); marci@281: } marci@281: } marci@281: }; marci@281: marci@281: OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@281: e.out_or_in=true; gw.first(e.out, n); marci@281: if (!(gw.valid(e.out))) { e.out_or_in=false; gw.first(e.in, n); } marci@281: return e; marci@281: } marci@281: marci@281: EdgeIt& first(EdgeIt& e) const { marci@281: e.out_or_in=true; marci@281: //NodeIt v; marci@281: first(e.v); marci@281: if (valid(e.v)) gw.first(e.out, e.v); else e.out=INVALID; marci@281: while (valid(e.v) && !gw.valid(e.out)) { marci@281: gw.next(e.v); marci@281: if (valid(e.v)) gw.first(e.out, e.v); marci@281: } marci@281: return e; marci@281: } marci@281: marci@281: template I& first(I& i) const { gw.first(i); return i; } marci@281: template I& first(I& i, const P& p) const { marci@281: gw.first(i, p); return i; } marci@281: marci@281: OutEdgeIt& next(OutEdgeIt& e) const { marci@281: if (e.out_or_in) { marci@281: Node n=gw.tail(e.out); marci@281: gw.next(e.out); marci@281: if (!gw.valid(e.out)) { e.out_or_in=false; gw.first(e.in, n); } marci@281: } else { marci@281: gw.next(e.in); marci@281: } marci@281: return e; marci@281: } marci@281: marci@281: EdgeIt& next(EdgeIt& e) const { marci@281: //NodeIt v=tail(e); marci@281: gw.next(e.out); marci@281: while (valid(e.v) && !gw.valid(e.out)) { marci@281: next(e.v); marci@281: if (valid(e.v)) gw.first(e.out, e.v); marci@281: } marci@281: return e; marci@281: } marci@281: marci@281: template I& next(I &i) const { return gw.next(i); } marci@281: // template I getNext(const I& i) const { return gw.getNext(i); } marci@281: marci@281: template< typename It > It first() const { marci@281: It e; first(e); return e; } marci@281: marci@281: template< typename It > It first(const Node& v) const { marci@281: It e; first(e, v); return e; } marci@281: marci@281: // Node head(const Edge& e) const { return gw.head(e); } marci@281: // Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: // template bool valid(const I& i) const marci@281: // { return gw.valid(i); } marci@281: marci@281: // int nodeNum() const { return gw.nodeNum(); } marci@281: // int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: // template Node aNode(const I& e) const { marci@281: // return graph->aNode(e); } marci@281: // template Node bNode(const I& e) const { marci@281: // return graph->bNode(e); } marci@281: marci@281: Node aNode(const OutEdgeIt& e) const { marci@281: if (e.out_or_in) return gw.tail(e); else return gw.head(e); } marci@281: Node bNode(const OutEdgeIt& e) const { marci@281: if (e.out_or_in) return gw.head(e); else return gw.tail(e); } marci@281: marci@281: // Node addNode() const { return gw.addNode(); } marci@281: marci@281: // FIXME: ez igy nem jo, mert nem marci@281: // Edge addEdge(const Node& tail, const Node& head) const { marci@281: // return graph->addEdge(tail, head); } marci@281: marci@281: // template void erase(const I& i) const { gw.erase(i); } marci@281: marci@281: // void clear() const { gw.clear(); } marci@281: marci@281: // template class NodeMap : public GraphWrapper::NodeMap { marci@281: // public: marci@281: // NodeMap(const UndirGraphWrapper& _G) : marci@281: // GraphWrapper::NodeMap(_G.gw) { } marci@281: // NodeMap(const UndirGraphWrapper& _G, T a) : marci@281: // GraphWrapper::NodeMap(_G.gw, a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : alpar@880: // public GraphWrapper::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const UndirGraphWrapper& _G) : alpar@880: // GraphWrapper::EdgeMap(_G.gw) { } marci@281: // EdgeMap(const UndirGraphWrapper& _G, T a) : marci@281: // GraphWrapper::EdgeMap(_G.gw, a) { } marci@281: // }; marci@281: }; marci@281: marci@281: marci@281: marci@281: marci@281: marci@281: // template marci@281: // class SymGraphWrapper marci@281: // { marci@281: // Graph* graph; marci@281: marci@281: // public: marci@281: // typedef Graph BaseGraph; marci@281: marci@281: // typedef typename Graph::Node Node; marci@281: // typedef typename Graph::Edge Edge; marci@281: marci@281: // typedef typename Graph::NodeIt NodeIt; marci@281: marci@281: // //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon marci@281: // //iranyitatlant, ami van marci@281: // //mert csak 1 dolgot lehet be typedef-elni marci@281: // typedef typename Graph::OutEdgeIt SymEdgeIt; marci@281: // //typedef typename Graph::InEdgeIt SymEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // int nodeNum() const { return graph->nodeNum(); } marci@281: // int edgeNum() const { return graph->edgeNum(); } marci@281: marci@281: // template I& first(I& i) const { return graph->first(i); } marci@281: // template I& first(I& i, const P& p) const { marci@281: // return graph->first(i, p); } marci@281: // //template I next(const I i); { return graph->goNext(i); } marci@281: // //template I &goNext(I &i); { return graph->goNext(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(Node v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // Node head(const Edge& e) const { return graph->head(e); } marci@281: // Node tail(const Edge& e) const { return graph->tail(e); } marci@281: marci@281: // template Node aNode(const I& e) const { marci@281: // return graph->aNode(e); } marci@281: // template Node bNode(const I& e) const { marci@281: // return graph->bNode(e); } marci@281: marci@281: // //template bool valid(const I i); marci@281: // //{ return graph->valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return graph->setInvalid(i); } marci@281: marci@281: // Node addNode() { return graph->addNode(); } marci@281: // Edge addEdge(const Node& tail, const Node& head) { marci@281: // return graph->addEdge(tail, head); } marci@281: marci@281: // template void erase(const I& i) { graph->erase(i); } marci@281: marci@281: // void clear() { graph->clear(); } marci@281: marci@281: // template class NodeMap : public Graph::NodeMap { }; marci@281: // template class EdgeMap : public Graph::EdgeMap { }; marci@281: marci@281: // void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // Graph& getGraph() { return (*graph); } marci@281: marci@281: // //SymGraphWrapper() : graph(0) { } marci@281: // SymGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: // }; marci@281: marci@281: marci@281: template alpar@880: class ResGraphWrapper : public GraphWrapper{ marci@281: public: marci@281: //typedef Graph BaseGraph; marci@281: //typedef TrivGraphWrapper GraphWrapper; alpar@880: typedef typename GraphWrapper::Node Node; alpar@880: typedef typename GraphWrapper::NodeIt NodeIt; marci@281: private: alpar@880: typedef typename /*GraphWrapper*/ marci@281: GraphWrapper::OutEdgeIt OldOutEdgeIt; alpar@880: typedef typename /*GraphWrapper*/ marci@281: GraphWrapper::InEdgeIt OldInEdgeIt; marci@281: protected: marci@281: //const Graph* graph; marci@281: //GraphWrapper gw; marci@281: FlowMap* flow; marci@281: const CapacityMap* capacity; marci@281: public: marci@281: marci@281: ResGraphWrapper(const GraphWrapper& _gw, FlowMap& _flow, marci@281: const CapacityMap& _capacity) : alpar@880: GraphWrapper(_gw), marci@281: flow(&_flow), capacity(&_capacity) { } marci@281: marci@281: //void setGraph(const Graph& _graph) { graph = &_graph; } marci@281: //const Graph& getGraph() const { return (*graph); } marci@281: marci@281: class Edge; marci@281: class OutEdgeIt; marci@281: friend class Edge; marci@281: friend class OutEdgeIt; marci@281: marci@281: class Edge { marci@281: friend class ResGraphWrapper; marci@281: protected: marci@281: bool out_or_in; //true, iff out marci@281: OldOutEdgeIt out; marci@281: OldInEdgeIt in; marci@281: public: marci@281: Edge() : out_or_in(true) { } marci@281: Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } marci@281: // bool valid() const { marci@281: // return out_or_in && out.valid() || in.valid(); } marci@281: friend bool operator==(const Edge& u, const Edge& v) { marci@281: if (v.out_or_in) marci@281: return (u.out_or_in && u.out==v.out); marci@281: else marci@281: return (!u.out_or_in && u.in==v.in); marci@281: } marci@281: friend bool operator!=(const Edge& u, const Edge& v) { marci@281: if (v.out_or_in) marci@281: return (!u.out_or_in || u.out!=v.out); marci@281: else marci@281: return (u.out_or_in || u.in!=v.in); marci@281: } marci@281: }; marci@281: marci@281: marci@281: class OutEdgeIt : public Edge { marci@281: friend class ResGraphWrapper; marci@281: public: marci@281: OutEdgeIt() { } marci@281: //FIXME marci@281: OutEdgeIt(const Edge& e) : Edge(e) { } marci@281: OutEdgeIt(const Invalid& i) : Edge(i) { } marci@281: protected: marci@281: OutEdgeIt(const ResGraphWrapper& resG, Node v) : Edge() { marci@281: resG.gw.first(out, v); marci@281: while( resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } marci@281: if (!resG.gw.valid(out)) { marci@281: out_or_in=0; marci@281: resG.gw.first(in, v); marci@281: while( resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } marci@281: } marci@281: } marci@281: // public: marci@281: // OutEdgeIt& operator++() { marci@281: // if (out_or_in) { marci@281: // Node v=/*resG->*/G->aNode(out); marci@281: // ++out; marci@281: // while( out.valid() && !(Edge::resCap()>0) ) { ++out; } marci@281: // if (!out.valid()) { marci@281: // out_or_in=0; marci@281: // G->first(in, v); marci@281: // while( in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // } marci@281: // } else { marci@281: // ++in; marci@281: // while( in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // } marci@281: // return *this; marci@281: // } marci@281: }; marci@281: marci@281: //FIXME This is just for having InEdgeIt marci@281: typedef void InEdgeIt; marci@281: marci@281: class EdgeIt : public Edge { marci@281: friend class ResGraphWrapper; marci@281: NodeIt v; marci@281: public: marci@281: EdgeIt() { } marci@281: //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { } marci@281: EdgeIt(const Invalid& i) : Edge(i) { } marci@281: EdgeIt(const ResGraphWrapper& resG) : Edge() { marci@281: resG.gw.first(v); marci@281: if (resG.gw.valid(v)) resG.gw.first(out, v); else out=INVALID; marci@281: while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } marci@281: while (resG.gw.valid(v) && !resG.gw.valid(out)) { marci@281: resG.gw.next(v); marci@281: if (resG.gw.valid(v)) resG.gw.first(out, v); marci@281: while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } marci@281: } marci@281: if (!resG.gw.valid(out)) { marci@281: out_or_in=0; marci@281: resG.gw.first(v); marci@281: if (resG.gw.valid(v)) resG.gw.first(in, v); else in=INVALID; marci@281: while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } marci@281: while (resG.gw.valid(v) && !resG.gw.valid(in)) { marci@281: resG.gw.next(v); marci@281: if (resG.gw.valid(v)) resG.gw.first(in, v); marci@281: while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } marci@281: } marci@281: } marci@281: } marci@281: // EdgeIt& operator++() { marci@281: // if (out_or_in) { marci@281: // ++out; marci@281: // while (out.valid() && !(Edge::resCap()>0) ) { ++out; } marci@281: // while (v.valid() && !out.valid()) { marci@281: // ++v; marci@281: // if (v.valid()) G->first(out, v); marci@281: // while (out.valid() && !(Edge::resCap()>0) ) { ++out; } marci@281: // } marci@281: // if (!out.valid()) { marci@281: // out_or_in=0; marci@281: // G->first(v); marci@281: // if (v.valid()) G->first(in, v); else in=OldInEdgeIt(); marci@281: // while (in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // while (v.valid() && !in.valid()) { marci@281: // ++v; marci@281: // if (v.valid()) G->first(in, v); marci@281: // while (in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // } marci@281: // } marci@281: // } else { marci@281: // ++in; marci@281: // while (in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // while (v.valid() && !in.valid()) { marci@281: // ++v; marci@281: // if (v.valid()) G->first(in, v); marci@281: // while (in.valid() && !(Edge::resCap()>0) ) { ++in; } marci@281: // } marci@281: // } marci@281: // return *this; marci@281: // } marci@281: }; marci@281: marci@281: NodeIt& first(NodeIt& v) const { gw.first(v); return v; } marci@281: OutEdgeIt& first(OutEdgeIt& e, Node v) const { marci@281: e=OutEdgeIt(*this, v); marci@281: return e; marci@281: } marci@281: EdgeIt& first(EdgeIt& e) const { marci@281: e=EdgeIt(*this); marci@281: return e; marci@281: } marci@281: marci@281: NodeIt& next(NodeIt& n) const { return gw.next(n); } marci@281: marci@281: OutEdgeIt& next(OutEdgeIt& e) const { marci@281: if (e.out_or_in) { marci@281: Node v=gw.aNode(e.out); marci@281: gw.next(e.out); marci@281: while( gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } marci@281: if (!gw.valid(e.out)) { marci@281: e.out_or_in=0; marci@281: gw.first(e.in, v); marci@281: while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: } marci@281: } else { marci@281: gw.next(e.in); marci@281: while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: } marci@281: return e; marci@281: } marci@281: marci@281: EdgeIt& next(EdgeIt& e) const { marci@281: if (e.out_or_in) { marci@281: gw.next(e.out); marci@281: while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } marci@281: while (gw.valid(e.v) && !gw.valid(e.out)) { marci@281: gw.next(e.v); marci@281: if (gw.valid(e.v)) gw.first(e.out, e.v); marci@281: while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } marci@281: } marci@281: if (!gw.valid(e.out)) { marci@281: e.out_or_in=0; marci@281: gw.first(e.v); marci@281: if (gw.valid(e.v)) gw.first(e.in, e.v); else e.in=INVALID; marci@281: while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: while (gw.valid(e.v) && !gw.valid(e.in)) { marci@281: gw.next(e.v); marci@281: if (gw.valid(e.v)) gw.first(e.in, e.v); marci@281: while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: } marci@281: } marci@281: } else { marci@281: gw.next(e.in); marci@281: while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: while (gw.valid(e.v) && !gw.valid(e.in)) { marci@281: gw.next(e.v); marci@281: if (gw.valid(e.v)) gw.first(e.in, e.v); marci@281: while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } marci@281: } marci@281: } marci@281: return e; marci@281: } marci@281: marci@281: marci@281: template< typename It > marci@281: It first() const { marci@281: It e; marci@281: first(e); marci@281: return e; marci@281: } marci@281: marci@281: template< typename It > marci@281: It first(Node v) const { marci@281: It e; marci@281: first(e, v); marci@281: return e; marci@281: } marci@281: marci@281: Node tail(Edge e) const { marci@281: return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); } marci@281: Node head(Edge e) const { marci@281: return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); } marci@281: marci@281: Node aNode(OutEdgeIt e) const { marci@281: return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); } marci@281: Node bNode(OutEdgeIt e) const { marci@281: return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); } marci@281: marci@281: int nodeNum() const { return gw.nodeNum(); } marci@281: //FIXME marci@281: //int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: marci@281: int id(Node v) const { return gw.id(v); } marci@281: marci@281: bool valid(Node n) const { return gw.valid(n); } marci@281: bool valid(Edge e) const { marci@281: return e.out_or_in ? gw.valid(e.out) : gw.valid(e.in); } marci@281: marci@281: void augment(const Edge& e, Number a) const { marci@281: if (e.out_or_in) marci@281: flow->set(e.out, flow->get(e.out)+a); marci@281: else marci@281: flow->set(e.in, flow->get(e.in)-a); marci@281: } marci@281: marci@281: Number resCap(const Edge& e) const { marci@281: if (e.out_or_in) marci@281: return (capacity->get(e.out)-flow->get(e.out)); marci@281: else marci@281: return (flow->get(e.in)); marci@281: } marci@281: marci@281: Number resCap(OldOutEdgeIt out) const { marci@281: return (capacity->get(out)-flow->get(out)); marci@281: } marci@281: marci@281: Number resCap(OldInEdgeIt in) const { marci@281: return (flow->get(in)); marci@281: } marci@281: marci@281: // template class NodeMap : public GraphWrapper::NodeMap { marci@281: // public: marci@281: // NodeMap(const ResGraphWrapper& _G) marci@281: // : GraphWrapper::NodeMap(_G.gw) { } marci@281: // NodeMap(const ResGraphWrapper& _G, marci@281: // T a) : GraphWrapper::NodeMap(_G.gw, a) { } marci@281: // }; marci@281: marci@281: // template marci@281: // class NodeMap { marci@281: // typename Graph::NodeMap node_map; marci@281: // public: marci@281: // NodeMap(const ResGraphWrapper& _G) : node_map(*(_G.graph)) { } marci@281: // NodeMap(const ResGraphWrapper& _G, T a) : node_map(*(_G.graph), a) { } marci@281: // void set(Node nit, T a) { node_map.set(nit, a); } marci@281: // T get(Node nit) const { return node_map.get(nit); } marci@281: // }; marci@281: marci@281: template marci@281: class EdgeMap { marci@281: typename GraphWrapper::EdgeMap forward_map, backward_map; marci@281: public: marci@281: EdgeMap(const ResGraphWrapper& _G) : forward_map(_G.gw), backward_map(_G.gw) { } marci@281: EdgeMap(const ResGraphWrapper& _G, T a) : forward_map(_G.gw, a), backward_map(_G.gw, a) { } marci@281: void set(Edge e, T a) { marci@281: if (e.out_or_in) marci@281: forward_map.set(e.out, a); marci@281: else marci@281: backward_map.set(e.in, a); marci@281: } marci@281: T get(Edge e) { marci@281: if (e.out_or_in) marci@281: return forward_map.get(e.out); marci@281: else marci@281: return backward_map.get(e.in); marci@281: } marci@281: }; marci@281: }; marci@281: marci@281: //Subgraph on the same node-set and partial edge-set marci@281: template alpar@880: class ErasingFirstGraphWrapper : public GraphWrapper { marci@281: protected: marci@281: FirstOutEdgesMap* first_out_edges; marci@281: public: alpar@880: typedef typename GraphWrapper::Node Node; alpar@880: typedef typename GraphWrapper::NodeIt NodeIt; alpar@880: typedef typename GraphWrapper::Edge Edge; alpar@880: typedef typename GraphWrapper::EdgeIt EdgeIt; alpar@880: typedef typename GraphWrapper::InEdgeIt InEdgeIt; alpar@880: typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; marci@281: marci@281: ErasingFirstGraphWrapper(GraphWrapper _gw, FirstOutEdgesMap& _first_out_edges) : alpar@880: GraphWrapper(_gw), first_out_edges(&_first_out_edges) { } marci@281: marci@281: template I& first(I& i) const { marci@281: gw.first(i); marci@281: //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@281: e=first_out_edges->get(n); marci@281: return e; marci@281: } marci@281: template I& first(I& i, const P& p) const { marci@281: gw.first(i, p); marci@281: //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: marci@281: //template I getNext(const I& i) const { marci@281: // return gw.getNext(i); marci@281: //} marci@281: template I& next(I &i) const { marci@281: gw.next(i); marci@281: //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } marci@281: return i; marci@281: } marci@281: marci@281: template< typename It > It first() const { marci@281: It e; this->first(e); return e; } marci@281: marci@281: template< typename It > It first(const Node& v) const { marci@281: It e; this->first(e, v); return e; } marci@281: marci@281: void erase(const OutEdgeIt& e) const { marci@281: OutEdgeIt f=e; marci@281: this->next(f); marci@281: first_out_edges->set(this->tail(e), f); marci@281: } marci@281: }; marci@281: marci@281: // template marci@281: // class ErasingResGraphWrapper : public ResGraphWrapper { marci@281: // protected: marci@281: // ResGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; marci@281: // //ResGraphWrapper::NodeMap dist; marci@281: // public: marci@281: // ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow, marci@281: // const CapacityMap& _capacity) : marci@281: // ResGraphWrapper(_G, _flow, _capacity), marci@281: // first_out_edges(*this) /*, dist(*this)*/ { marci@281: // for(NodeIt n=this->template first(); this->valid(n); this->next(n)) { marci@281: // OutEdgeIt e; marci@281: // ResGraphWrapper::first(e, n); marci@281: // first_out_edges.set(n, e); marci@281: // } marci@281: // } marci@281: marci@281: // //void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // //Graph& getGraph() const { return (*graph); } marci@281: marci@281: // //TrivGraphWrapper() : graph(0) { } marci@281: // //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: marci@281: // //typedef Graph BaseGraph; marci@281: marci@281: // //typedef typename Graph::Node Node; marci@281: // //typedef typename Graph::NodeIt NodeIt; marci@281: marci@281: // //typedef typename Graph::Edge Edge; marci@281: // //typedef typename Graph::OutEdgeIt OutEdgeIt; marci@281: // //typedef typename Graph::InEdgeIt InEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // //typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // typedef typename ResGraphWrapper::Node Node; marci@281: // typedef typename ResGraphWrapper::NodeIt NodeIt; marci@281: marci@281: // typedef typename ResGraphWrapper::Edge Edge; marci@281: // typedef typename ResGraphWrapper::OutEdgeIt OutEdgeIt; marci@281: // //typedef typename ResGraphWrapper::InEdgeIt InEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // //typedef typename ResGraphWrapper::EdgeIt EdgeIt; marci@281: marci@281: // NodeIt& first(NodeIt& n) const { marci@281: // return ResGraphWrapper::first(n); marci@281: // } marci@281: marci@281: // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@281: // e=first_out_edges.get(n); marci@281: // return e; marci@281: // } marci@281: marci@281: // //ROSSZ template I& first(I& i) const { return first(i); } marci@281: // //ROSSZ template I& first(I& i, const P& p) const { marci@281: // // return first(i, p); } marci@281: marci@281: // //template I getNext(const I& i) const { marci@281: // // return gw.getNext(i); } marci@281: // //template I& next(I &i) const { return gw.next(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(const Node& v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // //Node head(const Edge& e) const { return gw.head(e); } marci@281: // //Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: // //template bool valid(const I& i) const marci@281: // // { return gw.valid(i); } marci@281: marci@281: // //int nodeNum() const { return gw.nodeNum(); } marci@281: // //int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: // //template Node aNode(const I& e) const { marci@281: // // return gw.aNode(e); } marci@281: // //template Node bNode(const I& e) const { marci@281: // // return gw.bNode(e); } marci@281: marci@281: // //Node addNode() const { return gw.addNode(); } marci@281: // //Edge addEdge(const Node& tail, const Node& head) const { marci@281: // // return gw.addEdge(tail, head); } marci@281: marci@281: // //void erase(const OutEdgeIt& e) { marci@281: // // first_out_edge(this->tail(e))=e; marci@281: // //} marci@281: // void erase(const Edge& e) { marci@281: // OutEdgeIt f(e); marci@281: // next(f); marci@281: // first_out_edges.set(this->tail(e), f); marci@281: // } marci@281: // //template void erase(const I& i) const { gw.erase(i); } marci@281: marci@281: // //void clear() const { gw.clear(); } marci@281: marci@281: // template class NodeMap : public ResGraphWrapper::NodeMap { marci@281: // public: marci@281: // NodeMap(const ErasingResGraphWrapper& _G) : marci@281: // ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } marci@281: // NodeMap(const ErasingResGraphWrapper& _G, T a) : marci@281: // ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : public ResGraphWrapper::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const ErasingResGraphWrapper& _G) : marci@281: // ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } marci@281: // EdgeMap(const ErasingResGraphWrapper& _G, T a) : marci@281: // ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } marci@281: // }; marci@281: // }; marci@281: marci@281: // template marci@281: // class FilterGraphWrapper { marci@281: // }; marci@281: marci@281: // template marci@281: // class FilterGraphWrapper > : public ErasingResGraphWrapper { marci@281: marci@281: // //Graph* graph; marci@281: marci@281: // public: marci@281: // //typedef Graph BaseGraph; marci@281: marci@281: // typedef typename ErasingResGraphWrapper::Node Node; marci@281: // typedef typename ErasingResGraphWrapper::NodeIt NodeIt; marci@281: marci@281: // typedef typename ErasingResGraphWrapper::Edge Edge; marci@281: // typedef typename ErasingResGraphWrapper::OutEdgeIt OutEdgeIt; marci@281: // //typedef typename ErasingResGraphWrapper::InEdgeIt InEdgeIt; marci@281: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // typedef typename ErasingResGraphWrapper::EdgeIt EdgeIt; marci@281: marci@281: // //FilterGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; marci@281: marci@281: // public: marci@281: // FilterGraphWrapper(const Graph& _G, FlowMap& _flow, marci@281: // const CapacityMap& _capacity) : marci@281: // ErasingResGraphWrapper(_G, _flow, _capacity), dist(*this, gw.nodeNum()) { marci@281: // } marci@281: marci@281: // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@281: // ErasingResGraphWrapper::first(e, n); marci@281: // while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e)))) marci@281: // ErasingResGraphWrapper::next(e); marci@281: // return e; marci@281: // } marci@281: marci@281: // NodeIt& next(NodeIt& e) const { marci@281: // return ErasingResGraphWrapper::next(e); marci@281: // } marci@281: marci@281: // OutEdgeIt& next(OutEdgeIt& e) const { marci@281: // ErasingResGraphWrapper::next(e); marci@281: // while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e)))) marci@281: // ErasingResGraphWrapper::next(e); marci@281: // return e; marci@281: // } marci@281: marci@281: // NodeIt& first(NodeIt& n) const { marci@281: // return ErasingResGraphWrapper::first(n); marci@281: // } marci@281: marci@281: // void erase(const Edge& e) { marci@281: // OutEdgeIt f(e); marci@281: // ErasingResGraphWrapper::next(f); marci@281: // while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f)))) marci@281: // ErasingResGraphWrapper::next(f); marci@281: // first_out_edges.set(this->tail(e), f); marci@281: // } marci@281: marci@281: // //TrivGraphWrapper() : graph(0) { } marci@281: // //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: marci@281: // //void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // //Graph& getGraph() const { return (*graph); } marci@281: marci@281: // //template I& first(I& i) const { return gw.first(i); } marci@281: // //template I& first(I& i, const P& p) const { marci@281: // // return gw.first(i, p); } marci@281: marci@281: // //template I getNext(const I& i) const { marci@281: // // return gw.getNext(i); } marci@281: // //template I& next(I &i) const { return gw.next(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(const Node& v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // //Node head(const Edge& e) const { return gw.head(e); } marci@281: // //Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: // //template bool valid(const I& i) const marci@281: // // { return gw.valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return gw.setInvalid(i); } marci@281: marci@281: // //int nodeNum() const { return gw.nodeNum(); } marci@281: // //int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: // //template Node aNode(const I& e) const { marci@281: // // return gw.aNode(e); } marci@281: // //template Node bNode(const I& e) const { marci@281: // // return gw.bNode(e); } marci@281: marci@281: // //Node addNode() const { return gw.addNode(); } marci@281: // //Edge addEdge(const Node& tail, const Node& head) const { marci@281: // // return gw.addEdge(tail, head); } marci@281: marci@281: // //template void erase(const I& i) const { gw.erase(i); } marci@281: marci@281: // //void clear() const { gw.clear(); } marci@281: marci@281: // template class NodeMap : public ErasingResGraphWrapper::NodeMap { marci@281: // public: marci@281: // NodeMap(const FilterGraphWrapper >& _G) : marci@281: // ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } marci@281: // NodeMap(const FilterGraphWrapper >& _G, T a) : marci@281: // ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } marci@281: // }; marci@281: marci@281: // template class EdgeMap : public ErasingResGraphWrapper::EdgeMap { marci@281: // public: marci@281: // EdgeMap(const FilterGraphWrapper >& _G) : marci@281: // ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } marci@281: // EdgeMap(const FilterGraphWrapper >& _G, T a) : marci@281: // ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } marci@281: // }; marci@281: marci@281: // public: marci@281: // ErasingResGraphWrapper::NodeMap dist; marci@281: marci@281: // }; marci@281: marci@281: marci@281: marci@281: // // FIXME: comparison should be made better!!! marci@281: // template marci@281: // class ResGraphWrapper marci@281: // { marci@281: // Graph* graph; marci@281: marci@281: // public: marci@281: // typedef Graph BaseGraph; marci@281: marci@281: // typedef typename Graph::Node Node; marci@281: // typedef typename Graph::Edge Edge; marci@281: marci@281: // typedef typename Graph::NodeIt NodeIt; marci@281: marci@281: // class OutEdgeIt { marci@281: // public: marci@281: // //Graph::Node n; marci@281: // bool out_or_in; marci@281: // typename Graph::OutEdgeIt o; marci@281: // typename Graph::InEdgeIt i; marci@281: // }; marci@281: // class InEdgeIt { marci@281: // public: marci@281: // //Graph::Node n; marci@281: // bool out_or_in; marci@281: // typename Graph::OutEdgeIt o; marci@281: // typename Graph::InEdgeIt i; marci@281: // }; marci@281: // typedef typename Graph::SymEdgeIt SymEdgeIt; marci@281: // typedef typename Graph::EdgeIt EdgeIt; marci@281: marci@281: // int nodeNum() const { return gw.nodeNum(); } marci@281: // int edgeNum() const { return gw.edgeNum(); } marci@281: marci@281: // Node& first(Node& n) const { return gw.first(n); } marci@281: marci@281: // // Edge and SymEdge is missing!!!! marci@281: // // Edge <-> In/OutEdgeIt conversion is missing!!!! marci@281: marci@281: // //FIXME marci@281: // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const marci@281: // { marci@281: // e.n=n; marci@281: // gw.first(e.o,n); marci@281: // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) marci@281: // gw.goNext(e.o); marci@281: // if(!gw.valid(e.o)) { marci@281: // gw.first(e.i,n); marci@281: // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) marci@281: // gw.goNext(e.i); marci@281: // } marci@281: // return e; marci@281: // } marci@281: // /* marci@281: // OutEdgeIt &goNext(OutEdgeIt &e) marci@281: // { marci@281: // if(gw.valid(e.o)) { marci@281: // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) marci@281: // gw.goNext(e.o); marci@281: // if(gw.valid(e.o)) return e; marci@281: // else gw.first(e.i,e.n); marci@281: // } marci@281: // else { marci@281: // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) marci@281: // gw.goNext(e.i); marci@281: // return e; marci@281: // } marci@281: // } marci@281: // OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} marci@281: // */ marci@281: // //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);} marci@281: marci@281: // //FIXME marci@281: // InEdgeIt& first(InEdgeIt& e, const Node& n) const marci@281: // { marci@281: // e.n=n; marci@281: // gw.first(e.i,n); marci@281: // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) marci@281: // gw.goNext(e.i); marci@281: // if(!gw.valid(e.i)) { marci@281: // gw.first(e.o,n); marci@281: // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) marci@281: // gw.goNext(e.o); marci@281: // } marci@281: // return e; marci@281: // } marci@281: // /* marci@281: // InEdgeIt &goNext(InEdgeIt &e) marci@281: // { marci@281: // if(gw.valid(e.i)) { marci@281: // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) marci@281: // gw.goNext(e.i); marci@281: // if(gw.valid(e.i)) return e; marci@281: // else gw.first(e.o,e.n); marci@281: // } marci@281: // else { marci@281: // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) marci@281: // gw.goNext(e.o); marci@281: // return e; marci@281: // } marci@281: // } marci@281: // InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} marci@281: // */ marci@281: // //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);} marci@281: marci@281: // //template I &goNext(I &i); { return gw.goNext(i); } marci@281: // //template I next(const I i); { return gw.goNext(i); } marci@281: marci@281: // template< typename It > It first() const { marci@281: // It e; first(e); return e; } marci@281: marci@281: // template< typename It > It first(Node v) const { marci@281: // It e; first(e, v); return e; } marci@281: marci@281: // Node head(const Edge& e) const { return gw.head(e); } marci@281: // Node tail(const Edge& e) const { return gw.tail(e); } marci@281: marci@281: // template Node aNode(const I& e) const { marci@281: // return gw.aNode(e); } marci@281: // template Node bNode(const I& e) const { marci@281: // return gw.bNode(e); } marci@281: marci@281: // //template bool valid(const I i); marci@281: // //{ return gw.valid(i); } marci@281: marci@281: // //template void setInvalid(const I &i); marci@281: // //{ return gw.setInvalid(i); } marci@281: marci@281: // Node addNode() { return gw.addNode(); } marci@281: // Edge addEdge(const Node& tail, const Node& head) { marci@281: // return gw.addEdge(tail, head); } marci@281: marci@281: // template void erase(const I& i) { gw.erase(i); } marci@281: marci@281: // void clear() { gw.clear(); } marci@281: marci@281: // template class NodeMap : public Graph::NodeMap { }; marci@281: // template class EdgeMap : public Graph::EdgeMap { }; marci@281: marci@281: // void setGraph(Graph& _graph) { graph = &_graph; } marci@281: // Graph& getGraph() { return (*graph); } marci@281: marci@281: // //ResGraphWrapper() : graph(0) { } marci@281: // ResGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@281: // }; marci@281: alpar@921: } //namespace lemon marci@281: alpar@921: #endif //LEMON_GRAPH_WRAPPER_H marci@281: