5 #include <lemon/graph_utils.h>
 
     6 #include <lemon/smart_graph.h>
 
     7 #include <lemon/list_graph.h>
 
     8 #include <lemon/dimacs.h>
 
     9 #include <lemon/time_measure.h>
 
    10 #include <lp_solver_base.h>
 
    14 using namespace lemon;
 
    16 template<typename Edge, typename EdgeIndexMap> 
 
    20   EdgeIndexMap* edge_index_map;
 
    22   PrimalMap(LPGLPK& _lp, EdgeIndexMap& _edge_index_map) : 
 
    23     lp(&_lp), edge_index_map(&_edge_index_map) { }
 
    24   double operator[](Edge e) const { 
 
    25     return lp->getPrimal((*edge_index_map)[e]);
 
    29 // Use a DIMACS max flow file as stdin.
 
    30 // max_flow_expresion < dimacs_max_flow_file
 
    32 int main(int, char **) {
 
    34   typedef ListGraph Graph;
 
    35   typedef Graph::Node Node;
 
    36   typedef Graph::Edge Edge;
 
    37   typedef Graph::EdgeIt EdgeIt;
 
    42   Graph::EdgeMap<int> cap(g);
 
    43   readDimacs(std::cin, g, cap, s, t);
 
    46   typedef LPGLPK LPSolver;
 
    49   typedef LPSolver::Col Col;
 
    50   typedef LPSolver::Row Row;
 
    51   typedef Graph::EdgeMap<Col> EdgeIndexMap;
 
    52   typedef Graph::NodeMap<Row> NodeIndexMap;
 
    53   EdgeIndexMap edge_index_map(g);
 
    54   NodeIndexMap node_index_map(g);
 
    55   PrimalMap<Edge, EdgeIndexMap> flow(lp, edge_index_map);
 
    57   // nonnegativity of flow and capacity function
 
    58   for (Graph::EdgeIt e(g); e!=INVALID; ++e) {
 
    60     edge_index_map.set(e, col);
 
    61     // interesting property in GLPK:
 
    62     // if you change the order of the following two lines, the 
 
    63     // two runs of GLPK are extremely different
 
    64       lp.setColLowerBound(col, 0);
 
    65       lp.setColUpperBound(col, cap[e]);
 
    68   for (Graph::NodeIt n(g); n!=INVALID; ++n) {
 
    69     LPSolver::Expression expr;
 
    70     for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e)
 
    71       expr+=edge_index_map[e];
 
    72     for (Graph::InEdgeIt e(g, n); e!=INVALID; ++e)
 
    73       expr-=edge_index_map[e];
 
    76       lp.setObjCoeffs(expr);      
 
    78     // flow conservation constraints
 
    79     if ((n!=s) && (n!=t)) {
 
    80       node_index_map.set(n, lp.addRow(expr == 0.0));
 
    84   cout << "elapsed time: " << ts << endl;
 
    85 //   cout << "rows:" << endl;
 
    87 //        LPSolver::Rows::ClassIt i(lp.row_iter_map, 0);
 
    93 //   cout << "cols:" << endl;
 
    95 //        LPSolver::Cols::ClassIt i(lp.col_iter_map, 0);
 
   102   cout << "elapsed time: " << ts << endl;
 
   103   for (LPSolver::Cols::ClassIt it(lp.col_iter_map ,1); it!=INVALID; ++it) {
 
   106   cout << "elapsed time: " << ts << endl;
 
   108   cout << "elapsed time: " << ts << endl;