# 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. |