src/work/jacint/max_flow_test.cc
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
parent 715 665689d86225
child 921 818510fa3d99
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
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;
alpar@757
    84
  max_flow_test.setFlow(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
}