Minor changes.
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;