src/work/jacint/max_flow_test.cc
author alpar
Thu, 22 Jul 2004 19:59:18 +0000
changeset 732 33cbc0635e92
parent 588 510cf257e6f2
child 757 8680351d0c28
permissions -rw-r--r--
Skeletons have been simplified.
"Optional features" have been deleted.
Map skeletons have been renamed.
jacint@588
     1
#include <iostream>
jacint@588
     2
jacint@715
     3
#include <hugo/list_graph.h>
jacint@715
     4
#include <hugo/dimacs.h>
jacint@588
     5
#include <max_flow.h>
jacint@715
     6
#include <max_flow_no_stack.h>
jacint@715
     7
#include <hugo/time_measure.h>
jacint@588
     8
jacint@588
     9
using namespace hugo;
jacint@588
    10
jacint@588
    11
int main(int, char **) {
jacint@588
    12
 
jacint@588
    13
  typedef ListGraph Graph;
jacint@588
    14
  
jacint@588
    15
  typedef Graph::Node Node;
jacint@588
    16
  typedef Graph::EdgeIt EdgeIt;
jacint@588
    17
jacint@588
    18
  Graph G;
jacint@588
    19
  Node s, t;
jacint@588
    20
  Graph::EdgeMap<int> cap(G);
jacint@588
    21
  readDimacs(std::cin, G, cap, s, t);
jacint@588
    22
  Timer ts;
jacint@588
    23
  
jacint@588
    24
  std::cout <<
jacint@588
    25
    "\n  Running max_flow.h on a graph with " << 
jacint@588
    26
    G.nodeNum() << " nodes and " << G.edgeNum() << " edges..."
jacint@588
    27
	   << std::endl<<std::endl;
jacint@588
    28
jacint@715
    29
  Graph::EdgeMap<int> flowstack(G,0);
jacint@715
    30
  MaxFlow<Graph, int> max_flow_test(G, s, t, cap, flowstack);
jacint@588
    31
  ts.reset();
jacint@588
    32
  max_flow_test.run();
jacint@715
    33
  std::cout << "Elapsed time of run() with stl stack: " << std::endl 
jacint@715
    34
	    <<ts << std::endl;
jacint@715
    35
jacint@715
    36
  Graph::EdgeMap<int> flow(G,0);
jacint@715
    37
  MaxFlowNoStack<Graph, int> max_flow_test_no_stack(G, s, t, cap, flow);
jacint@715
    38
  ts.reset();
jacint@715
    39
  max_flow_test_no_stack.run();
jacint@715
    40
  std::cout << "Elapsed time of run() without stack: " << std::endl 
jacint@588
    41
	    <<ts << std::endl;
jacint@588
    42
  
jacint@588
    43
  Graph::NodeMap<bool> mincut(G);
jacint@715
    44
  max_flow_test_no_stack.minMinCut(mincut); 
jacint@588
    45
  int min_min_cut_value=0;
jacint@588
    46
  EdgeIt e;
jacint@588
    47
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
    48
    if (mincut[G.tail(e)] && !mincut[G.head(e)]) min_min_cut_value+=cap[e];
jacint@588
    49
  }
jacint@588
    50
jacint@588
    51
  Graph::NodeMap<bool> cut(G);
jacint@715
    52
  max_flow_test_no_stack.minCut(cut); 
jacint@588
    53
  int min_cut_value=0;
jacint@588
    54
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
    55
    if (cut[G.tail(e)] && !cut[G.head(e)]) 
jacint@588
    56
      min_cut_value+=cap[e];
jacint@588
    57
  }
jacint@588
    58
jacint@588
    59
  Graph::NodeMap<bool> maxcut(G);
jacint@715
    60
  max_flow_test_no_stack.maxMinCut(maxcut); 
jacint@588
    61
  int max_min_cut_value=0;
jacint@588
    62
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
    63
    if (maxcut[G.tail(e)] && !maxcut[G.head(e)]) 
jacint@588
    64
      max_min_cut_value+=cap[e];
jacint@588
    65
      }
jacint@588
    66
jacint@715
    67
  std::cout << "\n Checking the result without stack: " <<std::endl;  
jacint@715
    68
  std::cout << "Flow value: "<< max_flow_test_no_stack.flowValue() << std::endl;
jacint@588
    69
  std::cout << "Min cut value: "<< min_cut_value << std::endl;
jacint@588
    70
  std::cout << "Min min cut value: "<< min_min_cut_value << std::endl;
jacint@588
    71
  std::cout << "Max min cut value: "<< max_min_cut_value << 
jacint@588
    72
    std::endl;
jacint@588
    73
jacint@715
    74
  if ( max_flow_test_no_stack.flowValue() == min_cut_value &&
jacint@588
    75
       min_cut_value == min_min_cut_value &&
jacint@588
    76
       min_min_cut_value == max_min_cut_value )
jacint@588
    77
    std::cout << "They are equal! " <<std::endl<< std::endl<<"\n";  
jacint@588
    78
jacint@715
    79
  /*
jacint@588
    80
jacint@588
    81
  Graph::EdgeMap<int> flow2(G,0);
jacint@588
    82
  std::cout << "Calling resetFlow() " << std::endl 
jacint@588
    83
	    << ts << std::endl;
jacint@588
    84
  max_flow_test.resetFlow(flow2);  
jacint@588
    85
  ts.reset();
jacint@588
    86
  max_flow_test.preflow(max_flow_test.PRE_FLOW);
jacint@588
    87
  std::cout << "Elapsed time of preflow(PRE_FLOW) starting from the zero flow: " << std::endl 
jacint@588
    88
	    << ts << std::endl;
jacint@588
    89
  
jacint@588
    90
  Graph::NodeMap<bool> mincut2(G);
jacint@588
    91
  max_flow_test.minMinCut(mincut2); 
jacint@588
    92
  int min_min_cut_value2=0;
jacint@588
    93
    for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
    94
    if (mincut2[G.tail(e)] && !mincut2[G.head(e)]) min_min_cut_value2+=cap[e];
jacint@588
    95
  }
jacint@588
    96
jacint@588
    97
  Graph::NodeMap<bool> cut2(G);
jacint@588
    98
  max_flow_test.minCut(cut2); 
jacint@588
    99
  int min_cut_value2=0;
jacint@588
   100
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
   101
    if (cut2[G.tail(e)] && !cut2[G.head(e)]) 
jacint@588
   102
      min_cut_value2+=cap[e];
jacint@588
   103
  }
jacint@588
   104
jacint@588
   105
  Graph::NodeMap<bool> maxcut2(G);
jacint@588
   106
  max_flow_test.maxMinCut(maxcut2); 
jacint@588
   107
  int max_min_cut_value2=0;
jacint@588
   108
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
   109
    if (maxcut2[G.tail(e)] && !maxcut2[G.head(e)]) 
jacint@588
   110
      max_min_cut_value2+=cap[e];
jacint@588
   111
      }
jacint@588
   112
  
jacint@588
   113
  std::cout << "\n Checking the result: " <<std::endl;  
jacint@588
   114
  std::cout << "Flow value: "<< max_flow_test.flowValue() << std::endl;
jacint@588
   115
  std::cout << "Min cut value: "<< min_cut_value2 << std::endl;
jacint@588
   116
  std::cout << "Min min cut value: "<< min_min_cut_value2 << std::endl;
jacint@588
   117
  std::cout << "Max min cut value: "<< max_min_cut_value2 << 
jacint@588
   118
    std::endl;  
jacint@588
   119
  if ( max_flow_test.flowValue() == min_cut_value &&
jacint@588
   120
       min_cut_value == min_min_cut_value &&
jacint@588
   121
       min_min_cut_value == max_min_cut_value )
jacint@588
   122
    std::cout << "They are equal! " <<std::endl;  
jacint@588
   123
jacint@588
   124
jacint@588
   125
  MaxFlow<Graph, int> max_flow_test3(G, s, t, cap, flow2);
jacint@588
   126
  max_flow_test3.run(max_flow_test3.GEN_FLOW);
jacint@588
   127
  std::cout << "Calling run(GEN_FLOW) from the max flow found before. " <<std::endl;  
jacint@588
   128
  
jacint@588
   129
  Graph::NodeMap<bool> mincut3(G);
jacint@588
   130
  max_flow_test3.minMinCut(mincut3); 
jacint@588
   131
  int min_min_cut_value3=0;
jacint@588
   132
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
   133
    if (mincut3[G.tail(e)] && !mincut3[G.head(e)]) min_min_cut_value3+=cap[e];
jacint@588
   134
  }
jacint@588
   135
jacint@588
   136
  Graph::NodeMap<bool> cut3(G);
jacint@588
   137
  max_flow_test3.minCut(cut3); 
jacint@588
   138
  int min_cut_value3=0;
jacint@588
   139
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
   140
    if (cut3[G.tail(e)] && !cut3[G.head(e)]) 
jacint@588
   141
      min_cut_value3+=cap[e];
jacint@588
   142
  }
jacint@588
   143
jacint@588
   144
  Graph::NodeMap<bool> maxcut3(G);
jacint@588
   145
  max_flow_test3.maxMinCut(maxcut3); 
jacint@588
   146
  int max_min_cut_value3=0;
jacint@588
   147
  for(G.first(e); G.valid(e); G.next(e)) {
jacint@588
   148
    if (maxcut3[G.tail(e)] && !maxcut3[G.head(e)]) 
jacint@588
   149
      max_min_cut_value3+=cap[e];
jacint@588
   150
  }
jacint@588
   151
jacint@588
   152
  std::cout << "\n Checking the result: " <<std::endl;  
jacint@588
   153
  std::cout << "Flow value: "<< max_flow_test3.flowValue() << std::endl;
jacint@588
   154
  std::cout << "Min cut value: "<< min_cut_value3 << std::endl;
jacint@588
   155
  std::cout << "Min min cut value: "<< min_min_cut_value3 << std::endl;
jacint@588
   156
  std::cout << "Max min cut value: "<< max_min_cut_value3 << 
jacint@588
   157
    std::endl;
jacint@588
   158
jacint@588
   159
  if ( max_flow_test3.flowValue() == min_cut_value3 &&
jacint@588
   160
       min_cut_value3 == min_min_cut_value3 &&
jacint@588
   161
       min_min_cut_value3 == max_min_cut_value3 )
jacint@588
   162
    std::cout << "They are equal! " <<std::endl<< std::endl<<"\n";  
jacint@715
   163
  */
jacint@588
   164
  
jacint@588
   165
  return 0;
jacint@588
   166
}