98 GraphWrapper(Graph& _graph) : graph(&_graph) { } |
98 GraphWrapper(Graph& _graph) : graph(&_graph) { } |
99 GraphWrapper(const GraphWrapper<Graph>& gw) : graph(gw.graph) { } |
99 GraphWrapper(const GraphWrapper<Graph>& gw) : graph(gw.graph) { } |
100 // Graph& getGraph() const { return *graph; } |
100 // Graph& getGraph() const { return *graph; } |
101 |
101 |
102 typedef typename Graph::Node Node; |
102 typedef typename Graph::Node Node; |
103 // class Node : public Graph::Node { |
|
104 // friend class GraphWrapper<Graph>; |
|
105 // public: |
|
106 // Node() { } |
|
107 // Node(const typename Graph::Node& _n) : Graph::Node(_n) { } |
|
108 // // /// \bug construction throughrthr multiple levels should be |
|
109 // // /// handled better |
|
110 // // Node(const typename ParentGraph::ParentGraph::Node& _n) : |
|
111 // // Graph::Node(_n) { } |
|
112 // Node(const Invalid& i) : Graph::Node(i) { } |
|
113 // }; |
|
114 class NodeIt : public Node { |
103 class NodeIt : public Node { |
115 const GraphWrapper<Graph>* gw; |
104 const GraphWrapper<Graph>* gw; |
116 friend class GraphWrapper<Graph>; |
105 friend class GraphWrapper<Graph>; |
117 public: |
106 public: |
118 NodeIt() { } |
107 NodeIt() { } |
127 ++(typename Graph::NodeIt(*(gw->graph), *this)); |
116 ++(typename Graph::NodeIt(*(gw->graph), *this)); |
128 return *this; |
117 return *this; |
129 } |
118 } |
130 }; |
119 }; |
131 typedef typename Graph::Edge Edge; |
120 typedef typename Graph::Edge Edge; |
132 // class Edge : public Graph::Edge { |
|
133 // friend class GraphWrapper<Graph>; |
|
134 // public: |
|
135 // Edge() { } |
|
136 // Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { } |
|
137 // Edge(const Invalid& i) : Graph::Edge(i) { } |
|
138 // }; |
|
139 class OutEdgeIt : public Edge { |
121 class OutEdgeIt : public Edge { |
140 const GraphWrapper<Graph>* gw; |
122 const GraphWrapper<Graph>* gw; |
141 friend class GraphWrapper<Graph>; |
123 friend class GraphWrapper<Graph>; |
142 public: |
124 public: |
143 OutEdgeIt() { } |
125 OutEdgeIt() { } |
275 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { } |
257 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { } |
276 RevGraphWrapper(const RevGraphWrapper<Graph>& gw) : Parent(gw) { } |
258 RevGraphWrapper(const RevGraphWrapper<Graph>& gw) : Parent(gw) { } |
277 |
259 |
278 typedef typename GraphWrapper<Graph>::Node Node; |
260 typedef typename GraphWrapper<Graph>::Node Node; |
279 typedef typename GraphWrapper<Graph>::Edge Edge; |
261 typedef typename GraphWrapper<Graph>::Edge Edge; |
280 //If Graph::OutEdgeIt is not defined |
262 //remark: OutEdgeIt and InEdgeIt cannot be typedef-ed to each other |
281 //and we do not want to use RevGraphWrapper::InEdgeIt, |
263 //because this does not work is some of them are not defined in the |
282 //the typdef techinque does not work. |
264 //original graph. The problem with this is that typedef-ed stuff |
283 //Unfortunately all the typedefs are instantiated in templates. |
265 //are instantiated in c++. |
284 //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt; |
|
285 //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt; |
|
286 |
|
287 class OutEdgeIt : public Edge { |
266 class OutEdgeIt : public Edge { |
288 const RevGraphWrapper<Graph>* gw; |
267 const RevGraphWrapper<Graph>* gw; |
289 friend class GraphWrapper<Graph>; |
268 friend class GraphWrapper<Graph>; |
290 public: |
269 public: |
291 OutEdgeIt() { } |
270 OutEdgeIt() { } |
380 EdgeFilterMap& _edge_filter_map) : |
359 EdgeFilterMap& _edge_filter_map) : |
381 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), |
360 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), |
382 edge_filter_map(&_edge_filter_map) { } |
361 edge_filter_map(&_edge_filter_map) { } |
383 |
362 |
384 typedef typename GraphWrapper<Graph>::Node Node; |
363 typedef typename GraphWrapper<Graph>::Node Node; |
385 // class NodeIt { |
|
386 // friend class GraphWrapper<Graph>; |
|
387 // friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>; |
|
388 // typename Graph::NodeIt n; |
|
389 // public: |
|
390 // NodeIt() { } |
|
391 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { } |
|
392 // NodeIt(const Invalid& i) : n(i) { } |
|
393 // NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : |
|
394 // n(*(_G.graph)) { |
|
395 // while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n]) |
|
396 // _G.graph->next(n); |
|
397 // } |
|
398 // operator Node() const { return Node(typename Graph::Node(n)); } |
|
399 // }; |
|
400 class NodeIt : public Node { |
364 class NodeIt : public Node { |
401 const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw; |
365 const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw; |
402 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>; |
366 friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>; |
403 public: |
367 public: |
404 NodeIt() { } |
368 NodeIt() { } |
558 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
522 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
559 |
523 |
560 /// Returns true if \c n is hidden. |
524 /// Returns true if \c n is hidden. |
561 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
525 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
562 |
526 |
563 /// This is a linear time operation and works only if |
527 /// \warning This is a linear time operation and works only if |
564 /// NodeIt is defined. |
528 /// \c Graph::NodeIt is defined. |
565 int nodeNum() const { |
529 int nodeNum() const { |
566 int i=0; |
530 int i=0; |
567 NodeIt n; |
531 for (NodeIt n(*this); n!=INVALID; ++n) ++i; |
568 for (this->first(n); this->valid(n); this->next(n)) ++i; |
|
569 return i; |
532 return i; |
570 } |
533 } |
571 |
534 |
572 /// This is a linear time operation and works only if |
535 /// \warning This is a linear time operation and works only if |
573 /// EdgeIt is defined. |
536 /// \c Graph::EdgeIt is defined. |
574 int edgeNum() const { |
537 int edgeNum() const { |
575 int i=0; |
538 int i=0; |
576 EdgeIt e; |
539 for (EdgeIt e(*this); e!=INVALID; ++e) ++i; |
577 for (this->first(e); this->valid(e); this->next(e)) ++i; |
|
578 return i; |
540 return i; |
579 } |
541 } |
580 |
542 |
581 }; |
543 }; |
582 |
544 |
687 }; |
649 }; |
688 |
650 |
689 |
651 |
690 |
652 |
691 ///\brief A wrapper for composing a subgraph of a |
653 ///\brief A wrapper for composing a subgraph of a |
692 /// bidirected graph composed from a directed one. |
654 /// bidirected graph made from a directed one. |
693 /// experimental, for fezso's sake. |
|
694 /// |
655 /// |
695 /// A wrapper for composing a subgraps of a |
656 /// Suppose that for a directed graph $G=(V, A)$, |
696 /// bidirected graph composed from a directed one. |
657 /// two predicates on the edge-set, $forward_filter$, and $backward_filter$ |
697 /// experimental, for fezso's sake. |
658 /// is given, and we are dealing with the directed graph |
698 /// A bidirected graph is composed over the directed one without physical |
659 /// a $G'=(V, \{uv : uv\in A \mbox{ and } forward_filter(uv) \mbox{ is true}\}+\{vu : uv\in A \mbox{ and } backward_filter(uv) \mbox{ is true}\})$. |
699 /// storage. As the oppositely directed edges are logically different ones |
660 /// The purpose of writing + instead of union is because parallel |
700 /// the maps are able to attach different values for them. |
661 /// edges can arose. |
|
662 /// In other words, a subgraph of the bidirected graph obtained, which |
|
663 /// is given by orienting the edges of the original graph in both directions. |
|
664 /// An example for such a construction is the \c RevGraphWrapper where the |
|
665 /// forward_filter is everywhere false and the backward_filter is |
|
666 /// everywhere true. We note that for sake of efficiency, |
|
667 /// \c RevGraphWrapper is implemented in a different way. |
|
668 /// But BidirGraphWrapper is obtained from |
|
669 /// SubBidirGraphWrapper by considering everywhere true |
|
670 /// predicates both forward_filter and backward_filter. |
|
671 /// Finally, one of the most important applications of SubBidirGraphWrapper |
|
672 /// is ResGraphWrapper, which stands for the residual graph in directed |
|
673 /// flow and circulation problems. |
|
674 /// As wrappers usually, the SubBidirGraphWrapper implements the |
|
675 /// above mentioned graph structure without its physical storage, |
|
676 /// that is the whole stuff eats constant memory. |
|
677 /// As the oppositely directed edges are logical different, |
|
678 /// the maps are able to attach different values for them. |
701 template<typename Graph, |
679 template<typename Graph, |
702 typename ForwardFilterMap, typename BackwardFilterMap> |
680 typename ForwardFilterMap, typename BackwardFilterMap> |
703 class SubBidirGraphWrapper : public GraphWrapper<Graph> { |
681 class SubBidirGraphWrapper : public GraphWrapper<Graph> { |
704 public: |
682 public: |
705 typedef GraphWrapper<Graph> Parent; |
683 typedef GraphWrapper<Graph> Parent; |
706 protected: |
684 protected: |
707 ForwardFilterMap* forward_filter; |
685 ForwardFilterMap* forward_filter; |
708 BackwardFilterMap* backward_filter; |
686 BackwardFilterMap* backward_filter; |
709 |
687 |
710 SubBidirGraphWrapper() : GraphWrapper<Graph>()/*, |
688 SubBidirGraphWrapper() : GraphWrapper<Graph>() { } |
711 capacity(0), flow(0)*/ { } |
|
712 void setForwardFilterMap(ForwardFilterMap& _forward_filter) { |
689 void setForwardFilterMap(ForwardFilterMap& _forward_filter) { |
713 forward_filter=&_forward_filter; |
690 forward_filter=&_forward_filter; |
714 } |
691 } |
715 void setBackwardFilterMap(BackwardFilterMap& _backward_filter) { |
692 void setBackwardFilterMap(BackwardFilterMap& _backward_filter) { |
716 backward_filter=&_backward_filter; |
693 backward_filter=&_backward_filter; |
731 class Edge; |
708 class Edge; |
732 class OutEdgeIt; |
709 class OutEdgeIt; |
733 friend class Edge; |
710 friend class Edge; |
734 friend class OutEdgeIt; |
711 friend class OutEdgeIt; |
735 |
712 |
736 //template<typename T> class NodeMap; |
|
737 template<typename T> class EdgeMap; |
713 template<typename T> class EdgeMap; |
738 |
714 |
739 typedef typename GraphWrapper<Graph>::Node Node; |
715 typedef typename GraphWrapper<Graph>::Node Node; |
740 //typedef typename GraphWrapper<Graph>::NodeIt NodeIt; |
|
741 |
716 |
742 typedef typename Graph::Edge GraphEdge; |
717 typedef typename Graph::Edge GraphEdge; |
|
718 /// SubBidirGraphWrapper<..., ..., ...>::Edge is inherited from |
|
719 /// Graph::Edge. It contains an extra bool flag which shows if the |
|
720 /// edge is the backward version of the original edge. |
743 class Edge : public Graph::Edge { |
721 class Edge : public Graph::Edge { |
744 friend class SubBidirGraphWrapper<Graph, |
722 friend class SubBidirGraphWrapper<Graph, |
745 ForwardFilterMap, BackwardFilterMap>; |
723 ForwardFilterMap, BackwardFilterMap>; |
746 ///\bug ez nem is kell |
|
747 //template<typename T> friend class NodeMap; |
|
748 template<typename T> friend class EdgeMap; |
724 template<typename T> friend class EdgeMap; |
749 protected: |
725 protected: |
750 bool backward; //true, iff backward |
726 bool backward; //true, iff backward |
751 // typename Graph::Edge e; |
|
752 public: |
727 public: |
753 Edge() { } |
728 Edge() { } |
754 ///\bug =false kell-e? zsoltnak kell az addEdge miatt |
729 /// \todo =false is needed, or causes problems? |
|
730 /// If \c _backward is false, then we get an edge corresponding to the |
|
731 /// original one, otherwise its oppositely directed pair is obtained. |
755 Edge(const typename Graph::Edge& e, bool _backward/*=false*/) : |
732 Edge(const typename Graph::Edge& e, bool _backward/*=false*/) : |
756 Graph::Edge(e), backward(_backward) { } |
733 Graph::Edge(e), backward(_backward) { } |
757 Edge(Invalid i) : Graph::Edge(i), backward(true) { } |
734 Edge(Invalid i) : Graph::Edge(i), backward(true) { } |
758 //the unique invalid iterator |
735 //the unique invalid iterator |
759 // friend bool operator==(const Edge& u, const Edge& v) { |
736 // friend bool operator==(const Edge& u, const Edge& v) { |
956 // i=NodeIt(*this); return i; |
933 // i=NodeIt(*this); return i; |
957 // } |
934 // } |
958 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { |
935 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { |
959 i=OutEdgeIt(*this, p); return i; |
936 i=OutEdgeIt(*this, p); return i; |
960 } |
937 } |
961 // FIXME not tested |
|
962 InEdgeIt& first(InEdgeIt& i, const Node& p) const { |
938 InEdgeIt& first(InEdgeIt& i, const Node& p) const { |
963 i=InEdgeIt(*this, p); return i; |
939 i=InEdgeIt(*this, p); return i; |
964 } |
940 } |
965 EdgeIt& first(EdgeIt& i) const { |
941 EdgeIt& first(EdgeIt& i) const { |
966 i=EdgeIt(*this); return i; |
942 i=EdgeIt(*this); return i; |
1050 Edge f=e; |
1026 Edge f=e; |
1051 f.backward=!f.backward; |
1027 f.backward=!f.backward; |
1052 return f; |
1028 return f; |
1053 } |
1029 } |
1054 |
1030 |
1055 // int nodeNum() const { return graph->nodeNum(); } |
1031 /// \warning This is a linear time operation and works only if |
1056 //FIXME |
1032 /// \c Graph::EdgeIt is defined. |
1057 void edgeNum() const { } |
1033 int edgeNum() const { |
1058 //int edgeNum() const { return graph->edgeNum(); } |
1034 int i=0; |
1059 |
1035 for (EdgeIt e(*this); e!=INVALID; ++e) ++i; |
1060 |
1036 return i; |
1061 // int id(Node v) const { return graph->id(v); } |
1037 } |
1062 |
|
1063 // bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); } |
|
1064 // bool valid(Edge e) const { |
|
1065 // return this->graph->valid(e); |
|
1066 // //return e.forward ? graph->valid(e.out) : graph->valid(e.in); |
|
1067 // } |
|
1068 |
1038 |
1069 bool forward(const Edge& e) const { return !e.backward; } |
1039 bool forward(const Edge& e) const { return !e.backward; } |
1070 bool backward(const Edge& e) const { return e.backward; } |
1040 bool backward(const Edge& e) const { return e.backward; } |
1071 |
1041 |
1072 // void augment(const Edge& e, Number a) const { |
|
1073 // if (!e.backward) |
|
1074 // // flow->set(e.out, flow->get(e.out)+a); |
|
1075 // flow->set(e, (*flow)[e]+a); |
|
1076 // else |
|
1077 // // flow->set(e.in, flow->get(e.in)-a); |
|
1078 // flow->set(e, (*flow)[e]-a); |
|
1079 // } |
|
1080 |
|
1081 // bool enabled(const Edge& e) const { |
|
1082 // if (!e.backward) |
|
1083 // // return (capacity->get(e.out)-flow->get(e.out)); |
|
1084 // //return ((*capacity)[e]-(*flow)[e]); |
|
1085 // return true; |
|
1086 // else |
|
1087 // // return (flow->get(e.in)); |
|
1088 // //return ((*flow)[e]); |
|
1089 // return true; |
|
1090 // } |
|
1091 |
|
1092 // Number enabled(typename Graph::OutEdgeIt out) const { |
|
1093 // // return (capacity->get(out)-flow->get(out)); |
|
1094 // return ((*capacity)[out]-(*flow)[out]); |
|
1095 // } |
|
1096 |
|
1097 // Number enabled(typename Graph::InEdgeIt in) const { |
|
1098 // // return (flow->get(in)); |
|
1099 // return ((*flow)[in]); |
|
1100 // } |
|
1101 |
1042 |
1102 template <typename T> |
1043 template <typename T> |
|
1044 /// \c SubBidirGraphWrapper<..., ..., ...>::EdgeMap contains two |
|
1045 /// Graph::EdgeMap one for the forward edges and |
|
1046 /// one for the backward edges. |
1103 class EdgeMap { |
1047 class EdgeMap { |
1104 typename Graph::template EdgeMap<T> forward_map, backward_map; |
1048 typename Graph::template EdgeMap<T> forward_map, backward_map; |
1105 public: |
1049 public: |
1106 typedef T ValueType; |
1050 typedef T ValueType; |
1107 typedef Edge KeyType; |
1051 typedef Edge KeyType; |
1111 EdgeMap(const SubBidirGraphWrapper<Graph, |
1055 EdgeMap(const SubBidirGraphWrapper<Graph, |
1112 ForwardFilterMap, BackwardFilterMap>& g, T a) : |
1056 ForwardFilterMap, BackwardFilterMap>& g, T a) : |
1113 forward_map(*(g.graph), a), backward_map(*(g.graph), a) { } |
1057 forward_map(*(g.graph), a), backward_map(*(g.graph), a) { } |
1114 void set(Edge e, T a) { |
1058 void set(Edge e, T a) { |
1115 if (!e.backward) |
1059 if (!e.backward) |
1116 forward_map.set(e/*.out*/, a); |
1060 forward_map.set(e, a); |
1117 else |
1061 else |
1118 backward_map.set(e/*.in*/, a); |
1062 backward_map.set(e, a); |
1119 } |
1063 } |
1120 T operator[](Edge e) const { |
1064 T operator[](Edge e) const { |
1121 if (!e.backward) |
1065 if (!e.backward) |
1122 return forward_map[e/*.out*/]; |
1066 return forward_map[e]; |
1123 else |
1067 else |
1124 return backward_map[e/*.in*/]; |
1068 return backward_map[e]; |
1125 } |
1069 } |
1126 void update() { |
1070 void update() { |
1127 forward_map.update(); |
1071 forward_map.update(); |
1128 backward_map.update(); |
1072 backward_map.update(); |
1129 } |
1073 } |
1135 // } |
1079 // } |
1136 }; |
1080 }; |
1137 }; |
1081 }; |
1138 |
1082 |
1139 |
1083 |
1140 |
|
1141 ///\brief A wrapper for composing bidirected graph from a directed one. |
1084 ///\brief A wrapper for composing bidirected graph from a directed one. |
1142 /// experimental, for fezso's sake. |
|
1143 /// |
1085 /// |
1144 /// A wrapper for composing bidirected graph from a directed one. |
1086 /// A wrapper for composing bidirected graph from a directed one. |
1145 /// experimental, for fezso's sake. |
|
1146 /// A bidirected graph is composed over the directed one without physical |
1087 /// A bidirected graph is composed over the directed one without physical |
1147 /// storage. As the oppositely directed edges are logically different ones |
1088 /// storage. As the oppositely directed edges are logically different ones |
1148 /// the maps are able to attach different values for them. |
1089 /// the maps are able to attach different values for them. |
1149 template<typename Graph> |
1090 template<typename Graph> |
1150 class BidirGraphWrapper : |
1091 class BidirGraphWrapper : |
1157 Graph, |
1098 Graph, |
1158 ConstMap<typename Graph::Edge, bool>, |
1099 ConstMap<typename Graph::Edge, bool>, |
1159 ConstMap<typename Graph::Edge, bool> > Parent; |
1100 ConstMap<typename Graph::Edge, bool> > Parent; |
1160 protected: |
1101 protected: |
1161 ConstMap<typename Graph::Edge, bool> cm; |
1102 ConstMap<typename Graph::Edge, bool> cm; |
1162 //const CapacityMap* capacity; |
|
1163 //FlowMap* flow; |
|
1164 |
1103 |
1165 BidirGraphWrapper() : Parent(), cm(true) { |
1104 BidirGraphWrapper() : Parent(), cm(true) { |
1166 Parent::setForwardFilterMap(cm); |
1105 Parent::setForwardFilterMap(cm); |
1167 Parent::setBackwardFilterMap(cm); |
1106 Parent::setBackwardFilterMap(cm); |
1168 } |
1107 } |
1169 // void setCapacityMap(const CapacityMap& _capacity) { |
1108 public: |
1170 // capacity=&_capacity; |
|
1171 // } |
|
1172 // void setFlowMap(FlowMap& _flow) { |
|
1173 // flow=&_flow; |
|
1174 // } |
|
1175 |
|
1176 public: |
|
1177 |
|
1178 BidirGraphWrapper(Graph& _graph) : Parent() { |
1109 BidirGraphWrapper(Graph& _graph) : Parent() { |
1179 Parent::setGraph(_graph); |
1110 Parent::setGraph(_graph); |
1180 Parent::setForwardFilterMap(cm); |
1111 Parent::setForwardFilterMap(cm); |
1181 Parent::setBackwardFilterMap(cm); |
1112 Parent::setBackwardFilterMap(cm); |
1182 } |
1113 } |
1186 } |
1117 } |
1187 }; |
1118 }; |
1188 |
1119 |
1189 |
1120 |
1190 |
1121 |
1191 |
1122 // this is a direct implementation of the bidirected-graph wrapper. |
|
1123 // in early hugo, it was implemented that way. |
1192 template<typename Graph> |
1124 template<typename Graph> |
1193 class OldBidirGraphWrapper : public GraphWrapper<Graph> { |
1125 class OldBidirGraphWrapper : public GraphWrapper<Graph> { |
1194 public: |
1126 public: |
1195 typedef GraphWrapper<Graph> Parent; |
1127 typedef GraphWrapper<Graph> Parent; |
1196 protected: |
1128 protected: |
1197 //const CapacityMap* capacity; |
1129 OldBidirGraphWrapper() : GraphWrapper<Graph>() { } |
1198 //FlowMap* flow; |
1130 |
1199 |
1131 public: |
1200 OldBidirGraphWrapper() : GraphWrapper<Graph>()/*, |
1132 |
1201 capacity(0), flow(0)*/ { } |
1133 OldBidirGraphWrapper(Graph& _graph) : |
1202 // void setCapacityMap(const CapacityMap& _capacity) { |
1134 GraphWrapper<Graph>(_graph) { } |
1203 // capacity=&_capacity; |
|
1204 // } |
|
1205 // void setFlowMap(FlowMap& _flow) { |
|
1206 // flow=&_flow; |
|
1207 // } |
|
1208 |
|
1209 public: |
|
1210 |
|
1211 OldBidirGraphWrapper(Graph& _graph/*, const CapacityMap& _capacity, |
|
1212 FlowMap& _flow*/) : |
|
1213 GraphWrapper<Graph>(_graph)/*, capacity(&_capacity), flow(&_flow)*/ { } |
|
1214 |
1135 |
1215 class Edge; |
1136 class Edge; |
1216 class OutEdgeIt; |
1137 class OutEdgeIt; |
1217 friend class Edge; |
1138 friend class Edge; |
1218 friend class OutEdgeIt; |
1139 friend class OutEdgeIt; |
1457 } |
1378 } |
1458 |
1379 |
1459 bool forward(const Edge& e) const { return !e.backward; } |
1380 bool forward(const Edge& e) const { return !e.backward; } |
1460 bool backward(const Edge& e) const { return e.backward; } |
1381 bool backward(const Edge& e) const { return e.backward; } |
1461 |
1382 |
1462 // void augment(const Edge& e, Number a) const { |
|
1463 // if (!e.backward) |
|
1464 // // flow->set(e.out, flow->get(e.out)+a); |
|
1465 // flow->set(e, (*flow)[e]+a); |
|
1466 // else |
|
1467 // // flow->set(e.in, flow->get(e.in)-a); |
|
1468 // flow->set(e, (*flow)[e]-a); |
|
1469 // } |
|
1470 |
|
1471 bool enabled(const Edge& e) const { |
1383 bool enabled(const Edge& e) const { |
1472 if (!e.backward) |
1384 if (!e.backward) |
1473 // return (capacity->get(e.out)-flow->get(e.out)); |
1385 // return (capacity->get(e.out)-flow->get(e.out)); |
1474 //return ((*capacity)[e]-(*flow)[e]); |
1386 //return ((*capacity)[e]-(*flow)[e]); |
1475 return true; |
1387 return true; |
2005 |
1917 |
2006 |
1918 |
2007 |
1919 |
2008 /// For blocking flows. |
1920 /// For blocking flows. |
2009 |
1921 |
2010 /// This graph wrapper is used for Dinits blocking flow computations. |
1922 /// This graph wrapper is used for on-the-fly |
|
1923 /// Dinits blocking flow computations. |
2011 /// For each node, an out-edge is stored which is used when the |
1924 /// For each node, an out-edge is stored which is used when the |
2012 /// \code |
1925 /// \code |
2013 /// OutEdgeIt& first(OutEdgeIt&, const Node&) |
1926 /// OutEdgeIt& first(OutEdgeIt&, const Node&) |
2014 /// \endcode |
1927 /// \endcode |
2015 /// is called. |
1928 /// is called. |
2016 /// |
1929 /// |
2017 ///\author Marton Makai |
1930 /// \author Marton Makai |
2018 template<typename Graph, typename FirstOutEdgesMap> |
1931 template<typename Graph, typename FirstOutEdgesMap> |
2019 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> { |
1932 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> { |
2020 public: |
1933 public: |
2021 typedef GraphWrapper<Graph> Parent; |
1934 typedef GraphWrapper<Graph> Parent; |
2022 protected: |
1935 protected: |
2025 ErasingFirstGraphWrapper(Graph& _graph, |
1938 ErasingFirstGraphWrapper(Graph& _graph, |
2026 FirstOutEdgesMap& _first_out_edges) : |
1939 FirstOutEdgesMap& _first_out_edges) : |
2027 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { } |
1940 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { } |
2028 |
1941 |
2029 typedef typename GraphWrapper<Graph>::Node Node; |
1942 typedef typename GraphWrapper<Graph>::Node Node; |
2030 // class NodeIt { |
|
2031 // friend class GraphWrapper<Graph>; |
|
2032 // friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>; |
|
2033 // typename Graph::NodeIt n; |
|
2034 // public: |
|
2035 // NodeIt() { } |
|
2036 // NodeIt(const typename Graph::NodeIt& _n) : n(_n) { } |
|
2037 // NodeIt(const Invalid& i) : n(i) { } |
|
2038 // NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : |
|
2039 // n(*(_G.graph)) { } |
|
2040 // operator Node() const { return Node(typename Graph::Node(n)); } |
|
2041 // }; |
|
2042 typedef typename GraphWrapper<Graph>::Edge Edge; |
1943 typedef typename GraphWrapper<Graph>::Edge Edge; |
2043 class OutEdgeIt : public Edge { |
1944 class OutEdgeIt : public Edge { |
2044 friend class GraphWrapper<Graph>; |
1945 friend class GraphWrapper<Graph>; |
2045 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>; |
1946 friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>; |
2046 const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>* gw; |
1947 const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>* gw; |