Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
10/11/00
1
Rev. 1.2, 10/00
Teoria dei Grafi:Parte II,
Problemi di flussoDaniele Vigo
D.E.I.S. – Università di Bologna
rev. 1.2 – Ottobre 2000
Flussi.2D. Vigo
Problemi di flusso
• Rete (Network): grafo orientato G=(V, A), ogniarco (i, j)∈A ha:• capacità qij > 0
• (eventualmente) costo cij ≥ 0
• Archi immaginati come “condotte” lungo le qualipuò “fluire” del materiale
qij = massimo flusso da vi a vj
• Due vertici speciali s, t ∈V :• s = sorgente, (origine del flusso)• t = terminale, (destinazione del flusso)
10/11/00
2
Flussi.3D. Vigo
Problema MAX–FLOW
Data una rete inviare il massimo flusso da s a t
• Esempio – Rete stradale:• qij espresse in numero di veicoli/ora
• determinare la massima quantità di traffico possibile tradue località (s e t)
• individuare tratti di strada saturati (“colli di bottiglia”)
Flussi.4D. Vigo
Problemi di flusso (2)
• Dato G=(V, A) con capacità qij , un insieme di valori
ξij (= flusso da vi a vj ), (vi, vj)∈A
è un flusso ammissibile da s a t di valore z se:
0 ≤ ξij ≤ qij , ∀ (vi, vj)∈A (a)
(b)Σ ξijvj ∈Γ+(vi )
– Σ ξki =vk∈Γ– (vi )
+ z se vi = s
– z se vi = t
0 se vi ∈V, vi ≠s,t{
Flusso uscente Flusso entrante
10/11/00
3
Flussi.5D. Vigo
Problemi di flusso (3)
Modello LP di max–flow:
max z
subject to
capacità: 0 ≤ ξij ≤ qij ∀ (vi, vj) ∈ A (a)
bilanciamento di flusso:
(b)Σ ξijvj ∈Γ+(vi )
– Σ ξki =vk∈Γ– (vi )
+ z se vi = s
– z se vi = t
0 se vi ∈V, vi ≠s,t{
Flussi.6D. Vigo
Taglio s–t
• Taglio s–t = partizione di V in (V1, V2) :
s∈V1 , t∈V2
• Valore di un taglio s–t :
v1
s t
v2 v4
v3
s
v1
v2
v3
v4
t1
3
1
5
2
1
2
9
1
Valore del taglio = 7
Σ qij(vi , vj): vi∈V1, vj ∈V2
10/11/00
4
Flussi.7D. Vigo
Tagli s–t e flusso
• Dato un flusso ammissibile ξ di valore z il flussoche attraversa ogni Taglio s–t vale z
• Valore del flusso s–t :
v1
s t
v2 v4
v3
s
v1
v2
v3
v4
t1
3
1
5
2
1
2
9
1
Valore del flusso = 4
Σ ξij(vi , vj): vi∈V1, vj ∈V2
3
1
1
2
2
0
1
3
1
– Σ ξji(vj , vi): vi∈V1, vj ∈V2
flusso uscente flusso entrante
Flussi.8D. Vigo
Teorema fondamentale del flusso(Ford–Fulkerson, 1956)
Th. Il valore z del massimo flusso da s a t è ugualeal minimo valore di un taglio s–t.
DIM. (costruttiva):
• z non può ovviamente essere maggiore delvalore del minimo taglio s–t (collo di bottiglia)
⇒ dimostriamo che esiste un flusso di tale valore(ottimo)
10/11/00
5
Flussi.9D. Vigo
Dimostrazione
• Dato un flusso ammissibile ξij , determinare untaglio mediante:
V1 := {s};
while ∃ vi ∈V1 , vj ∉V1 : ξij < qij or ξji > 0 do V1 := V1 ∪{vj };
v1
s t
v2 v4
v3
s
v1
v2
5
3
1
2
2
1
2
9
1
Valore del taglio = 4
3
1
1
2
2
0
1
3
1
v3
v4
t
Flussi.10D. Vigo
Dimostrazione – Caso 1 (1)
• t∈V1 :
tale che: ξij < qij ∀ arco avanti (vi , vj)
ξkl > 0 ∀ arco indietro (vk , vl)
vi vj vls vk t
∃ una catena (sequenza di archi) da s a t
v1
s t
v2 v4
v3
s
v1
v2
5
3
1
2
2
1
2
9
1
2
1
1
1
2
0
1
2
1
v3
t
arco avanti arco indietro
10/11/00
6
Flussi.11D. Vigo
Dimostrazione – Caso 1 (2)
• La sequenza è detta catena aumentante.δ1 = min { (qij –ξij ) : (vi , vj) è avanti}δ2 = min { ξkl : (vk , vl) è indietro}aggiungendo δ al flusso di ogni arco avanti esottraendo δ dal flusso di ogni arco indietro
si ha un nuovo flusso che:• soddisfa (a) ⇐ definizione di δ
δ = min (δ1 , δ2 )
• soddisfa (b) ⇐• ha valore maggiore di δ unità
–δ +δ–δ –δ+δ +δ +δ –δ
Nuovo flusso → nuovo taglio… fino a quando:
Flussi.12D. Vigo
Dimostrazione – Caso 2
• t∉V1 : ⇒
Valore del flusso =
= valore del taglio s–t
• Ad ogni iterazione sul Caso 1 il flusso aumentaalmeno di 1 ⇒ convergenza
• ξij = qij ∀(vi , vj) : vi ∈V1 , vj∈V2
ξkl = 0 ∀(vk , vl) : vk ∈V2 , vl∈V1
⇓=0=qij
⇒ ottimo
Σ ξij(vi , vj): vi∈V1, vj ∈V2
– Σ ξji(vj , vi): vi∈V1, vj ∈V2
10/11/00
7
Flussi.13D. Vigo
Complessità
• Il numero di iterazioni non è definibile ma èlimitato da:
U = upper bound su z
• Esempio:
• Tempo: O(T U)
T = tempo per ciascuna iterazione
U = Σ qijvj ∈Γ+(s)
Flussi.14D. Vigo
Algoritmo
• Si inizia con un flusso ammissibile
ad esempio: ξij = 0 ∀i,j
• lo si incrementa mediante catene aumentanti
• quando non esistono catene aumentanti il flusso è massimo
Per trovare le catene aumentanti si ricorre ad unalgoritmo di etichettamento sui vertici.
10/11/00
8
Flussi.15D. Vigo
Etichette
• Un vertice può essere:• non etichettato;
• etichettato (⇔∈ V1) e non esplorato;
• etichettato ed esplorato (⇔usato per estendere V1).
• Etichetta di un vertice vi :
[+vk ,δ] ⇔ etichettato in avanti
[–vk ,δ] ⇔ etichettato all’indietro
δ = massimo flusso addizionale che si può inviareda s a vi
Flussi.16D. Vigo
Procedure MAX_FLOWbeginfor i:=1 to n do
for j:=1 to n do ξij := 0;
comment ξij = flusso lungo l’arco (vi , vj);
opt := false;
while opt = false do begin
etichetta s con [+s,+∞];
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
if t non è etichettato
then opt := true
elsebegin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ; (i.e. [–y , δ (x)] )
x = y;
until x = s;
cancella tutte le etichette;
end;
end;
comment taglio minimo: V1 ={vi etich} V2 = V \V1
end.
10/11/00
9
Flussi.17D. Vigo
Procedure MAX_FLOW
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
• tempo O(n2)
⇓• totale O(n2 U)
Flussi.18D. Vigo
Esempio
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
Ad ogni iterazione si sceglie il vi
etichettato e non esplorato di indice minimo
10/11/00
10
Flussi.19D. Vigo
Inizializzazione
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
for i:=1 to n do
for j:=1 to n do ξij := 0;
comment ξij = flusso lungo l’arco (vi , vj);
opt := false;
Flussi.20D. Vigo
Prima iterazione (1)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
v1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v1,2]
[+v1,2]
[+v1,2]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
10/11/00
11
Flussi.21D. Vigo
Prima iterazione (2)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
v2
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v1,2]
[+v1,2]
[+v1,2]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v2,2]
[+v2,2]
Flussi.22D. Vigo
Prima iterazione (3)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
v3
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v1,2]
[+v1,2]
[+v1,2]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v2,2]
[+v2,2]
[+v3,2]
10/11/00
12
Flussi.23D. Vigo
Prima iterazione (4)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
[+s,∞]
[+v1,2]
[+v1,2]
[+v1,2]
[+v2,2]
[+v2,2]
[+v3,2]
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
δ* = 2
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
2
2
2
2
2
2
flusso = 2
Flussi.24D. Vigo
Prima iterazione (5)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
δ* = 2
2
2
2
flusso = 2
10/11/00
13
Flussi.25D. Vigo
Seconda iterazione (1)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
v1
[+v1,2]
[+v1,2]
2 2
2
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
Flussi.26D. Vigo
Seconda iterazione (2)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
2 2
2
[+v1,2]
[+v1,2]
v4
[+v4,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
10/11/00
14
Flussi.27D. Vigo
Seconda iterazione (3)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
2 2
2
[+v1,2]
[+v1,2]
v3
[+v4,1]
[–v3,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
Flussi.28D. Vigo
Seconda iterazione (4)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
2 2
2v2
[+v1,2]
[+v1,2]
[+v4,1]
[–v3,1]
[+v2,1]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
10/11/00
15
Flussi.29D. Vigo
Seconda iterazione (5)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
2 2
2
v5
[+v1,2]
[+v1,2]
[+v4,1]
[–v3,1]
[+v2,1]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
Flussi.30D. Vigo
Seconda iterazione (6)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
2 2
2
v6
[+v1,2]
[+v1,2]
[+v4,1]
[–v3,1]
[+v2,1]
[+v6,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
δ* = 2
flusso = 2
10/11/00
16
Flussi.31D. Vigo
Seconda iterazione (7)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 0 0 0 00 0 2 0 0 0 00 0 0 0 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0
[+s,∞]
2 2
2
[+v1,2]
[+v1,2]
[+v4,1]
[–v3,1]
[+v2,1]
[+v6,1]
δ* = 1
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
1
1
1
1
1
1
1111
flusso = 2+1
Flussi.32D. Vigo
Seconda iterazione (8)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
1
1
1
1
flusso = 3
10/11/00
17
Flussi.33D. Vigo
Terza iterazione (1)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v1
[+v1,2]
[+v1,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
flusso = 3
Flussi.34D. Vigo
Terza iterazione (2)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v4
[+v1,2]
[+v1,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
flusso = 3
10/11/00
18
Flussi.35D. Vigo
Terza iterazione (3)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v5
[+v1,2]
[+v1,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;[+v5,1]
[+v5,1]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+s,∞]
flusso = 3
Flussi.36D. Vigo
Terza iterazione (4)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v2
[+v1,2]
[+v1,1]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;[+v5,1]
[+v5,1]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v2,1][+s,∞]
flusso = 3
10/11/00
19
Flussi.37D. Vigo
Terza iterazione (5)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v3
[+v1,2]
[+v1,1]
[+v5,1]
[+v5,2]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v2,1][+s,∞]
flusso = 3
Flussi.38D. Vigo
Terza iterazione (6)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 1
1
1
1
1
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v6
[+v1,2]
[+v1,1]
[+v5,1]
[+v5,2]repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
[+v2,1][+s,∞] [+v6,2]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
flusso = 3
10/11/00
20
Flussi.39D. Vigo
Terza iterazione (7)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 0 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 0 0
2 2
1
δ* = 2
1
1
1
1
[+v1,2]
[+v1,1]
[+v5,1]
[+v5,2]
[+v2,1][+s,∞] [+v6,2]
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
3
2
2
32
3
flusso = 3+2
Flussi.40D. Vigo
Terza iterazione (8)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 3 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 2 00 0 0 0 0 0 30 0 0 0 0 0 0
2 2
1
δ* = 2
3
1
1
1
if t non è etichettato
then opt := true
else begin
δ* := δ ( t ); x := t;
repeat
if etichetta di x è [+y , δ (x)]
then ξyx := ξyx + δ*
else ξxy := ξxy – δ* ;x = y;
until x = s;
cancella tutte le etichette;
end;
2
2
flusso = 5
10/11/00
21
Flussi.41D. Vigo
Quarta iterazione
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 3 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 2 00 0 0 0 0 0 30 0 0 0 0 0 0
2 2
1
δ* = 2
3
1
1
1
2
2
[+s,∞]
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
repeat
sia vi etich [± vk , δ (vi)] e non esplorato;
for each vj ∈Γ+(vi) : vj non et e ξij < qij doetich vj con [+vi , min(δ (vi) , qij – ξij )];
for each vj ∈Γ–(vi) : vj non et e ξji > 0 doetich vj con [–vi , min(δ (vi) , ξji )];
marca vi come esplorato;
until t etichettato o nessun vertice può essere etichettato;
v1
[+v1,1]
flusso = 5
Flussi.42D. Vigo
Soluzione (1)
v1
v5
v2 v3
v4
s
v6
v7
2 1
1
2
2
2
21
2
2
41
t
ξ ij =
0 2 0 1 3 0 00 0 1 0 0 1 00 0 0 1 0 0 20 0 0 0 0 0 00 0 0 0 0 2 00 0 0 0 0 0 30 0 0 0 0 0 0
2 2
1
δ* = 2
2
2
[+s,∞]
comment taglio minimo:
V1 ={vi etich} V2 = V \V1
end.
[+v1,1]
flusso = 5
V1 ={v1 , v4 }
V2 ={v2 , v3 , v5 , v6 , v7 }v1
v4
v5
v2
v6
v3 v7
Gli archi del taglio sono saturi!
2
1
2
taglio
10/11/00
22
Flussi.43D. Vigo
Esempio
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t
Flussi.44D. Vigo
Iterazione 1
[+s,∞]
[+v2,9]
[+v1,5][+s,9]
[+s,9] [+v1,6]
[+v3,5]
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
tv1
s
v2
v3
δ* = 5
flusso = 5
55
5
10/11/00
23
Flussi.45D. Vigo
Iterazione 2
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t55
5
flusso = 5
[+s,∞]
s
[+s,4]
[+s,9]
v1
[+v1,4]
v2
[+v2,9]
v4
[+v4,4]
v3
[+v3,2]
δ* = 2
+ 2
7
2
22
Flussi.46D. Vigo
Iterazione 3
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t75
5
flusso = 7
[+s,∞]
s
2
22
[+s,4]
[+s,7]
v1
[+v1,4]
v2
[+v2,7]
v4
[+v4,2]
v3
v5
[+v5,4]
δ* = 4
+ 44
4
9
10/11/00
24
Flussi.47D. Vigo
Iterazione 4
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t
flusso = 11
[+s,∞]
s
2
22
75
9
4
4
[+s,7]
v2
[+v2,7]
v4
[+v4, 3]
[+v4,2]
v3
[–v3,2]
v1
v5
[+v5,3]
δ* = 3
+ 3
7
355
Flussi.48D. Vigo
Iterazione 5
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t
flusso = 14
[+s,∞]
s
2
55
75
9
7
4
3
[+s,4]
v2
[+v2,4]
v4
[+v4,2]
v3
[–v3,2]
v1
[+v1,2]
v5
[+v5,2]
δ* = 2
+2
96
3
4
77
10/11/00
25
Flussi.49D. Vigo
Iterazione 6
s
v1
9
v2
v3
v4
v6
v5
9
5
9
7
3
96 4
t
flusso = 16
[+s,∞]
s
4
77
73
9
9
6
3v2 v4
[+s,2] [+v2,2]
4
9
3
Taglio minimo
Archi saturi!
Flussi.50D. Vigo
Altri problemi di flusso (1)
A) Sorgenti e terminali multipli
• Dati:
G=(V, A) con capacità qij
S, T ⊂ V S ∩ T = ∅trasmettere il massimo flusso dalla totalità deivertici di S alla totalità dei vertici di T
10/11/00
26
Flussi.51D. Vigo
S
T
Soluzione (1)
• Nuovo grafo G’=(V’, A’) :
V’ := V ∪ { vs , vt }
vs vt
G
A’ := A ∪ { (vs , vi) : vi ∈ S } ∪ { (vj , vt) : vj ∈ T }
Flussi.52D. Vigo
Soluzione (2)
• Si trova il flusso massimo da vs a vt
• Se non ci sono altri vincoli:
qsi = qjt = + ∞ ∀ i, j
altrimenti:
qsi = limite di produzione per sorgente vi
qjt = limite di produzione per terminale vj
10/11/00
27
Flussi.53D. Vigo
Altri problemi di flusso (2)
B) Capacità anche sui vertici
• Dati:
G=(V, A) con qij = capacità arco (vi , vj)
pi = capacità vertice vi
s, t ∈ V
trasmettere il massimo flusso da s a t
• flusso totale entrante in vi ≤ pi , ∀ vi ∈ V :
Σ ξij ≤ pi ∀ vi ∈ Vvk∈Γ–(vi)
Flussi.54D. Vigo
Soluzione (1)
• Nuovo grafo G’=(V’, A’ ∪ A” ) :
V’ := { vi+ : vi ∈ V } ∪ { vi
– : vi ∈ V }A’ := { (vi
– , vj
+ ) : (vi , vj) ∈ A } con capacità di (vi– , vj
+ ) = qij
A” := { (vi+
, vi– ) : vi ∈ V } con capacità di (vi
+ , vi
– ) = pi
s
v2
v3
t
p2
p3
p4
p1
q24q12
q23
q34q13
p2
p3
p4p1
q24q12
q23
q34q13
s+ s –
v2+ v2
–
v3+ v3
–
t+ t –
10/11/00
28
Flussi.55D. Vigo
Soluzione (2)
• Si trova il flusso massimo da s+ a t –
• Il flusso totale entrante in un vertice vi+ deve
viaggiare lungo l’arco (vi+
, vi– )
⇓
rispetta il vincolo :
Σ ξij ≤ pi ∀ vi ∈ Vvk∈Γ–(vi)