3 #include <smart_graph.h>
 
     6 #include <time_measure.h>
 
    10 int main(int, char **) {
 
    12   typedef SmartGraph Graph;
 
    14   typedef Graph::Node Node;
 
    15   typedef Graph::EdgeIt EdgeIt;
 
    19   Graph::EdgeMap<int> cap(G);
 
    20   readDimacsMaxFlow(std::cin, G, s, t, cap);
 
    25     "\n  Testing preflow.h on a graph with " << 
 
    26     G.nodeNum() << " nodes and " << G.edgeNum() << " edges..."
 
    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;
 
    35   std::cout << "Elapsed time: " << ts << std::endl;
 
    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); 
 
    43   Graph::NodeMap<bool> maxcut(G);
 
    44   preflow_test.maxMinCut(maxcut); 
 
    45   int max_min_cut_value=0;
 
    47   for(G.first(e); G.valid(e); G.next(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;
 
    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 << 
 
    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;  
 
    66     std::cout << "ERROR! They are not equal! " <<std::endl;  
 
    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;
 
    75   preflow_test2.preflow(preflow_test2.GEN_FLOW);
 
    76   std::cout << "Elapsed time: " << ts << std::endl;
 
    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); 
 
    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)) {
 
    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;
 
    94   std::cout << "\nThe given flow value is "
 
    95 	    << preflow_test2.flowValue();
 
    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." 
 
   103     std::cout << "ERROR! It is not equal to all three min cut values! " 
 
   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;
 
   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;
 
   122   preflow_test3.preflowPhase1();
 
   123   std::cout << "Elapsed time: " << ts << std::endl;
 
   125   int act_min_cut3_value=0;
 
   127   Graph::NodeMap<bool> mincut3(G);
 
   128   preflow_test.minMinCut(mincut3); 
 
   129   int min_min_cut3_value=0;
 
   131   Graph::NodeMap<bool> cut3(G);
 
   132   preflow_test.minCut(cut3); 
 
   133   int min_cut3_value=0;
 
   135   Graph::NodeMap<bool> maxcut3(G);
 
   136   preflow_test.maxMinCut(maxcut3); 
 
   137   int max_min_cut3_value=0;
 
   139   for(G.first(e); G.valid(e); G.next(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;
 
   147  std::cout << "\nThe min cut value given by actMinCut() after phase 0 is "<<
 
   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 ) {
 
   155       ", which is equal to the given flow value and to all three min cut values after phase 1." 
 
   160       "ERROR! It is not equal to the given flow value and to all three min cut values after phase 1! " 
 
   169   Graph::EdgeMap<int> flow4(G,0);
 
   170   Preflow<Graph, int> preflow_test4(G, s, t, cap, flow4);
 
   172     "\n\nCalling preflow(PREFLOW) with the constant 0 flow, the result is f..."
 
   174   preflow_test4.preflow(preflow_test4.PREFLOW);
 
   176   std::cout << "Swapping the source and the target, "<<std::endl;
 
   177   std::cout << "by calling resetSource(t) and resetTarget(s)..."
 
   179   preflow_test4.resetSource(t);
 
   180   preflow_test4.resetTarget(s);
 
   183     "Calling preflow(PREFLOW) to find a maximum t-s flow starting with flow f..."
 
   185   preflow_test4.preflow(preflow_test4.PREFLOW);
 
   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)) {
 
   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;
 
   203   std::cout << "\nThe given flow value is "
 
   204 	    << preflow_test4.flowValue();
 
   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." 
 
   212     std::cout << "ERROR! It is not equal to all three min cut values! " 
 
   220   Graph::EdgeMap<int> flow5(G,0);
 
   221   std::cout << "Resetting the stored flow to constant zero, by calling resetFlow..."
 
   223   preflow_test4.resetFlow(flow5);
 
   225     "Calling preflow(GEN_FLOW) to find a maximum t-s flow "<<std::endl;
 
   227     "starting with this constant zero flow..." <<std::endl;
 
   228   preflow_test4.preflow(preflow_test4.GEN_FLOW);
 
   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)) {
 
   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;
 
   246   std::cout << "\nThe given flow value is "
 
   247 	    << preflow_test4.flowValue();
 
   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;  
 
   255     std::cout << "ERROR! It is not equal to all three min cut values! " 
 
   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;