COIN-OR::LEMON - Graph Library

Changeset 572:635a8375227d in lemon


Ignore:
Timestamp:
02/23/09 12:48:47 (9 years ago)
Author:
Alpar Juttner <alpar@…>
Branch:
default
Message:

dimacs.h reads MAT files to both dir and undir graphs (#231)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/dimacs.h

    r463 r572  
    296296  } 
    297297 
    298   /// DIMACS plain digraph reader function. 
    299   /// 
    300   /// This function reads a digraph without any designated nodes and 
     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. 
     314  /// 
     315  /// This function reads a (di)graph without any designated nodes and 
    301316  /// maps from DIMACS format, i.e. from DIMACS files having a line 
    302317  /// starting with 
     
    308323  /// If the file type was previously evaluated by dimacsType(), then 
    309324  /// 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  { 
    315329    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); 
    316330    if(desc.type!=DimacsDescriptor::MAT) 
    317331      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    } 
    319357  } 
    320358 
Note: See TracChangeset for help on using the changeset viewer.