3  * This file is a part of LEMON, a generic C++ optimization library
 
     5  * Copyright (C) 2003-2006
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    21 ///\brief DIMACS to LGF converter (demo).
 
    23 /// This program converts various DIMACS formats to the LEMON Graph Format
 
    26 /// \include dim_to_lgf.cc
 
    32 #include <lemon/smart_graph.h>
 
    33 #include <lemon/dimacs.h>
 
    34 #include <lemon/graph_writer.h>
 
    37 using namespace lemon;
 
    39 const char* versionString =
 
    40 "dim_to_lgf - part of lemon library\n";
 
    42 const char* helpString =
 
    43 "DIMACS to LGF converter\n"
 
    44 "Usage: dim_to_lgf [OPTIONS]\n"
 
    47 "  dim_to_lgf --type shortestpath --input graph.dim --output graph.lgf\n"
 
    50 "  -i FILE, --input FILE    use FILE as input instead of standard input\n"
 
    51 "  -o FILE, --output FILE   use FILE as output instead of standard output\n"
 
    52 "  -t TYPE, --type TYPE     set up the type of the graph\n"
 
    55 "                               maxflow (default)\n"
 
    59 "  -v, --version            shows the version of the converter\n"
 
    60 "  -h, --help               shows the help of the converter\n";
 
    63 int main(int argc, const char *argv[]) {
 
    64   typedef SmartGraph Graph;
 
    66   typedef Graph::Edge Edge;
 
    67   typedef Graph::Node Node;
 
    68   typedef Graph::EdgeIt EdgeIt;
 
    69   typedef Graph::NodeIt NodeIt;
 
    70   typedef Graph::EdgeMap<double> DoubleMap;
 
    72   std::string inputName;
 
    73   std::string outputName;
 
    79   for (int arg = 1; arg < argc; ++arg) {
 
    80     if (strcmp(argv[arg], "--type") == 0 || 
 
    81 	strcmp(argv[arg], "-t") == 0) {
 
    82       if (!typeName.empty()) {
 
    83 	cerr << "Multiple type description" << endl;
 
    86       if (arg + 1 == argc) {
 
    87 	cerr << "Parameter without value" << endl;
 
    90       typeName = argv[++arg];
 
    92     else if (strcmp(argv[arg], "--input") == 0 || 
 
    93 	     strcmp(argv[arg], "-i") == 0) {
 
    94       if (!inputName.empty()) {
 
    95 	cerr << "Multiple input description" << endl;
 
    98       if (arg + 1 == argc) {
 
    99 	cerr << "Parameter without value" << endl;
 
   102       inputName = argv[++arg];
 
   104     else if (strcmp(argv[arg], "--output") == 0 || 
 
   105 	     strcmp(argv[arg], "-o") == 0) {
 
   106       if (!outputName.empty()) {
 
   107 	cerr << "Multiple input description" << endl;
 
   110       if (arg + 1 == argc) {
 
   111 	cerr << "Parameter without value" << endl;
 
   114       outputName = argv[++arg];
 
   115     } else if (strcmp(argv[arg], "--help") == 0 ||
 
   116 	       strcmp(argv[arg], "-h") == 0) {
 
   118     } else if (strcmp(argv[arg], "--version") == 0 ||
 
   119 	       strcmp(argv[arg], "-v") == 0) {
 
   122       cerr << "Invalid option: " << argv[arg] << endl;
 
   128     cout << versionString;
 
   133   if (help || version) {
 
   138   if (!inputName.empty()) {
 
   139     input.open(inputName.c_str());
 
   141       cerr << "File open error" << endl;
 
   145   istream& is = (inputName.empty() ? cin : input);
 
   148   if (!outputName.empty()) {
 
   149     output.open(outputName.c_str());
 
   151       cerr << "File open error" << endl;
 
   155   ostream& os = (outputName.empty() ? cout : output);
 
   157   if (typeName.empty()) {
 
   158     typeName = "maxflow";
 
   161   if (typeName == "mincostflow") {
 
   164     DoubleMap cost(graph), capacity(graph);
 
   165     readDimacs(is, graph, capacity, s, t, cost);
 
   166     GraphWriter<Graph>(os, graph).
 
   167       writeEdgeMap("capacity", capacity).
 
   168       writeNode("source", s).
 
   169       writeNode("target", t).
 
   170       writeEdgeMap("cost", cost).
 
   172   } else if (typeName == "maxflow") {
 
   175     DoubleMap capacity(graph);
 
   176     readDimacs(is, graph, capacity, s, t);
 
   177     GraphWriter<Graph>(os, graph).
 
   178       writeEdgeMap("capacity", capacity).
 
   179       writeNode("source", s).
 
   180       writeNode("target", t).
 
   182   } else if (typeName == "shortestpath") {
 
   185     DoubleMap capacity(graph);
 
   186     readDimacs(is, graph, capacity, s);
 
   187     GraphWriter<Graph>(os, graph).
 
   188       writeEdgeMap("capacity", capacity).
 
   189       writeNode("source", s).
 
   191   } else if (typeName == "capacitated") {
 
   193     DoubleMap capacity(graph);
 
   194     readDimacs(is, graph, capacity);
 
   195     GraphWriter<Graph>(os, graph).
 
   196       writeEdgeMap("capacity", capacity).
 
   198   } else if (typeName == "plain") {
 
   200     readDimacs(is, graph);
 
   201     GraphWriter<Graph>(os, graph).run();
 
   203     cerr << "Invalid type error" << endl;