|
1 // -*- c++ -*- |
|
2 #include <iostream> |
|
3 #include <fstream> |
|
4 |
|
5 #include <sage_graph.h> |
|
6 #include <hugo/smart_graph.h> |
|
7 #include <hugo/dimacs.h> |
|
8 //#include <hugo/time_measure.h> |
|
9 //#include <graph_wrapper.h> |
|
10 #include <hugo/max_flow.h> |
|
11 //#include <preflow_res.h> |
|
12 #include <for_each_macros.h> |
|
13 #include <graph_concept.h> |
|
14 |
|
15 using std::cout; |
|
16 using std::endl; |
|
17 |
|
18 using namespace hugo; |
|
19 |
|
20 // Use a DIMACS min cost flow file as stdin. |
|
21 // read_dimacs_demo < dimacs_max_flow_file |
|
22 |
|
23 int main(int, char **) { |
|
24 |
|
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; |
|
31 |
|
32 Graph g; |
|
33 |
|
34 Node s, t; |
|
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); |
|
39 // Timer ts; |
|
40 MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > |
|
41 max_flow_test(g, s, t, cap, flow); |
|
42 |
|
43 Graph::NodeMap<bool> cut(g); |
|
44 |
|
45 { |
|
46 Graph::EdgeIt e; |
|
47 for (g.first(e); g.valid(e); g.next(e)) |
|
48 cout << 1+g.id(g.tail(e)) << "->" << 1+g.id(g.head(e)) << " cap: " << cap[e] << " preflow: " << flow[e] << endl; |
|
49 } |
|
50 { |
|
51 Graph::NodeIt n; |
|
52 for (g.first(n); g.valid(n); g.next(n)) { |
|
53 int a=0; |
|
54 { |
|
55 Graph::InEdgeIt e; |
|
56 for (g.first(e, n); g.valid(e); g.next(e)) a+=flow[e]; |
|
57 } |
|
58 { |
|
59 Graph::OutEdgeIt e; |
|
60 for (g.first(e, n); g.valid(e); g.next(e)) a-=flow[e]; |
|
61 } |
|
62 cout << 1+g.id(n) << " excess: " << a << endl; |
|
63 } |
|
64 } |
|
65 |
|
66 |
|
67 { |
|
68 // std::cout << "preflow ..." << std::endl; |
|
69 // ts.reset(); |
|
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); |
|
75 |
|
76 Graph::EdgeIt e; |
|
77 for (g.first(e); g.valid(e); g.next(e)) { |
|
78 if (cut[g.tail(e)] && !cut[g.head(e)]) { |
|
79 cout << 1+g.id(g.tail(e)) << "->" << 1+g.id(g.head(e)) |
|
80 << "(forward edge) flow: " << flow[e] |
|
81 << " cap: " << cap[e]<< endl; |
|
82 if (flow[e]!=cap[e]) |
|
83 std::cout << "Slackness does not hold!" << std::endl; |
|
84 } |
|
85 if (!cut[g.tail(e)] && cut[g.head(e)]) { |
|
86 cout << 1+g.id(g.tail(e)) << "->" << 1+g.id(g.head(e)) |
|
87 << "(backward edge) flow: " << flow[e] << endl; |
|
88 if (flow[e]!=0) |
|
89 std::cout << "Slackness does not hold!" << std::endl; |
|
90 } |
|
91 } |
|
92 Graph::NodeIt n; |
|
93 for (g.first(n); g.valid(n); g.next(n)) { |
|
94 if (cut[n]) |
|
95 cout << "in cut: " << 1+g.id(n) << endl; |
|
96 } |
|
97 } |
|
98 |
|
99 // { |
|
100 // std::cout << "preflow ..." << std::endl; |
|
101 // ts.reset(); |
|
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); |
|
106 |
|
107 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
108 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
109 // std::cout << "Slackness does not hold!" << std::endl; |
|
110 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
111 // std::cout << "Slackness does not hold!" << std::endl; |
|
112 // } |
|
113 // } |
|
114 |
|
115 // { |
|
116 // std::cout << "preflow ..." << std::endl; |
|
117 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
118 // ts.reset(); |
|
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; |
|
122 |
|
123 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
124 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
125 // std::cout << "Slackness does not hold!" << std::endl; |
|
126 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
127 // std::cout << "Slackness does not hold!" << std::endl; |
|
128 // } |
|
129 // } |
|
130 |
|
131 // // { |
|
132 // // std::cout << "wrapped preflow ..." << std::endl; |
|
133 // // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
134 // // ts.reset(); |
|
135 // // pre_flow_res.run(); |
|
136 // // std::cout << "elapsed time: " << ts << std::endl; |
|
137 // // std::cout << "flow value: "<< pre_flow_test.flowValue() << std::endl; |
|
138 // // } |
|
139 |
|
140 // { |
|
141 // std::cout << "physical blocking flow augmentation ..." << std::endl; |
|
142 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
143 // ts.reset(); |
|
144 // int i=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; |
|
149 |
|
150 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
151 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
152 // std::cout << "Slackness does not hold!" << std::endl; |
|
153 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
154 // std::cout << "Slackness does not hold!" << std::endl; |
|
155 // } |
|
156 // } |
|
157 |
|
158 // // { |
|
159 // // std::cout << "faster physical blocking flow augmentation ..." << std::endl; |
|
160 // // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
161 // // ts.reset(); |
|
162 // // int i=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; |
|
167 // // } |
|
168 |
|
169 // { |
|
170 // std::cout << "on-the-fly blocking flow augmentation ..." << std::endl; |
|
171 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
172 // ts.reset(); |
|
173 // int i=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; |
|
178 |
|
179 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
180 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
181 // std::cout << "Slackness does not hold!" << std::endl; |
|
182 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
183 // std::cout << "Slackness does not hold!" << std::endl; |
|
184 // } |
|
185 // } |
|
186 |
|
187 // { |
|
188 // std::cout << "on-the-fly shortest path augmentation ..." << std::endl; |
|
189 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
190 // ts.reset(); |
|
191 // int i=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; |
|
196 |
|
197 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
198 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
199 // std::cout << "Slackness does not hold!" << std::endl; |
|
200 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
201 // std::cout << "Slackness does not hold!" << std::endl; |
|
202 // } |
|
203 // } |
|
204 |
|
205 // { |
|
206 // std::cout << "on-the-fly shortest path augmentation ..." << std::endl; |
|
207 // FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); |
|
208 // ts.reset(); |
|
209 // int i=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; |
|
214 |
|
215 // FOR_EACH_LOC(Graph::EdgeIt, e, g) { |
|
216 // if (cut[g.tail(e)] && !cut[g.head(e)] && !flow[e]==cap[e]) |
|
217 // std::cout << "Slackness does not hold!" << std::endl; |
|
218 // if (!cut[g.tail(e)] && cut[g.head(e)] && flow[e]>0) |
|
219 // std::cout << "Slackness does not hold!" << std::endl; |
|
220 // } |
|
221 // } |
|
222 |
|
223 return 0; |
|
224 } |