gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Use 'long long' flow cost in dimacs-solver.cc (#347)
0 1 0
default
1 file changed with 11 insertions and 8 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
... ...
@@ -88,13 +88,13 @@
88 88
  ti.restart();
89 89
  pre.run();
90 90
  if(report) std::cerr << "Run Preflow: " << ti << '\n';
91 91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';  
92 92
}
93 93

	
94
template<class Value>
94
template<class Value, class LargeValue>
95 95
void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
96 96
               Value infty, DimacsDescriptor &desc)
97 97
{
98 98
  bool report = !ap.given("q");
99 99
  Digraph g;
100 100
  Digraph::ArcMap<Value> lower(g), cap(g), cost(g);
... ...
@@ -124,13 +124,14 @@
124 124
  if (report) std::cerr << "Setup NetworkSimplex class: " << ti << '\n';
125 125
  ti.restart();
126 126
  bool res = ns.run();
127 127
  if (report) {
128 128
    std::cerr << "Run NetworkSimplex: " << ti << "\n\n";
129 129
    std::cerr << "Feasible flow: " << (res ? "found" : "not found") << '\n';
130
    if (res) std::cerr << "Min flow cost: " << ns.totalCost() << '\n';
130
    if (res) std::cerr << "Min flow cost: "
131
                       << ns.template totalCost<LargeValue>() << '\n';
131 132
  }
132 133
}
133 134

	
134 135
void solve_mat(ArgParser &ap, std::istream &is, std::ostream &,
135 136
              DimacsDescriptor &desc)
136 137
{
... ...
@@ -148,13 +149,13 @@
148 149
  if(report) std::cerr << "Run MaxMatching: " << ti << '\n';
149 150
  if(report) std::cerr << "\nCardinality of max matching: "
150 151
                       << mat.matchingSize() << '\n';  
151 152
}
152 153

	
153 154

	
154
template<class Value>
155
template<class Value, class LargeValue>
155 156
void solve(ArgParser &ap, std::istream &is, std::ostream &os,
156 157
           DimacsDescriptor &desc)
157 158
{
158 159
  std::stringstream iss(static_cast<std::string>(ap["infcap"]));
159 160
  Value infty;
160 161
  iss >> infty;
... ...
@@ -166,13 +167,13 @@
166 167
      exit(1);
167 168
    }
168 169
  
169 170
  switch(desc.type)
170 171
    {
171 172
    case DimacsDescriptor::MIN:
172
      solve_min<Value>(ap,is,os,infty,desc);
173
      solve_min<Value, LargeValue>(ap,is,os,infty,desc);
173 174
      break;
174 175
    case DimacsDescriptor::MAX:
175 176
      solve_max<Value>(ap,is,os,infty,desc);
176 177
      break;
177 178
    case DimacsDescriptor::SP:
178 179
      solve_sp<Value>(ap,is,os,desc);
... ...
@@ -261,17 +262,19 @@
261 262
      std::cout << "\nNum of nodes: " << desc.nodeNum;
262 263
      std::cout << "\nNum of arcs:  " << desc.edgeNum;
263 264
      std::cout << "\n\n";
264 265
    }
265 266
    
266 267
  if(ap.given("double"))
267
    solve<double>(ap,is,os,desc);
268
    solve<double, double>(ap,is,os,desc);
268 269
  else if(ap.given("ldouble"))
269
    solve<long double>(ap,is,os,desc);
270
    solve<long double, long double>(ap,is,os,desc);
270 271
#ifdef LEMON_HAVE_LONG_LONG
271 272
  else if(ap.given("long"))
272
    solve<long long>(ap,is,os,desc);
273
    solve<long long, long long>(ap,is,os,desc);
274
  else solve<int, long long>(ap,is,os,desc);
275
#else
276
  else solve<int, long>(ap,is,os,desc);
273 277
#endif
274
  else solve<int>(ap,is,os,desc);
275 278

	
276 279
  return 0;
277 280
}
0 comments (0 inline)