COIN-OR::LEMON - Graph Library

Ticket #243: dimacs-cap-780ce5fdf189.patch

File dimacs-cap-780ce5fdf189.patch, 2.5 KB (added by Peter Kovacs, 16 years ago)
  • lemon/dimacs.h

    # HG changeset patch
    # User Peter Kovacs <kpeter@inf.elte.hu>
    # Date 1238014516 -3600
    # Node ID 780ce5fdf189edce2e8b78454ddfd003a88cceb3
    # Parent  6a17a722b50e1b22187f5a4cb99a7de28aada418
    Accept negative values as unbounded capacity in dimacs readers (#243)
    
    diff --git a/lemon/dimacs.h b/lemon/dimacs.h
    a b  
    142142    typename CapacityMap::Value low;
    143143    typename CapacityMap::Value cap;
    144144    typename CostMap::Value co;
     145    typedef typename CapacityMap::Value Capacity;
     146    Capacity MAX = std::numeric_limits<Capacity>::has_infinity ?
     147      std::numeric_limits<Capacity>::infinity() :
     148      std::numeric_limits<Capacity>::max();
     149
    145150    while (is >> c) {
    146151      switch (c) {
    147152      case 'c': // comment line
     
    152157        getline(is, str);
    153158        supply.set(nodes[i], sup);
    154159        break;
    155       case 'a': // arc (arc) definition line
     160      case 'a': // arc definition line
    156161        is >> i >> j >> low >> cap >> co;
    157162        getline(is, str);
    158163        e = g.addArc(nodes[i], nodes[j]);
    159164        lower.set(e, low);
    160         if (cap >= 0)
     165        if (cap >= low)
    161166          capacity.set(e, cap);
    162167        else
    163           capacity.set(e, -1);
     168          capacity.set(e, MAX);
    164169        cost.set(e, co);
    165170        break;
    166171      }
     
    186191    for (int k = 1; k <= desc.nodeNum; ++k) {
    187192      nodes[k] = g.addNode();
    188193    }
     194    typedef typename CapacityMap::Value Capacity;
     195    Capacity MAX = std::numeric_limits<Capacity>::has_infinity ?
     196      std::numeric_limits<Capacity>::infinity() :
     197      std::numeric_limits<Capacity>::max();
    189198
    190199    while (is >> c) {
    191200      switch (c) {
     
    205214          if (d == 't') t = nodes[i];
    206215        }
    207216        break;
    208       case 'a': // arc (arc) definition line
    209         if (desc.type==DimacsDescriptor::SP ||
    210             desc.type==DimacsDescriptor::MAX) {
     217      case 'a': // arc definition line
     218        if (desc.type==DimacsDescriptor::SP) {
    211219          is >> i >> j >> _cap;
    212220          getline(is, str);
    213221          e = g.addArc(nodes[i], nodes[j]);
    214222          capacity.set(e, _cap);
    215         } else {
     223        }
     224        else if (desc.type==DimacsDescriptor::MAX) {
     225          is >> i >> j >> _cap;
     226          getline(is, str);
     227          e = g.addArc(nodes[i], nodes[j]);
     228          if (_cap >= 0)
     229            capacity.set(e, _cap);
     230          else
     231            capacity.set(e, MAX);
     232        }
     233        else {
    216234          is >> i >> j;
    217235          getline(is, str);
    218236          g.addArc(nodes[i], nodes[j]);