alpar@1309: #include alpar@1309: #include alpar@1309: #include alpar@1309: alpar@1309: using namespace lemon; alpar@1309: alpar@1309: template alpar@1309: double maxFlow(const G &g,const C &cap,typename G::Node s,typename G::Node t) alpar@1309: { alpar@1309: LpGlpk lp; alpar@1309: alpar@1309: typedef G Graph; alpar@1309: typedef typename G::Node Node; alpar@1309: typedef typename G::NodeIt NodeIt; alpar@1309: typedef typename G::Edge Edge; alpar@1309: typedef typename G::EdgeIt EdgeIt; alpar@1309: typedef typename G::OutEdgeIt OutEdgeIt; alpar@1309: typedef typename G::InEdgeIt InEdgeIt; alpar@1309: alpar@1309: typename G::template EdgeMap x(g); alpar@1309: lp.addColSet(x); alpar@1309: alpar@1309: for(EdgeIt e(g);e!=INVALID;++e) { alpar@1309: lp.colUpperBound(x[e],cap[e]); alpar@1309: lp.colLowerBound(x[e],0); alpar@1309: } alpar@1309: alpar@1309: for(NodeIt n(g);n!=INVALID;++n) if(n!=s&&n!=t) { alpar@1309: LpGlpk::Expr ex; alpar@1309: for(InEdgeIt e(g,n);e!=INVALID;++e) ex+=x[e]; alpar@1309: for(OutEdgeIt e(g,n);e!=INVALID;++e) ex-=x[e]; alpar@1309: lp.addRow(ex==0); alpar@1309: } alpar@1309: { alpar@1309: LpGlpk::Expr ex; alpar@1309: for(InEdgeIt e(g,t);e!=INVALID;++e) ex+=x[e]; alpar@1309: for(OutEdgeIt e(g,t);e!=INVALID;++e) ex-=x[e]; alpar@1309: lp.setObj(ex); alpar@1309: } alpar@1309: alpar@1309: lp.solve(); alpar@1309: alpar@1309: return 0; alpar@1309: } alpar@1309: alpar@1309: int main() alpar@1309: { alpar@1309: LpGlpk lp_glpk; alpar@1309: alpar@1309: ListGraph g; alpar@1309: ListGraph::Node s=g.addNode(); alpar@1309: ListGraph::Node t=g.addNode(); alpar@1309: alpar@1309: ListGraph::EdgeMap cap(g); alpar@1309: alpar@1309: GraphReader reader(std::cin,g); alpar@1309: reader.addEdgeMap("capacity",cap).run(); alpar@1309: alpar@1309: maxFlow(g,cap,s,t); alpar@1309: alpar@1309: }