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