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@1322: lp.max(); alpar@1326: alpar@1326: lp.presolver(true); alpar@1326: alpar@1326: lp.messageLevel(3); alpar@1326: alpar@1309: lp.solve(); alpar@1309: alpar@1322: return lp.primalValue(); alpar@1309: } alpar@1309: alpar@1309: int main() alpar@1309: { alpar@1309: ListGraph g; alpar@1322: ListGraph::Node s; alpar@1322: ListGraph::Node t; alpar@1322: alpar@1309: ListGraph::EdgeMap cap(g); alpar@1309: alpar@1309: GraphReader reader(std::cin,g); alpar@1322: reader.addNode("source",s).addNode("target",t) alpar@1322: .addEdgeMap("capacity",cap).run(); alpar@1309: alpar@1322: // std::ifstream file("../test/preflow_"); alpar@1322: // readDimacs(file, g, cap, s, t); alpar@1322: alpar@1322: std::cout << "Max flow value = " << maxFlow(g,cap,s,t) << std::endl; alpar@1309: alpar@1309: }