# HG changeset patch
# User Alpar Juttner <alpar@cs.elte.hu>
# Date 1235202124 0
# Node ID 4ccb5d61e2af222f6e54a39c03b80089ceb749e5
# Parent 2b6d5d22bb23c5f0a014e064a9a236bfc452c645
dimacs.h reads MAT files to both dir and undir graphs
diff --git a/lemon/dimacs.h b/lemon/dimacs.h
a
|
b
|
|
295 | 295 | _readDimacs(is, g, capacity, u, v, desc); |
296 | 296 | } |
297 | 297 | |
298 | | /// DIMACS plain digraph reader function. |
| 298 | template<typename Graph> |
| 299 | typename enable_if<lemon::UndirectedTagIndicator<Graph>,void>::type |
| 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. |
299 | 314 | /// |
300 | | /// This function reads a digraph without any designated nodes and |
| 315 | /// This function reads a (di)graph without any designated nodes and |
301 | 316 | /// maps from DIMACS format, i.e. from DIMACS files having a line |
302 | 317 | /// starting with |
303 | 318 | /// \code |
… |
… |
|
307 | 322 | /// |
308 | 323 | /// If the file type was previously evaluated by dimacsType(), then |
309 | 324 | /// the descriptor struct should be given by the \c dest parameter. |
310 | | template<typename Digraph> |
311 | | void readDimacsMat(std::istream& is, Digraph &g, |
312 | | DimacsDescriptor desc=DimacsDescriptor()) { |
313 | | typename Digraph::Node u,v; |
314 | | NullMap<typename Digraph::Arc, int> n; |
| 325 | template<typename Graph> |
| 326 | void readDimacsMat(std::istream& is, Graph &g, |
| 327 | DimacsDescriptor desc=DimacsDescriptor()) |
| 328 | { |
315 | 329 | if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); |
316 | 330 | if(desc.type!=DimacsDescriptor::MAT) |
317 | 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 | 359 | /// DIMACS plain digraph writer function. |