@let@token mac0328 algoritmos em grafoscoelho/mac0328-2011/aulas/aula25.pdfcaminho de aumento um...
TRANSCRIPT
![Page 1: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/1.jpg)
Melhores momentos
AULA 24
![Page 2: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/2.jpg)
Caminho de aumento
Um caminho de aumento (= augmenting path) éum pseudo-caminho do vértice inicial ao �nal onde:
I os arcos diretos não estão cheios eI os arcos inversos não estão vazios.
![Page 3: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/3.jpg)
Exemplo
0
1
2
3
4
5
6
71/2
2/3
1/21/1
1/1
1/1
0/2
1/1
1/1
2/3
0/1
1/1
3/3
1/1
arcos diretos arco inverso
2/2
![Page 4: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/4.jpg)
Enviar �uxo através de caminhos de aumento
A operação de enviar d unidades de �uxo ao longode um caminho de aumento consiste de:
I para cada arco direto, some d ao �uxoI para cada arco inverso, subtraia d do �uxo.
![Page 5: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/5.jpg)
Exemplo
0
1
2
3
4
5
6
71/2
2/3
1/21/1
1/1
1/1
0/2
1/1
1/1
2/3
0/1
1/1
3/3
1/1
arcos diretos arco inverso
2/2
![Page 6: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/6.jpg)
Exemplo
0
1
2
3
4
5
6
72/2
2/3
2/20/1
1/1
1/1
1/2
1/1
1/1
2/3
1/1
1/1
3/3
1/1
arcos diretos arco inverso
2/2
![Page 7: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/7.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
0/7
0/5
0/5
0/2
0/3
0/9
0/1
0/1
0/6
int(f) = 0 f(a)/c(a)
![Page 8: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/8.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
0/7
0/5
0/5
0/2
0/3
0/9
0/1
0/1
0/6
int(f) = 0 f(a)/c(a)
![Page 9: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/9.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
1/7
0/5
1/5
0/2
0/3
0/9
0/1
1/1
0/6
int(f) = 1 f(a)/c(a)
![Page 10: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/10.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
1/7
0/5
1/5
0/2
0/3
0/9
0/1
1/1
0/6
int(f) = 1 f(a)/c(a)
![Page 11: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/11.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
2/7
0/5
1/5
0/2
0/3
0/9
1/1
1/1
1/6
int(f) = 2 f(a)/c(a)
![Page 12: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/12.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
0/3
2/7
0/5
1/5
0/2
0/3
0/9
1/1
1/1
1/6
int(f) = 2 f(a)/c(a)
![Page 13: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/13.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
1/3
2/7
1/5
1/5
1/2
0/3
0/9
1/1
0/1
1/6
int(f) = 3 f(a)/c(a)
![Page 14: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/14.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
1/3
2/7
1/5
1/5
1/2
0/3
0/9
1/1
0/1
1/6
int(f) = 3 f(a)/c(a)
![Page 15: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/15.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
2/3
2/7
1/5
1/5
1/2
1/3
0/9
0/1
0/1
1/6
int(f) = 4 f(a)/c(a)
![Page 16: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/16.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
2/3
2/7
1/5
1/5
1/2
1/3
0/9
0/1
0/1
1/6
int(f) = 4 f(a)/c(a)
![Page 17: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/17.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
2/3
2/7
1/5
1/5
1/2
3/3
0/9
0/1
0/1
3/6
int(f) = 6 f(a)/c(a)
![Page 18: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/18.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
2/3
2/7
1/5
1/5
1/2
3/3
0/9
0/1
0/1
3/6
int(f) = 6 f(a)/c(a)
![Page 19: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/19.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
2/7
2/5
1/5
1/2
3/3
1/9
0/1
0/1
3/6
int(f) = 7 f(a)/c(a)
![Page 20: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/20.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
2/7
2/5
1/5
1/2
3/3
1/9
0/1
0/1
3/6
int(f) = 7 f(a)/c(a)
![Page 21: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/21.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
3/7
2/5
1/5
1/2
3/3
1/9
1/1
0/1
4/6
int(f) = 8 f(a)/c(a)
![Page 22: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/22.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
3/7
2/5
1/5
1/2
3/3
1/9
1/1
0/1
4/6
int(f) = 8 f(a)/c(a)
![Page 23: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/23.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
3/7
3/5
2/5
2/2
3/3
1/9
1/1
0/1
4/6
int(f) = 9 f(a)/c(a)
![Page 24: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/24.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
3/7
3/5
2/5
2/2
3/3
1/9
1/1
0/1
4/6
int(f) = 9 f(a)/c(a)
![Page 25: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/25.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
4/7
3/5
3/5
2/2
3/3
1/9
1/1
1/1
4/6
int(f) = 10 f(a)/c(a)
![Page 26: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/26.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
4/7
3/5
3/5
2/2
3/3
1/9
1/1
1/1
4/6
int(f) = 10 f(a)/c(a)
![Page 27: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/27.jpg)
Método de Ford-Fulkerson
0
2
3
4
5
1
3/3
4/7
3/5
3/5
2/2
3/3
1/9
1/1
1/1
4/6
int(f) = 10 f(a)/c(a)
![Page 28: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/28.jpg)
Método dos caminhos de aumento
O método é iterativo. Cada iteração começa comuma �uxo f que respeita as capacidades.
No início da primeira iteração f é o �uxo nulo.
Cada iteração consiste em:
Caso 1: não existe um caminho de aumentoDevolva f e pare
Caso 2: existe uma caminho de aumentoSeja d a capacidade residual de umcaminho de aumento P
Seja f′ o �uxo obtido ao enviarmos dunidades de �uxo ao longo de PComece nova iteração com f′ no papelde f
![Page 29: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/29.jpg)
Relações invariantes
No início de cada iteração temos que:
(i0) f é inteiro;
(i1) f é um �uxo;
(i2) f respeita c.
![Page 30: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/30.jpg)
Capacidade de um corte
Numa rede capacitada, a capacidade de um corte(S,T) é a soma das capacidades dos arcos diretos docorte.Exemplo: corte de capacidade 18
0
2
3
4
5
1
3
7
5
5
2
3
9
1
1
6
![Page 31: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/31.jpg)
Lema da dualidade
Se f é um �uxo que respeita c e (S, T) é um corteentão
intensidade de f ≤ capacidade de (S,T).
Exemplo: int(f) = 10 ≤ 24 = c(S, T).
2
3
4
1
5
0
T
3/34/7
3/5
f(a)/c(a)
3/5
2/2
3/3
1/9
1/1
1/1
4/6
![Page 32: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/32.jpg)
Conseqüência
Se f é um �uxo que respeita c e (S, T) é um cortetais que intensidade de f = capacidade de (S,T).então f é um �uxo de máximo e (S, T) é um corte decapacidade mínima.
2
3
4
1
5
0
T
3/34/7
3/5
f(a)/c(a)
3/5
2/2
3/3
1/9
1/1
1/1
4/6
![Page 33: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/33.jpg)
Conseqüência
Se f é um �uxo que respeita c e (S, T) é um cortetais que intensidade de f = capacidade de (S,T).então f é um �uxo de máximo e (S, T) é um corte decapacidade mínima.
2
3
4
1
5
0
T
3/34/7
3/5
f(a)/c(a)
3/5
2/2
3/3
1/9
1/1
1/1
4/6
![Page 34: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/34.jpg)
Fluxo é máximo?
0
1
2
3
4
5
6
7
1/31/1
0/2
1/1
1/1
2/3
0/1
1/1
3/4
1/1
iten(f ) = 5 f(a)/c(a)
2/2
1/2
2/3
1/1
1/1
![Page 35: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/35.jpg)
Caminho de aumento
0
1
2
3
4
5
6
71/2
2/3
1/31/1
1/1
1/1
0/2
1/1
1/1
2/3
0/1
1/1
3/4
1/1
iten(f ) = 5 f(a)/c(a)
2/2
![Page 36: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/36.jpg)
E agora? Fluxo é máximo?
0
1
2
3
4
5
6
7
2/30/1
1/2
1/1
1/1
2/3
1/1
1/1
3/4
1/1
iten(f ) = 6 f(a)/c(a)
2/2
2/2
2/3
1/1
1/1
![Page 37: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/37.jpg)
Fluxo é máximo!
0
1
2
3
4
5
6
7
2/30/1
1/2
1/1
1/1
2/3
1/1
1/1
3/4
1/1
iten(f ) = 6 f(a)/c(a)
2/2
2/2
2/3
1/1
1/1
![Page 38: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/38.jpg)
Fluxo é máximo!
0
1
2
3
4
5
6
7
2/30/1
1/2
1/1
1/1
2/3
1/1
1/1
3/4
1/1
iten(f ) = 6 f(a)/c(a)
2/2
2/2
2/3
1/1
1/1
![Page 39: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/39.jpg)
Teorema do �uxo máximo e corte mínimo
O teorema foi demonstrado por Ford e Fulkerson e,independentemente, por Kotzig.
Para quaisquer dois vértices s e t em uma redecapacidade com função-capacidade c tem-se que
max{int(f) : f é �uxo que respeita c}=min{c(S, T) : (S, T) é um corte}.
![Page 40: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/40.jpg)
Teorema do �uxo máximo e corte mínimo
O teorema foi demonstrado por Ford e Fulkerson e,independentemente, por Kotzig.
Em qualquer rede capacitada, a intensidade deum �uxo máximo é igual à capacidade de um
corte mínimo.
![Page 41: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/41.jpg)
AULA 25
![Page 42: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/42.jpg)
Estrutura de dados para redes de �uxo
S 22.1
![Page 43: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/43.jpg)
Listas de adjacência
Redes serão representadas por listas de
adjacência.Cada arco v-w será representado por um nó na listaencadeada adj[v].Além do campo w, esse nó terá os campos
I cap para armazenar a capacidade do arco v-w eI flow para armazenar o valor do �uxo no arco.I dup para armazenar . . .
![Page 44: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/44.jpg)
Estrutura node
typedef struct node *link;
struct node {Vertex w;
link next;int cap;
int flow;
link dup;
};
![Page 45: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/45.jpg)
Construtor
link
NEW (Vertex w, int cap, int flow, link next) {link x = malloc(sizeof*x);x->w = w;
x->cap = cap;
x->flow = flow;
x->next = next;
return x;
}
![Page 46: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/46.jpg)
Flownet
struct flownet {int V,A;
link *adj;Vertex s,t;
};
typedef struct flownet *Flownet;
![Page 47: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/47.jpg)
Flowinit
Flownet FLOWinit (int V) {Vertex v;
Flownet G = malloc(sizeof *G);G->adj = malloc(V * sizeof(link));G->V = V;
G->A = 0;for (v = 0;v < V;v++) G->adj[v] = NULL;
return G;
}
![Page 48: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/48.jpg)
FLOWinsert
Insere um arco v-w, de capacidade cap e �uxo nulona rede G.
void
FLOWinsertA (Flownet G,Vertex v,Vertex w,int
cap) {if (v == w || cap < 0) return;G->adj[v] = NEW(w,cap,0,G->adj[v]);G->adj[v]->dup = NULL;
G->A++;}
![Page 49: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/49.jpg)
Redes de �uxo expandidas
É difícil procurar caminhos de aumento numa rede de�uxo porque esses caminhos podem ter arcosinversos.
Para contornar essa di�culdade, vamos introduzir oconceito de rede de �uxo expandida.
Para cada arco v-w, acrescente à rede um arco w-v.
Diremos que os novos arcos são arti�ciais e osantigos são originais
A capacidade arco arti�cial w-v será o negativo dacapacidade do correspondente arco original v-w.
![Page 50: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/50.jpg)
Redes expandidas
O �uxo em cada arco arti�cial será o negativo do�uxo no correspondente arco original.O campo dup nos nós será usado para apontar de umarco original para o correspondente arco arti�cial evice-versa.
Para cada o arco arti�cial teremos
cap ≤ flow ≤ 0
e para cada o arco original teremos
0 ≤ flow ≤ cap
![Page 51: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/51.jpg)
Expand
Função que transforma uma rede de �uxo nacorrespondente rede de �uxo expandida:
void Expand (Flownet G) {
Vertex v,w;
int cap, flow;
link po, pa;
for (v = 0;v < G->V; v++)for(po=G->adj[v];po!=NULL;po=po->next)
po->dup = NULL;
![Page 52: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/52.jpg)
Expand
Função que transforma uma rede de �uxo nacorrespondente rede de �uxo expandida:
void Expand (Flownet G) {Vertex v,w;
int cap, flow;
link po, pa;
for (v = 0;v < G->V; v++)for(po=G->adj[v];po!=NULL;po=po->next)
po->dup = NULL;
![Page 53: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/53.jpg)
for (v = 0;v < G->V;v++)for(po=G->adj[v];po!=NULL;po=po->next)
if (po->dup== NULL) {w = po->w;
cap = po->cap;
flow = po->flow;
G->adj[w] = pa=NEW(v,-cap,-flow,G->adj[w]);
po->dup= pa;
pa->dup= po;
}}
![Page 54: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/54.jpg)
flowV
flowV calcula o saldo de �uxo no vértice v de umarede de �uxo expandida G.
int flowV (Flownet G, Vertex v) {
link p;
int x = 0;for (p = G->adj[v]; p != NULL; p = p->next)
x += p->�ow;return x;
}
A intensidade do �uxo é flowV(G, G->s).
![Page 55: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/55.jpg)
flowV
flowV calcula o saldo de �uxo no vértice v de umarede de �uxo expandida G.
int flowV (Flownet G, Vertex v) {link p;
int x = 0;for (p = G->adj[v]; p != NULL; p = p->next)
x += p->�ow;return x;
}
A intensidade do �uxo é flowV(G, G->s).
![Page 56: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/56.jpg)
Rede expandida e capacidades residuais
Um caminho de s a t na rede de �uxo expandidacorresponde a um caminho de aumento na rede de�uxo original se
I cap ≥ 0 implica em flow < cap eI cap < 0 implica em flow < 0
para todo arco do caminho.A capacidade residual de um arco original da redeexpandida é
cap− flow
e a capacidade residual de um arco arti�cial é
−flow.
![Page 57: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/57.jpg)
Algoritmo de �uxo máximo: versão shortest
augmenting paths
S 22.2
![Page 58: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/58.jpg)
Camada externa da implementação
Um caminho de aumento pode ser representado porum caminho de capacidade residual positiva na redeexpandida.
Para encontrar um tal caminho, podemos usar oalgoritmo de busca em largura como modelo.
Na implementação a seguir, o vetor parnt seráusado de maneira um pouco diferente: ao percorrerum arco v-w da rede expandida, o código fará
parnt[w] = p,
sendo p o endereço do nó na lista adj[v] para o qualp->w vale w.
O "pai" v de w será então parnt[w]->dup->w.
![Page 59: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/59.jpg)
MaxFlow
Recebe uma rede capacitada (não-expandida) G ecalcula um �uxo máximo.void MaxFlow (Flownet G) {
Vertex s = G->s, t= G->t, x;
int d;link parnt[maxV];Expand(G);while (1) {
d = AugmentingPath(G,parnt);if (d == 0) break;for(x=t;x!=s;x=parnt[x]->dup->w){
parnt[x]->flow += d;
parnt[x]->dup->flow-= d;
}}
}
![Page 60: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/60.jpg)
MaxFlow
Recebe uma rede capacitada (não-expandida) G ecalcula um �uxo máximo.void MaxFlow (Flownet G) {
Vertex s = G->s, t= G->t, x;
int d;link parnt[maxV];Expand(G);while (1) {
d = AugmentingPath(G,parnt);if (d == 0) break;for(x=t;x!=s;x=parnt[x]->dup->w){
parnt[x]->flow += d;
parnt[x]->dup->flow-= d;
}}
}
![Page 61: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/61.jpg)
Shortest augmenting paths
Para encontrar um caminho de aumento que tenhanúmero mínimo de arcos, basta aplicar o algoritmo debusca em largura à rede de �uxo expandida.
Esta é uma implementação shortest-augmenting-pathda função AugmentingPath.
#de�ne ShrtstAugmPath AugmentingPath
A macro RC recebe um link p e calcula a capacidaderesidual do arco da rede de �uxo expandida que vaido vértice p->dup->w ao vértice p->w.#de�ne RC(p) (p->cap >= 0 ? p->cap - p->flow : -p->flow)
![Page 62: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/62.jpg)
ShrtstAugmPath
A função ShrtstAugmPath devolve 0 se não hácaminho de aumento.
Caso contrário, devolve a capacidade residual d deum caminho de aumento na rede expandida earmazena o caminho no vetor parnt.
A função supõe que todas as capacidades sãomenores que M.
int ShrtstAugmPath(Flownet G,link parnt[]) {
Vertex s= G->s,t= G->t,v,w;
int lbl[maxV],d;link p;
for (v = 0;v < G->V;v++) lbl[v] = -1;
QUEUEinit(G->V);
![Page 63: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/63.jpg)
ShrtstAugmPath
A função ShrtstAugmPath devolve 0 se não hácaminho de aumento.
Caso contrário, devolve a capacidade residual d deum caminho de aumento na rede expandida earmazena o caminho no vetor parnt.
A função supõe que todas as capacidades sãomenores que M.
int ShrtstAugmPath(Flownet G,link parnt[]) {Vertex s= G->s,t= G->t,v,w;
int lbl[maxV],d;link p;
for (v = 0;v < G->V;v++) lbl[v] = -1;
QUEUEinit(G->V);
![Page 64: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/64.jpg)
lbl[s] = 0;QUEUEput(s);while (!QUEUEempty()) {
v = QUEUEget();for(p=G->adj[v];p!=NULL;p=p->next){
w =p->w;if(RC(p)>0 && lbl[w]==-1){
lbl[w] = 0;parnt[w] = p;
QUEUEput(w);}
}}
![Page 65: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/65.jpg)
if (lbl[t] == -1) return 0;d = M;
for (w = t; w != s; w = p->dup->w){p = parnt[w];if (d > RC(p)) d = RC(p);
}return d;
}
![Page 66: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/66.jpg)
Número de iterações
O número de caminhos de aumento usados pelacombinação de MaxFlow com ShrtstAugmPath
nunca é maior que VA/2, sendo V o número devértices e A o número de arcos originais.
![Page 67: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/67.jpg)
Consumo de tempo
O consumo de tempo de MaxFlow comShrtstAugmPath é O(VA(V+ A)), sendo V onúmero de vértices e A o número de arcos
originais.
![Page 68: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/68.jpg)
Considerações �nais
![Page 69: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/69.jpg)
MAC0328
MAC0328 Algoritmos em grafos foi:
I uma disciplina introdutória em projeto eanálise de algoritmos sobre grafos
I um laboratório de algoritmos sobre grafos
![Page 70: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/70.jpg)
MAC0328
MAC0328 combinou técnicas de
I programaçãoI estruturas de dadosI análise de algoritmosI teoria dos grafos
para resolver problemas sobre grafos.
![Page 71: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/71.jpg)
Pré-requisitos
O pré-requisito o�cial de MAC0328 era
I MAC0122 Princípios de Desenvolvimento deAlgoritmos.
No entanto, era recomendável que já tivessemcursado
I MAC0211 Laboratório de programação; eI MAC0323 Estruturas de dados
Costuma ser conveniente cursar MAC0328simultaneamente com
I MAC0338 Análise de algoritmos.
![Page 72: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/72.jpg)
Principais tópicos foram
I digrafos e grafos
I estruturas de dados para digrafos e grafos
I busca em profundidadeI caminhos e ciclos
I �orestas e árvores
I grafos bipartidos
I digrafos acíclicos
I ordenação topológica
I pontes e ciclos
I grafos conexos e componentes
I articulações e grafos biconexos
I digrafos fortemente conexos
I busca em larguraI caminhos mínimos
I árvores geradoras mínimas
I �uxo em redes
![Page 73: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao](https://reader033.vdocuments.pub/reader033/viewer/2022042204/5ea58c3d2202e75635410ab6/html5/thumbnails/73.jpg)
FIM