diff -r 0274efa2222f -r b3ce42a4d7d2 src/demo/lp_demo.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/demo/lp_demo.cc Wed Apr 06 07:24:48 2005 +0000 @@ -0,0 +1,61 @@ +#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.solve(); + + return 0; +} + +int main() +{ + LpGlpk lp_glpk; + + ListGraph g; + ListGraph::Node s=g.addNode(); + ListGraph::Node t=g.addNode(); + + ListGraph::EdgeMap cap(g); + + GraphReader reader(std::cin,g); + reader.addEdgeMap("capacity",cap).run(); + + maxFlow(g,cap,s,t); + +}