COIN-OR::LEMON - Graph Library

Changeset 572:635a8375227d in lemon for lemon/dimacs.h


Ignore:
Timestamp:
02/23/09 12:48:47 (16 years ago)
Author:
Alpar Juttner <alpar@…>
Branch:
default
Phase:
public
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.