// -*- c++ -*- #ifndef LEMON_GRAPH_WRAPPER_H #define LEMON_GRAPH_WRAPPER_H #include namespace lemon { template class TrivGraphWrapper { protected: Graph* graph; public: typedef Graph BaseGraph; // TrivGraphWrapper() : graph(0) { } TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } // void setGraph(Graph& _graph) { graph = &_graph; } // Graph& getGraph() const { return *graph; } 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 TrivGraphWrapper& _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 TrivGraphWrapper& _G, const Node& n) : Graph::OutEdgeIt(*(_G.graph), 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 TrivGraphWrapper& _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 TrivGraphWrapper& _G) : Graph::EdgeIt(*(_G.graph)) { } }; NodeIt& first(NodeIt& i) const { i=NodeIt(*this); return i; } EdgeIt& first(EdgeIt& i) const { i=EdgeIt(*this); return i; } // template I& first(I& i) const { // i=I(*this); // return i; // } 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; } // template I& first(I& i, const P& p) const { // i=I(*this, p); // return i; // } // template I getNext(const I& i) const { // return graph->getNext(i); } template 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 target(const Edge& e) const { return graph->target(e); } Node source(const Edge& e) const { return graph->source(e); } template bool valid(const I& i) const { return graph->valid(i); } //template void setInvalid(const I &i); //{ return graph->setInvalid(i); } int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template Node aNode(const I& e) const { return graph->aNode(e); } template Node bNode(const I& e) const { return graph->bNode(e); } Node addNode() const { return graph->addNode(); } Edge addEdge(const Node& source, const Node& target) const { return graph->addEdge(source, target); } template void erase(const I& i) const { graph->erase(i); } void clear() const { graph->clear(); } template class NodeMap : public Graph::NodeMap { public: NodeMap(const TrivGraphWrapper& _G) : Graph::NodeMap(*(_G.graph)) { } NodeMap(const TrivGraphWrapper& _G, T a) : Graph::NodeMap(*(_G.graph), a) { } }; template class EdgeMap : public Graph::EdgeMap { public: EdgeMap(const TrivGraphWrapper& _G) : Graph::EdgeMap(*(_G.graph)) { } EdgeMap(const TrivGraphWrapper& _G, T a) : Graph::EdgeMap(*(_G.graph), a) { } }; template class NodeMapWrapper { protected: Map* map; public: NodeMapWrapper(Map& _map) : map(&_map) { } void set(Node n, T a) { map->set(n, a); } T get(Node n) const { return map->get(n); } }; template class EdgeMapWrapper { protected: Map* map; public: EdgeMapWrapper(Map& _map) : map(&_map) { } void set(Edge n, T a) { map->set(n, a); } T get(Edge n) const { return map->get(n); } }; }; template class GraphWrapper { protected: Graph* graph; public: typedef Graph BaseGraph; // GraphWrapper() : graph(0) { } GraphWrapper(Graph& _graph) : graph(&_graph) { } // void setGraph(Graph& _graph) { graph=&_graph; } // Graph& getGraph() const { return *graph; } 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 GraphWrapper& _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 GraphWrapper& _G, const Node& n) : Graph::OutEdgeIt(*(_G.graph), 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 GraphWrapper& _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 GraphWrapper& _G) : Graph::EdgeIt(*(_G.graph)) { } }; NodeIt& first(NodeIt& i) const { i=NodeIt(*this); return i; } EdgeIt& first(EdgeIt& i) const { i=EdgeIt(*this); return i; } // template I& first(I& i) const { // i=I(*this); // return i; // } 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; } // template I& first(I& i, const P& p) const { // i=I(*this, p); // return i; // } // template I getNext(const I& i) const { // return gw.getNext(i); } template 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 target(const Edge& e) const { return graph->target(e); } Node source(const Edge& e) const { return graph->source(e); } template bool valid(const I& i) const { return graph->valid(i); } //template void setInvalid(const I &i); //{ return graph->setInvalid(i); } int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template Node aNode(const I& e) const { return graph->aNode(e); } template Node bNode(const I& e) const { return graph->bNode(e); } Node addNode() const { return graph->addNode(); } Edge addEdge(const Node& source, const Node& target) const { return graph->addEdge(source, target); } template void erase(const I& i) const { graph->erase(i); } void clear() const { graph->clear(); } template class NodeMap : public Graph::NodeMap { public: NodeMap(const GraphWrapper& _G) : Graph::NodeMap(*(_G.graph)) { } NodeMap(const GraphWrapper& _G, T a) : Graph::NodeMap(*(_G.graph), a) { } }; template class EdgeMap : public Graph::EdgeMap { public: EdgeMap(const GraphWrapper& _G) : Graph::EdgeMap(*(_G.graph)) { } EdgeMap(const GraphWrapper& _G, T a) : Graph::EdgeMap(*(_G.graph), a) { } }; }; // template // class RevGraphWrapper // { // protected: // Graph* graph; // public: // typedef Graph BaseGraph; // 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 I& first(I& i) const { return graph->first(i); } // template I& first(I& i, const P& p) const { // return graph->first(i, p); } // template I getNext(const I& i) const { // return graph->getNext(i); } // template 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 target(const Edge& e) const { return graph->source(e); } // Node source(const Edge& e) const { return graph->target(e); } // template bool valid(const I& i) const // { return graph->valid(i); } // //template void setInvalid(const I &i); // //{ return graph->setInvalid(i); } // template Node aNode(const I& e) const { // return graph->aNode(e); } // template Node bNode(const I& e) const { // return graph->bNode(e); } // Node addNode() const { return graph->addNode(); } // Edge addEdge(const Node& source, const Node& target) const { // return graph->addEdge(source, target); } // int nodeNum() const { return graph->nodeNum(); } // int edgeNum() const { return graph->edgeNum(); } // template void erase(const I& i) const { graph->erase(i); } // void clear() const { graph->clear(); } // template class NodeMap : public Graph::NodeMap { // public: // NodeMap(const RevGraphWrapper& _G) : // Graph::NodeMap(_G.getGraph()) { } // NodeMap(const RevGraphWrapper& _G, T a) : // Graph::NodeMap(_G.getGraph(), a) { } // }; // template class EdgeMap : public Graph::EdgeMap { // public: // EdgeMap(const RevGraphWrapper& _G) : // Graph::EdgeMap(_G.getGraph()) { } // EdgeMap(const RevGraphWrapper& _G, T a) : // Graph::EdgeMap(_G.getGraph(), a) { } // }; // }; template class RevGraphWrapper : public GraphWrapper { public: typedef typename GraphWrapper::Node Node; typedef typename GraphWrapper::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::OutEdgeIt InEdgeIt; typedef typename GraphWrapper::InEdgeIt OutEdgeIt; // RevGraphWrapper() : GraphWrapper() { } RevGraphWrapper(Graph& _graph) : GraphWrapper(_graph) { } Node target(const Edge& e) const { return GraphWrapper::source(e); } Node source(const Edge& e) const { return GraphWrapper::target(e); } }; //Subgraph on the same node-set and partial edge-set template class SubGraphWrapper : public GraphWrapper { protected: EdgeFilterMap* filter_map; public: typedef typename GraphWrapper::Node Node; typedef typename GraphWrapper::NodeIt NodeIt; typedef typename GraphWrapper::Edge Edge; typedef typename GraphWrapper::EdgeIt EdgeIt; typedef typename GraphWrapper::InEdgeIt InEdgeIt; typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; // SubGraphWrapper() : GraphWrapper(), filter_map(0) { } SubGraphWrapper(Graph& _graph, EdgeFilterMap& _filter_map) : GraphWrapper(_graph), filter_map(&_filter_map) { } template I& first(I& i) const { graph->first(i); while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); } return i; } template I& first(I& i, const P& p) const { graph->first(i, p); while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); } return i; } //template I getNext(const I& i) const { // return gw.getNext(i); //} template I& next(I &i) const { graph->next(i); while (graph->valid(i) && !filter_map->get(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; } }; // template // class UndirGraphWrapper { // protected: // //Graph* graph; // GraphWrapper gw; // public: // typedef GraphWrapper BaseGraph; // typedef typename GraphWrapper::Node Node; // typedef typename GraphWrapper::NodeIt NodeIt; // //typedef typename Graph::Edge Edge; // //typedef typename Graph::OutEdgeIt OutEdgeIt; // //typedef typename Graph::InEdgeIt InEdgeIt; // //typedef typename Graph::SymEdgeIt SymEdgeIt; // //typedef typename Graph::EdgeIt EdgeIt; // //private: // typedef typename GraphWrapper::Edge GraphEdge; // typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt; // typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt; // //public: // //UndirGraphWrapper() : graph(0) { } // UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } // //void setGraph(Graph& _graph) { graph = &_graph; } // //Graph& getGraph() const { return (*graph); } // class Edge { // friend class UndirGraphWrapper; // 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); // } // 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); // } // }; // class OutEdgeIt : public Edge { // friend class UndirGraphWrapper; // public: // OutEdgeIt() : Edge() { } // OutEdgeIt(const Invalid& i) : Edge(i) { } // OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) // : Edge() { // out_or_in=true; // _G.gw.first(out, n); // if (!(_G.gw.valid(out))) { // out_or_in=false; // _G.gw.first(in, n); // } // } // }; // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { // e.out_or_in=true; // gw.first(e.out, n); // if (!(gw.valid(e.out))) { // e.out_or_in=false; // gw.first(e.in, n); // } // return e; // } // OutEdgeIt& next(OutEdgeIt& e) const { // if (e.out_or_in) { // Node n=gw.source(e.out); // gw.next(e.out); // if (!gw.valid(e.out)) { // e.out_or_in=false; // gw.first(e.in, n); // } // } else { // gw.next(e.in); // } // return e; // } // Node aNode(const OutEdgeIt& e) const { // if (e.out_or_in) return gw.source(e); else return gw.target(e); } // Node bNode(const OutEdgeIt& e) const { // if (e.out_or_in) return gw.target(e); else return gw.source(e); } // typedef OutEdgeIt InEdgeIt; // template I& first(I& i) const { return gw.first(i); } // // template I& first(I& i, const P& p) const { // // return graph->first(i, p); } // template I getNext(const I& i) const { // return gw.getNext(i); } // template I& next(I &i) const { return gw.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 target(const Edge& e) const { return gw.target(e); } // Node source(const Edge& e) const { return gw.source(e); } // template bool valid(const I& i) const // { return gw.valid(i); } // //template void setInvalid(const I &i); // //{ return graph->setInvalid(i); } // int nodeNum() const { return gw.nodeNum(); } // int edgeNum() const { return gw.edgeNum(); } // // template Node aNode(const I& e) const { // // return graph->aNode(e); } // // template Node bNode(const I& e) const { // // return graph->bNode(e); } // Node addNode() const { return gw.addNode(); } // // FIXME: ez igy nem jo, mert nem // // Edge addEdge(const Node& source, const Node& target) const { // // return graph->addEdge(source, target); } // template void erase(const I& i) const { gw.erase(i); } // void clear() const { gw.clear(); } // template class NodeMap : public GraphWrapper::NodeMap { // public: // NodeMap(const UndirGraphWrapper& _G) : // GraphWrapper::NodeMap(_G.gw) { } // NodeMap(const UndirGraphWrapper& _G, T a) : // GraphWrapper::NodeMap(_G.gw, a) { } // }; // template class EdgeMap : public GraphWrapper::EdgeMap { // public: // EdgeMap(const UndirGraphWrapper& _G) : // GraphWrapper::EdgeMap(_G.gw) { } // EdgeMap(const UndirGraphWrapper& _G, T a) : // GraphWrapper::EdgeMap(_G.gw, a) { } // }; // }; template class UndirGraphWrapper : public GraphWrapper { protected: typedef typename Graph::Edge GraphEdge; typedef typename Graph::OutEdgeIt GraphOutEdgeIt; typedef typename Graph::InEdgeIt GraphInEdgeIt; public: typedef typename GraphWrapper::Node Node; typedef typename GraphWrapper::NodeIt NodeIt; // UndirGraphWrapper() : GraphWrapper() { } UndirGraphWrapper(Graph& _graph) : GraphWrapper(_graph) { } class Edge { friend class UndirGraphWrapper; 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 : public Edge { friend class UndirGraphWrapper; public: OutEdgeIt() : Edge() { } OutEdgeIt(const Invalid& i) : Edge(i) { } OutEdgeIt(const UndirGraphWrapper& _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); } } }; typedef OutEdgeIt InEdgeIt; class EdgeIt : public Edge { friend class UndirGraphWrapper; protected: NodeIt v; public: EdgeIt() : Edge() { } EdgeIt(const Invalid& i) : Edge(i) { } EdgeIt(const UndirGraphWrapper& _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); } } }; OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { e.out_or_in=true; graph->first(e.out, n); if (!(graph->valid(e.out))) { e.out_or_in=false; graph->first(e.in, n); } return e; } EdgeIt& first(EdgeIt& e) const { e.out_or_in=true; //NodeIt v; first(e.v); if (valid(e.v)) graph->first(e.out, e.v); else e.out=INVALID; while (valid(e.v) && !graph->valid(e.out)) { graph->next(e.v); if (valid(e.v)) graph->first(e.out, e.v); } return e; } template I& first(I& i) const { graph->first(i); return i; } template I& first(I& i, const P& p) const { graph->first(i, p); return i; } OutEdgeIt& next(OutEdgeIt& e) const { if (e.out_or_in) { Node n=graph->source(e.out); graph->next(e.out); if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); } } else { graph->next(e.in); } return e; } EdgeIt& next(EdgeIt& e) const { //NodeIt v=source(e); graph->next(e.out); while (valid(e.v) && !graph->valid(e.out)) { next(e.v); if (valid(e.v)) graph->first(e.out, e.v); } return e; } template I& next(I &i) const { return graph->next(i); } // template I getNext(const I& i) const { return gw.getNext(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 target(const Edge& e) const { return gw.target(e); } // Node source(const Edge& e) const { return gw.source(e); } // template bool valid(const I& i) const // { return gw.valid(i); } // int nodeNum() const { return gw.nodeNum(); } // int edgeNum() const { return gw.edgeNum(); } // template Node aNode(const I& e) const { // return graph->aNode(e); } // template Node bNode(const I& e) const { // return graph->bNode(e); } Node aNode(const OutEdgeIt& e) const { if (e.out_or_in) return graph->source(e); else return graph->target(e); } Node bNode(const OutEdgeIt& e) const { if (e.out_or_in) return graph->target(e); else return graph->source(e); } // Node addNode() const { return gw.addNode(); } // FIXME: ez igy nem jo, mert nem // Edge addEdge(const Node& source, const Node& target) const { // return graph->addEdge(source, target); } // template void erase(const I& i) const { gw.erase(i); } // void clear() const { gw.clear(); } // template class NodeMap : public Graph::NodeMap { // public: // NodeMap(const UndirGraphWrapper& _G) : // Graph::NodeMap(_G.gw) { } // NodeMap(const UndirGraphWrapper& _G, T a) : // Graph::NodeMap(_G.gw, a) { } // }; // template class EdgeMap : // public GraphWrapper::EdgeMap { // public: // EdgeMap(const UndirGraphWrapper& _G) : // GraphWrapper::EdgeMap(_G.gw) { } // EdgeMap(const UndirGraphWrapper& _G, T a) : // Graph::EdgeMap(_G.gw, a) { } // }; }; // template // class SymGraphWrapper // { // Graph* graph; // public: // typedef Graph BaseGraph; // 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 I& first(I& i) const { return graph->first(i); } // template I& first(I& i, const P& p) const { // return graph->first(i, p); } // //template I next(const I i); { return graph->goNext(i); } // //template 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 target(const Edge& e) const { return graph->target(e); } // Node source(const Edge& e) const { return graph->source(e); } // template Node aNode(const I& e) const { // return graph->aNode(e); } // template Node bNode(const I& e) const { // return graph->bNode(e); } // //template bool valid(const I i); // //{ return graph->valid(i); } // //template void setInvalid(const I &i); // //{ return graph->setInvalid(i); } // Node addNode() { return graph->addNode(); } // Edge addEdge(const Node& source, const Node& target) { // return graph->addEdge(source, target); } // template void erase(const I& i) { graph->erase(i); } // void clear() { graph->clear(); } // template class NodeMap : public Graph::NodeMap { }; // template class EdgeMap : public Graph::EdgeMap { }; // void setGraph(Graph& _graph) { graph = &_graph; } // Graph& getGraph() { return (*graph); } // //SymGraphWrapper() : graph(0) { } // SymGraphWrapper(Graph& _graph) : graph(&_graph) { } // }; template class ResGraphWrapper : public GraphWrapper{ public: typedef typename GraphWrapper::Node Node; typedef typename GraphWrapper::NodeIt NodeIt; protected: typedef typename Graph::OutEdgeIt OldOutEdgeIt; typedef typename Graph::InEdgeIt OldInEdgeIt; FlowMap* flow; const CapacityMap* capacity; public: ResGraphWrapper(Graph& _graph, FlowMap& _flow, const CapacityMap& _capacity) : GraphWrapper(_graph), flow(&_flow), capacity(&_capacity) { } class Edge; class OutEdgeIt; friend class Edge; friend class OutEdgeIt; class Edge { friend class ResGraphWrapper; protected: bool out_or_in; //true, iff out OldOutEdgeIt out; OldInEdgeIt 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); } }; class OutEdgeIt : public Edge { friend class ResGraphWrapper; public: OutEdgeIt() { } //FIXME OutEdgeIt(const Edge& e) : Edge(e) { } OutEdgeIt(const Invalid& i) : Edge(i) { } protected: OutEdgeIt(const ResGraphWrapper& 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 typedef void InEdgeIt; class EdgeIt : public Edge { friend class ResGraphWrapper; NodeIt v; public: EdgeIt() { } //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { } EdgeIt(const Invalid& i) : Edge(i) { } EdgeIt(const ResGraphWrapper& 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=OldInEdgeIt(); // 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& v) const { graph->first(v); return v; } OutEdgeIt& first(OutEdgeIt& e, Node v) const { e=OutEdgeIt(*this, v); return e; } EdgeIt& first(EdgeIt& e) const { e=EdgeIt(*this); return e; } NodeIt& next(NodeIt& n) const { return graph->next(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; } 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 source(Edge e) const { return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); } Node target(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); else flow->set(e.in, flow->get(e.in)-a); } Number resCap(const Edge& e) const { if (e.out_or_in) return (capacity->get(e.out)-flow->get(e.out)); else return (flow->get(e.in)); } Number resCap(OldOutEdgeIt out) const { return (capacity->get(out)-flow->get(out)); } Number resCap(OldInEdgeIt in) const { return (flow->get(in)); } // template class NodeMap : public Graph::NodeMap { // public: // NodeMap(const ResGraphWrapper& _G) // : Graph::NodeMap(_G.gw) { } // NodeMap(const ResGraphWrapper& _G, // T a) : Graph::NodeMap(_G.gw, a) { } // }; // template // class NodeMap { // typename Graph::NodeMap node_map; // public: // NodeMap(const ResGraphWrapper& _G) : node_map(*(_G.graph)) { } // NodeMap(const ResGraphWrapper& _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 class EdgeMap { typename Graph::EdgeMap forward_map, backward_map; public: EdgeMap(const ResGraphWrapper& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { } EdgeMap(const ResGraphWrapper& _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 get(Edge e) { if (e.out_or_in) return forward_map.get(e.out); else return backward_map.get(e.in); } }; }; //ErasingFirstGraphWrapper for blocking flows template class ErasingFirstGraphWrapper : public GraphWrapper { protected: FirstOutEdgesMap* first_out_edges; public: typedef typename GraphWrapper::Node Node; typedef typename GraphWrapper::NodeIt NodeIt; typedef typename GraphWrapper::Edge Edge; typedef typename GraphWrapper::EdgeIt EdgeIt; typedef typename GraphWrapper::InEdgeIt InEdgeIt; typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; ErasingFirstGraphWrapper(Graph& _graph, FirstOutEdgesMap& _first_out_edges) : GraphWrapper(_graph), first_out_edges(&_first_out_edges) { } template I& first(I& i) const { graph->first(i); return i; } OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { e=first_out_edges->get(n); return e; } template I& first(I& i, const P& p) const { graph->first(i, p); return i; } //template I getNext(const I& i) const { // return gw.getNext(i); //} template 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->source(e), f); } }; // // FIXME: comparison should be made better!!! // template // class ResGraphWrapper // { // Graph* graph; // public: // typedef Graph BaseGraph; // 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 I &goNext(I &i); { return gw.goNext(i); } // //template 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 target(const Edge& e) const { return gw.target(e); } // Node source(const Edge& e) const { return gw.source(e); } // template Node aNode(const I& e) const { // return gw.aNode(e); } // template Node bNode(const I& e) const { // return gw.bNode(e); } // //template bool valid(const I i); // //{ return gw.valid(i); } // //template void setInvalid(const I &i); // //{ return gw.setInvalid(i); } // Node addNode() { return gw.addNode(); } // Edge addEdge(const Node& source, const Node& target) { // return gw.addEdge(source, target); } // template void erase(const I& i) { gw.erase(i); } // void clear() { gw.clear(); } // template class NodeMap : public Graph::NodeMap { }; // template class EdgeMap : public Graph::EdgeMap { }; // void setGraph(Graph& _graph) { graph = &_graph; } // Graph& getGraph() { return (*graph); } // //ResGraphWrapper() : graph(0) { } // ResGraphWrapper(Graph& _graph) : graph(&_graph) { } // }; } //namespace lemon #endif //LEMON_GRAPH_WRAPPER_H