| [451] | 1 | #include <iostream> | 
|---|
 | 2 |  | 
|---|
 | 3 | #include <smart_graph.h> | 
|---|
 | 4 | #include <dimacs.h> | 
|---|
 | 5 | #include <preflow.h> | 
|---|
 | 6 | #include <time_measure.h> | 
|---|
 | 7 |  | 
|---|
 | 8 | using namespace hugo; | 
|---|
 | 9 |  | 
|---|
 | 10 | int main(int, char **) { | 
|---|
 | 11 |   | 
|---|
 | 12 |   typedef SmartGraph Graph; | 
|---|
 | 13 |    | 
|---|
 | 14 |   typedef Graph::Node Node; | 
|---|
 | 15 |   typedef Graph::EdgeIt EdgeIt; | 
|---|
 | 16 |  | 
|---|
 | 17 |   Graph G; | 
|---|
 | 18 |   Node s, t; | 
|---|
 | 19 |   Graph::EdgeMap<int> cap(G); | 
|---|
 | 20 |   readDimacsMaxFlow(std::cin, G, s, t, cap); | 
|---|
 | 21 |   Timer ts; | 
|---|
| [470] | 22 |   bool error=false; | 
|---|
| [451] | 23 |    | 
|---|
 | 24 |   std::cout << | 
|---|
 | 25 |     "\n  Testing preflow.h on a graph with " <<  | 
|---|
 | 26 |     G.nodeNum() << " nodes and " << G.edgeNum() << " edges..." | 
|---|
 | 27 |            << std::endl; | 
|---|
 | 28 |  | 
|---|
 | 29 |  | 
|---|
 | 30 |   Graph::EdgeMap<int> flow(G,0); | 
|---|
 | 31 |   Preflow<Graph, int> preflow_test(G, s, t, cap, flow); | 
|---|
 | 32 |   std::cout << "\nCalling run() (flow must be constant zero)..."<<std::endl; | 
|---|
 | 33 |   ts.reset(); | 
|---|
 | 34 |   preflow_test.run(); | 
|---|
 | 35 |   std::cout << "Elapsed time: " << ts << std::endl; | 
|---|
 | 36 |  | 
|---|
 | 37 |   Graph::NodeMap<bool> mincut(G); | 
|---|
 | 38 |   preflow_test.minMinCut(mincut);  | 
|---|
 | 39 |   int min_min_cut_value=0; | 
|---|
 | 40 |   Graph::NodeMap<bool> cut(G); | 
|---|
 | 41 |   preflow_test.minCut(cut);  | 
|---|
 | 42 |   int min_cut_value=0; | 
|---|
 | 43 |   Graph::NodeMap<bool> maxcut(G); | 
|---|
 | 44 |   preflow_test.maxMinCut(maxcut);  | 
|---|
 | 45 |   int max_min_cut_value=0; | 
|---|
 | 46 |   EdgeIt e; | 
|---|
 | 47 |   for(G.first(e); G.valid(e); G.next(e)) { | 
|---|
 | 48 |     int c=cap[e]; | 
|---|
 | 49 |     if (mincut[G.tail(e)] && !mincut[G.head(e)]) min_min_cut_value+=c; | 
|---|
 | 50 |     if (cut[G.tail(e)] && !cut[G.head(e)]) min_cut_value+=c;  | 
|---|
 | 51 |     if (maxcut[G.tail(e)] && !maxcut[G.head(e)]) max_min_cut_value+=c; | 
|---|
 | 52 |   } | 
|---|
 | 53 |  | 
|---|
 | 54 |   std::cout << "\nChecking the result: " <<std::endl;   | 
|---|
 | 55 |   std::cout << "Flow value: "<< preflow_test.flowValue() << std::endl; | 
|---|
 | 56 |   std::cout << "Min cut value: "<< min_cut_value << std::endl; | 
|---|
 | 57 |   std::cout << "Min min cut value: "<< min_min_cut_value << std::endl; | 
|---|
 | 58 |   std::cout << "Max min cut value: "<< max_min_cut_value <<  | 
|---|
 | 59 |     std::endl; | 
|---|
 | 60 |  | 
|---|
 | 61 |   if ( preflow_test.flowValue() == min_cut_value && | 
|---|
 | 62 |        min_cut_value == min_min_cut_value && | 
|---|
 | 63 |        min_min_cut_value == max_min_cut_value ) | 
|---|
 | 64 |     std::cout << "They are equal. " <<std::endl;   | 
|---|
| [470] | 65 |   else { | 
|---|
 | 66 |     std::cout << "ERROR! They are not equal! " <<std::endl;   | 
|---|
 | 67 |     error=true; | 
|---|
 | 68 |   } | 
|---|
| [451] | 69 |  | 
|---|
 | 70 |  | 
|---|
 | 71 |  | 
|---|
 | 72 |   Preflow<Graph, int> preflow_test2(G, s, t, cap, flow); | 
|---|
 | 73 |   std::cout << "\n\nCalling preflow(GEN_FLOW) with the given maximum flow..."<<std::endl; | 
|---|
 | 74 |   ts.reset(); | 
|---|
 | 75 |   preflow_test2.preflow(preflow_test2.GEN_FLOW); | 
|---|
 | 76 |   std::cout << "Elapsed time: " << ts << std::endl; | 
|---|
 | 77 |  | 
|---|
 | 78 |   Graph::NodeMap<bool> mincut2(G); | 
|---|
 | 79 |   preflow_test.minMinCut(mincut2);  | 
|---|
 | 80 |   int min_min_cut2_value=0; | 
|---|
 | 81 |   Graph::NodeMap<bool> cut2(G); | 
|---|
 | 82 |   preflow_test.minCut(cut2);  | 
|---|
 | 83 |   int min_cut2_value=0; | 
|---|
 | 84 |   Graph::NodeMap<bool> maxcut2(G); | 
|---|
 | 85 |   preflow_test.maxMinCut(maxcut2);  | 
|---|
 | 86 |   int max_min_cut2_value=0; | 
|---|
 | 87 |   for(G.first(e); G.valid(e); G.next(e)) { | 
|---|
 | 88 |     int c=cap[e]; | 
|---|
 | 89 |     if (mincut2[G.tail(e)] && !mincut2[G.head(e)]) min_min_cut2_value+=c; | 
|---|
 | 90 |     if (cut2[G.tail(e)] && !cut2[G.head(e)]) min_cut2_value+=c;  | 
|---|
 | 91 |     if (maxcut2[G.tail(e)] && !maxcut2[G.head(e)]) max_min_cut2_value+=c; | 
|---|
 | 92 |   } | 
|---|
 | 93 |  | 
|---|
 | 94 |   std::cout << "\nThe given flow value is " | 
|---|
 | 95 |             << preflow_test2.flowValue(); | 
|---|
 | 96 |  | 
|---|
 | 97 |   if ( preflow_test2.flowValue() == min_cut2_value && | 
|---|
 | 98 |        min_cut2_value == min_min_cut2_value && | 
|---|
 | 99 |        min_min_cut2_value == max_min_cut2_value ) | 
|---|
 | 100 |     std::cout <<", which is equal to all three min cut values."  | 
|---|
 | 101 |               <<std::endl;   | 
|---|
| [470] | 102 |   else { | 
|---|
 | 103 |     std::cout << "ERROR! It is not equal to all three min cut values! "  | 
|---|
 | 104 |               <<std::endl;   | 
|---|
 | 105 |     error=true; | 
|---|
 | 106 |   } | 
|---|
 | 107 |    | 
|---|
| [451] | 108 |  | 
|---|
 | 109 |  | 
|---|
 | 110 |  | 
|---|
 | 111 |   Graph::EdgeMap<int> flow3(G,0); | 
|---|
 | 112 |   Preflow<Graph, int> preflow_test3(G, s, t, cap, flow3); | 
|---|
 | 113 |   std::cout << "\n\nCalling preflowPhase0(PREFLOW) on the constant zero flow..."<<std::endl; | 
|---|
 | 114 |   ts.reset(); | 
|---|
 | 115 |   preflow_test3.preflowPhase0(preflow_test3.PREFLOW); | 
|---|
 | 116 |   std::cout << "Elapsed time: " << ts << std::endl; | 
|---|
 | 117 |   Graph::NodeMap<bool> actcut3(G); | 
|---|
 | 118 |   std::cout << "\nCalling actMinCut()..."<<std::endl; | 
|---|
 | 119 |   preflow_test3.actMinCut(actcut3);  | 
|---|
 | 120 |   std::cout << "Calling preflowPhase1() on the given flow..."<<std::endl; | 
|---|
 | 121 |   ts.reset(); | 
|---|
 | 122 |   preflow_test3.preflowPhase1(); | 
|---|
 | 123 |   std::cout << "Elapsed time: " << ts << std::endl; | 
|---|
 | 124 |    | 
|---|
 | 125 |   int act_min_cut3_value=0; | 
|---|
 | 126 |    | 
|---|
 | 127 |   Graph::NodeMap<bool> mincut3(G); | 
|---|
 | 128 |   preflow_test.minMinCut(mincut3);  | 
|---|
 | 129 |   int min_min_cut3_value=0; | 
|---|
 | 130 |    | 
|---|
 | 131 |   Graph::NodeMap<bool> cut3(G); | 
|---|
 | 132 |   preflow_test.minCut(cut3);  | 
|---|
 | 133 |   int min_cut3_value=0; | 
|---|
 | 134 |    | 
|---|
 | 135 |   Graph::NodeMap<bool> maxcut3(G); | 
|---|
 | 136 |   preflow_test.maxMinCut(maxcut3);  | 
|---|
 | 137 |   int max_min_cut3_value=0; | 
|---|
 | 138 |    | 
|---|
 | 139 |   for(G.first(e); G.valid(e); G.next(e)) { | 
|---|
 | 140 |     int c=cap[e]; | 
|---|
 | 141 |     if (mincut3[G.tail(e)] && !mincut3[G.head(e)]) min_min_cut3_value+=c; | 
|---|
 | 142 |     if (cut3[G.tail(e)] && !cut3[G.head(e)]) min_cut3_value+=c;  | 
|---|
 | 143 |     if (maxcut3[G.tail(e)] && !maxcut3[G.head(e)]) max_min_cut3_value+=c; | 
|---|
 | 144 |     if (actcut3[G.tail(e)] && !actcut3[G.head(e)]) act_min_cut3_value+=c; | 
|---|
 | 145 |   } | 
|---|
 | 146 |  | 
|---|
 | 147 |  std::cout << "\nThe min cut value given by actMinCut() after phase 0 is "<< | 
|---|
 | 148 |    act_min_cut3_value; | 
|---|
 | 149 |  | 
|---|
 | 150 |   if ( preflow_test3.flowValue() == min_cut3_value && | 
|---|
 | 151 |        min_cut3_value == min_min_cut3_value && | 
|---|
 | 152 |        min_min_cut3_value == max_min_cut3_value && | 
|---|
 | 153 |        max_min_cut3_value == act_min_cut3_value ) { | 
|---|
 | 154 |     std::cout <<  | 
|---|
 | 155 |       ", which is equal to the given flow value and to all three min cut values after phase 1."  | 
|---|
 | 156 |               <<std::endl;   | 
|---|
 | 157 |   } | 
|---|
| [470] | 158 |   else { | 
|---|
 | 159 |     std::cout <<  | 
|---|
 | 160 |       "ERROR! It is not equal to the given flow value and to all three min cut values after phase 1! "  | 
|---|
 | 161 |               <<std::endl;   | 
|---|
 | 162 |     error=true; | 
|---|
 | 163 |   } | 
|---|
 | 164 |    | 
|---|
| [451] | 165 |  | 
|---|
 | 166 |  | 
|---|
 | 167 |  | 
|---|
 | 168 |  | 
|---|
 | 169 |   Graph::EdgeMap<int> flow4(G,0); | 
|---|
 | 170 |   Preflow<Graph, int> preflow_test4(G, s, t, cap, flow4); | 
|---|
 | 171 |   std::cout <<  | 
|---|
 | 172 |     "\n\nCalling preflow(PREFLOW) with the constant 0 flow, the result is f..." | 
|---|
 | 173 |             <<std::endl; | 
|---|
 | 174 |   preflow_test4.preflow(preflow_test4.PREFLOW); | 
|---|
 | 175 |  | 
|---|
 | 176 |   std::cout << "Swapping the source and the target, "<<std::endl; | 
|---|
 | 177 |   std::cout << "by calling resetSource(t) and resetTarget(s)..." | 
|---|
 | 178 |             <<std::endl; | 
|---|
 | 179 |   preflow_test4.resetSource(t); | 
|---|
 | 180 |   preflow_test4.resetTarget(s); | 
|---|
 | 181 |  | 
|---|
 | 182 |   std::cout <<  | 
|---|
 | 183 |     "Calling preflow(PREFLOW) to find a maximum t-s flow starting with flow f..." | 
|---|
 | 184 |             <<std::endl; | 
|---|
 | 185 |   preflow_test4.preflow(preflow_test4.PREFLOW); | 
|---|
 | 186 |  | 
|---|
 | 187 |   Graph::NodeMap<bool> mincut4(G); | 
|---|
 | 188 |   preflow_test4.minMinCut(mincut4);  | 
|---|
 | 189 |   int min_min_cut4_value=0; | 
|---|
 | 190 |   Graph::NodeMap<bool> cut4(G); | 
|---|
 | 191 |   preflow_test4.minCut(cut4);  | 
|---|
 | 192 |   int min_cut4_value=0; | 
|---|
 | 193 |   Graph::NodeMap<bool> maxcut4(G); | 
|---|
 | 194 |   preflow_test4.maxMinCut(maxcut4);  | 
|---|
 | 195 |   int max_min_cut4_value=0; | 
|---|
 | 196 |   for(G.first(e); G.valid(e); G.next(e)) { | 
|---|
 | 197 |     int c=cap[e]; | 
|---|
 | 198 |     if (mincut4[G.tail(e)] && !mincut4[G.head(e)]) min_min_cut4_value+=c; | 
|---|
 | 199 |     if (cut4[G.tail(e)] && !cut4[G.head(e)]) min_cut4_value+=c;  | 
|---|
 | 200 |     if (maxcut4[G.tail(e)] && !maxcut4[G.head(e)]) max_min_cut4_value+=c; | 
|---|
 | 201 |   } | 
|---|
 | 202 |  | 
|---|
 | 203 |   std::cout << "\nThe given flow value is " | 
|---|
 | 204 |             << preflow_test4.flowValue(); | 
|---|
 | 205 |    | 
|---|
 | 206 |   if ( preflow_test4.flowValue() == min_cut4_value && | 
|---|
 | 207 |        min_cut4_value == min_min_cut4_value && | 
|---|
 | 208 |        min_min_cut4_value == max_min_cut4_value ) | 
|---|
 | 209 |     std::cout <<", which is equal to all three min cut values."  | 
|---|
 | 210 |               <<std::endl;   | 
|---|
| [470] | 211 |   else { | 
|---|
 | 212 |     std::cout << "ERROR! It is not equal to all three min cut values! "  | 
|---|
 | 213 |               <<std::endl;   | 
|---|
 | 214 |     error=true; | 
|---|
 | 215 |   } | 
|---|
| [451] | 216 |  | 
|---|
 | 217 |  | 
|---|
 | 218 |  | 
|---|
 | 219 |  | 
|---|
 | 220 |   Graph::EdgeMap<int> flow5(G,0); | 
|---|
 | 221 |   std::cout << "Resetting the stored flow to constant zero, by calling resetFlow..." | 
|---|
 | 222 |             <<std::endl; | 
|---|
 | 223 |   preflow_test4.resetFlow(flow5); | 
|---|
 | 224 |   std::cout <<  | 
|---|
 | 225 |     "Calling preflow(GEN_FLOW) to find a maximum t-s flow "<<std::endl; | 
|---|
 | 226 |   std::cout <<  | 
|---|
 | 227 |     "starting with this constant zero flow..." <<std::endl; | 
|---|
 | 228 |   preflow_test4.preflow(preflow_test4.GEN_FLOW); | 
|---|
 | 229 |  | 
|---|
 | 230 |   Graph::NodeMap<bool> mincut5(G); | 
|---|
 | 231 |   preflow_test4.minMinCut(mincut5);  | 
|---|
 | 232 |   int min_min_cut5_value=0; | 
|---|
 | 233 |   Graph::NodeMap<bool> cut5(G); | 
|---|
 | 234 |   preflow_test4.minCut(cut5);  | 
|---|
 | 235 |   int min_cut5_value=0; | 
|---|
 | 236 |   Graph::NodeMap<bool> maxcut5(G); | 
|---|
 | 237 |   preflow_test4.maxMinCut(maxcut5);  | 
|---|
 | 238 |   int max_min_cut5_value=0; | 
|---|
 | 239 |   for(G.first(e); G.valid(e); G.next(e)) { | 
|---|
 | 240 |     int c=cap[e]; | 
|---|
 | 241 |     if (mincut5[G.tail(e)] && !mincut5[G.head(e)]) min_min_cut5_value+=c; | 
|---|
 | 242 |     if (cut5[G.tail(e)] && !cut5[G.head(e)]) min_cut5_value+=c;  | 
|---|
 | 243 |     if (maxcut5[G.tail(e)] && !maxcut5[G.head(e)]) max_min_cut5_value+=c; | 
|---|
 | 244 |   } | 
|---|
 | 245 |  | 
|---|
 | 246 |   std::cout << "\nThe given flow value is " | 
|---|
 | 247 |             << preflow_test4.flowValue(); | 
|---|
 | 248 |    | 
|---|
 | 249 |   if ( preflow_test4.flowValue() == min_cut5_value && | 
|---|
 | 250 |        min_cut5_value == min_min_cut5_value && | 
|---|
 | 251 |        min_min_cut5_value == max_min_cut5_value ) | 
|---|
 | 252 |     std::cout <<", which is equal to all three min cut values."  | 
|---|
 | 253 |               <<std::endl<<std::endl;   | 
|---|
| [470] | 254 |   else { | 
|---|
 | 255 |     std::cout << "ERROR! It is not equal to all three min cut values! "  | 
|---|
 | 256 |               <<std::endl;   | 
|---|
 | 257 |     error=true; | 
|---|
 | 258 |   } | 
|---|
 | 259 |    | 
|---|
 | 260 |   if (error) std::cout <<"\nThere was some error in the results!\n"<<std::endl;  | 
|---|
 | 261 |   else std::cout <<"\nThere was no error in the results.\n"<<std::endl;  | 
|---|
| [451] | 262 |  | 
|---|
 | 263 |   return 0; | 
|---|
 | 264 | } | 
|---|