Problema del Massimo Flusso Dati un grafo orientato G = (N, A) con capacità uij associate agli archi un nodo s N, detto sorgente un nodo t N, detto pozzo trovare la massima quantità di flusso che può essere inviata da s a t rispettando le capacità degli archi il fatto che nei nodi intermedi il flusso non può entrare né uscire Grafo G : 8 2 4 7 1 4 1 5 6 9 5 3 4 5 sorgente : s = 1 pozzo : t = 6 uij i j Si dice flusso un vettore x R|A| tale che per ogni nodo intermedio i N {s, t} j ,i x x BS i ji ij i , j FS i i N \ s,t ossia nei nodi intermedi non si ha né immissione né prelievo di flusso Queste relazioni sono dette “vincoli di conservazione del flusso” Si dice valore del flusso, denotato con v R, la quantità di flusso immessa in rete nel nodo sorgente s v x x sj s , j FS s js j , s BS s Valendo i vincoli di conservazione del flusso ai nodi intermedi, il flusso immesso in rete nel nodo sorgente s equivale al flusso prelevato dalla rete nel nodo pozzo t v j ,t x x BS t jt tj t , j FS t Il flusso x si dice ammissibile se per ogni arco (i, j) A 0 xij uij (i, j) A Problema del Massimo Flusso : tra tutti i flussi ammissibili, determinarne uno cui è associato il massimo valore v Esempio di flusso ammissibile xij , uij i 2, 8 2 4 1, 1 6, 7 4, 4 1 j 1, 5 0, 5 6 5, 9 3 4, 4 5 Il vettore x è un flusso : soddisfa i vincoli di conservazione del flusso ai nodi è ammissibile : soddisfa i vincoli di nonnegatività e di capacità Valore del flusso : v = 6 quantità immessa nella sorgente s e prelevata nel pozzo t L’arco (i, j) è detto vuoto se il flusso xij è nullo (coincide con il lower bound) saturo se il flusso xij è pari alla capacità uij (xij coincide con l’upper bound) Nell’esempio l’arco (1, 3) è vuoto gli archi (2, 3), (3, 5) e (4, 6) sono saturi. Formulazione PL del problema di Massimo Flusso Variabili decisionali : xij : flusso sull’arco (i, j) v : quantità immessa nel nodo s e prelevata al nodo t (valore del flusso) Equazioni di conservazione del flusso: • nodo sorgente : flusso totale pervenuto sugli archi entranti + quantità immessa al nodo (deve essere massimizzata) = flusso totale inviato sugli archi uscenti x v x js j , s BS s sj s , j FS s • nodo pozzo : flusso totale inviato sugli archi uscenti + quantità prelevata al nodo (deve essere massimizzata) = flusso totale pervenuto sugli archi entranti j ,t x x v BS t jt tj t , j FS t • nodi di trasferimento i s , t : flusso totale pervenuto sugli archi entranti = flusso totale inviato sugli archi uscenti j ,i x x BS i ji ij i , j FS i i N \ s,t vincoli di conservazione del flusso, associati ai nodi del grafo diversi da s e t : stabiliscono che in ciascun nodo intermedio il flusso entrante deve essere uguale al flusso uscente, garantendo l’assenza di dispersioni e di immissioni Vincoli di nonnegatività e di capacità massima : 0 xij uij (i, j) A Funzione obiettivo : = v Variabile obiettivo : (coincide con la variabile decisionale v) max v s.a x x v js j , s BS s sj s , j FS s j ,i x x 0 j ,t x x v BS i BS t ji jt ij i , j FS i i N \ s,t tj t , j FS t 0 xij u ij i, j A Modello dell’esempio max v s.a x1, 2 x1,3 v x1, 2 x2,3 x2, 4 0 x1,3 x2,3 x3,5 0 x2 , 4 x 4 , 5 x4 , 6 0 x3,5 x4,5 x5, 6 0 x4, 6 x5, 6 v Formulazione alternativa del problema di MF Nella formulazione contenente la variabile decisionale v , la matrice dei coefficienti dei vincoli di conservazione del flusso ai nodi • contiene una colonna in più (la colonna associata alla variabile v) della matrice di incidenza del grafo G : gli elementi della colonna associata a v sono 1 nella riga del nodo s 1 nella riga del nodo t 0 in tutte le altre righe • può quindi essere interpretata come la matrice di incidenza del grafo G’ ottenuto aggiungendo a G l’arco orientato fittizio (t, s), detto arco di ritorno, il cui flusso (xts) è rappresentato dalla variabile v. Grafo G’ : 8 2 4 7 1 4 1 5 9 5 3 sorgente : s = 1 pozzo : t = 6 6 4 5 Si introduce un arco fittizio di ritorno (t, s) con capacità uts = M, con M valore opportunamente grande tale che M sia maggiore del valore della soluzione ottima. max xts i, j A' 0 xij uij x j ,i BS ji i dove A’ = A {(t,s)} x 0 ij i , j FS i iN Il problema che in G è un problema di MF, su G’ è un problema di circolazione (caso particolare di MCF) : • vettore b dei bilanci è nullo (bi = 0, i) : tutti i nodi, compresi s e t, sono di trasferimento (nella rete non c’è immissione o prelievo, ma solo circolazione) • vettore c dei costi è nullo, tranne che per l’arco fittizio (t, s), in cui è 1 (cts = 1, cij = 0 (i, j) (t, s)) : (la minimizzazione di v corrisponde alla massimizzazione del valore v del flusso che transita lungo l’arco (t, s), ossia del flusso inviato, nel grafo originario G, da s a t) In generale : • se dal grafo G, su cui è definito il problema di Massimo Flusso, si ottiene il grafo G’ aggiungendo l’arco fittizio (t, s) • se in G’ si pongono a 0 i deficit dei nodi s e t • se in G’ si definiscono i costi di percorrenza degli archi cts = –1 per l’arco (t, s) , cij = 0 per tutti gli altri archi si ottiene un problema (MCF) di circolazione in cui il flusso totale v sui grafi G e G’ è il flusso dell’arco (t, s) di G’ Nell’esempio, il valore del flusso : v = 6 pari al numero di unità uscenti dalla sorgente s ed entranti nel pozzo t (nel corrispondente problema di circolazione sul grafo G’ è il valore di xts, flusso sull’arco di ritorno) Esempio di problema di massimo flusso Sono dati • un’officina meccanica con M operai (con identiche capacità lavorative) • un insieme J = {1,…, n} di macchine da riparare Ogni macchina da riparare j è caratterizzata dalla terna (pj , rj , dj), dove pj : tempo necessario per ripararla rj : ora in cui il proprietario la consegna all’officina dj : ora in cui la macchina viene ritirata Le riparazioni possono venire interrotte e riprese (prelazione) senza perdite di tempo devono essere eseguite da un operaio alla volta Problema : trovare un assegnamento delle riparazioni agli operai in modo da consegnare le macchine entro l’orario stabilito Il problema può essere risolto per mezzo della ricerca di un flusso massimo su un opportuno grafo. Esempio : M = 3 (n° operai) i dati relativi ai lavori in J sono riportati dalla seguente tabella Ordiniamo gli “eventi” (consegne o ritiri di macchine) in ordine crescente (eliminando le ripetizioni) : 1, 3, 4, 5, 7, 9 Tra due “eventi” consecutivi abbiamo intervalli di tempo di lavoro continuato (Tkl): T13(2 ore), T34(1 ora), T45(1 ora), T57(2 ore), T79(2 ore) Durante l’intervallo Tkl possono venir riparate le macchine che sono arrivate prima di k (rj < k) e vengono ritirate dopo l (dj > l). Costruzione del grafo Insieme dei nodi nodo sorgente s nodo pozzo t un nodo per ogni macchina j J un nodo per ogni intervallo Tkl Insieme degli archi, con rispettive capacità • il nodo sorgente s è collegato ad ogni nodo-macchina j J con un arco di capacità uguale al tempo di riparazione pj • ogni nodo-macchina j J è collegato ad ogni nodo-intervallo Tkl nel quale la macchina può essere riparata, con un arco di capacità (lk) • ogni nodo-intervallo Tkl è collegato al pozzo t, con un arco di capacità pari alla capacità lavorativa dell’officina in tale intervallo cioè M·(lk) 2 1 3 2 1 r2 3 r1 r3 1 3 3 4 4 4 5 d 2 r4 d1 7 d3 9 d4 pj l k 1 2 8.45 ore di lavoro richieste (1 centesimo di ora = 36”) 1.25 s 2.10 1 3 3.60 T45 1 2 3 3 t 6 T57 2 4 Le ore di consegna e ritiro dei lavori sono compatibili con la distribuzione nel tempo delle ore disponibili ? T34 1 2 M·(l k) 6 1 1 1.50 T13 6 2 T79 24 ore di lavoro disponibile (8 ore 3 operai) max v s.a xs ,1 xs , 2 xs ,3 xs , 4 v xs ,1 x1,T34 x1,T45 0 xs , 2 x2,T13 x2,T34 0 xs ,3 x3,T34 x3,T45 x3,T57 0 xs , 4 x4,T57 x4,T79 0 x2,T13 xT13 ,t 0 x1,T34 x2,T34 x3,T34 xT34 ,t 0 x1,T45 x3,T45 xT45 ,t 0 x3,T57 x4,T57 xT57 ,t 0 x4,T79 xT79 ,t 0 xT13 ,t xT34 ,t xT45 ,t xT57 ,t xT79 ,t v 0 xs ,1 1.5 0 xs , 2 1.25 0 xs ,3 2.1 0 xs , 4 3.6 0 x1,T3 4 1 0 x1,T4 5 1 0 x2,T1 3 2 0 x2,T3 4 1 0 x3,T3 4 1 0 x3,T4 5 1 0 x3,T5 7 2 0 x4,T5 7 2 0 x4,T7 9 2 0 xT1 3 ,t 0 xT3 4 ,t 0 xT4 5 ,t 0 xT5 7 ,t 0 xT7 9 ,t 6 3 3 6 6 Soluzione del problema v 8.45 x s ,1 1.5 x s , 2 1.25 x s ,3 2.1 x s , 4 3.6 x1,T34 x1,T45 x 2,T13 x 2,T34 x3,T34 x3,T45 x 4,T57 x 4,T57 x 4,T79 1 0.5 0.25 1 0.1 0 2 2 1.6 xT13 ,t xT34 ,t xT45 ,t xT57 ,t xT79 ,t 0.25 2.1 0.5 4 1.6 2 1 3 2 1 r2 3 r1 r3 pj l k 1.5 1.5 1, 1 1 0.5, 1 0.25, 2 1, 1 2 0.1, 1 1.25 s 1.25 2.1 2.1 3.6 3.6 3 4 3 4 1 3 4 5 d 2 r4 d1 0, 1 2, 2 2, 2 1.6, 2 4 7 d3 9 d4 M·(l k) T13 0.25, 6 T34 T45 2.10, 3 0.50, 3 t 4, 6 T57 1.60, 6 T79 Il flusso sugli archi del grafo così costruito rappresenta la quantità di lavoro che viene svolto. Se il flusso massimo che si può spedire da s a t è uguale alla somma dei tempi di riparazione (= capacità degli archi uscenti da s), allora è possibile riparare tutte le macchine entro i tempi stabiliti. v, valore del flusso x : quantità immessa nel nodo s e prelevata al nodo t v x x sj s , j FS s js j , s BS s 2, 8 2 4 1, 1 6, 7 4, 4 1 1, 5 0, 5 5, 9 3 Ns = { s } 6 4, 4 5 Nt = { 2, 3, 4, 5, t } v j ,t x x BS t jt tj t , j FS t 2, 8 2 4 1, 1 6, 7 4, 4 1 1, 5 0, 5 6 5, 9 3 4, 4 Ns = { s, 2, 3, 4, 5 } 5 Nt = { t } Proprietà di flussi e tagli Taglio s-t del grafo G : partizione dell’insieme N dei nodi in due sottoinsiemi (Ns , Nt) con s Ns e t Nt = N \ Ns Gli archi che attraversano il taglio (che hanno un estremo in Ns e l’altro in Nt) sono a loro volta distinti in due sottoinsiemi: • l’insieme A+(Ns, Nt) degli archi diretti del taglio (uscenti da un nodo di Ns ed entranti in un nodo di Nt) A+(Ns, Nt) = {(i, j) A : i Ns , j Nt } • l’insieme A–(Ns, Nt) degli archi inversi del taglio (uscenti da un nodo di Nt ed entranti in un nodo di Ns) A–(Ns, Nt) = {(i, j) A : i Nt , j Ns } Dato un flusso x, ad ogni taglio s-t è associato il flusso del taglio dato dalla quantità di flusso che percorre gli archi diretti meno la quantità di flusso che percorre gli archi inversi e denotato col simbolo x(Ns, Nt)) x N s , N t x ij i , j A N s , N t x ij i , j A N s , N t (valore netto tra quanto fluisce verso t e quanto ritorna verso s) Ad ogni taglio s-t del grafo G è associata la capacità del taglio data dalla somma delle capacità degli archi diretti e denotata col simbolo u(Ns, Nt) : u N s , N t u ij i , j A N s , N t Teorema x , flusso ammissibile di valore v (Ns, Nt), taglio s-t del grafo G, a) x(Ns, Nt) = v b) x(Ns, Nt) u(Ns, Nt) ossia, il flusso x(Ns, Nt) del taglio (Ns, Nt) • coincide con il valore v del flusso x • non supera la capacità u(Ns, Nt) del taglio Dimostrazione di a) Sommando membro a membro le equazioni di conservazione del flusso relative ai nodi dell’insieme Nt j ,i x x 0 j ,t x x v BS i BS t ji jt ij i , j FS i tj t , j FS t si ottiene v x x ji ij iN t j , i BS i i , j FS i i N t \ t Nella sommatoria sugli archi (j, i) BS(i) : • se j Ns : (j, i) è arco diretto del taglio ((j, i) A+(Ns, Nt)) • se j Nt : l’arco (j, i) ha entrambi gli estremi in Nt Nella sommatoria sugli archi (i, j) FS(i) : • se j Ns : (i, j) è arco inverso del taglio ((i, j) A–(Ns, Nt)) • se j Nt : l’arco (i, j) ha entrambi gli estremi in Nt Gli archi con entrambi gli estremi j e i in Nt si elidono perché compaiono con coefficiente +1 nella sommatoria sugli archi (j, i) BS(i) con coefficiente –1 nella sommatoria sugli archi (i, j) FS(i) Quindi a secondo membro resta la differenza tra la somma dei flussi sugli archi diretti e la somma dei flussi degli archi inversi (flusso del taglio) v x ji j ,i A N s ,Nt x ij i , j A N s ,Nt x N s , N t Dimostrazione di b) Sommando membro a membro 1. i vincoli di capacità per gli archi diretti del taglio 2. i vincoli di nonnegatività per gli archi inversi del taglio si ottengono rispettivamente le seguenti relazioni 1. 2. x x 0 ij i , j A N s , N t ij i , j A N s , N t ij i , j A N s , N t dalle quali segue ossia u x ij i , j A N s , N t x N s , N t u N s , N t x ij i , j A N s , N t u ij i , j A N s , N t Condizioni di ottimalità per MF Siano x : flusso ammissibile v : valore del flusso x Il flusso ammissibile x non è ottimo se riusciamo ad inviare altro flusso dall’origine s alla destinazione t. Tale flusso aggiuntivo è “instradato” lungo un cammino P da s a t. Esempio 1 : 2, 8 2 4 1, 1 6, 7 4, 4 1 1, 5 0, 5 6 5, 9 3 4, 4 5 cammino P su cui inviare nuovo flusso da s a t P = { (1, 2), (2, 4), (4, 5), (5, 6) } capacità del cammino P dato il flusso x : (P, x) = min { 7 6, 8 2, 5 1, 9 5 } = 1 Si ottiene il nuovo flusso ammissibile 3, 8 2 4 1, 1 7, 7 4, 4 1 2, 5 0, 5 6 6, 9 3 4, 4 5 v=7 Esempio 2 : 2, 8 2 4 1, 1 6, 7 4, 4 1 1, 5 0, 5 6 5, 9 3 4, 4 5 cammino P su cui inviare nuovo flusso da s a t P = { (1, 3), (2, 3), (2, 4), (4, 5), (5, 6) } capacità del cammino P dato il flusso x : (P, x) = min { 5 0, 4, 8 2, 5 1, 9 5 } = 4 Si ottiene il nuovo flusso ammissibile 6, 8 2 4 1, 1 6, 7 0, 4 1 5, 5 4, 5 6 v = 10 9, 9 3 4, 4 5 Effettuati contemporaneamente redistribuzione su percorsi diversi del flusso già presente sulla rete invio di 4 unità di flusso aggiuntivo Un cammino P su cui sia possibile inviare nuovo flusso è detto cammino aumentante. I cammini aumentanti non sono necessariamente orientati : possono essere composti • sia da archi che vengono attraversati nel verso del loro orientamento (archi concordi) • sia da archi che vengono attraversati nel verso opposto (archi discordi) P+ : insieme degli archi concordi del cammino P P– : insieme degli archi discordi del cammino P Capacità (P, x) del cammino aumentante P rispetto al flusso x : (P, x) = min { min{uij – xij : (i, j) P+} , min{xij : (i, j) P–} } È la massima quantità di flusso che • aggiunta agli archi concordi di P non produce flussi maggiori delle capacità • sottratta agli archi discordi di P non produce flussi negativi (P, x) = 0 , se almeno uno degli archi concordi è saturo (xij = uij) oalmeno uno degli archi discordi è vuoto (xij = 0) (P, x) > 0 : il cammino è detto AUMENTANTE Se x è un flusso, ossia soddisfa i vincoli di conservazione del flusso, per ogni scalare reale , il vettore x() = x P, definito, componente per componente, dall’operazione di composizione xij xij xij x ij se i, j P se i, j P altrimenti soddisfa i vincoli di conservazione del flusso (è quindi un flusso) e il valore del flusso x() è v + . Se = , con capacità del cammino aumentante P rispetto al flusso x, x( ) = x P soddisfa anche i vincoli di nonnegatività e di capacità : x( ) è flusso ammissibile. Determinazione di un cammino aumentante P rispetto al flusso ammissibile x su un grafo G : si introduce il grafo residuo Gx = ( N, Ax ) rispetto al flusso x, dove Ax i, j : i, j A, xij uij j, i : i, j A, ossia un arco (i, j) non saturo e non vuoto in G (0 < xij < uij) è rappresentato in Gx da una coppia di archi • un arco (i, j) di capacità uij – xij • un arco (j, i) di capacità xij un arco (i, j) vuoto (xij = 0) [ saturo (xij = uij) ] in G è rappresentato in Gx da un arco (i, j) [(j, i)] di capacità uij xij 0 Lemma: per ogni cammino aumentante da s a t rispetto a x in G esiste uno ed un solo cammino orientato da s a t in Gx Mediante il grafo residuo Gx , il concetto di cammini aumentanti è ricondotto al più usuale concetto di cammini orientati : archi di Gx associati ad archi non saturi [non vuoti] di G sono candidati ad appartenere all’insieme P+ degli archi concordi [all’insieme P– degli archi discordi] di un cammino aumentante Un cammino aumentante può essere determinato mediante una visita del grafo residuo Gx a partire da s : possono presentarsi 2 casi • la visita raggiunge t : risulta individuato un cammino aumentante che permette di costruire un nuovo flusso x’ di valore strettamente maggiore al valore di x : si è ottenuta, per costruzione, una prova della non ottimalità di x • la visita non raggiunge t : su N, insieme dei nodi di G, si definisce la partizione ( Ns, Nt ) : Ns : sottoinsieme dei nodi raggiunti dalla visita (contiene s) Nt : sottoinsieme dei nodi non raggiunti dalla visita (contiene t) Quando la visita del grafo residuo Gx non raggiunge il nodo t, il taglio s-t definito dalla partizione (Ns, Nt) con Ns : insieme dei nodi visitati a partire da s Nt = N \ Ns: insieme dei nodi non visitati è tale che v = u(Ns, Nt) In tale taglio s-t, infatti • tutti gli archi di A+ (Ns, Nt) sono saturi • tutti gli archi di A– (Ns, Nt) sono vuoti altrimenti l’algoritmo avrebbe potuto visitare un ulteriore nodo Quindi, dalle definizioni di flusso del taglio e di capacità del taglio, v x N s , N t x ij i , j A N s , N t i , j A N s , N t uij perché tutti gli archi diretti sono saturi u ij i , j A N s , N t x ij i , j A N s , N t 0 perché tutti gli archi inversi sono vuoti u N s , N t segue anche che (Ns, Nt) deve necessariamente essere un taglio di capacità minima tra tutti i tagli del grafo che separano s da t Essendo v = x(Ns, Nt) = u(Ns, Nt), non può esistere un taglio (Ns’, Nt’) del grafo di capacità u’(Ns’, Nt’) strettamente minore di u(Ns, Nt) : infatti, se un tale taglio esistesse, si avrebbe u’(Ns’, Nt’) < x(Ns, Nt) = v : ciò sarebbe in contraddizione con u(Ns, Nt) x(Ns, Nt) (Ns, Nt) (e quindi anche per la partizione (Ns’, Nt’) ) Abbiamo dimostrato che il massimo valore dei flussi ammissibili su G è uguale alla minima capacità dei tagli di G che separano s da t Teorema del Flusso Massimo e del Taglio Minimo o Max flow – Min cut Algoritmo dei cammini aumentanti o di Ford-Fulkerson Procedure Cammini-Aumentanti (G, s, t, x, Ns, Nt) : begin x := 0 ; while Trova-Cammino(G, s, t, x, P, , Ns, Nt) do Aumenta-Flusso(x, P, ) end. Inizializzazione : flusso nullo Procedura Trova-Cammino : cerca di determinare un cammino aumentante P da s a t, dato il flusso x : • è una visita del grafo residuo Gx a partire dall’origine s • insieme a P determina la capacità = (P, x) di P memorizzando, per ciascun nodo j raggiunto nella visita, la capacità dj dell’unico cammino da s a j sull’albero Ts = (Ns, As) determinato fino a quel momento; Avendo ad es. inizializzato la procedura con ds = nil , quando si giunge al nodo j provenendo dal nodo i: • se si è usato l’arco (i, j): dj = min { di , uij – xij } • se si è usato l’arco (j, i): dj = min { di , xji } confronto tra capacità del cammino s-i e capacità residua dell’arco (i, j)) confronto tra capacità del cammino s-i e flusso dell’arco (i, j)) • se il cammino esiste: la procedura Trova-Cammino restituisce vero e fornisce P e = (P, x)) • se il cammino non esiste: la procedura restituisce falso e fornisce un taglio s-t di capacità minima, che certifica l’ottimalità del flusso Procedura Aumenta-Flusso • aggiorna il flusso x inviando sul cammino P la quantità di flusso , ossia implementa l’operazione di composizione x() = x P • ciò è fatto percorrendo il cammino in senso inverso da t a s, per mezzo della funzione predecessore, e modificando il flusso xij θ se i, j P xij θ xij θ se i, j P x altrimenti ij La funzione predecessore della procedura di visita standard non distingue l’orientamento degli archi del grafo originale: pj = i non indica se per andare dal nodo i al nodo j si è usato l’arco (i, j) (percorrendolo secondo il suo orientamento) oppure l’arco (j, i) (percorrendolo nel verso opposto al suo orientamento) Nella Trova-Cammino porre • pj = i : se j viene visitato a partire da i mediante l’arco (i, j) • pj = – i : se j viene visitato mediante l’arco (j, i). Flusso massimo con più sorgenti/pozzi Dati • un insieme S di nodi sorgente • un insieme T di nodi pozzo Individuare il massimo flusso che può essere inviato dai nodi sorgente ai nodi pozzo. Risoluzione 1 (si modifica il grafo e non l’algoritmo): applicare un algoritmo per MF al grafo ampliato G’ = (N’, A’) con • N’ = N {s, t} s e t sono la “super-sorgente” ed il “super-pozzo” • A’ = A { (s, j) : j S} {(i, t) : i T } gli archi che collegano la “super-sorgente” a tutti i nodi in S ed il “super-pozzo” a tutti i nodi in T hanno capacità infinita Risoluzione 2 (si modifica l’algoritmo e non il grafo): la procedura Trova-Cammino implementa una visita a partire dall’insieme di nodi S invece che dal singolo nodo s (inizializza Q = S) La visita è interrotta in uno dei seguenti due casi : • si raggiunge un qualsiasi nodo in T : si è determinato un cammino aumentante da una delle sorgenti ad uno dei pozzi • Q è vuoto : si è determinato un taglio saturo, ossia flusso = capacità, che separa tutte le sorgenti da tutti i pozzi 2) Flusso massimo con più sorgenti i S e pozzi i T aventi capacità finita ui, ossia una massima quantità di flusso che può essere immessa nella o prelevata dalla rete Risoluzione 1 (si modifica il grafo e non l’algoritmo): applicare un algoritmo per MF al grafo ampliato G’ = (N’, A’) dove la capacità degli archi (s, i) e (i, t) viene posta a ui e non a +