293 if(desc.type!=DimacsDescriptor::MAX || desc.type!=DimacsDescriptor::SP) |
293 if(desc.type!=DimacsDescriptor::MAX || desc.type!=DimacsDescriptor::SP) |
294 throw FormatError("Problem type mismatch"); |
294 throw FormatError("Problem type mismatch"); |
295 _readDimacs(is, g, capacity, u, v, desc); |
295 _readDimacs(is, g, capacity, u, v, desc); |
296 } |
296 } |
297 |
297 |
298 /// DIMACS plain digraph reader function. |
298 template<typename Graph> |
299 /// |
299 typename enable_if<lemon::UndirectedTagIndicator<Graph>,void>::type |
300 /// This function reads a digraph without any designated nodes and |
300 _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t, |
|
301 dummy<0> = 0) |
|
302 { |
|
303 g.addEdge(s,t); |
|
304 } |
|
305 template<typename Graph> |
|
306 typename disable_if<lemon::UndirectedTagIndicator<Graph>,void>::type |
|
307 _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t, |
|
308 dummy<1> = 1) |
|
309 { |
|
310 g.addArc(s,t); |
|
311 } |
|
312 |
|
313 /// DIMACS plain (di)graph reader function. |
|
314 /// |
|
315 /// This function reads a (di)graph without any designated nodes and |
301 /// maps from DIMACS format, i.e. from DIMACS files having a line |
316 /// maps from DIMACS format, i.e. from DIMACS files having a line |
302 /// starting with |
317 /// starting with |
303 /// \code |
318 /// \code |
304 /// p mat |
319 /// p mat |
305 /// \endcode |
320 /// \endcode |
306 /// At the beginning, \c g is cleared by \c g.clear(). |
321 /// At the beginning, \c g is cleared by \c g.clear(). |
307 /// |
322 /// |
308 /// If the file type was previously evaluated by dimacsType(), then |
323 /// If the file type was previously evaluated by dimacsType(), then |
309 /// the descriptor struct should be given by the \c dest parameter. |
324 /// the descriptor struct should be given by the \c dest parameter. |
310 template<typename Digraph> |
325 template<typename Graph> |
311 void readDimacsMat(std::istream& is, Digraph &g, |
326 void readDimacsMat(std::istream& is, Graph &g, |
312 DimacsDescriptor desc=DimacsDescriptor()) { |
327 DimacsDescriptor desc=DimacsDescriptor()) |
313 typename Digraph::Node u,v; |
328 { |
314 NullMap<typename Digraph::Arc, int> n; |
|
315 if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); |
329 if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); |
316 if(desc.type!=DimacsDescriptor::MAT) |
330 if(desc.type!=DimacsDescriptor::MAT) |
317 throw FormatError("Problem type mismatch"); |
331 throw FormatError("Problem type mismatch"); |
318 _readDimacs(is, g, n, u, v, desc); |
332 |
|
333 g.clear(); |
|
334 std::vector<typename Graph::Node> nodes; |
|
335 char c; |
|
336 int i, j; |
|
337 std::string str; |
|
338 nodes.resize(desc.nodeNum + 1); |
|
339 for (int k = 1; k <= desc.nodeNum; ++k) { |
|
340 nodes[k] = g.addNode(); |
|
341 } |
|
342 |
|
343 while (is >> c) { |
|
344 switch (c) { |
|
345 case 'c': // comment line |
|
346 getline(is, str); |
|
347 break; |
|
348 case 'n': // node definition line |
|
349 break; |
|
350 case 'a': // arc (arc) definition line |
|
351 is >> i >> j; |
|
352 getline(is, str); |
|
353 _addArcEdge(g,nodes[i], nodes[j]); |
|
354 break; |
|
355 } |
|
356 } |
319 } |
357 } |
320 |
358 |
321 /// DIMACS plain digraph writer function. |
359 /// DIMACS plain digraph writer function. |
322 /// |
360 /// |
323 /// This function writes a digraph without any designated nodes and |
361 /// This function writes a digraph without any designated nodes and |