ladanyi@1387: #ifdef HAVE_CONFIG_H ladanyi@1387: #include ladanyi@1387: #endif ladanyi@1387: alpar@1361: #include alpar@1361: #include alpar@1361: alpar@1381: alpar@1381: #ifdef HAVE_GLPK alpar@1381: #include alpar@1381: #elif HAVE_CPLEX alpar@1381: #include alpar@1381: #endif alpar@1381: alpar@1361: using namespace lemon; alpar@1361: alpar@1381: #ifdef HAVE_GLPK alpar@1381: typedef LpGlpk LpDefault; alpar@1381: #elif HAVE_CPLEX alpar@1381: typedef LpCplex LpDefault; alpar@1381: #endif alpar@1381: alpar@1381: alpar@1361: template alpar@1361: double maxFlow(const G &g,const C &cap,typename G::Node s,typename G::Node t) alpar@1361: { alpar@1381: LpDefault lp; alpar@1361: alpar@1361: typedef G Graph; alpar@1361: typedef typename G::Node Node; alpar@1361: typedef typename G::NodeIt NodeIt; alpar@1361: typedef typename G::Edge Edge; alpar@1361: typedef typename G::EdgeIt EdgeIt; alpar@1361: typedef typename G::OutEdgeIt OutEdgeIt; alpar@1361: typedef typename G::InEdgeIt InEdgeIt; alpar@1361: alpar@1381: typename G::template EdgeMap x(g); alpar@1361: lp.addColSet(x); alpar@1361: alpar@1361: for(EdgeIt e(g);e!=INVALID;++e) { alpar@1361: lp.colUpperBound(x[e],cap[e]); alpar@1361: lp.colLowerBound(x[e],0); alpar@1361: } alpar@1361: alpar@1361: for(NodeIt n(g);n!=INVALID;++n) if(n!=s&&n!=t) { alpar@1381: LpDefault::Expr ex; alpar@1361: for(InEdgeIt e(g,n);e!=INVALID;++e) ex+=x[e]; alpar@1361: for(OutEdgeIt e(g,n);e!=INVALID;++e) ex-=x[e]; alpar@1361: lp.addRow(ex==0); alpar@1361: } alpar@1361: { alpar@1381: LpDefault::Expr ex; alpar@1361: for(InEdgeIt e(g,t);e!=INVALID;++e) ex+=x[e]; alpar@1361: for(OutEdgeIt e(g,t);e!=INVALID;++e) ex-=x[e]; alpar@1361: lp.setObj(ex); alpar@1361: } alpar@1361: lp.max(); alpar@1361: alpar@1381: #ifdef HAVE_GLPK alpar@1361: lp.presolver(true); alpar@1361: lp.messageLevel(3); alpar@1381: #endif alpar@1361: alpar@1361: lp.solve(); alpar@1361: alpar@1361: return lp.primalValue(); alpar@1361: } alpar@1361: alpar@1361: int main() alpar@1361: { alpar@1361: ListGraph g; alpar@1361: ListGraph::Node s; alpar@1361: ListGraph::Node t; alpar@1361: alpar@1361: ListGraph::EdgeMap cap(g); alpar@1361: alpar@1361: GraphReader reader(std::cin,g); alpar@1361: reader.addNode("source",s).addNode("target",t) alpar@1361: .addEdgeMap("capacity",cap).run(); alpar@1361: alpar@1361: // std::ifstream file("../test/preflow_"); alpar@1361: // readDimacs(file, g, cap, s, t); alpar@1361: alpar@1361: std::cout << "Max flow value = " << maxFlow(g,cap,s,t) << std::endl; alpar@1361: alpar@1361: }