5 #include <sage_graph.h>
6 #include <lemon/smart_graph.h>
7 #include <lemon/dimacs.h>
8 //#include <lemon/time_measure.h>
9 //#include <graph_wrapper.h>
10 #include <lemon/max_flow.h>
11 //#include <preflow_res.h>
12 #include <for_each_macros.h>
13 #include <graph_concept.h>
18 using namespace lemon;
20 // Use a DIMACS min cost flow file as stdin.
21 // read_dimacs_demo < dimacs_max_flow_file
23 int main(int, char **) {
25 //typedef SageGraph MutableGraph;
26 //typedef FullFeatureGraphConcept Graph;
27 //typedef SmartGraph Graph;
28 typedef SageGraph Graph;
29 typedef Graph::Node Node;
30 typedef Graph::EdgeIt EdgeIt;
35 Graph::EdgeMap<int> cap(g);
36 Graph::EdgeMap<int> flow(g); //0 flow
37 //readDimacs(std::cin, g, cap, s, t);
38 readDimacs(std::cin, g, cap, s, t, flow);
40 MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> >
41 max_flow_test(g, s, t, cap, flow);
43 Graph::NodeMap<bool> cut(g);
47 for (g.first(e); g.valid(e); g.next(e))
48 cout << 1+g.id(g.source(e)) << "->" << 1+g.id(g.target(e)) << " cap: " << cap[e] << " preflow: " << flow[e] << endl;
52 for (g.first(n); g.valid(n); g.next(n)) {
56 for (g.first(e, n); g.valid(e); g.next(e)) a+=flow[e];
60 for (g.first(e, n); g.valid(e); g.next(e)) a-=flow[e];
62 cout << 1+g.id(n) << " excess: " << a << endl;
68 // std::cout << "preflow ..." << std::endl;
70 max_flow_test.preflowPhase1(MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> >::PRE_FLOW);
71 // std::cout << "elapsed time: " << ts << std::endl;
72 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
73 std::cout << "flow value 2: "<< max_flow_test.flowValue2() << std::endl;
74 max_flow_test.actMinCut(cut);
77 for (g.first(e); g.valid(e); g.next(e)) {
78 if (cut[g.source(e)] && !cut[g.target(e)]) {
79 cout << 1+g.id(g.source(e)) << "->" << 1+g.id(g.target(e))
80 << "(forward edge) flow: " << flow[e]
81 << " cap: " << cap[e]<< endl;
83 std::cout << "Slackness does not hold!" << std::endl;
85 if (!cut[g.source(e)] && cut[g.target(e)]) {
86 cout << 1+g.id(g.source(e)) << "->" << 1+g.id(g.target(e))
87 << "(backward edge) flow: " << flow[e] << endl;
89 std::cout << "Slackness does not hold!" << std::endl;
93 for (g.first(n); g.valid(n); g.next(n)) {
95 cout << "in cut: " << 1+g.id(n) << endl;
100 // std::cout << "preflow ..." << std::endl;
102 // max_flow_test.run();
103 // std::cout << "elapsed time: " << ts << std::endl;
104 // std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
105 // max_flow_test.actMinCut(cut);
107 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
108 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
109 // std::cout << "Slackness does not hold!" << std::endl;
110 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
111 // std::cout << "Slackness does not hold!" << std::endl;
116 // std::cout << "preflow ..." << std::endl;
117 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
119 // max_flow_test.preflow(MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> >::GEN_FLOW);
120 // std::cout << "elapsed time: " << ts << std::endl;
121 // std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
123 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
124 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
125 // std::cout << "Slackness does not hold!" << std::endl;
126 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
127 // std::cout << "Slackness does not hold!" << std::endl;
132 // // std::cout << "wrapped preflow ..." << std::endl;
133 // // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
135 // // pre_flow_res.run();
136 // // std::cout << "elapsed time: " << ts << std::endl;
137 // // std::cout << "flow value: "<< pre_flow_test.flowValue() << std::endl;
141 // std::cout << "physical blocking flow augmentation ..." << std::endl;
142 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
145 // while (augmenting_flow_test.augmentOnBlockingFlow<MutableGraph>()) { ++i; }
146 // std::cout << "elapsed time: " << ts << std::endl;
147 // std::cout << "number of augmentation phases: " << i << std::endl;
148 // std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl;
150 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
151 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
152 // std::cout << "Slackness does not hold!" << std::endl;
153 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
154 // std::cout << "Slackness does not hold!" << std::endl;
159 // // std::cout << "faster physical blocking flow augmentation ..." << std::endl;
160 // // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
163 // // while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) { ++i; }
164 // // std::cout << "elapsed time: " << ts << std::endl;
165 // // std::cout << "number of augmentation phases: " << i << std::endl;
166 // // std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
170 // std::cout << "on-the-fly blocking flow augmentation ..." << std::endl;
171 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
174 // while (augmenting_flow_test.augmentOnBlockingFlow2()) { ++i; }
175 // std::cout << "elapsed time: " << ts << std::endl;
176 // std::cout << "number of augmentation phases: " << i << std::endl;
177 // std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl;
179 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
180 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
181 // std::cout << "Slackness does not hold!" << std::endl;
182 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
183 // std::cout << "Slackness does not hold!" << std::endl;
188 // std::cout << "on-the-fly shortest path augmentation ..." << std::endl;
189 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
192 // while (augmenting_flow_test.augmentOnShortestPath()) { ++i; }
193 // std::cout << "elapsed time: " << ts << std::endl;
194 // std::cout << "number of augmentation phases: " << i << std::endl;
195 // std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl;
197 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
198 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
199 // std::cout << "Slackness does not hold!" << std::endl;
200 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
201 // std::cout << "Slackness does not hold!" << std::endl;
206 // std::cout << "on-the-fly shortest path augmentation ..." << std::endl;
207 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0);
210 // while (augmenting_flow_test.augmentOnShortestPath2()) { ++i; }
211 // std::cout << "elapsed time: " << ts << std::endl;
212 // std::cout << "number of augmentation phases: " << i << std::endl;
213 // std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl;
215 // FOR_EACH_LOC(Graph::EdgeIt, e, g) {
216 // if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e])
217 // std::cout << "Slackness does not hold!" << std::endl;
218 // if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0)
219 // std::cout << "Slackness does not hold!" << std::endl;