Lindo Systems

! Max Flow (dual of Min cut) problem;
! Given a network, e.g., a railroad network,
where each arc (i,j) has a capacity c(i,j),
and a source node and a sink, 
find the maximum possible flow from the source
to the sink;
! References: Ford and Fulkerson, Harris and Ross;
! Keywords: Min cut, Max flow, Network, Interdiction;

SETS:
 NODE;
 ARC( NODE, NODE): C, FLO;
ENDSETS
DATA:
 NODE = S  1 2 3 4 5 6 7 8 9 T;
! The arcs and their capacities;
  ARC, C =
  S 1  23
  S 2  29
  1 3   6
  1 4   9
  2 3  19
  3 4   9
  3 5  17
  4 6  11
  4 7  13
  5 6   8
  5 8   7
  6 7  12
  6 9  14
  6 T   6
  7 T  21
  8 9  15
  9 T  16; 
ENDDATA
! Variables:
    FLO(i,j) = flow from node i to node j;

! Get number of nodes in network;
 NODET = @SIZE( NODE);

! Maximize flow out of S ;
 MAX = @SUM( ARC(i,j) | i #EQ# 1: FLO(i,j));

 ! Conservation of flow at each intermediate nodes;
 @FOR( NODE( k) | k #GT# 1 #AND# k #LT# NODET:
  [Y]  @SUM( ARC(i,k): FLO(i,k)) = @SUM( ARC(k,j): FLO(k,j));
     );

 ! Flow out of 1/S = Flow into NODET/T;
   [Y1] @SUM( ARC(k,j) | k #EQ# 1: FLO(k,j))
  =@SUM( ARC(i,k) | k #EQ# NODET: FLO(i,k));

 ! Upper limit on flow on each arc;
  @FOR( ARC(i,j):
    [Z] FLO(i,j) <= C(i,j); 
      );