| ... |
... |
@@ -28,46 +28,38 @@
|
| 28 |
28 |
/// \ingroup dimacs_group
|
| 29 |
29 |
/// \file
|
| 30 |
30 |
/// \brief DIMACS file format reader.
|
| 31 |
31 |
|
| 32 |
32 |
namespace lemon {
|
| 33 |
33 |
|
| 34 |
|
///@defgroup dimacs_group DIMACS format
|
| 35 |
|
///\brief Read and write files in DIMACS format
|
| 36 |
|
///
|
| 37 |
|
///Tools to read a digraph from or write it to a file in DIMACS format
|
| 38 |
|
///data
|
| 39 |
|
///\ingroup io_group
|
| 40 |
|
|
| 41 |
34 |
/// \addtogroup dimacs_group
|
| 42 |
35 |
/// @{
|
| 43 |
36 |
|
| 44 |
|
|
| 45 |
37 |
/// DIMACS file type descriptor.
|
| 46 |
38 |
struct DimacsDescriptor
|
| 47 |
39 |
{
|
| 48 |
40 |
///File type enum
|
| 49 |
41 |
enum Type
|
| 50 |
42 |
{
|
| 51 |
43 |
NONE, MIN, MAX, SP, MAT
|
| 52 |
44 |
};
|
| 53 |
45 |
///The file type
|
| 54 |
46 |
Type type;
|
| 55 |
|
///The number of nodes on the graph
|
|
47 |
///The number of nodes in the graph
|
| 56 |
48 |
int nodeNum;
|
| 57 |
|
///The number of edges on the graph
|
|
49 |
///The number of edges in the graph
|
| 58 |
50 |
int edgeNum;
|
| 59 |
51 |
int lineShift;
|
| 60 |
52 |
/// Constructor. Sets the type to NONE.
|
| 61 |
53 |
DimacsDescriptor() : type(NONE) {}
|
| 62 |
54 |
};
|
| 63 |
55 |
|
| 64 |
56 |
///Discover the type of a DIMACS file
|
| 65 |
57 |
|
| 66 |
58 |
///It starts seeking the begining of the file for the problem type
|
| 67 |
|
///and size info. The found date is returned in a special struct
|
|
59 |
///and size info. The found data is returned in a special struct
|
| 68 |
60 |
///that can be evaluated and passed to the appropriate reader
|
| 69 |
61 |
///function.
|
| 70 |
62 |
DimacsDescriptor dimacsType(std::istream& is)
|
| 71 |
63 |
{
|
| 72 |
64 |
DimacsDescriptor r;
|
| 73 |
65 |
std::string problem,str;
|
| ... |
... |
@@ -102,16 +94,16 @@
|
| 102 |
94 |
}
|
| 103 |
95 |
throw FormatError("Missing problem type declaration.");
|
| 104 |
96 |
}
|
| 105 |
97 |
|
| 106 |
98 |
|
| 107 |
99 |
|
| 108 |
|
/// DIMACS min cost flow reader function.
|
|
100 |
/// DIMACS minimum cost flow reader function.
|
| 109 |
101 |
///
|
| 110 |
|
/// This function reads a min cost flow instance from DIMACS format,
|
| 111 |
|
/// i.e. from DIMACS files having a line starting with
|
|
102 |
/// This function reads a minimum cost flow instance from DIMACS format,
|
|
103 |
/// i.e. from a DIMACS file having a line starting with
|
| 112 |
104 |
/// \code
|
| 113 |
105 |
/// p min
|
| 114 |
106 |
/// \endcode
|
| 115 |
107 |
/// At the beginning, \c g is cleared by \c g.clear(). The supply
|
| 116 |
108 |
/// amount of the nodes are written to \c supply (signed). The
|
| 117 |
109 |
/// lower bounds, capacities and costs of the arcs are written to
|
| ... |
... |
@@ -227,16 +219,16 @@
|
| 227 |
219 |
}
|
| 228 |
220 |
break;
|
| 229 |
221 |
}
|
| 230 |
222 |
}
|
| 231 |
223 |
}
|
| 232 |
224 |
|
| 233 |
|
/// DIMACS max flow reader function.
|
|
225 |
/// DIMACS maximum flow reader function.
|
| 234 |
226 |
///
|
| 235 |
|
/// This function reads a max flow instance from DIMACS format,
|
| 236 |
|
/// i.e. from DIMACS files having a line starting with
|
|
227 |
/// This function reads a maximum flow instance from DIMACS format,
|
|
228 |
/// i.e. from a DIMACS file having a line starting with
|
| 237 |
229 |
/// \code
|
| 238 |
230 |
/// p max
|
| 239 |
231 |
/// \endcode
|
| 240 |
232 |
/// At the beginning, \c g is cleared by \c g.clear(). The arc
|
| 241 |
233 |
/// capacities are written to \c capacity and \c s and \c t are
|
| 242 |
234 |
/// set to the source and the target nodes.
|
| ... |
... |
@@ -256,18 +248,18 @@
|
| 256 |
248 |
_readDimacs(is,g,capacity,s,t,desc);
|
| 257 |
249 |
}
|
| 258 |
250 |
|
| 259 |
251 |
/// DIMACS shortest path reader function.
|
| 260 |
252 |
///
|
| 261 |
253 |
/// This function reads a shortest path instance from DIMACS format,
|
| 262 |
|
/// i.e. from DIMACS files having a line starting with
|
|
254 |
/// i.e. from a DIMACS file having a line starting with
|
| 263 |
255 |
/// \code
|
| 264 |
256 |
/// p sp
|
| 265 |
257 |
/// \endcode
|
| 266 |
258 |
/// At the beginning, \c g is cleared by \c g.clear(). The arc
|
| 267 |
|
/// lengths are written to \c lenght and \c s is set to the
|
|
259 |
/// lengths are written to \c length and \c s is set to the
|
| 268 |
260 |
/// source node.
|
| 269 |
261 |
///
|
| 270 |
262 |
/// If the file type was previously evaluated by dimacsType(), then
|
| 271 |
263 |
/// the descriptor struct should be given by the \c dest parameter.
|
| 272 |
264 |
template<typename Digraph, typename LengthMap>
|
| 273 |
265 |
void readDimacsSp(std::istream& is,
|