diff -r 4338e4280f67 -r 04733359bac2 src/demo/lp_maxflow_demo.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/demo/lp_maxflow_demo.cc Fri Apr 15 20:46:18 2005 +0000 @@ -0,0 +1,68 @@ +#include +#include +#include + +using namespace lemon; + +template +double maxFlow(const G &g,const C &cap,typename G::Node s,typename G::Node t) +{ + LpGlpk lp; + + typedef G Graph; + typedef typename G::Node Node; + typedef typename G::NodeIt NodeIt; + typedef typename G::Edge Edge; + typedef typename G::EdgeIt EdgeIt; + typedef typename G::OutEdgeIt OutEdgeIt; + typedef typename G::InEdgeIt InEdgeIt; + + typename G::template EdgeMap x(g); + lp.addColSet(x); + + for(EdgeIt e(g);e!=INVALID;++e) { + lp.colUpperBound(x[e],cap[e]); + lp.colLowerBound(x[e],0); + } + + for(NodeIt n(g);n!=INVALID;++n) if(n!=s&&n!=t) { + LpGlpk::Expr ex; + for(InEdgeIt e(g,n);e!=INVALID;++e) ex+=x[e]; + for(OutEdgeIt e(g,n);e!=INVALID;++e) ex-=x[e]; + lp.addRow(ex==0); + } + { + LpGlpk::Expr ex; + for(InEdgeIt e(g,t);e!=INVALID;++e) ex+=x[e]; + for(OutEdgeIt e(g,t);e!=INVALID;++e) ex-=x[e]; + lp.setObj(ex); + } + lp.max(); + + lp.presolver(true); + + lp.messageLevel(3); + + lp.solve(); + + return lp.primalValue(); +} + +int main() +{ + ListGraph g; + ListGraph::Node s; + ListGraph::Node t; + + ListGraph::EdgeMap cap(g); + + GraphReader reader(std::cin,g); + reader.addNode("source",s).addNode("target",t) + .addEdgeMap("capacity",cap).run(); + + // std::ifstream file("../test/preflow_"); +// readDimacs(file, g, cap, s, t); + + std::cout << "Max flow value = " << maxFlow(g,cap,s,t) << std::endl; + +}