src/work/marci/edmonds_karp_demo.cc
author alpar
Wed, 14 Apr 2004 16:16:40 +0000
changeset 324 c8b0ad782bda
parent 311 6635b11938fe
child 330 7ac0d4e8a31c
permissions -rw-r--r--
Naming conventions...
marci@174
     1
// -*- c++ -*-
marci@73
     2
#include <iostream>
marci@73
     3
#include <fstream>
marci@73
     4
marci@174
     5
#include <list_graph.h>
marci@305
     6
#include <smart_graph.h>
marci@174
     7
#include <dimacs.h>
marci@174
     8
#include <edmonds_karp.h>
marci@73
     9
#include <time_measure.h>
marci@303
    10
//#include <graph_wrapper.h>
marci@311
    11
#include <preflow.h>
marci@266
    12
alpar@105
    13
using namespace hugo;
marci@73
    14
marci@73
    15
// Use a DIMACS max flow file as stdin.
marci@73
    16
// read_dimacs_demo < dimacs_max_flow_file
marci@139
    17
marci@174
    18
marci@174
    19
//   struct Ize {
marci@174
    20
//   };
marci@139
    21
  
marci@174
    22
//   struct Mize {
marci@174
    23
//     Ize bumm;
marci@174
    24
//   };
marci@139
    25
marci@174
    26
//   template <typename B>
marci@174
    27
//     class Huha {
marci@174
    28
//     public:
marci@174
    29
//       int u;
marci@174
    30
//       B brr;
marci@174
    31
//     };
marci@174
    32
marci@139
    33
marci@73
    34
int main(int, char **) {
marci@73
    35
marci@174
    36
  typedef ListGraph MutableGraph;
marci@139
    37
marci@317
    38
//  typedef SmartGraph Graph;
marci@317
    39
  typedef ListGraph Graph;
marci@174
    40
  typedef Graph::Node Node;
marci@174
    41
  typedef Graph::EdgeIt EdgeIt;
marci@139
    42
marci@139
    43
marci@174
    44
//   Mize mize[10];
marci@174
    45
//   Mize bize[0];
marci@174
    46
//   Mize zize;
marci@174
    47
//   typedef Mize Tize[0];
marci@146
    48
marci@174
    49
//   std::cout << &zize << " " << sizeof(mize) << sizeof(Tize) << std::endl;
marci@174
    50
//   std::cout << sizeof(bize) << std::endl;
marci@146
    51
marci@146
    52
marci@174
    53
//   Huha<Tize> k;
marci@174
    54
//   std::cout << sizeof(k) << std::endl;
marci@139
    55
marci@174
    56
marci@174
    57
//   struct Bumm {
marci@174
    58
//     //int a;
marci@174
    59
//     bool b;
marci@174
    60
//   };
marci@174
    61
marci@174
    62
//   std::cout << sizeof(Bumm) << std::endl;
marci@174
    63
marci@174
    64
marci@174
    65
  Graph G;
marci@174
    66
  Node s, t;
marci@174
    67
  Graph::EdgeMap<int> cap(G);
marci@73
    68
  readDimacsMaxFlow(std::cin, G, s, t, cap);
marci@155
    69
marci@311
    70
  {
marci@311
    71
    std::cout << "preflow ..." << std::endl;
marci@311
    72
    Graph::EdgeMap<int> flow(G); //0 flow
marci@311
    73
marci@311
    74
    Timer ts;
marci@311
    75
    ts.reset();
marci@311
    76
marci@311
    77
    Preflow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 
marci@311
    78
      max_flow_test(G, s, t, cap, flow);
marci@311
    79
    max_flow_test.run();
marci@311
    80
//    int i=0;
marci@311
    81
//    while (max_flow_test.augmentOnBlockingFlow<MutableGraph>()) { 
marci@311
    82
//     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
marci@311
    83
//       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@311
    84
//     }
marci@311
    85
//     std::cout<<std::endl;
marci@311
    86
//      ++i; 
marci@311
    87
//    }
marci@311
    88
marci@311
    89
//   std::cout << "maximum flow: "<< std::endl;
marci@311
    90
//   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
marci@311
    91
//     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@311
    92
//   }
marci@311
    93
//   std::cout<<std::endl;
marci@311
    94
    std::cout << "elapsed time: " << ts << std::endl;
marci@311
    95
//    std::cout << "number of augmentation phases: " << i << std::endl; 
marci@311
    96
    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
marci@311
    97
  }
marci@73
    98
marci@133
    99
  {
marci@311
   100
    std::cout << "physical blocking flow augmentation ..." << std::endl;
marci@303
   101
    Graph::EdgeMap<int> flow(G); //0 flow
marci@73
   102
marci@174
   103
    Timer ts;
marci@174
   104
    ts.reset();
marci@174
   105
marci@303
   106
    MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 
marci@303
   107
      max_flow_test(G, s, t, flow, cap);
marci@174
   108
    int i=0;
marci@174
   109
    while (max_flow_test.augmentOnBlockingFlow<MutableGraph>()) { 
marci@174
   110
//     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
marci@168
   111
//       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@168
   112
//     }
marci@168
   113
//     std::cout<<std::endl;
marci@174
   114
      ++i; 
marci@174
   115
    }
marci@168
   116
marci@174
   117
//   std::cout << "maximum flow: "<< std::endl;
marci@174
   118
//   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
marci@174
   119
//     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@174
   120
//   }
marci@174
   121
//   std::cout<<std::endl;
marci@174
   122
    std::cout << "elapsed time: " << ts << std::endl;
marci@174
   123
    std::cout << "number of augmentation phases: " << i << std::endl; 
marci@174
   124
    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
marci@168
   125
  }
marci@168
   126
marci@268
   127
  {
marci@311
   128
    std::cout << "faster physical blocking flow augmentation ..." << std::endl;
marci@303
   129
    Graph::EdgeMap<int> flow(G); //0 flow
marci@266
   130
marci@268
   131
    Timer ts;
marci@268
   132
    ts.reset();
marci@266
   133
marci@303
   134
    MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 
marci@303
   135
      max_flow_test(G, s, t, flow, cap);
marci@268
   136
    int i=0;
marci@268
   137
    while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) { 
marci@268
   138
//     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
marci@268
   139
//       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@266
   140
//     }
marci@268
   141
//     std::cout<<std::endl;
marci@268
   142
      ++i; 
marci@268
   143
    }
marci@266
   144
marci@268
   145
//   std::cout << "maximum flow: "<< std::endl;
marci@268
   146
//   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
marci@268
   147
//     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@266
   148
//   }
marci@268
   149
//   std::cout<<std::endl;
marci@268
   150
    std::cout << "elapsed time: " << ts << std::endl;
marci@268
   151
    std::cout << "number of augmentation phases: " << i << std::endl; 
marci@268
   152
    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
marci@268
   153
  }
marci@266
   154
marci@269
   155
  {
marci@311
   156
    std::cout << "on-the-fly blocking flow augmentation ..." << std::endl;
marci@303
   157
    Graph::EdgeMap<int> flow(G); //0 flow
marci@266
   158
marci@269
   159
    Timer ts;
marci@269
   160
    ts.reset();
marci@266
   161
marci@303
   162
    MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 
marci@303
   163
      max_flow_test(G, s, t, flow, cap);
marci@269
   164
    int i=0;
marci@269
   165
    while (max_flow_test.augmentOnBlockingFlow2()) { 
marci@269
   166
//     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
marci@269
   167
//       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@266
   168
//     }
marci@269
   169
//     std::cout<<std::endl;
marci@269
   170
      ++i; 
marci@269
   171
    }
marci@266
   172
marci@269
   173
//   std::cout << "maximum flow: "<< std::endl;
marci@269
   174
//   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
marci@269
   175
//     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@266
   176
//   }
marci@269
   177
//   std::cout<<std::endl;
marci@269
   178
    std::cout << "elapsed time: " << ts << std::endl;
marci@269
   179
    std::cout << "number of augmentation phases: " << i << std::endl; 
marci@269
   180
    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
marci@269
   181
  }
marci@266
   182
marci@168
   183
  {
marci@311
   184
    std::cout << "on-the-fly shortest path augmentation ..." << std::endl;
marci@303
   185
    Graph::EdgeMap<int> flow(G); //0 flow
marci@206
   186
marci@206
   187
    Timer ts;
marci@206
   188
    ts.reset();
marci@206
   189
marci@303
   190
    MaxFlow<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 
marci@303
   191
      max_flow_test(G, s, t, flow, cap);
marci@174
   192
    int i=0;
marci@174
   193
    while (max_flow_test.augmentOnShortestPath()) { 
marci@174
   194
//     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
marci@168
   195
//       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@168
   196
//     }
marci@168
   197
//     std::cout<<std::endl;
marci@174
   198
      ++i; 
marci@174
   199
    }
marci@174
   200
marci@174
   201
//   std::cout << "maximum flow: "<< std::endl;
marci@174
   202
//   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
marci@174
   203
//     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
marci@174
   204
//   }
marci@174
   205
//   std::cout<<std::endl;
marci@174
   206
    std::cout << "elapsed time: " << ts << std::endl;
marci@174
   207
    std::cout << "number of augmentation phases: " << i << std::endl; 
marci@174
   208
    std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
marci@168
   209
  }
marci@133
   210
marci@73
   211
marci@73
   212
  return 0;
marci@73
   213
}