[Lemon-commits] Peter Kovacs: Support min cost flow in dimacs-so...

Lemon HG hg at lemon.cs.elte.hu
Tue Apr 21 16:33:30 CEST 2009


details:   http://lemon.cs.elte.hu/hg/lemon/rev/a79ef774fae1
changeset: 634:a79ef774fae1
user:      Peter Kovacs <kpeter [at] inf.elte.hu>
date:      Tue Feb 24 09:52:26 2009 +0100
description:
	Support min cost flow in dimacs-solver (#234)

diffstat:

 tools/dimacs-solver.cc |  27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diffs (51 lines):

diff --git a/tools/dimacs-solver.cc b/tools/dimacs-solver.cc
--- a/tools/dimacs-solver.cc
+++ b/tools/dimacs-solver.cc
@@ -44,6 +44,7 @@
 #include <lemon/dijkstra.h>
 #include <lemon/preflow.h>
 #include <lemon/max_matching.h>
+#include <lemon/network_simplex.h>
 
 using namespace lemon;
 typedef SmartDigraph Digraph;
@@ -91,6 +92,29 @@
   if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';  
 }
 
+template<class Value>
+void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
+               DimacsDescriptor &desc)
+{
+  bool report = !ap.given("q");
+  Digraph g;
+  Digraph::ArcMap<Value> lower(g), cap(g), cost(g);
+  Digraph::NodeMap<Value> sup(g);
+  Timer ti;
+  ti.restart();
+  readDimacsMin(is, g, lower, cap, cost, sup, desc);
+  if (report) std::cerr << "Read the file: " << ti << '\n';
+  ti.restart();
+  NetworkSimplex< Digraph, Digraph::ArcMap<Value>, Digraph::ArcMap<Value>,
+                  Digraph::ArcMap<Value>, Digraph::NodeMap<Value> >
+    ns(g, lower, cap, cost, sup);
+  if (report) std::cerr << "Setup NetworkSimplex class: " << ti << '\n';
+  ti.restart();
+  ns.run();
+  if (report) std::cerr << "Run NetworkSimplex: " << ti << '\n';
+  if (report) std::cerr << "\nMin flow cost: " << ns.totalCost() << '\n';
+}
+
 void solve_mat(ArgParser &ap, std::istream &is, std::ostream &,
               DimacsDescriptor &desc)
 {
@@ -118,8 +142,7 @@
   switch(desc.type)
     {
     case DimacsDescriptor::MIN:
-      std::cerr <<
-        "\n\n Sorry, the min. cost flow solver is not yet available.\n";
+      solve_min<Value>(ap,is,os,desc);
       break;
     case DimacsDescriptor::MAX:
       solve_max<Value>(ap,is,os,desc);



More information about the Lemon-commits mailing list