src/demo/lp_maxflow_demo.cc
changeset 1362 b4330c52caeb
child 1381 998e8def9676
equal deleted inserted replaced
-1:000000000000 0:4cb675f90829
       
     1 #include<lemon/lp_glpk.h>
       
     2 #include<lemon/graph_reader.h>
       
     3 #include<lemon/list_graph.h>
       
     4 
       
     5 using namespace lemon;
       
     6 
       
     7 template<class G,class C>
       
     8 double maxFlow(const G &g,const C &cap,typename G::Node s,typename G::Node t)
       
     9 {
       
    10   LpGlpk lp;
       
    11   
       
    12   typedef G Graph;
       
    13   typedef typename G::Node Node;
       
    14   typedef typename G::NodeIt NodeIt;
       
    15   typedef typename G::Edge Edge;
       
    16   typedef typename G::EdgeIt EdgeIt;
       
    17   typedef typename G::OutEdgeIt OutEdgeIt;
       
    18   typedef typename G::InEdgeIt InEdgeIt;
       
    19   
       
    20   typename G::template EdgeMap<LpGlpk::Col> x(g);
       
    21   lp.addColSet(x);
       
    22   
       
    23   for(EdgeIt e(g);e!=INVALID;++e) {
       
    24     lp.colUpperBound(x[e],cap[e]);
       
    25     lp.colLowerBound(x[e],0);
       
    26   }
       
    27 
       
    28   for(NodeIt n(g);n!=INVALID;++n) if(n!=s&&n!=t) {
       
    29     LpGlpk::Expr ex;
       
    30     for(InEdgeIt  e(g,n);e!=INVALID;++e) ex+=x[e];
       
    31     for(OutEdgeIt e(g,n);e!=INVALID;++e) ex-=x[e];
       
    32     lp.addRow(ex==0);
       
    33   }
       
    34   {
       
    35     LpGlpk::Expr ex;
       
    36     for(InEdgeIt  e(g,t);e!=INVALID;++e) ex+=x[e];
       
    37     for(OutEdgeIt e(g,t);e!=INVALID;++e) ex-=x[e];
       
    38     lp.setObj(ex);
       
    39   }
       
    40   lp.max();
       
    41 
       
    42   lp.presolver(true);
       
    43   
       
    44   lp.messageLevel(3);
       
    45 
       
    46   lp.solve();
       
    47 
       
    48   return lp.primalValue();
       
    49 }
       
    50 
       
    51 int main() 
       
    52 {
       
    53   ListGraph g;
       
    54   ListGraph::Node s;
       
    55   ListGraph::Node t;
       
    56   
       
    57   ListGraph::EdgeMap<double> cap(g);
       
    58   
       
    59   GraphReader<ListGraph> reader(std::cin,g);
       
    60   reader.addNode("source",s).addNode("target",t)
       
    61     .addEdgeMap("capacity",cap).run();
       
    62   
       
    63   // std::ifstream file("../test/preflow_");
       
    64 //   readDimacs(file, g, cap, s, t);
       
    65 
       
    66   std::cout << "Max flow value = " << maxFlow(g,cap,s,t) << std::endl;
       
    67 
       
    68 }