marci@69: #ifndef DIMACS_HH
marci@69: #define DIMACS_HH
marci@69: 
marci@69: #include <iostream>
marci@69: #include <string>
marci@69: #include <vector>
marci@69: 
alpar@105: namespace hugo {
marci@69: 
marci@69:   template<typename Graph, typename CapacityMap>
marci@69:   void readDimacsMaxFlow(std::istream& is, Graph &G, typename Graph::NodeIt &s, typename Graph::NodeIt &t, CapacityMap& capacity) {
marci@69:     G.clear();
marci@69:     int cap;
marci@69:     char d;
marci@69:     std::string problem;
marci@69:     char c;
marci@69:     int i, j;
marci@69:     std::string str;
marci@69:     int n, m; 
marci@69:     std::vector<typename Graph::NodeIt> nodes;
marci@69:     while (is>>c) {
marci@69:       switch (c) {
marci@69:       case 'c': //comment
marci@69: 	getline(is, str);
marci@69: 	break;
marci@69:       case 't': //type
marci@69: 	getline(is, str);
marci@69: 	break;
marci@69:       case 'p': //problem definition
marci@69: 	is >> problem >> n >> m;
marci@69: 	getline(is, str);
marci@69: 	nodes.resize(n+1);
marci@69: 	for (int k=1; k<=n; ++k) nodes[k]=G.addNode();
marci@69: 	break;
marci@69:       case 'n': //node definition
marci@69: 	if (problem=="sp") { //shortest path problem
marci@69: 	  is >> i;
marci@69: 	  getline(is, str);
marci@69: 	  s=nodes[i];
marci@69: 	}
marci@69: 	if (problem=="max") { //max flow problem
marci@69: 	  is >> i >> d;
marci@69: 	  getline(is, str);
marci@69: 	  if (d=='s') s=nodes[i];
marci@69: 	  if (d=='t') t=nodes[i];
marci@69: 	}
marci@69: 	break;
marci@69:       case 'a':
marci@69: 	is >> i >> j >> cap;
marci@69: 	getline(is, str);
marci@69: 	typename Graph::EdgeIt e=G.addEdge(nodes[i], nodes[j]);
alpar@105: 	capacity.update();
marci@69: 	capacity.set(e, cap);
marci@69: 	break;
marci@69:       }
marci@69:     }
marci@69:   }
marci@69:   
alpar@105: } //namespace hugo
marci@69: 
marci@69: #endif //DIMACS_HH