# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1235465546 -3600
# Node ID a79ef774fae12569fdba4acc7c79af425a15f814
# Parent  e8349c6f12ca30c0a54b36825969cdaca81f933c
Support min cost flow in dimacs-solver (#234)

diff -r e8349c6f12ca -r a79ef774fae1 tools/dimacs-solver.cc
--- a/tools/dimacs-solver.cc	Tue Feb 24 09:46:02 2009 +0100
+++ b/tools/dimacs-solver.cc	Tue Feb 24 09:52:26 2009 +0100
@@ -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);