set FUENTES;
set SUMIDEROS;
set T;

param clis{s in SUMIDEROS} >= 0;
param dist{f in FUENTES, s in SUMIDEROS} integer >= 0;
param costoInst{t in T} >= 0;
param capacidad{t in T} >= 0;
param SAL_MAX integer >= 0;
param DST_MIN :=
  min{f in FUENTES, s in SUMIDEROS : clis[s] > 0} dist[f,s] <= SAL_MAX - 2;
param SUM_CLI := sum{s in SUMIDEROS} clis[s] >= 0;

set S := setof{s in SUMIDEROS : clis[s] > 0} s;
set VS1{s in S} := setof{f in FUENTES : dist[f,s] + 2 <= SAL_MAX} f;
set VS2{s in S, f1 in VS1[s]} :=
  setof{f2 in VS1[s] :
    f2 <> f1 and dist[f1,s] <= dist[f2,s]} f2;
set F :=
  setof{s in S, f1 in VS1[s]} f1
  union 
  setof{s in S, f1 in VS1[s], f2 in VS2[s,f1]} f2;
set VF{f in F} := setof{s in S: dist[f,s] + 2 <= SAL_MAX} s;

param clisMax{f in F} := sum{s in VF[f]} clis[s];

var x1{s in S, f1 in VS1[s], t1 in T} >= 0 <= SUM_CLI;
var x2{s in S, f1 in VS1[s], t1 in T, f2 in VS2[s,f1], t2 in T} >= 0 <= SUM_CLI;
var y{f in F, t in T} binary;

minimize costoInstTot: sum{f in F, t in T} costoInst[t] * y[f,t];

subject to Def_y_p1 {s in S, f1 in VS1[s], t1 in T}:
  y[f1,t1] * clisMax[f1] >= x1[s,f1,t1];
subject to Def_y_p2 {s in S, f1 in VS1[s], t1 in T, f2 in VS2[s,f1], t2 in T}: 
  y[f2,t2] * clisMax[f2] >= x2[s,f1,t1,f2,t2];

subject to Dem {s in S}:
  sum{f1 in VS1[s], t1 in T} x1[s,f1,t1] = clis[s];

subject to Cap {f in F, t in T}: 
  sum{s in VF[f]} x1[s,f,t]
  +
  sum{s in S, f1 in VS1[s], t1 in T: f in VS2[s,f1]} x2[s,f1,t1,f,t]
  <= capacidad[t];

subject to BalFluj {s in S, f1 in VS1[s], t1 in T}:
  sum{f2 in VS2[s,f1], t2 in T} x2[s,f1,t1,f2,t2] = x1[s,f1,t1];

subject to PriProx {s in S, f0 in VS1[s], t0 in T, f1 in VS1[s], t1 in T :
  dist[f0,s] < dist[f1,s]}:
  x1[s,f1,t1] <= (1 - y[f0,t0]) * SUM_CLI;

subject to SecProx {s in S, f1 in VS1[s], t1 in T, 
  f2a in VS2[s,f1], t2a in T, f2b in VS2[s,f1], t2b in T :
  dist[f2b,s] > dist[f2a,s]}:
  x2[s,f1,t1,f2b,t2b] <= (1 - y[f2a,t2a]) * SUM_CLI;

end;
