2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
9 template<typename Graph>
10 class TrivGraphWrapper {
15 typedef Graph BaseGraph;
17 typedef typename Graph::Node Node;
18 class NodeIt : public Graph::NodeIt {
21 NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
22 NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
23 NodeIt(const TrivGraphWrapper<Graph>& _G) :
24 Graph::NodeIt(*(_G.graph)) { }
26 typedef typename Graph::Edge Edge;
27 //typedef typename Graph::OutEdgeIt OutEdgeIt;
28 class OutEdgeIt : public Graph::OutEdgeIt {
31 OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
32 OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
33 OutEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :
34 Graph::OutEdgeIt(*(_G.graph), n) { }
36 //typedef typename Graph::InEdgeIt InEdgeIt;
37 class InEdgeIt : public Graph::InEdgeIt {
40 InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
41 InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
42 InEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :
43 Graph::InEdgeIt(*(_G.graph), n) { }
45 //typedef typename Graph::SymEdgeIt SymEdgeIt;
46 //typedef typename Graph::EdgeIt EdgeIt;
47 class EdgeIt : public Graph::EdgeIt {
50 EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
51 EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
52 EdgeIt(const TrivGraphWrapper<Graph>& _G) :
53 Graph::EdgeIt(*(_G.graph)) { }
56 //TrivGraphWrapper() : graph(0) { }
57 TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
59 // void setGraph(Graph& _graph) { graph = &_graph; }
60 // Graph& getGraph() const { return (*graph); }
62 NodeIt& first(NodeIt& i) const {
66 EdgeIt& first(EdgeIt& i) const {
70 // template<typename I> I& first(I& i) const {
71 // //return graph->first(i);
75 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
76 i=OutEdgeIt(*this, p);
79 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
83 // template<typename I, typename P> I& first(I& i, const P& p) const {
84 // //return graph->first(i, p);
89 // template<typename I> I getNext(const I& i) const {
90 // return graph->getNext(i); }
91 template<typename I> I& next(I &i) const { graph->next(i); return i; }
93 template< typename It > It first() const {
94 It e; first(e); return e; }
96 template< typename It > It first(const Node& v) const {
97 It e; first(e, v); return e; }
99 Node head(const Edge& e) const { return graph->head(e); }
100 Node tail(const Edge& e) const { return graph->tail(e); }
102 template<typename I> bool valid(const I& i) const
103 { return graph->valid(i); }
105 //template<typename I> void setInvalid(const I &i);
106 //{ return graph->setInvalid(i); }
108 int nodeNum() const { return graph->nodeNum(); }
109 int edgeNum() const { return graph->edgeNum(); }
111 template<typename I> Node aNode(const I& e) const {
112 return graph->aNode(e); }
113 template<typename I> Node bNode(const I& e) const {
114 return graph->bNode(e); }
116 Node addNode() const { return graph->addNode(); }
117 Edge addEdge(const Node& tail, const Node& head) const {
118 return graph->addEdge(tail, head); }
120 template<typename I> void erase(const I& i) const { graph->erase(i); }
122 void clear() const { graph->clear(); }
124 template<typename T> class NodeMap : public Graph::NodeMap<T> {
126 NodeMap(const TrivGraphWrapper<Graph>& _G) :
127 Graph::NodeMap<T>(*(_G.graph)) { }
128 NodeMap(const TrivGraphWrapper<Graph>& _G, T a) :
129 Graph::NodeMap<T>(*(_G.graph), a) { }
132 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
134 EdgeMap(const TrivGraphWrapper<Graph>& _G) :
135 Graph::EdgeMap<T>(*(_G.graph)) { }
136 EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) :
137 Graph::EdgeMap<T>(*(_G.graph), a) { }
140 template<typename Map, typename T> class NodeMapWrapper {
144 NodeMapWrapper(Map& _map) : map(&_map) { }
145 //template<typename T>
146 void set(Node n, T a) { map->set(n, a); }
147 //template<typename T>
148 T get(Node n) const { return map->get(n); }
151 template<typename Map, typename T> class EdgeMapWrapper {
155 EdgeMapWrapper(Map& _map) : map(&_map) { }
156 //template<typename T>
157 void set(Edge n, T a) { map->set(n, a); }
158 //template<typename T>
159 T get(Edge n) const { return map->get(n); }
163 template<typename GraphWrapper>
164 class GraphWrapperSkeleton {
169 //typedef typename GraphWrapper::BaseGraph BaseGraph;
171 // typedef typename GraphWrapper::Node Node;
172 // typedef typename GraphWrapper::NodeIt NodeIt;
174 // typedef typename GraphWrapper::Edge Edge;
175 // typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
176 // typedef typename GraphWrapper::InEdgeIt InEdgeIt;
177 // //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt;
178 // typedef typename GraphWrapper::EdgeIt EdgeIt;
180 typedef typename GraphWrapper::Node Node;
181 class NodeIt : public GraphWrapper::NodeIt {
184 NodeIt(const typename GraphWrapper::NodeIt& n) :
185 GraphWrapper::NodeIt(n) { }
186 NodeIt(const Invalid& i) : GraphWrapper::NodeIt(i) { }
187 NodeIt(const GraphWrapperSkeleton<GraphWrapper>& _G) :
188 GraphWrapper::NodeIt(_G.gw) { }
190 typedef typename GraphWrapper::Edge Edge;
191 //typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
192 class OutEdgeIt : public GraphWrapper::OutEdgeIt {
195 OutEdgeIt(const typename GraphWrapper::OutEdgeIt& e) :
196 GraphWrapper::OutEdgeIt(e) { }
197 OutEdgeIt(const Invalid& i) : GraphWrapper::OutEdgeIt(i) { }
198 OutEdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G, const Node& n) :
199 GraphWrapper::OutEdgeIt(_G.gw, n) { }
201 //typedef typename GraphWrapper::InEdgeIt InEdgeIt;
202 class InEdgeIt : public GraphWrapper::InEdgeIt {
205 InEdgeIt(const typename GraphWrapper::InEdgeIt& e) :
206 GraphWrapper::InEdgeIt(e) { }
207 InEdgeIt(const Invalid& i) : GraphWrapper::InEdgeIt(i) { }
208 InEdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G, const Node& n) :
209 GraphWrapper::InEdgeIt(_G.gw, n) { }
211 //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt;
212 //typedef typename GraphWrapper::EdgeIt EdgeIt;
213 class EdgeIt : public GraphWrapper::EdgeIt {
216 EdgeIt(const typename GraphWrapper::EdgeIt& e) :
217 GraphWrapper::EdgeIt(e) { }
218 EdgeIt(const Invalid& i) : GraphWrapper::EdgeIt(i) { }
219 EdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G) :
220 GraphWrapper::EdgeIt(_G.gw) { }
224 //GraphWrapperSkeleton() : gw() { }
225 GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { }
227 //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); }
228 //BaseGraph& getGraph() const { return gw.getGraph(); }
230 template<typename I> I& first(I& i) const {
234 template<typename I, typename P> I& first(I& i, const P& p) const {
239 // template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
240 template<typename I> I& next(I &i) const { gw.next(i); return i; }
242 template< typename It > It first() const {
243 It e; this->first(e); return e; }
245 template< typename It > It first(const Node& v) const {
246 It e; this->first(e, v); return e; }
248 Node head(const Edge& e) const { return gw.head(e); }
249 Node tail(const Edge& e) const { return gw.tail(e); }
251 template<typename I> bool valid(const I& i) const { return gw.valid(i); }
253 //template<typename I> void setInvalid(const I &i);
254 //{ return graph->setInvalid(i); }
256 int nodeNum() const { return gw.nodeNum(); }
257 int edgeNum() const { return gw.edgeNum(); }
259 template<typename I> Node aNode(const I& e) const { return gw.aNode(e); }
260 template<typename I> Node bNode(const I& e) const { return gw.bNode(e); }
262 Node addNode() const { return gw.addNode(); }
263 Edge addEdge(const Node& tail, const Node& head) const {
264 return gw.addEdge(tail, head); }
266 template<typename I> void erase(const I& i) const { gw.erase(i); }
268 void clear() const { gw.clear(); }
270 template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
272 NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :
273 GraphWrapper::NodeMap<T>(_G.gw) { }
274 NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :
275 GraphWrapper::NodeMap<T>(_G.gw, a) { }
278 template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {
280 EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :
281 GraphWrapper::EdgeMap<T>(_G.gw) { }
282 EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :
283 GraphWrapper::EdgeMap<T>(_G.gw, a) { }
287 // template<typename Graph>
288 // class RevGraphWrapper
294 // typedef Graph BaseGraph;
296 // typedef typename Graph::Node Node;
297 // typedef typename Graph::NodeIt NodeIt;
299 // typedef typename Graph::Edge Edge;
300 // typedef typename Graph::OutEdgeIt InEdgeIt;
301 // typedef typename Graph::InEdgeIt OutEdgeIt;
302 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
303 // typedef typename Graph::EdgeIt EdgeIt;
305 // //RevGraphWrapper() : graph(0) { }
306 // RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
308 // void setGraph(Graph& _graph) { graph = &_graph; }
309 // Graph& getGraph() const { return (*graph); }
311 // template<typename I> I& first(I& i) const { return graph->first(i); }
312 // template<typename I, typename P> I& first(I& i, const P& p) const {
313 // return graph->first(i, p); }
315 // template<typename I> I getNext(const I& i) const {
316 // return graph->getNext(i); }
317 // template<typename I> I& next(I &i) const { return graph->next(i); }
319 // template< typename It > It first() const {
320 // It e; first(e); return e; }
322 // template< typename It > It first(const Node& v) const {
323 // It e; first(e, v); return e; }
325 // Node head(const Edge& e) const { return graph->tail(e); }
326 // Node tail(const Edge& e) const { return graph->head(e); }
328 // template<typename I> bool valid(const I& i) const
329 // { return graph->valid(i); }
331 // //template<typename I> void setInvalid(const I &i);
332 // //{ return graph->setInvalid(i); }
334 // template<typename I> Node aNode(const I& e) const {
335 // return graph->aNode(e); }
336 // template<typename I> Node bNode(const I& e) const {
337 // return graph->bNode(e); }
339 // Node addNode() const { return graph->addNode(); }
340 // Edge addEdge(const Node& tail, const Node& head) const {
341 // return graph->addEdge(tail, head); }
343 // int nodeNum() const { return graph->nodeNum(); }
344 // int edgeNum() const { return graph->edgeNum(); }
346 // template<typename I> void erase(const I& i) const { graph->erase(i); }
348 // void clear() const { graph->clear(); }
350 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
352 // NodeMap(const RevGraphWrapper<Graph>& _G) :
353 // Graph::NodeMap<T>(_G.getGraph()) { }
354 // NodeMap(const RevGraphWrapper<Graph>& _G, T a) :
355 // Graph::NodeMap<T>(_G.getGraph(), a) { }
358 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
360 // EdgeMap(const RevGraphWrapper<Graph>& _G) :
361 // Graph::EdgeMap<T>(_G.getGraph()) { }
362 // EdgeMap(const RevGraphWrapper<Graph>& _G, T a) :
363 // Graph::EdgeMap<T>(_G.getGraph(), a) { }
367 // template<typename /*Graph*/GraphWrapper
368 // /*=typename GraphWrapperSkeleton< TrivGraphWrapper<Graph>*/ >
369 // class RevGraphWrapper :
370 // public GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/ {
375 // //typedef Graph BaseGraph;
377 // //typedef typename Graph::Node Node;
378 // //typedef typename Graph::NodeIt NodeIt;
380 // //typedef typename Graph::Edge Edge;
381 // typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::OutEdgeIt InEdgeIt;
382 // typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::InEdgeIt OutEdgeIt;
383 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
384 // //typedef typename Graph::EdgeIt EdgeIt;
386 // //RevGraphWrapper() : graph(0) { }
387 // RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/(_gw/*TrivGraphWrapper<Graph>(_graph)*/) { }
389 // //void setGraph(Graph& _graph) { graph = &_graph; }
390 // //Graph& getGraph() const { return (*graph); }
392 // //template<typename I> I& first(I& i) const { return graph->first(i); }
393 // //template<typename I, typename P> I& first(I& i, const P& p) const {
394 // // return graph->first(i, p); }
396 // //template<typename I> I getNext(const I& i) const {
397 // // return graph->getNext(i); }
398 // //template<typename I> I& next(I &i) const { return graph->next(i); }
400 // //template< typename It > It first() const {
401 // // It e; first(e); return e; }
403 // //template< typename It > It first(const Node& v) const {
404 // // It e; first(e, v); return e; }
406 // //Node head(const Edge& e) const { return graph->tail(e); }
407 // //Node tail(const Edge& e) const { return graph->head(e); }
409 // //template<typename I> bool valid(const I& i) const
410 // // { return graph->valid(i); }
412 // //template<typename I> void setInvalid(const I &i);
413 // //{ return graph->setInvalid(i); }
415 // //template<typename I> Node aNode(const I& e) const {
416 // // return graph->aNode(e); }
417 // //template<typename I> Node bNode(const I& e) const {
418 // // return graph->bNode(e); }
420 // //Node addNode() const { return graph->addNode(); }
421 // //Edge addEdge(const Node& tail, const Node& head) const {
422 // // return graph->addEdge(tail, head); }
424 // //int nodeNum() const { return graph->nodeNum(); }
425 // //int edgeNum() const { return graph->edgeNum(); }
427 // //template<typename I> void erase(const I& i) const { graph->erase(i); }
429 // //void clear() const { graph->clear(); }
431 // template<typename T> class NodeMap :
432 // public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>
435 // NodeMap(const RevGraphWrapper<GraphWrapper>& _gw) :
436 // GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw) { }
437 // NodeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) :
438 // GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw, a) { }
441 // template<typename T> class EdgeMap :
442 // public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T> {
444 // EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw) :
445 // GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw) { }
446 // EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) :
447 // GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw, a) { }
452 template<typename GraphWrapper>
453 class RevGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> {
455 typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
456 typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge;
457 typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt InEdgeIt;
458 typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt OutEdgeIt;
460 RevGraphWrapper(GraphWrapper _gw) :
461 GraphWrapperSkeleton<GraphWrapper>(_gw) { }
463 Node head(const Edge& e) const
464 { return GraphWrapperSkeleton<GraphWrapper>::tail(e); }
465 Node tail(const Edge& e) const
466 { return GraphWrapperSkeleton<GraphWrapper>::head(e); }
469 //Subgraph on the same node-set and partial edge-set
470 template<typename GraphWrapper, typename EdgeFilterMap>
471 class SubGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> {
473 EdgeFilterMap* filter_map;
475 typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
476 typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt;
477 typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge;
478 typedef typename GraphWrapperSkeleton<GraphWrapper>::EdgeIt EdgeIt;
479 typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt InEdgeIt;
480 typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt OutEdgeIt;
482 SubGraphWrapper(GraphWrapper _gw, EdgeFilterMap& _filter_map) :
483 GraphWrapperSkeleton<GraphWrapper>(_gw), filter_map(&_filter_map) { }
485 template<typename I> I& first(I& i) const {
487 while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
490 template<typename I, typename P> I& first(I& i, const P& p) const {
492 while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
496 //template<typename I> I getNext(const I& i) const {
497 // return gw.getNext(i);
499 template<typename I> I& next(I &i) const {
501 while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
505 template< typename It > It first() const {
506 It e; this->first(e); return e; }
508 template< typename It > It first(const Node& v) const {
509 It e; this->first(e, v); return e; }
512 // template<typename GraphWrapper>
513 // class UndirGraphWrapper {
519 // typedef GraphWrapper BaseGraph;
521 // typedef typename GraphWrapper::Node Node;
522 // typedef typename GraphWrapper::NodeIt NodeIt;
524 // //typedef typename Graph::Edge Edge;
525 // //typedef typename Graph::OutEdgeIt OutEdgeIt;
526 // //typedef typename Graph::InEdgeIt InEdgeIt;
527 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
528 // //typedef typename Graph::EdgeIt EdgeIt;
531 // typedef typename GraphWrapper::Edge GraphEdge;
532 // typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt;
533 // typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt;
536 // //UndirGraphWrapper() : graph(0) { }
537 // UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
539 // //void setGraph(Graph& _graph) { graph = &_graph; }
540 // //Graph& getGraph() const { return (*graph); }
543 // friend class UndirGraphWrapper<GraphWrapper>;
544 // bool out_or_in; //true iff out
545 // GraphOutEdgeIt out;
548 // Edge() : out_or_in(), out(), in() { }
549 // Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
550 // operator GraphEdge() const {
551 // if (out_or_in) return(out); else return(in);
553 // friend bool operator==(const Edge& u, const Edge& v) {
555 // return (u.out_or_in && u.out==v.out);
557 // return (!u.out_or_in && u.in==v.in);
559 // friend bool operator!=(const Edge& u, const Edge& v) {
561 // return (!u.out_or_in || u.out!=v.out);
563 // return (u.out_or_in || u.in!=v.in);
567 // class OutEdgeIt : public Edge {
568 // friend class UndirGraphWrapper<GraphWrapper>;
570 // OutEdgeIt() : Edge() { }
571 // OutEdgeIt(const Invalid& i) : Edge(i) { }
572 // OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)
575 // _G.gw.first(out, n);
576 // if (!(_G.gw.valid(out))) {
578 // _G.gw.first(in, n);
583 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
585 // gw.first(e.out, n);
586 // if (!(gw.valid(e.out))) {
587 // e.out_or_in=false;
588 // gw.first(e.in, n);
593 // OutEdgeIt& next(OutEdgeIt& e) const {
594 // if (e.out_or_in) {
595 // Node n=gw.tail(e.out);
597 // if (!gw.valid(e.out)) {
598 // e.out_or_in=false;
599 // gw.first(e.in, n);
607 // Node aNode(const OutEdgeIt& e) const {
608 // if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
609 // Node bNode(const OutEdgeIt& e) const {
610 // if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
612 // typedef OutEdgeIt InEdgeIt;
614 // template<typename I> I& first(I& i) const { return gw.first(i); }
615 // // template<typename I, typename P> I& first(I& i, const P& p) const {
616 // // return graph->first(i, p); }
618 // template<typename I> I getNext(const I& i) const {
619 // return gw.getNext(i); }
620 // template<typename I> I& next(I &i) const { return gw.next(i); }
622 // template< typename It > It first() const {
623 // It e; first(e); return e; }
625 // template< typename It > It first(const Node& v) const {
626 // It e; first(e, v); return e; }
628 // Node head(const Edge& e) const { return gw.head(e); }
629 // Node tail(const Edge& e) const { return gw.tail(e); }
631 // template<typename I> bool valid(const I& i) const
632 // { return gw.valid(i); }
634 // //template<typename I> void setInvalid(const I &i);
635 // //{ return graph->setInvalid(i); }
637 // int nodeNum() const { return gw.nodeNum(); }
638 // int edgeNum() const { return gw.edgeNum(); }
640 // // template<typename I> Node aNode(const I& e) const {
641 // // return graph->aNode(e); }
642 // // template<typename I> Node bNode(const I& e) const {
643 // // return graph->bNode(e); }
645 // Node addNode() const { return gw.addNode(); }
646 // // FIXME: ez igy nem jo, mert nem
647 // // Edge addEdge(const Node& tail, const Node& head) const {
648 // // return graph->addEdge(tail, head); }
650 // template<typename I> void erase(const I& i) const { gw.erase(i); }
652 // void clear() const { gw.clear(); }
654 // template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
656 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
657 // GraphWrapper::NodeMap<T>(_G.gw) { }
658 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
659 // GraphWrapper::NodeMap<T>(_G.gw, a) { }
662 // template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {
664 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
665 // GraphWrapper::EdgeMap<T>(_G.gw) { }
666 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
667 // GraphWrapper::EdgeMap<T>(_G.gw, a) { }
672 template<typename GraphWrapper>
673 class UndirGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> {
678 //typedef GraphWrapper BaseGraph;
680 typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
681 typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt;
684 //FIXME ezeknek valojaban a GraphWrapper megfelelo dolgai kellene hogy
685 //legyenek, at kell irni
686 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
687 GraphWrapper::Edge GraphEdge;
688 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
689 GraphWrapper::OutEdgeIt GraphOutEdgeIt;
690 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
691 GraphWrapper::InEdgeIt GraphInEdgeIt;
694 //UndirGraphWrapper() : graph(0) { }
695 UndirGraphWrapper(GraphWrapper _gw) :
696 GraphWrapperSkeleton<GraphWrapper>(_gw) { }
698 //UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
700 //void setGraph(Graph& _graph) { graph = &_graph; }
701 //Graph& getGraph() const { return (*graph); }
704 friend class UndirGraphWrapper<GraphWrapper>;
705 bool out_or_in; //true iff out
709 Edge() : out_or_in(), out(), in() { }
710 Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
711 operator GraphEdge() const {
712 if (out_or_in) return(out); else return(in);
715 //2 edges are equal if they "refer" to the same physical edge
717 friend bool operator==(const Edge& u, const Edge& v) {
719 if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in);
720 //return (u.out_or_in && u.out==v.out);
722 if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in);
723 //return (!u.out_or_in && u.in==v.in);
725 friend bool operator!=(const Edge& u, const Edge& v) {
727 if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in);
728 //return (!u.out_or_in || u.out!=v.out);
730 if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in);
731 //return (u.out_or_in || u.in!=v.in);
735 class OutEdgeIt : public Edge {
736 friend class UndirGraphWrapper<GraphWrapper>;
738 OutEdgeIt() : Edge() { }
739 OutEdgeIt(const Invalid& i) : Edge(i) { }
740 OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)
742 out_or_in=true; _G.gw.first(out, n);
743 if (!(_G.gw.valid(out))) { out_or_in=false; _G.gw.first(in, n); }
747 typedef OutEdgeIt InEdgeIt;
749 class EdgeIt : public Edge {
750 friend class UndirGraphWrapper<GraphWrapper>;
754 EdgeIt() : Edge() { }
755 EdgeIt(const Invalid& i) : Edge(i) { }
756 EdgeIt(const UndirGraphWrapper<GraphWrapper>& _G)
761 if (_G.valid(v)) _G.gw.first(out); else out=INVALID;
762 while (_G.valid(v) && !_G.gw.valid(out)) {
764 if (_G.valid(v)) _G.gw.first(out);
769 OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
770 e.out_or_in=true; gw.first(e.out, n);
771 if (!(gw.valid(e.out))) { e.out_or_in=false; gw.first(e.in, n); }
775 EdgeIt& first(EdgeIt& e) const {
779 if (valid(e.v)) gw.first(e.out, e.v); else e.out=INVALID;
780 while (valid(e.v) && !gw.valid(e.out)) {
782 if (valid(e.v)) gw.first(e.out, e.v);
787 template<typename I> I& first(I& i) const { gw.first(i); return i; }
788 template<typename I, typename P> I& first(I& i, const P& p) const {
789 gw.first(i, p); return i; }
791 OutEdgeIt& next(OutEdgeIt& e) const {
793 Node n=gw.tail(e.out);
795 if (!gw.valid(e.out)) { e.out_or_in=false; gw.first(e.in, n); }
802 EdgeIt& next(EdgeIt& e) const {
805 while (valid(e.v) && !gw.valid(e.out)) {
807 if (valid(e.v)) gw.first(e.out, e.v);
812 template<typename I> I& next(I &i) const { return gw.next(i); }
813 // template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
815 template< typename It > It first() const {
816 It e; first(e); return e; }
818 template< typename It > It first(const Node& v) const {
819 It e; first(e, v); return e; }
821 // Node head(const Edge& e) const { return gw.head(e); }
822 // Node tail(const Edge& e) const { return gw.tail(e); }
824 // template<typename I> bool valid(const I& i) const
825 // { return gw.valid(i); }
827 // int nodeNum() const { return gw.nodeNum(); }
828 // int edgeNum() const { return gw.edgeNum(); }
830 // template<typename I> Node aNode(const I& e) const {
831 // return graph->aNode(e); }
832 // template<typename I> Node bNode(const I& e) const {
833 // return graph->bNode(e); }
835 Node aNode(const OutEdgeIt& e) const {
836 if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
837 Node bNode(const OutEdgeIt& e) const {
838 if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
840 // Node addNode() const { return gw.addNode(); }
842 // FIXME: ez igy nem jo, mert nem
843 // Edge addEdge(const Node& tail, const Node& head) const {
844 // return graph->addEdge(tail, head); }
846 // template<typename I> void erase(const I& i) const { gw.erase(i); }
848 // void clear() const { gw.clear(); }
850 // template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
852 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
853 // GraphWrapper::NodeMap<T>(_G.gw) { }
854 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
855 // GraphWrapper::NodeMap<T>(_G.gw, a) { }
858 // template<typename T> class EdgeMap :
859 // public GraphWrapperSkeleton<GraphWrapper>::EdgeMap<T> {
861 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
862 // GraphWrapperSkeleton<GraphWrapper>::EdgeMap<T>(_G.gw) { }
863 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
864 // GraphWrapper::EdgeMap<T>(_G.gw, a) { }
872 // template<typename Graph>
873 // class SymGraphWrapper
878 // typedef Graph BaseGraph;
880 // typedef typename Graph::Node Node;
881 // typedef typename Graph::Edge Edge;
883 // typedef typename Graph::NodeIt NodeIt;
885 // //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
886 // //iranyitatlant, ami van
887 // //mert csak 1 dolgot lehet be typedef-elni
888 // typedef typename Graph::OutEdgeIt SymEdgeIt;
889 // //typedef typename Graph::InEdgeIt SymEdgeIt;
890 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
891 // typedef typename Graph::EdgeIt EdgeIt;
893 // int nodeNum() const { return graph->nodeNum(); }
894 // int edgeNum() const { return graph->edgeNum(); }
896 // template<typename I> I& first(I& i) const { return graph->first(i); }
897 // template<typename I, typename P> I& first(I& i, const P& p) const {
898 // return graph->first(i, p); }
899 // //template<typename I> I next(const I i); { return graph->goNext(i); }
900 // //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
902 // template< typename It > It first() const {
903 // It e; first(e); return e; }
905 // template< typename It > It first(Node v) const {
906 // It e; first(e, v); return e; }
908 // Node head(const Edge& e) const { return graph->head(e); }
909 // Node tail(const Edge& e) const { return graph->tail(e); }
911 // template<typename I> Node aNode(const I& e) const {
912 // return graph->aNode(e); }
913 // template<typename I> Node bNode(const I& e) const {
914 // return graph->bNode(e); }
916 // //template<typename I> bool valid(const I i);
917 // //{ return graph->valid(i); }
919 // //template<typename I> void setInvalid(const I &i);
920 // //{ return graph->setInvalid(i); }
922 // Node addNode() { return graph->addNode(); }
923 // Edge addEdge(const Node& tail, const Node& head) {
924 // return graph->addEdge(tail, head); }
926 // template<typename I> void erase(const I& i) { graph->erase(i); }
928 // void clear() { graph->clear(); }
930 // template<typename T> class NodeMap : public Graph::NodeMap<T> { };
931 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
933 // void setGraph(Graph& _graph) { graph = &_graph; }
934 // Graph& getGraph() { return (*graph); }
936 // //SymGraphWrapper() : graph(0) { }
937 // SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
941 template<typename GraphWrapper, typename Number, typename FlowMap, typename CapacityMap>
942 class ResGraphWrapper : public GraphWrapperSkeleton<GraphWrapper>{
944 //typedef Graph BaseGraph;
945 //typedef TrivGraphWrapper<const Graph> GraphWrapper;
946 typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
947 typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt;
949 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
950 GraphWrapper::OutEdgeIt OldOutEdgeIt;
951 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
952 GraphWrapper::InEdgeIt OldInEdgeIt;
954 typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/
955 GraphWrapper::Edge OldEdge;
957 //const Graph* graph;
960 const CapacityMap* capacity;
963 ResGraphWrapper(const GraphWrapper& _gw, FlowMap& _flow,
964 const CapacityMap& _capacity) :
965 GraphWrapperSkeleton<GraphWrapper>(_gw),
966 flow(&_flow), capacity(&_capacity) { }
968 //void setGraph(const Graph& _graph) { graph = &_graph; }
969 //const Graph& getGraph() const { return (*graph); }
974 friend class OutEdgeIt;
977 friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>;
979 bool out_or_in; //true, iff out
983 Edge() : out_or_in(true) { }
984 Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
985 // bool valid() const {
986 // return out_or_in && out.valid() || in.valid(); }
987 friend bool operator==(const Edge& u, const Edge& v) {
989 return (u.out_or_in && u.out==v.out);
991 return (!u.out_or_in && u.in==v.in);
993 friend bool operator!=(const Edge& u, const Edge& v) {
995 return (!u.out_or_in || u.out!=v.out);
997 return (u.out_or_in || u.in!=v.in);
1008 class OutEdgeIt : public Edge {
1009 friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>;
1013 OutEdgeIt(const Edge& e) : Edge(e) { }
1014 OutEdgeIt(const Invalid& i) : Edge(i) { }
1016 OutEdgeIt(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() {
1017 resG.gw.first(out, v);
1018 while( resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); }
1019 if (!resG.gw.valid(out)) {
1021 resG.gw.first(in, v);
1022 while( resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); }
1026 // OutEdgeIt& operator++() {
1028 // Node v=/*resG->*/G->aNode(out);
1030 // while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
1031 // if (!out.valid()) {
1034 // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
1038 // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
1044 //FIXME This is just for having InEdgeIt
1045 typedef void InEdgeIt;
1047 class EdgeIt : public Edge {
1048 friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>;
1052 //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
1053 EdgeIt(const Invalid& i) : Edge(i) { }
1054 EdgeIt(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& resG) : Edge() {
1056 if (resG.gw.valid(v)) resG.gw.first(out, v); else out=INVALID;
1057 while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); }
1058 while (resG.gw.valid(v) && !resG.gw.valid(out)) {
1060 if (resG.gw.valid(v)) resG.gw.first(out, v);
1061 while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); }
1063 if (!resG.gw.valid(out)) {
1066 if (resG.gw.valid(v)) resG.gw.first(in, v); else in=INVALID;
1067 while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); }
1068 while (resG.gw.valid(v) && !resG.gw.valid(in)) {
1070 if (resG.gw.valid(v)) resG.gw.first(in, v);
1071 while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); }
1075 // EdgeIt& operator++() {
1078 // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
1079 // while (v.valid() && !out.valid()) {
1081 // if (v.valid()) G->first(out, v);
1082 // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
1084 // if (!out.valid()) {
1087 // if (v.valid()) G->first(in, v); else in=OldInEdgeIt();
1088 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1089 // while (v.valid() && !in.valid()) {
1091 // if (v.valid()) G->first(in, v);
1092 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1097 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1098 // while (v.valid() && !in.valid()) {
1100 // if (v.valid()) G->first(in, v);
1101 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1108 NodeIt& first(NodeIt& v) const { gw.first(v); return v; }
1109 OutEdgeIt& first(OutEdgeIt& e, Node v) const {
1110 e=OutEdgeIt(*this, v);
1113 EdgeIt& first(EdgeIt& e) const {
1118 NodeIt& next(NodeIt& n) const { return gw.next(n); }
1120 OutEdgeIt& next(OutEdgeIt& e) const {
1122 Node v=gw.aNode(e.out);
1124 while( gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); }
1125 if (!gw.valid(e.out)) {
1128 while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1132 while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1137 EdgeIt& next(EdgeIt& e) const {
1140 while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); }
1141 while (gw.valid(e.v) && !gw.valid(e.out)) {
1143 if (gw.valid(e.v)) gw.first(e.out, e.v);
1144 while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); }
1146 if (!gw.valid(e.out)) {
1149 if (gw.valid(e.v)) gw.first(e.in, e.v); else e.in=INVALID;
1150 while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1151 while (gw.valid(e.v) && !gw.valid(e.in)) {
1153 if (gw.valid(e.v)) gw.first(e.in, e.v);
1154 while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1159 while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1160 while (gw.valid(e.v) && !gw.valid(e.in)) {
1162 if (gw.valid(e.v)) gw.first(e.in, e.v);
1163 while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }
1170 template< typename It >
1177 template< typename It >
1178 It first(Node v) const {
1184 Node tail(Edge e) const {
1185 return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); }
1186 Node head(Edge e) const {
1187 return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); }
1189 Node aNode(OutEdgeIt e) const {
1190 return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); }
1191 Node bNode(OutEdgeIt e) const {
1192 return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); }
1194 int nodeNum() const { return gw.nodeNum(); }
1196 //int edgeNum() const { return gw.edgeNum(); }
1199 int id(Node v) const { return gw.id(v); }
1201 bool valid(Node n) const { return gw.valid(n); }
1202 bool valid(Edge e) const {
1203 return e.out_or_in ? gw.valid(e.out) : gw.valid(e.in); }
1205 void augment(const Edge& e, Number a) const {
1207 flow->set(e.out, flow->get(e.out)+a);
1209 flow->set(e.in, flow->get(e.in)-a);
1212 Number resCap(const Edge& e) const {
1214 return (capacity->get(e.out)-flow->get(e.out));
1216 return (flow->get(e.in));
1219 Number resCap(OldOutEdgeIt out) const {
1220 return ( (*capacity)[out] - (*flow)[out]);
1223 Number resCap(OldInEdgeIt in) const {
1224 return ( (*flow)[in] );
1227 // template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
1229 // NodeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G)
1230 // : GraphWrapper::NodeMap<T>(_G.gw) { }
1231 // NodeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G,
1232 // T a) : GraphWrapper::NodeMap<T>(_G.gw, a) { }
1235 // template <typename T>
1237 // typename Graph::NodeMap<T> node_map;
1239 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
1240 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
1241 // void set(Node nit, T a) { node_map.set(nit, a); }
1242 // T get(Node nit) const { return node_map.get(nit); }
1245 template <typename T>
1247 typename GraphWrapper::EdgeMap<T> forward_map, backward_map;
1249 EdgeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G) : forward_map(_G.gw), backward_map(_G.gw) { }
1250 EdgeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(_G.gw, a), backward_map(_G.gw, a) { }
1251 void set(Edge e, T a) {
1253 forward_map.set(e.out, a);
1255 backward_map.set(e.in, a);
1259 return forward_map.get(e.out);
1261 return backward_map.get(e.in);
1266 //Subgraph on the same node-set and partial edge-set
1267 template<typename GraphWrapper, typename FirstOutEdgesMap>
1268 class ErasingFirstGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> {
1270 FirstOutEdgesMap* first_out_edges;
1272 typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node;
1273 typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt;
1274 typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge;
1275 typedef typename GraphWrapperSkeleton<GraphWrapper>::EdgeIt EdgeIt;
1276 typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt InEdgeIt;
1277 typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt OutEdgeIt;
1279 ErasingFirstGraphWrapper(GraphWrapper _gw, FirstOutEdgesMap& _first_out_edges) :
1280 GraphWrapperSkeleton<GraphWrapper>(_gw), first_out_edges(&_first_out_edges) { }
1282 template<typename I> I& first(I& i) const {
1284 //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
1287 OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1288 e=first_out_edges->get(n);
1291 template<typename I, typename P> I& first(I& i, const P& p) const {
1293 //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
1297 //template<typename I> I getNext(const I& i) const {
1298 // return gw.getNext(i);
1300 template<typename I> I& next(I &i) const {
1302 //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); }
1306 template< typename It > It first() const {
1307 It e; this->first(e); return e; }
1309 template< typename It > It first(const Node& v) const {
1310 It e; this->first(e, v); return e; }
1312 void erase(const OutEdgeIt& e) const {
1315 first_out_edges->set(this->tail(e), f);
1319 // template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
1320 // class ErasingResGraphWrapper : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
1322 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
1323 // //ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
1325 // ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow,
1326 // const CapacityMap& _capacity) :
1327 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity),
1328 // first_out_edges(*this) /*, dist(*this)*/ {
1329 // for(NodeIt n=this->template first<NodeIt>(); this->valid(n); this->next(n)) {
1331 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
1332 // first_out_edges.set(n, e);
1336 // //void setGraph(Graph& _graph) { graph = &_graph; }
1337 // //Graph& getGraph() const { return (*graph); }
1339 // //TrivGraphWrapper() : graph(0) { }
1340 // //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { }
1342 // //typedef Graph BaseGraph;
1344 // //typedef typename Graph::Node Node;
1345 // //typedef typename Graph::NodeIt NodeIt;
1347 // //typedef typename Graph::Edge Edge;
1348 // //typedef typename Graph::OutEdgeIt OutEdgeIt;
1349 // //typedef typename Graph::InEdgeIt InEdgeIt;
1350 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
1351 // //typedef typename Graph::EdgeIt EdgeIt;
1353 // typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
1354 // typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
1356 // typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
1357 // typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
1358 // //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
1359 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
1360 // //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
1362 // NodeIt& first(NodeIt& n) const {
1363 // return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
1366 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1367 // e=first_out_edges.get(n);
1371 // //ROSSZ template<typename I> I& first(I& i) const { return first(i); }
1372 // //ROSSZ template<typename I, typename P> I& first(I& i, const P& p) const {
1373 // // return first(i, p); }
1375 // //template<typename I> I getNext(const I& i) const {
1376 // // return gw.getNext(i); }
1377 // //template<typename I> I& next(I &i) const { return gw.next(i); }
1379 // template< typename It > It first() const {
1380 // It e; first(e); return e; }
1382 // template< typename It > It first(const Node& v) const {
1383 // It e; first(e, v); return e; }
1385 // //Node head(const Edge& e) const { return gw.head(e); }
1386 // //Node tail(const Edge& e) const { return gw.tail(e); }
1388 // //template<typename I> bool valid(const I& i) const
1389 // // { return gw.valid(i); }
1391 // //int nodeNum() const { return gw.nodeNum(); }
1392 // //int edgeNum() const { return gw.edgeNum(); }
1394 // //template<typename I> Node aNode(const I& e) const {
1395 // // return gw.aNode(e); }
1396 // //template<typename I> Node bNode(const I& e) const {
1397 // // return gw.bNode(e); }
1399 // //Node addNode() const { return gw.addNode(); }
1400 // //Edge addEdge(const Node& tail, const Node& head) const {
1401 // // return gw.addEdge(tail, head); }
1403 // //void erase(const OutEdgeIt& e) {
1404 // // first_out_edge(this->tail(e))=e;
1406 // void erase(const Edge& e) {
1409 // first_out_edges.set(this->tail(e), f);
1411 // //template<typename I> void erase(const I& i) const { gw.erase(i); }
1413 // //void clear() const { gw.clear(); }
1415 // template<typename T> class NodeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> {
1417 // NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) :
1418 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
1419 // NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) :
1420 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
1423 // template<typename T> class EdgeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> {
1425 // EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) :
1426 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
1427 // EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) :
1428 // ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
1432 // template<typename GraphWrapper>
1433 // class FilterGraphWrapper {
1436 // template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
1437 // class FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
1442 // //typedef Graph BaseGraph;
1444 // typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
1445 // typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
1447 // typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
1448 // typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
1449 // //typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
1450 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
1451 // typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
1453 // //FilterGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
1456 // FilterGraphWrapper(const Graph& _G, FlowMap& _flow,
1457 // const CapacityMap& _capacity) :
1458 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), dist(*this, gw.nodeNum()) {
1461 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1462 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
1463 // while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e))))
1464 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
1468 // NodeIt& next(NodeIt& e) const {
1469 // return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
1472 // OutEdgeIt& next(OutEdgeIt& e) const {
1473 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
1474 // while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e))))
1475 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
1479 // NodeIt& first(NodeIt& n) const {
1480 // return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
1483 // void erase(const Edge& e) {
1485 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
1486 // while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f))))
1487 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
1488 // first_out_edges.set(this->tail(e), f);
1491 // //TrivGraphWrapper() : graph(0) { }
1492 // //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
1494 // //void setGraph(Graph& _graph) { graph = &_graph; }
1495 // //Graph& getGraph() const { return (*graph); }
1497 // //template<typename I> I& first(I& i) const { return gw.first(i); }
1498 // //template<typename I, typename P> I& first(I& i, const P& p) const {
1499 // // return gw.first(i, p); }
1501 // //template<typename I> I getNext(const I& i) const {
1502 // // return gw.getNext(i); }
1503 // //template<typename I> I& next(I &i) const { return gw.next(i); }
1505 // template< typename It > It first() const {
1506 // It e; first(e); return e; }
1508 // template< typename It > It first(const Node& v) const {
1509 // It e; first(e, v); return e; }
1511 // //Node head(const Edge& e) const { return gw.head(e); }
1512 // //Node tail(const Edge& e) const { return gw.tail(e); }
1514 // //template<typename I> bool valid(const I& i) const
1515 // // { return gw.valid(i); }
1517 // //template<typename I> void setInvalid(const I &i);
1518 // //{ return gw.setInvalid(i); }
1520 // //int nodeNum() const { return gw.nodeNum(); }
1521 // //int edgeNum() const { return gw.edgeNum(); }
1523 // //template<typename I> Node aNode(const I& e) const {
1524 // // return gw.aNode(e); }
1525 // //template<typename I> Node bNode(const I& e) const {
1526 // // return gw.bNode(e); }
1528 // //Node addNode() const { return gw.addNode(); }
1529 // //Edge addEdge(const Node& tail, const Node& head) const {
1530 // // return gw.addEdge(tail, head); }
1532 // //template<typename I> void erase(const I& i) const { gw.erase(i); }
1534 // //void clear() const { gw.clear(); }
1536 // template<typename T> class NodeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> {
1538 // NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) :
1539 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
1540 // NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) :
1541 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
1544 // template<typename T> class EdgeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> {
1546 // EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) :
1547 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
1548 // EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) :
1549 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
1553 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
1559 // // FIXME: comparison should be made better!!!
1560 // template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
1561 // class ResGraphWrapper
1566 // typedef Graph BaseGraph;
1568 // typedef typename Graph::Node Node;
1569 // typedef typename Graph::Edge Edge;
1571 // typedef typename Graph::NodeIt NodeIt;
1573 // class OutEdgeIt {
1577 // typename Graph::OutEdgeIt o;
1578 // typename Graph::InEdgeIt i;
1584 // typename Graph::OutEdgeIt o;
1585 // typename Graph::InEdgeIt i;
1587 // typedef typename Graph::SymEdgeIt SymEdgeIt;
1588 // typedef typename Graph::EdgeIt EdgeIt;
1590 // int nodeNum() const { return gw.nodeNum(); }
1591 // int edgeNum() const { return gw.edgeNum(); }
1593 // Node& first(Node& n) const { return gw.first(n); }
1595 // // Edge and SymEdge is missing!!!!
1596 // // Edge <-> In/OutEdgeIt conversion is missing!!!!
1599 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const
1603 // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
1605 // if(!gw.valid(e.o)) {
1607 // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
1613 // OutEdgeIt &goNext(OutEdgeIt &e)
1615 // if(gw.valid(e.o)) {
1616 // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
1618 // if(gw.valid(e.o)) return e;
1619 // else gw.first(e.i,e.n);
1622 // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
1627 // OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
1629 // //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);}
1632 // InEdgeIt& first(InEdgeIt& e, const Node& n) const
1636 // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
1638 // if(!gw.valid(e.i)) {
1640 // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
1646 // InEdgeIt &goNext(InEdgeIt &e)
1648 // if(gw.valid(e.i)) {
1649 // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
1651 // if(gw.valid(e.i)) return e;
1652 // else gw.first(e.o,e.n);
1655 // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
1660 // InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
1662 // //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);}
1664 // //template<typename I> I &goNext(I &i); { return gw.goNext(i); }
1665 // //template<typename I> I next(const I i); { return gw.goNext(i); }
1667 // template< typename It > It first() const {
1668 // It e; first(e); return e; }
1670 // template< typename It > It first(Node v) const {
1671 // It e; first(e, v); return e; }
1673 // Node head(const Edge& e) const { return gw.head(e); }
1674 // Node tail(const Edge& e) const { return gw.tail(e); }
1676 // template<typename I> Node aNode(const I& e) const {
1677 // return gw.aNode(e); }
1678 // template<typename I> Node bNode(const I& e) const {
1679 // return gw.bNode(e); }
1681 // //template<typename I> bool valid(const I i);
1682 // //{ return gw.valid(i); }
1684 // //template<typename I> void setInvalid(const I &i);
1685 // //{ return gw.setInvalid(i); }
1687 // Node addNode() { return gw.addNode(); }
1688 // Edge addEdge(const Node& tail, const Node& head) {
1689 // return gw.addEdge(tail, head); }
1691 // template<typename I> void erase(const I& i) { gw.erase(i); }
1693 // void clear() { gw.clear(); }
1695 // template<typename S> class NodeMap : public Graph::NodeMap<S> { };
1696 // template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
1698 // void setGraph(Graph& _graph) { graph = &_graph; }
1699 // Graph& getGraph() { return (*graph); }
1701 // //ResGraphWrapper() : graph(0) { }
1702 // ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
1707 #endif //HUGO_GRAPH_WRAPPER_H