|
1 // -*- c++ -*- |
|
2 #include <iostream> |
|
3 #include <fstream> |
|
4 |
|
5 #include <list_graph.h> |
|
6 #include <smart_graph.h> |
|
7 #include <dimacs.h> |
|
8 #include <edmonds_karp.h> |
|
9 #include <time_measure.h> |
|
10 #include <graph_wrapper.h> |
|
11 |
|
12 using namespace hugo; |
|
13 |
|
14 // Use a DIMACS max flow file as stdin. |
|
15 // read_dimacs_demo < dimacs_max_flow_file |
|
16 |
|
17 int main(int, char **) { |
|
18 |
|
19 typedef ListGraph MutableGraph; |
|
20 //typedef SmartGraph Graph; |
|
21 typedef ListGraph Graph; |
|
22 typedef Graph::Node Node; |
|
23 typedef Graph::EdgeIt EdgeIt; |
|
24 |
|
25 Graph G; |
|
26 Node s, t; |
|
27 Graph::EdgeMap<int> cap(G); |
|
28 readDimacsMaxFlow(std::cin, G, s, t, cap); |
|
29 |
|
30 { |
|
31 typedef TrivGraphWrapper<const Graph> GW; |
|
32 GW gw(G); |
|
33 typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW; |
|
34 EMW cw(cap); |
|
35 Timer ts; |
|
36 GW::EdgeMap<int> flow(gw); |
|
37 MaxFlow<GW, int, GW::EdgeMap<int>, EMW > max_flow_test(gw, s, t, flow, cw); |
|
38 int i; |
|
39 |
|
40 { |
|
41 std::cout << "edmonds karp demo (physical blocking flow augmentation)..." << std::endl; |
|
42 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
43 ts.reset(); |
|
44 |
|
45 i=0; |
|
46 while (max_flow_test.augmentOnBlockingFlow<MutableGraph>()) { ++i; } |
|
47 |
|
48 std::cout << "elapsed time: " << ts << std::endl; |
|
49 std::cout << "number of augmentation phases: " << i << std::endl; |
|
50 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
51 } |
|
52 |
|
53 { |
|
54 std::cout << "edmonds karp demo (physical blocking flow 1 augmentation)..." << std::endl; |
|
55 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
56 ts.reset(); |
|
57 |
|
58 i=0; |
|
59 while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) { ++i; } |
|
60 |
|
61 std::cout << "elapsed time: " << ts << std::endl; |
|
62 std::cout << "number of augmentation phases: " << i << std::endl; |
|
63 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
64 } |
|
65 |
|
66 { |
|
67 std::cout << "edmonds karp demo (on-the-fly blocking flow augmentation)..." << std::endl; |
|
68 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
69 ts.reset(); |
|
70 |
|
71 i=0; |
|
72 while (max_flow_test.augmentOnBlockingFlow2()) { ++i; } |
|
73 |
|
74 std::cout << "elapsed time: " << ts << std::endl; |
|
75 std::cout << "number of augmentation phases: " << i << std::endl; |
|
76 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
77 } |
|
78 |
|
79 { |
|
80 std::cout << "edmonds karp demo (on-the-fly shortest path augmentation)..." << std::endl; |
|
81 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
82 ts.reset(); |
|
83 |
|
84 i=0; |
|
85 while (max_flow_test.augmentOnShortestPath()) { ++i; } |
|
86 |
|
87 std::cout << "elapsed time: " << ts << std::endl; |
|
88 std::cout << "number of augmentation phases: " << i << std::endl; |
|
89 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
90 } |
|
91 } |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 { |
|
97 typedef TrivGraphWrapper<const Graph> GW1; |
|
98 GW1 gw1(G); |
|
99 typedef TrivGraphWrapper<const GW1> GW2; |
|
100 GW2 gw2(gw1); |
|
101 typedef TrivGraphWrapper<const GW2> GW3; |
|
102 GW3 gw3(gw2); |
|
103 typedef TrivGraphWrapper<const GW3> GW4; |
|
104 GW4 gw4(gw3); |
|
105 typedef TrivGraphWrapper<const GW4> GW5; |
|
106 GW5 gw5(gw4); |
|
107 typedef TrivGraphWrapper<const GW5> GW6; |
|
108 GW6 gw6(gw5); |
|
109 typedef TrivGraphWrapper<const GW6> GW7; |
|
110 GW7 gw7(gw6); |
|
111 typedef TrivGraphWrapper<const GW7> GW8; |
|
112 GW8 gw8(gw7); |
|
113 typedef TrivGraphWrapper<const GW8> GW9; |
|
114 GW9 gw9(gw8); |
|
115 typedef TrivGraphWrapper<const GW9> GW; |
|
116 GW gw(gw9); |
|
117 typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW; |
|
118 EMW cw(cap); |
|
119 Timer ts; |
|
120 GW::EdgeMap<int> flow(gw); |
|
121 MaxFlow<GW, int, GW::EdgeMap<int>, EMW > max_flow_test(gw, s, t, flow, cw); |
|
122 int i; |
|
123 |
|
124 { |
|
125 std::cout << "edmonds karp demo (physical blocking flow augmentation)..." << std::endl; |
|
126 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
127 ts.reset(); |
|
128 |
|
129 i=0; |
|
130 while (max_flow_test.augmentOnBlockingFlow<MutableGraph>()) { ++i; } |
|
131 |
|
132 std::cout << "elapsed time: " << ts << std::endl; |
|
133 std::cout << "number of augmentation phases: " << i << std::endl; |
|
134 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
135 } |
|
136 |
|
137 { |
|
138 std::cout << "edmonds karp demo (physical blocking flow 1 augmentation)..." << std::endl; |
|
139 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
140 ts.reset(); |
|
141 |
|
142 i=0; |
|
143 while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) { ++i; } |
|
144 |
|
145 std::cout << "elapsed time: " << ts << std::endl; |
|
146 std::cout << "number of augmentation phases: " << i << std::endl; |
|
147 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
148 } |
|
149 |
|
150 { |
|
151 std::cout << "edmonds karp demo (on-the-fly blocking flow augmentation)..." << std::endl; |
|
152 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
153 ts.reset(); |
|
154 |
|
155 i=0; |
|
156 while (max_flow_test.augmentOnBlockingFlow2()) { ++i; } |
|
157 |
|
158 std::cout << "elapsed time: " << ts << std::endl; |
|
159 std::cout << "number of augmentation phases: " << i << std::endl; |
|
160 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
161 } |
|
162 |
|
163 { |
|
164 std::cout << "edmonds karp demo (on-the-fly shortest path augmentation)..." << std::endl; |
|
165 for (GW::EdgeIt e(gw); gw.valid(e); gw.next(e)) flow.set(e, 0); |
|
166 ts.reset(); |
|
167 |
|
168 i=0; |
|
169 while (max_flow_test.augmentOnShortestPath()) { ++i; } |
|
170 |
|
171 std::cout << "elapsed time: " << ts << std::endl; |
|
172 std::cout << "number of augmentation phases: " << i << std::endl; |
|
173 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; |
|
174 } |
|
175 } |
|
176 |
|
177 |
|
178 return 0; |
|
179 } |