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