lemon/dimacs.h
changeset 550 c5fd2d996909
parent 440 88ed40ad0d4f
child 552 6e0525ec5355
equal deleted inserted replaced
4:4a59c9ff2ec2 5:1ba012539556
   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