Você está na página 1de 166

Fluxo em Redes

http://www.ime.usp.br/~pf/flows/

Paulo Feofiloff
Departamento de Cincia da Computao
Instituto de Matemtica e Estatstica
Universidade de So Paulo

//

Prefcio
Estas notas de aula foram escritas em 2002 para as disciplinas de Otimizao Combinatria (MAC5781 e MAC0325) no IMEUSP (Instituto de Matemtica e Estatstica da
Universidade de So Paulo). As notas foram baseadas em dois livros:
AhujaMagnantiOrlin [AMO93], que chamaremos de AMO, e
CormenLeisersonRivestStein [CLRS01], que chamaremos de CLRS.
Tambm serviu de referncia o excelente livro de Cook, Cunningham, Pulleyblank e Schrijver [CCPS98], que chamaremos de CCPS.
Ocasionalmente citamos tambm os nmeros de captulos do CLR [CLR91], que a
primeira edio do CLRS.
Ao contrrio do que fazem os livros citados, estas notas identificam as invariantes dos
algoritmos, permitindo assim uma anlise mais rigorosa de sua correo.

Sumrio
1

Programao linear: resumo

1.1

O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Dualidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3

Um caso particular importante . . . . . . . . . . . . . . . . . . . . . . . . .

10

Conceitos bsicos de redes

11

2.1

Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

2.2

Matriz de incidncias e matriz de adjacncias . . . . . . . . . . . . . . . . .

12

2.3

Passeios, caminhos, ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.4

Funo-predecessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.5

Grafo de predecessores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

2.6

Cortes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

2.7

Redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

2.8

Complexidade de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . .

16

Caminhos e ciclos

18

Algoritmos de busca

19

3.1

Condies de inexistncia . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

3.2

Algoritmo genrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

3.3

Algoritmo de busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

3.4

Busca em largura e busca em profundidade . . . . . . . . . . . . . . . . . .

24

FEOFILOFF

FLUXO EM REDES

15/11/2013

3.5

Verso capacitada do problema . . . . . . . . . . . . . . . . . . . . . . . .

24

3.6

Busca inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

Ciclos e ordem topolgica

27

4.1

Condies de inexistncia . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

4.2

Ordem topolgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

4.3

Um algoritmo de ordenao topolgica . . . . . . . . . . . . . . . . . . . .

28

4.4

Um algoritmo melhor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

4.5

Apndice: algoritmo genrico . . . . . . . . . . . . . . . . . . . . . . . . . .

30

Caminhos de comprimento mnimo

32

5.1

Condies de existncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

5.2

Algoritmo do caminho mais curto . . . . . . . . . . . . . . . . . . . . . . .

33

5.3

Potencial timo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

5.4

Caminhos mnimos invertidos . . . . . . . . . . . . . . . . . . . . . . . . . .

36

Caminhos de custo mnimo

39

6.1

O problema dos caminhos mnimos . . . . . . . . . . . . . . . . . . . . . .

39

6.2

Redes sem ciclos negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

6.3

Condies de otimalidade: funo potencial . . . . . . . . . . . . . . . . . .

41

6.4

Algoritmo genrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

6.5

Algoritmo de Ford-Bellman . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

6.6

Implementao FIFO do Ford-Bellman . . . . . . . . . . . . . . . . . . . . .

47

6.7

Apndice: Custos reduzidos . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

Ciclos negativos

51

7.1

Condies de inexistncia . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

7.2

Algoritmo genrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

7.3

Algoritmo de Ford-Bellman . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

7.4

Implementao FIFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

FEOFILOFF

II

FLUXO EM REDES

15/11/2013

Caminhos mnimos sob custos no negativos

57

8.1

Condies de otimalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

8.2

Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

8.3

Implementao de Dial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

8.4

Implementao com heap . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

8.5

Apndice: Reverse-Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

Caminhos mnimos em redes acclicas

66

9.1

66

Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Fluxo mximo entre dois ns

10 Fluxo: introduo

68
69

10.1 Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

10.2 Circulao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

10.3 Fluxo entre dois ns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

11 Fluxo mximo

75

11.1 Problema do fluxo mximo . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

11.2 Condies de otimalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

11.3 Teorema do fluxo mximo e corte mnimo . . . . . . . . . . . . . . . . . . .

77

12 Redes simtricas e pseudofluxo

85

12.1 Fluxo em redes simtricas . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

12.2 Pseudofluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

12.3 Pseudofluxo versus fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

12.4 Caminhos de incremento . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88

13 Algoritmo de Ford-Fulkerson

89

13.1 Um esboo do algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

13.2 Algoritmo de Ford e Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . .

90

FEOFILOFF

FLUXO EM REDES

15/11/2013

13.3 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

13.4 Fluxo mximo e caminho de incremento . . . . . . . . . . . . . . . . . . . .

92

14 Fluxo: capacity-scaling

94

14.1 Grandes incrementos de fluxo . . . . . . . . . . . . . . . . . . . . . . . . . .

94

14.2 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

15 Fluxo: algoritmo de Edmonds-Karp

97

15.1 Caminhos de incremento mnimos . . . . . . . . . . . . . . . . . . . . . . .

97

15.2 Nmero de iteraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

15.3 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100


16 Fluxo: algoritmo de Dinits

102

16.1 Uma rotina auxiliar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102


16.2 Algoritmo de Dinits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
16.3 Nmero de incrementos de fluxo . . . . . . . . . . . . . . . . . . . . . . . . 105
16.4 Consumo de tempo do algoritmo . . . . . . . . . . . . . . . . . . . . . . . . 106
17 Preflow-push: algoritmo bsico

110

17.1 Pr-fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110


17.2 Algoritmo preflow-push bsico . . . . . . . . . . . . . . . . . . . . . . . . . 111
17.3 Nmero de relabels e pushes . . . . . . . . . . . . . . . . . . . . . . . . . . 113
17.4 Consumo de tempo do algoritmo . . . . . . . . . . . . . . . . . . . . . . . . 116
18 Preflow-push: implementao FIFO

120

18.1 Algoritmo FIFO Preflow-push . . . . . . . . . . . . . . . . . . . . . . . . . . 120


18.2 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

III

Fluxo vivel de custo mnimo

19 Fluxo vivel

124
125

19.1 Ns com demandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

FEOFILOFF

FLUXO EM REDES

15/11/2013

19.2 Condies de viabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126


19.3 Teorema de Gale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
19.4 Algoritmo do fluxo vivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
20 Fluxo vivel de custo mnimo: introduo

132

20.1 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132


20.2 Condio de otimalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
20.3 Folgas complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
21 Fluxo em redes simtricas

137

21.1 Redes antissimtricas e custo no negativo . . . . . . . . . . . . . . . . . . 137


21.2 Redes simtricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
21.3 Custo antissimtrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
21.4 Folgas complementares em redes simtricas . . . . . . . . . . . . . . . . . . 139
22 Algoritmo de Klein

141

22.1 Algoritmo de Klein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141


22.2 Custo mnimo e ciclo negativo . . . . . . . . . . . . . . . . . . . . . . . . . . 143
22.3 Teorema do fluxo vivel de custo mnimo . . . . . . . . . . . . . . . . . . . 143
23 Algoritmo de Jewell

145

23.1 O algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145


23.2 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
24 Algoritmo Cost Scaling

148

24.1 Folgas complementares relaxadas . . . . . . . . . . . . . . . . . . . . . . . . 148


24.2 O algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
24.3 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
25 Algoritmo do ciclo de custo mdio mnimo

152

25.1 Ciclos de custo mdio mnimo . . . . . . . . . . . . . . . . . . . . . . . . . . 152


25.2 Ciclo de custo mdio mnimo: programao dinmica . . . . . . . . . . . . 154

FEOFILOFF

FLUXO EM REDES

15/11/2013

25.3 Algoritmo para fluxo vivel de custo mnimo . . . . . . . . . . . . . . . . . 155


25.4 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
26 Circulaes

157

26.1 Circulaes com delimitaes inferiores . . . . . . . . . . . . . . . . . . . . 157


26.2 Apndice: Fluxos com delimitaes inferiores . . . . . . . . . . . . . . . . . 158

Captulo 1

Programao linear: resumo


O assunto central de MAC5781 e MAC0325 o problema do fluxo de custo mnimo em
redes. Esse problema um caso particular do problema de programao linear. Portanto,
convm fazer um rpido resumo do assunto, principalmente para introduzir o conceito
de dualidade, que o pano de fundo de todos os captulos subsequentes.

1.1

O problema

Eis um problema tpico de programao linear: encontrar nmeros x1 , x2 , x3 , x4 , x5 que


minimizem
51x1 + 52x2 + 53x3 + 54x4 + 55x5
enquanto satisfazem as restries
11x1 + 12x2 + 13x3 + 14x4 + 15x5
21x1 + 22x2 + 23x3 + 24x4 + 25x5
31x1 + 32x2 + 33x3 + 34x4 + 35x5
41x1 + 42x2 + 43x3 + 44x4 + 45x5

=
=
=
=

16
26
36
46

e x1 0, x2 0, x3 0, x4 0, x5 0.
( claro que o nmero de linhas poderia ser diferente de 4 e o nmero de colunas diferente de 5. claro tambm que os valores dos coeficientes nada tm de especial: se
substituimos cada um por um nmero racional qualquer, positivo ou negativo, ainda
teremos um problema de programao linear.)
Em notao matricial, o problema pode ser escrito assim: dada qualquer matriz M e
quaisquer vetores b e c, encontrar um vetor x que

FEOFILOFF

FLUXO EM REDES

15/11/2013

minimize cx
sob as restries
M x = b e x 0.

(1.1)

Infelizmente, a terminologia tradicional abusa da palavra soluo e diz que uma soluo vivel qualquer vetor x que satisfaz as restries M x = b e x 0. Uma soluo
vivel x tima se x minimiza cx.
O problema vivel se admite ums soluo vivel. O problema ilimitado se for vivel
mas cx no tiver mnimo.

1.2

Dualidade

O dual do problema acima consiste em encontrar um vetor y que


maximize yb
sob as restries
yM c.

(1.2)

Os conceitos de soluo vivel, problema vivel e problema ilimitado so definidos da


maneira bvia.
A relao bsica entre os problemas (1.1) e (1.2) a desigualdade conhecida como teorema fraco da dualidade: para qualquer x que satisfaz as restries do primeiro problema e qualquer y que satisfaz as restries do segundo,
yb cx .

(1.3)

A prova dessa desigualdade muito simples e muito instrutiva:


yb = y(M x) = (yM )x cx .
Segue da imediatamente que se cx = yb ento x soluo tima do problema (1.1) e y
soluo tima do problema (1.2). (Em particular, para mostrar que uma soluo vivel x
tima, basta exibir uma soluo vivel y tal que cx = yb.) A recproca dessa observao
garantida pelo teorema forte da programao linear:
Teorema 1.1 Se os problemas (1.1) e (1.2) so viveis ento existe uma soluo vivel x
de (1.1) e uma soluo vivel y de (1.2) tais que cx = yb.
A prova do teorema algortmica: o algoritmo Simplex recebe M, b, c e decide se os dois
problemas so viveis e, em caso afirmativo, devolve x e y .

FEOFILOFF

1.3

FLUXO EM REDES

15/11/2013

10

Um caso particular importante

Suponha que cada coluna da matriz M tem um componente 1, um componente +1,


sendo todos os demais nulos. Ento a matriz pode ser representada por um grafo: cada
linha da matriz um n e cada coluna um arco; se uma coluna tem +1 na linha u e
1 na linha v ento o arco correspondente uv , ou seja, vai de u para v .
1
0 +1 1
0
0 1
0
0
0
+1 +1
0
0 +1
0
0 1 +1 1
Cada componente do vetor b fica associada a um n do grafo. Cada componente de c e
cada componente de x fica associada a um arco do grafo.
As restries M x = b podem ser formuladas assim: para cada n v , a soma dos nmeros
da forma xuv menos a soma dos nmeros da forma xvw deve ser igual a bv , ou seja,
X
X
xuv
xvw = bv ,
u : uvA

w : vwA

onde A o conjunto de arcos. A expresso cx pode ser escrita como


X
cuv xuv ,
uvA

onde a soma se estende a todos os arcos do grafo.


Este o problema do fluxo vivel de custo mnimo que estudaremos no que segue.
O problema um tanto complexo; por isso comearemos por estudar vrios casos do
problema.

Exerccios
1.1 O enunciado do teorema 1.1 supe tacitamente que que os problemas primal e dual
so viveis. Complete o enunciado de modo a cuidar dos problemas inviveis e
dos ilimitados.

Captulo 2

Conceitos bsicos de redes


Este captulo1 introduz os conceitos de grafo, rede, caminho e ciclo e establece algumas
convenes de notao.

2.1

Grafos

Um grafo (= grafo dirigido = grafo orientado) um par (N, A), onde N um conjunto
finito e A um conjunto de pares ordenados de elementos de N . (Veja minhas notas
sobre digrafos e algoritmos para grafos.) Os elementos de N so chamados ns. Os
elementos de A so chamados arcos. Para cada arco (i, j), o n i a ponta negativa2 ou
ponta inicial (= tail) de (i, j) e j a ponta positiva ou ponta final (= head) de (i, j). As
pontas inicial e final de cada arco so distintas; portanto, nossos grafos no tm laos
(= loops).
Um arco (i, j) tambm pode ser denotado por ij . Diremos que um tal arco sai de i e
entra em j . O grau de entrada de um n i o nmero de arcos que entram em i; o grau
de sada de i o nmero de arcos que saem de i.
De acordo com nossa definio, grafos no tm arcos paralelos: dois arcos diferentes
no podem ter a mesma ponta final e a mesma ponta inicial.3 Portanto o grau de sada
de um n no mximo |N | 1. Tambm o grau de entrada no passa de |N | 1.
Suponha que nosso grafo contm os arcos (i, j) e (j, i); dizemos que esses arcos so
antiparalelos ou mutuamente inversos. Um grafo simtrico se a presena de um arco
implica na presena do arco inverso. Um grafo simples se no tem arcos antiparalelos.
Em outras palavras, um grafo simples se a presena do arco (i, j) implica na ausncia
1

Trata-se de um resumo da seo 2.1, p.23, de AMO.


Nossa conveno contrria de AMO: para eles a ponta inicial positiva e a final negativa.
3
Em algumas ocasies, ser necessrio abusar da definio e permitir a presena de duas ou mais cpias de um mesmo arco (i, j) . Se tomarmos cuidado, poderemos lidar com isso sem criar confuso.
2

11

FEOFILOFF

FLUXO EM REDES

15/11/2013

12

do arco (j, i).4


O nmero de ns de um grafo (N, A) ser denotado por n e o nmero de arcos por m:
n := |N |

m := |A| .

Como nosssa definio no permite arcos paralelos nem laos, temos


m n(n 1) < n2 .
Um grafo esparso se m = O(n) e denso em caso contrrio (em particular, no caso
m = (n2 )).5
O conjunto de todos os arcos que saem de um dado n i ser denotado por
A(i) .
Esse conjunto a lista de incidncia do n i. s vezes trataremos A(i) como uma
sequncia e no apenas como um conjunto. Na terminologia da informtica, diramos
que A(i) uma lista encadeada (= linked list).
Em algumas raras ocasies, ser necessrio dispor do conjunto de arcos que entram em
e
um n j . Denotaremos esse conjunto por A(j).
evidente que |A(i)| o grau de sada de i. evidente tambm que
P
iN |A(i)| = |A| .
Um grafo (N 0 , A0 ) subgrafo de um grafo (N, A) se N 0 N e A0 A.

2.2

Matriz de incidncias e matriz de adjacncias

A matriz de incidncia de um grafo (N, A) definida assim: as linhas so indexadas por


N e as colunas por A; para cada ij em A, a coluna ij tem um 1 na linha i e um +1 na
linha j , sendo o resto da coluna igual a 0.
A matriz de adjacncias de um grafo (N, A) definida assim: as linhas e as colunas so
indexadas por N ; cada componente (i, j) da matriz vale 1 se ij um arco e vale 0 em
caso contrrio.
4

Veja Working with residual networks, AMO, p.45.


Dizemos que uma funo T (n) O(f (n)) se existe uma constante k e um nmero n0 tais que 0
T (n) k f (n) para todo n n0 . Dizemos que T (n) (f (n)) se existe uma constante k e um nmero n0
tais que 0 k f (n) T (n) para todo n n0 . Dizemos que T (n) (f (n)) se T (n) O(f (n)) e (f (n)) .
5

A(i)

FEOFILOFF

2.3

FLUXO EM REDES

15/11/2013

13

Passeios, caminhos, ciclos

Um passeio (= walk)6 num grafo (N, A) qualquer sequncia hv0 , v1 , . . . , vp i de ns tal


que
(vk1 , vk ) A
para k = 1, . . . , p. Um passeio um objeto dirigido (ou orientado): todos os seus arcos
apontam do n anterior para o sequinte. O n v0 a origem do passeio e vp o trmino
do passeio. Dizemos tambm que o passeio vai de v0 a vp .
Dizemos que um n t do grafo est ao alcance de (= is reachable from) um n s, ou que t
pode ser alcanado a partir de s, se existe um passeio de s a t.
O comprimento de um passeio hv0 , v1 , . . . , vp i p. O comprimento de um passeio P ser
denotado por |P |. Um passeio P degenerado se |P | = 0.
Um segmento de um passeio hv0 , v1 , . . . , vp i qualquer passeio hvi , vi+1 , . . . , vj i, com
0 i j p. Um tal segmento inicial se i = 0 e final de j = p.
Se o trmino de um passeio (v0 , . . . , vp ) igual origem de um passeio (w0 , . . . , wq )
(ou seja, se vp = w0 ) ento a concatenao dos dois passeios o passeio
(v0 , . . . , vp , w1 , . . . , wq ). Se um passeio P termina na origem de um passeio Q, a concatenao de P com Q ser denotada por P Q.
Um caminho (= path = simple path)7 um passeio sem ns repetidos ( claro os arcos
de um caminho tambm so distintos dois a dois). Se P um passeio com origem s e
trmino t ento alguma subsequncia de P um caminho de s a t. (Por exemplo, se
ha, b, c, d, b, c, ei um passeio ento ha, b, c, ei o correspondente caminho.)
Um quase caminho8 um passeio em que somente o primeiro n repetido.9 Assim,
um quase caminho algo como hd, a, b, c, d, e, f i, e portanto tem a aparncia de um 9
ou um . Mais formalmente: um quase caminho um passeio hv0 , v1 , . . . , vp i em que
v1 , . . . , vp so distintos dois a dois mas v0 coincide com um dos outros ns. claro que
os arcos de todo quase caminho so distintos dois a dois. claro tambm que todo quase
caminho tem comprimento maior que 1.

quase caminho

Um ciclo (= cycle)10 um quase caminho hv0 , v1 , . . . , vp i em que v0 = vp .

2.4

Funo-predecessor

Suponha que uma funo parcial de N em N .11 Se no est definido em j , diremos


6
7
8
9
10

AMO diz walk, mas CLRS diz path. J CCPS, diz dipath.
AMO diz path, enquanto CLRS diz simple path e CCPS diz simple dipath.
Nem AMO nem CLRS tm esse conceito. Mas eu acho que ele muito til.
Cuidado: eu disse primeiro e no ltimo.
Esta o termo usado por AMO. CLRS diz simple cycle.

FEOFILOFF

FLUXO EM REDES

15/11/2013

14

que (j) = NIL .12 Para qualquer j em N , diremos que


j , (j) , ((j)) , . . .
a sequncia determinada por a partir de j . bvio que essa sequncia pode ser finita
ou infinita. Se for finita, ento no est definida no ltimo termo e a sequncia no
tem termos repetidos. Se for infinita, a sequncia cclica a partir de um certo ponto (por
exemplo, j, i, h, g, f, h, g, f, h, g, f, . . .).
Em um grafo (N, A), uma funo-predecessor13 uma funo parcial de N em N tal
que,14 para todo j em N ,
(j) = NIL

ou

pred

((j), j) A.

Em particular, (j) 6= j para todo j .

2.5

Grafo de predecessores

Suponha que uma funo-predecessor. Denotaremos por A o conjunto de todos os


arcos da forma ((j), j) e diremos que (N, A ) o grafo de predecessores. claro que
dados dois ns s e t, existe no mximo um caminho de s a t no grafo de predecessores.
O grau de entrada de cada n do grafo de predecessores no mximo 1 (o grau de
entrada de um n j 0 se e s se (j) = NIL ). Reciprocamente, para qualquer parte A0
de A, se o grau de entrada de todo n do grafo (N, A0 ) for 1 ento (N, A0 ) o grafo
de predecessores definido por alguma funo-predecessor.
Suponha que a sequncia determinada por uma funo-predecessor a partir de um n
j finita; por exemplo, j, i, h, g, f . Ento
hf, g, h, i, ji
um caminho no grafo de predecessores. Diremos que esse o caminho determinado
por a partir de j .
Suponha agora que a sequncia determinada por a partir de j infinita; por exemplo,
j, i, h, g, f, e, g, f, e, g, f, e, . . . Diremos ento que o quase caminho
hg, e, f, g, h, i, ji
determinado por a partir de j .
11

Uma funo parcial de um conjunto X em um conjunto Y uma funo definida sobre um subconjunto
de X e com valores em Y .
12
AMO escreve 0 no lugar do meu NIL.
13
Predecessores so discutidos nas pginas 137, 139 e 148 do AMO. Tambm na subseo Representing
shortest paths, p.584, de CLRS.
14
AMO escreve pred no lugar do meu .

FEOFILOFF

FLUXO EM REDES

15/11/2013

15

Eis um algoritmo trivial que calcula o caminho ou o quase caminho determinado por
a partir de um n j :
0
1
2
3
4
5
6
7
8
9

P hji
J {j}
enquanto (j) 6= NIL e (j)
/J
faa j (j)
acrescente j ao incio de P
J J {j}
se (j) = NIL
ento P um caminho
seno acrescente (j) ao incio de P
P um quase caminho

Veja exerccio 2.1.

2.6

Cortes

Para quaisquer partes S e T de N , vamos denotar por (S, T ) o conjunto de todos


os arcos que tm ponta inicial em S e ponta final em T . Ocasionalmente, podemos
escrever15 apenas (S, T ) no lugar de (S, T ). Por exemplo, (N T, T ) o conjunto de
todos os arcos que entram em T . Analogamente, (S, N S) o conjuntos dos arcos
que saem de S .
Para qualquer parte T de N , o corte determinado por T o conjunto (N T, T ).
Para qualquer n s em N T e qualquer n t em T , diremos que o conjunto T separa
s de t; diremos tambm que o corte (N T, T ) separa s de t. Podemos dizer, ainda,
que (N T, T ) um (s, t)-corte.
Se s um n, usaremos a abreviatura (s, N s) para ({s}, N {s}). claro que
(s, N s) = A(s) .

2.7

Redes

Nossa definio de rede (= network) ser um tanto vaga e informal: uma rede um grafo
(N, A) juntamente com uma ou mais funes que atribuem nmeros aos arcos e/ou aos
ns.
A propsito, o conjunto dos nmeros racionais ser denotado por Q, o conjunto dos
racionais no negativos ser denotado por Q , o conjunto dos inteiros por Z e o conjunto
15

Como faz AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

16

dos inteiros no negativos por Z . Assim,


Z = { . . . , 2, 1, 0, 1, 2, . . . }

e Z = { 0, 1, 2, . . . } .

Se f uma funo que leva A em Z, diremos que (N, A, f ) uma rede. O valor de f
num arco (i, j) ser usualmente denotado por
fij .
Dependendo do contexto, f poder ser chamada funo-custo ou pseudofluxo. Se f
0, poderemos dizer (dependendo do contexo) que f uma funo-capacidade, um fluxo
ou um pr-fluxo.
Outro exemplo: Se g uma funo que leva N em Z, diremos que (N, A, g) uma rede.
O valor de g num n i ser usualmente denotado por
g(i) .
Dependendo do contexto, g poder ser chamada demanda ou potencial.
Para qualquer funo g de N em Z e qualquer parte S de N , vamos denotar por g(S) a
soma de todos os g(i) para i em S :
X
g(S) :=
g(i) .
iS

Notao anloga vale para qualquer funo f de A em Z e qualquer parte B de A:


X
f (B) :=
fij .
ijB

Em particular, se S uma parte de N ento


X

f (S, N S) :=

fij .

ij(S,N S)

Se c e x so funes de A em Z, vamos denotar por cx a soma de todos os produtos


cij xij :
X
cx :=
cij xij .
ijA

2.8

Complexidade de algoritmos

Nossa medida do consumo de tempo de um algoritmo ser assinttica. Suponha que


um algoritmo que opera sobre uma rede (N, A, c) com c definida sobre A. Diremos

FEOFILOFF

FLUXO EM REDES

15/11/2013

17

que o algoritmo consome O(f (n, m, C)) unidades de tempo, onde f alguma funo de
n := |N |, m := |A| e C := maxijA |cij |.
Vamos adotar um modelo de computao em que o consumo de tempo de cada operao
aritmtica sobre dois nmeros inteiros no depende do tamanho dos operandos: cada
operao aritmtica consome O(1) unidades de tempo.16
Suponha que um algoritmo A opera sobre uma rede (N, A, c), onde c uma funo de
A em Z. Diremos A fortemente polinomial (= strongly polynomial) se seu consumo de
tempo for O(np mq ) para algum p em Z e algum q em Z .
Diremos A fracamente polinomial (= weakly polinomial) se seu consumo de tempo for
O(np mq log C), onde C := maxijA |cij |. (Em geral, o nmero de iteraes de tal algoritmo proporcional a log C .)
Diremos A pseudopolinomial se seu consumo de tempo for O(np mq C). (Em geral, o
nmero de iteraes do algoritmo proporcional a log C .)

Exerccios
2.1 Suponha que o grafo de predecessores no tem ciclos. Seja ij um arco qualquer
do grafo (no necessariamente do grafo de predecessores). Escreva um algoritmo
para decidir se a atribuio (j) i vai criar um ciclo orientado no grafo de
predecessores.

16

Num modelo mais realista, uma operao como a + b consome O(log a + log b) unidades de tempo.

Parte I

Caminhos e ciclos

18

Captulo 3

Algoritmos de busca
O presente captulo1 trata do problema de decidir se um dado n t de um grafo est ao
alcance de um n s.
Problema 3.1 (de busca) Dados ns s e t de um grafo, encontrar um caminho2 de s a t.
Uma variante do problema: encontrar o conjunto de todos os ns que esto ao alcance de
s, isto , todos os ns que so trmino de um caminho que tem origem s.

3.1

Condies de inexistncia

O problema de busca nem sempre tem soluo (isto , nem sempre vivel). Como
possvel demonstrar que uma dada instncia do problema no tem soluo?
Dizemos que um conjunto T de ns separa s de t se s N T e t T ; podemos dizer
tambm que (N T, T ) um (s, t)-corte. Se T separa s de t e
(N T, T ) =
(ou seja, no existe arco ij com i N T e j T ), ento evidente que no existe
caminho de s a t. Como veremos adiante, a recproca verdadeira: se no existe caminho
de s a t ento algum corte vazio separa s de t.
Convm repetir todas essas consideraes de uma maneira mais sofisticada. Um 0potencial qualquer funo y de N em {0, 1} tal que
y(j) y(i) 0 para todo arco ij
1

O captulo um resumo da seo 3.4, p.73, de AMO. Veja tambm o captulo 22 (Elementary Graph
Algorithms) do CLRS ou captulo 23 do CLR.
2
Convm lembrar que nossos caminhos so dirigidos.

19

FEOFILOFF

FLUXO EM REDES

15/11/2013

20

(ou seja, no existe arco ij com y(i) = 0 e y(j) = 1). Qualquer funo constante um
0-potencial; mas no um 0-potencial muito interessante.
Qualquer 0-potencial y define um corte: se T o conjunto dos ns j tais que y(j) = 1
ento (N T, T ) o correspondente corte.
Eis uma propriedade bsica de qualquer 0-potencial y : se existe um passeio de s a t
ento
y(t) y(s) 0 .
(3.1)
Esboo da prova: Se P = hs, i, j, ti ento y(t)y(s) = y(t)y(j)+y(j)y(i)+y(i)y(s)
0 + 0 + 0 = 0.
Portanto, para mostrar que no existe caminho de s a t basta exibir um 0-potencial y tal
que y(t) y(s) > 0.

3.2

Algoritmo genrico

Eis um algoritmo genrico para o problema de busca.3 Ele recebe ns s e t de um grafo


(N, A) e devolve um caminho de s a t ou um 0-potencial y tal que y(t) y(s) > 0.
B USCA -G ENRICO (N, A, s, t)
0 para cada i em N faa
1
y(i) 1
2
(i) NIL
3 y(s) 0
4 enquanto y(j) > y(i) para algum ij em A faa
5
y(j) y(i)
6
(j) i
7 se y(t) = 1
8
ento devolva y
9
seno devolva o caminho de s a t no grafo (N, A )
Para mostrar que o algoritmo faz o que promete fazer preciso entender a relao entre
as variveis no incio de cada iterao. Digamos que cada iterao comea na linha 4,
imediatamente antes da verificao da condio y(j) > y(i) para algum ij em A. No
comeo de cada iterao, considere o grafo de predecessores (N, A ) (veja seo 2.6) e
observe as seguintes invariantes:4
3

Ele genrico porque n: no tem as estruturas de dados necessrias para uma implementao
eficiente.
4
O que so as invariantes? Eis uma explicao: o algoritmo produzir resultados corretos se for executado a partir de qualquer configurao que satisfaa as invariantes. Em outras palavras, qualquer configurao que satisfaa as invariantes pode ser usada como inicializao do algoritmo.

FEOFILOFF

(i0)
(i1)
(i2)
(i3)

FLUXO EM REDES

15/11/2013

21

para cada arco pq no grafo de predecessores tem-se y(p) = y(q) = 0;


(s) = NIL e y(s) = 0;
para cada v distinto de s, (v) 6= NIL se e s se y(v) = 0;
para cada n v , se (v) 6= NIL ento existe um caminho de s a v no grafo de
predecessores.

Eis um esboo da prova das invariantes. claro que eles valem no incio da primeira
iterao. Suponha agora que estamos no incio de uma iterao em que as invariantes
valem; seja ij um arco tal que y(j) > y(i). Vamos mostrar que as invariantes valem no
incio da iterao seguinte.
Prova de (i0): Durante a iterao, somente o arco ij acrescentado ao grafo de
predecessores e evidente que y(j) = y(i) = 0 no fim da iterao. Como j o
nico n que tem seu potencial alterado, basta verificar que, no incio da iterao,
nenhum arco no grafo de predecessores tem ponta inicial ou ponta final igual a j .
Digamos que pq um arco do grafo de predecessores. Em virtude (i0), y(p) =
y(q) = 0. Por outro lado, com y(j) > y(i) temos necessariamente y(j) = 1. Logo, j
diferente de p e de q .
Prova de (i1): Basta observar que j 6= s no incio da iterao. Isso verdade pois
y(j) > y(i) e portanto y(j) = 1, enquanto y(s) = 0 em virtude de (i1),
Prova de (i2): Os nicos valores de y e alterados durante a iterao so y(j)
e (j). No incio da iterao temos y(i) = 0 e portanto no fim da iterao teremos
y(j) = 0 e (j) 6= NIL .
Prova de (i3): Seja v um n qualquer tal que (v) 6= NIL no incio da iterao.
Por (i3), existe um caminho P de s a v no grafo de predecessores. Por (i0), temos
y(k) = 0 para cada n k de P . Como y(j) = 1, o n j no est em P e portanto, no
fim da iterao, P continua sendo um caminho de s a v no grafo de predecessores.
Resta mostrar que existe um caminho de s a j no grafo de predecessores no fim da
iterao. Mas isso fcil: basta tomar v = i no raciocnio acima, e observar que no
fim da iterao P hi, ji um caminho no grafo de predecessores.

(i0)

(i1)

(i3)
(i0)

(A propsito, as invariantes garantem mais uma propriedade: o grafo de predecessores


no tem ciclos.)
Suponha agora que estamos no incio da ltima iterao, e portanto
y(j) y(i) para todo arco ij .
Ento y um 0-potencial, como o enunciado do algoritmo prometeu. Se y(t) = 0 ento,
em virtude de (i2), (t) 6= NIL . Logo, em virtude de (i3), existe um caminho de s a t no
grafo de predecessores e portanto tambm no grafo (N, A). Por outro lado, se y(t) = 1
ento, em virtude de (i1), y(t) y(s) > 0. Em suma, o algoritmo realmente faz o que
promete.

(i2)
(i3)
(i1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

22

A anlise do algoritmo B USCA -G ENRICO prova o seguinte


Fato 3.2 Para quaisquer ns s e t em um grafo (N, A), existe um caminho de s a t
ou existe um 0-potencial y tal que y(t) y(s) > 0. (A segunda alternativa equivale
existncia de um conjunto de ns T que separa s de t e tem (N T, T ) = .)
Consumo de tempo. No est claro, primeira vista, que a execuo de B USCA G ENRICO termina depois de um nmero finito de iteraes. Seja T o conjunto {v
N : y(v) = 1} e observe que |T | diminui a cada iterao. Portanto, o nmero de iteraes
(ou seja, o nmero de execues do bloco de linhas 46) no passa de
n1,
onde n := |N |.

n = |N |

Cada execuo da linha 4 consome O(m) unidades de tempo, onde m := |A|, e as linhas 5
e 6 consomem O(1) unidades. Cada execuo das linhas 03 consome O(n) unidades
de tempo. Cada execuo das linhas 79 consome O(n) unidades. Conclumos que o
consumo de tempo do algoritmo
O(nm) .

m = |A|

Mais grosseiramente, podemos dizer que o consumo de tempo total O(n3 ), uma vez
que m < n2 .

3.3

Algoritmo de busca

A implementao bvia da linha 4 do algoritmo B USCA -G ENRICO no muito eficiente.


O algoritmo B USCA abaixo5 procura remediar a situao. A ideia manter um conjunto
L que contm a ponta inicial de todo arco ij que viola a condio y(j) y(i) 0.
Tal como B USCA -G ENRICO, o algoritmo B USCA recebe ns s e t de um grafo (N, A) e
devolve um caminho de s a t ou um 0-potencial y tal que y(t) y(s) > 0.
B USCA (N, A, s, t)
01 para cada i em N faa
02
A0 (i) A(i)
03
y(i) 1
04
(i) NIL
05 y(s) 0
06 L {s}
07 enquanto L 6= faa
5

Esse , essencialmente, o algoritmo Search descrito na figura 3.4, p.74, seo 3.4, do AMO.

FEOFILOFF

08
09
10
11
12
13
14
15
16
17
18

FLUXO EM REDES

15/11/2013

23

escolha um n i em L
se A0 (i) 6=
ento retire6 um arco ij de A0 (i)
se y(j) = 1
ento y(j) 0
(j) i
L L {j}
seno L L {i}
se y(t) = 1
ento devolva y
seno devolva o caminho de s a t em (N, A )

Na prtica, da lista de adjacncia A(i) implementado como uma sequncia (mais precisamente, como uma lista encadeada) e no como um conjunto. Portanto, no necessrio
fazer uma cpia A0 (i) de A(i), como fizemos na linha 02: basta manter um ponteiro para
o elemento corrente de A(i). O ponteiro comea apontando o primeiro elemento de A(i);
na linha 10, o ponteiro reajustado para o prximo elemento de A(i). Essa estrutura
conhecida como current arc data structure7 .
O algoritmo est correto? Observe que no incio de cada iterao (ou seja, na linha 07,
imediatamente antes da comparao de L com ), alm das invariantes (i0) a (i3) de
B USCA -G ENRICO, valem tambm os seguintes:
(i4) para cada arco pq , se y(p) = 0 e y(q) = 1 ento p L;8
(i5) y(p) = 0 para cada p em L;
(i6) para cada n p e cada arco pq em A(p) A0 (p), se y(p) = 0 ento y(q) = 0.
Prove essas invariantes! (Veja como a validade de (i6) no incio de uma iterao depende
da validade de (i4).)
Suponha agora que estamos no incio da ltima iterao, quando L = . Ento, em
virtude de (i4), temos y(q) y(p) 0 para todo arco pq ; portanto, y um 0-potencial. Se
y(t) = 1 ento, em virtude de (i1), y(t) y(s) = 1 > 0. Seno, de acordo com (i3), h um
caminho de s a t no grafo de predecessores. Em suma, o algoritmo faz o que promete.
Consumo de tempo. O bloco de linhas 0106 consome O(n) unidades de tempo. O
bloco de linhas 1616 tambm consome O(n) unidades de tempo. Resta examinar o
processo iterativo definido pelas linhas 07-15.
6
7
8

Est implcita a a operao A0 (i) A0 (i) {ij} .


Veja p.75 do AMO. Veja tambm a figura 7.7, p.217, de AMO.
Mas pode existir arco pq com p em L e y(q) = 0 .

(i4)
(i1)
(i3)

FEOFILOFF

FLUXO EM REDES

15/11/2013

24

Quantas iteraes so executadas? H dois tipos de iterao: o primeiro passa pelo bloco
de linhas 1014 e o segundo pela linha 15. O nmero de iteraes do segundo tipo
no mximo n pois cada n do grafo pode ser retirado de L no mximo uma vez (pois
no pode mais voltar a L, de acordo com o invariante (i5)). O nmero de iteraes do
primeiro tipo no passa de
X
|A(k)| ,

(i5)

kN

A0 (i)

A0 (h)

pois a cada iterao


diminui e
no se altera quando h 6= i. Como essa soma
igual a m, podemos dizer que o nmero total de iteraes dos dois tipos no mximo
n+m.
Cada iterao consome O(1) undidades de tempo9 . Logo, o consumo total do bloco de
linhas 07-15
O(n + m) .
Nossa concluso final: o algoritmo consome O(n) + O(n + m) + O(n), ou seja,
O(n + m)
unidades de tempo. Podemos dizer, mais grosseiramente, que o consumo de tempo total
O(n2 ), uma vez que m < n2 .
No difcil verificar que o consumo de tempo do algoritmo tambm (n + m).

3.4

Busca em largura e busca em profundidade

O conjunto L no algoritmo B USCA usualmente implementado como uma sequncia. Se


a sequncia for manipulada como um fila, ou seja, se elementos forem retirados (linha 15)
do incio de L e novos elementos forem acrescentados (linha 14) ao final de L, teremos
um algoritmo de busca em largura (= breadth-first search = BFS).
Se L for manipulada como um pilha, ou seja, se elementos forem retirados do incio de
L e novos elementos tambm forem acrescentados ao incio de L, teremos um algoritmo
de busca em profundidade (= depth-first search = DFS).

3.5

Verso capacitada do problema

Nas aplicaes, o problema de busca frequntemente ocorre no seguinte contexto. Suponha que uma funo u associa um nmero uij com cada arco ij de nosso grafo (N, A).
9

Ou seja, o consumo de tempo limitado por uma quantidade que no depende de n nem de m .

m := |A|

FEOFILOFF

FLUXO EM REDES

15/11/2013

25

Digamos que um arco ij positivo se uij > 0 e seja Au o conjunto dos arcos positivos.
Dados ns s e t, queremos encontrar um caminho de s a t no grafo (N, Au ).
Como mostrar que um tal caminho no existe? Basta usar um 0-potencial no grafo
(N, Au ), ou seja, uma funo y de N em {0, 1} tal que
y(j) y(i) 0 para todo ij tal que uij > 0.
fcil verificar que, para um tal y , se P um caminho de s a t em (N, Au ) ento
y(t) y(s) 0. Logo, se y(t) y(s) > 0 ento o problema no tem soluo.
fcil adaptar o algoritmo B USCA de modo que ele receba a rede (N, A, u) e devolva
(1) um caminho de s a t em (N, Au ) ou (2) um 0-potencial y em (N, Au ) tal que y(t)
y(s) > 0.

3.6

Busca inversa

Eis uma variante importante do problema de busca: Dado um n t de um grafo (N, A),
encontrar todos os ns que so origem de um passeio que termina em t.10
Esse problema poderia ser reduzido ao problema usual de busca mediante inverso de
todos os arcos (ou seja, troca de cada arco ij por um arco ji).
Outra possibilidade introduzir um nova estrutura na descrio do grafo: para cada n
e
j , seja A(j)
o conjunto de todos os arcos que entram em j .
Qual a definio apropriada de potencial para essa variante do problema? Escreva e
analise um algoritmo que resolva o problema.

Exerccios
3.1 Deduza das invariantes (i0) a (i3) que o grafo de predecessores gerado pelo algoritmo B USCA -G ENRICO e pelo algoritmo B USCA no tem ciclos.
3.2 Escreva um algoritmo de busca em largura. Procure simplificar o algoritmo.
3.3 Escreva um algoritmo de busca em profundidade. Procure simplificar o algoritmo.
3.4 [AMO 3.24, p.89] Desenhe as rvores de busca em largura e busca em profundidade do grafo na figura 3.12, p.89, de AMO.
10

Veja p.76 do AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

26

3.5 Programe os algoritmos de busca usando a estrutura de dados do Stanford GraphBase. Faa testes com grafos gerados pelo Stanford GraphBase. Inclua no seu mdulo
uma funo que verifique se y de fato um 0-potencial e se o caminho de fato
um caminho de s a t; claro que esse funo s ser usada durante os testes do
programa. [Uma das regras do eXtreme Programming: escreva as rotinas de teste
antes do programa principal!]
3.6 Escreva por extenso o algoritmo de busca capacitada descrito na seo 3.5.
3.7 Escreva por extenso o algoritmo de busca inversa descrito na seo 3.6.
3.8 [M ODELAGEM] Suponha que (N, A) um grafo e sejam u e u0 duas funes de
A em Z . Um pseudocaminho uma sequncia hi0 , i1 , . . . , iq i de ns tal que,
para cada k , tem-se (ik1 , ik ) A ou (ik , ik1 ) A. Os arcos do primeiro tipo
so diretos e os do segundo so inversos. Problema: dados ns s e t, encontrar
um pseudocaminho de s a t tal que uij > 0 para todo arco direto ij e u0ji > 0
para todo arco inverso ji. Qual a definio apropriada de funo-potencial nesse
caso (em termos de u e u0 )? Formule as condies de existncia de soluo do problema. Mostre como o problema pode ser transformado em um problema de busca
usual (ou seja, um que envolva caminho e no pseudocaminho). Para resolver esta
parte, voc pode supor que o grafo antissimtrico, ou seja, que se ij arco ento
ji no arco.

Captulo 4

Ciclos e ordem topolgica


O presente captulo1 trata do seguinte
Problema 4.1 (do ciclo) : Encontrar um ciclo num grafo dado.
Um grafo acclico (= DAG = directed acyclic graph) se no tem ciclo. evidente que o
problema no tem soluo se e s se o grafo acclico.

4.1

Condies de inexistncia

Como provar que uma dada instncia do problema no tem soluo? Em outras palavras,
como mostrar que um dado grafo acclico?
Um potencial em um grafo (N, A) qualquer funo de N em Z. Um 1-potencial
um potencial y tal que2
y(j) y(i) 1 para cada ij em A.

(4.1)

Em outras palavras, y(j) < y(i) para cada arco ij .3


Propriedade bsica de qualquer 1-potencial: para qualquer passeio P com origem s e
trmino t,
y(t) y(s) |P | .
1

Isso um resumo da seo 3.4, p.77, de AMO.


Cuidado! No confunda essa definio com a dos captulos 5 e 3. Aqui temos 1 onde (5.1) tinha
1 .
3
A definio de AMO diz order(i) no lugar do nosso y(i) . Alm disso, a conveno de AMO
contrria nossa: order(i) < order(j) para cada arco ij .
2

27

FEOFILOFF

FLUXO EM REDES

15/11/2013

28

Esboo da prova: Se P = hs, i, j, ti ento


y(t) y(s) = y(t) y(j) + y(j) y(i) + y(i) y(s)
1 1 1
= 3
= |P | .
Se P um ciclo ento t = s e portanto temos 0 |P |, ou seja,
|P | 0 .
Mas isso impossvel, pois todo ciclo tem pelo menos 2 arcos. Concluso: a existncia de
um 1-potencial incompatvel com a existncia de ciclo. Em outras palavras, se h um
1-potencial ento no existe ciclo. Portanto, para provar que um dado grafo acclico,
basta exibir um 1-potencial. Como veremos, isso sempre possvel: todo grafo acclico
admite um 1-potencial.

4.2

Ordem topolgica

H um tipo especial de 1-potencial que vale a pena discutir. Suponha que o conjunto
de ns de nosso grafo admite uma enumerao4 hv1 , v2 , . . . , vn i tal que
p < q sempre que vp vq um arco.
Uma tal enumerao conhecida como ordem topolgica (= topological order). fcil ver
que qualquer ordem topolgica define um 1-potencial: basta fazer
y(vp ) := n p + 1
para p = 1, . . . , n, onde n := |N |. Reciprocamente, se y um 1-potencial ento qualquer enumerao hv1 , v2 , . . . , vn i dos ns em ordem no crescente de valores de y (ou
seja, y(v1 ) y(vn )) uma ordem topolgica.
Diante dessa equivalncia entre potenciais e ordens topolgicas, podemos restringir
nossa ateno a potenciais que so uma bijeo de N em {1, . . . , n}, onde n := |N |.

4.3

Um algoritmo de ordenao topolgica

O seguinte algoritmo tem base na seguinte observao: todo grafo acclico tem pelo menos um n com grau de entrada nulo. O algoritmo d uma soluo apenas parcial do
problema: ele devolve um 1-potencial se o grafo (N, A) for acclico e no devolve nada
se o grafo tem um ciclo.
4

Isto , uma sequncia em que cada n comparece uma e uma s vez.

FEOFILOFF

FLUXO EM REDES

15/11/2013

29

T OPOLOGICAL -O RDERING5 (N, A)


01 para cada i em N faa ge(i) 0
02 para cada ij em A faa ge(j) ge(j) + 1
02  ge(i) o grau de entrada de i
03 rtulo n
04 L
05 para cada i em N faa
06
se ge(i) = 0 ento L L {i}
07 enquanto L 6= faa
08
escolha um n i em L
09
L L {i}
10
y(i) rtulo
11
rtulo rtulo 1
12
para cada ij em A(i) faa
13
ge(j) ge(j) 1
14
se ge(j) = 0 ento L L {j}
15 se rtulo 0 ento y um 1-potencial
O algoritmo prova do seguinte
Fato 4.2 Um grafo acclico se e s se admite um 1-potencial (ou, se preferir, se e s se
admite uma ordem topolgica).
O algoritmo consome O(n+m) unidades de tempo, essencialmente porque examina cada
arco (linha 12) no mximo uma vez. Se n = O(m), podemos dizer simplesmente que o
algoritmo O(m).

4.4

Um algoritmo melhor

O algoritmo abaixo usa a tcnica da busca em profundidade (veja seo 3.4) para resolver
o problema. O algoritmo6 devolve um 1-potencial y se o grafo (N, A) for acclico e
devolve um n j de um ciclo em caso contrrio; no segundo caso, a funo predecessor
define um ciclo a partir de j .
DAG (N, A)
01 para cada i em N faa
02
A0 (i) A(i)
03
y(i) n + 1  n + 1 faz o papel de
5
6

Esse o algoritmo topological ordering da figura 3.8, p.79, do AMO.


Veja CLRS seo 22.4, p.550.

FEOFILOFF

04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20

FLUXO EM REDES

15/11/2013

30

(i) NIL
rtulo 1
enquanto y(s) = n + 1 para algum s em N faa
L hsi
enquanto L 6= hi faa  L funciona como uma pilha
seja i o primeiro elemento de L
se A0 (i) 6=
ento retire7 um arco ij de A0 (i)
se y(j) = n + 1
ento (j) i
se j est em L
ento devolva j e pare
seno acrescente j ao incio de L
seno y(i) rtulo
rtulo rtulo + 1
elimine o primeiro elemento8 de L
devolva y

Prove que o algoritmo est correto!


Consumo de tempo. Pode parecer que cada execuo da linha 06 do algoritmo consome
O(n) unidades de tempo. Mas isso no assim: todas as execues da linha 06 somadas
consomem O(n) unidades de tempo. De fato, basta percorrer o conjunto de ns uma s
vez em uma ordem arbitrria e executar uma de duas aes para cada n s: se y(s) = n+1
ento aplique o bloco de linhas 0719 seno nada faa.
O bloco de linhas 0719 consome O(n + m) unidades de tempo, essencialmente porque
cada arco examinado no mximo uma vez. Portanto, o consumo de tempo total do
algoritmo
O(n + m) .
Se n = O(m), como frequentemente o caso, podemos dizer que o algoritmo O(m).
No difcil verificar que o consumo de tempo do algoritmo tambm (n + m).

4.5

Apndice: algoritmo genrico

O algoritmo DAG uma implementao concreta do seguinte algoritmo genrico:


7
8

Est implcita a a operao A0 (i) A0 (i) {ij} .


Ou seja, i .

FEOFILOFF

FLUXO EM REDES

15/11/2013

31

DAG-G ENRICO (N, A)


1 para cada i em N faa
2
y(i) n + 1
3
(i) NIL
4 enquanto y(j) > y(i) 1 para algum ij em A faa
5
y(j) y(i) 1
6
(j) i
7
se y(j) < 1
8
ento devolva j e pare
9 devolva y
Eis as invariantes que explicam o funcionamento do algoritmo. Ao enunciar as invariantes, diremos que um arco vw est relaxado ou folgado se y(w) y(v) 1, justo se
y(w)y(v) = 1 e tenso se y(w)y(v) > 1. No incio de cada iterao (imediatamente
antes de verificar a condio y(j) > y(i) 1 para algum ij em A na linha 4),
(i1) cada arco no grafo de predecessores (N, A ) est justo ou tenso (o grafo de
predecessores pode ter ciclos);
(i3) para qualquer caminho P no grafo de predecessores, y(t) n + 1 |P |, onde
t o trmino de P .
Esse algoritmo consome O(mn2 ) unidades de tempo (o bloco de linhas 48 repetido
n2 vezes). muito menos eficiente, portanto, que os algoritmos vistos acima.
Voltaremos anlise desse algoritmo genrico, em condies mais gerais, no captulo 6
e 7.

Exerccios
4.1 Escreva uma variante do algoritmo DAG que use a funo-predecessor no lugar
da pilha L.

Captulo 5

Caminhos de comprimento mnimo


Este captulo trata de um problema mais geral que o captulo 3 (Algoritmos de Busca):
ele discute o problema do caminho mais curto entre dois ns.1
Problema 5.1 (do caminho mais curto) Dados ns s e t de um grafo (N, A), encontrar
um caminho de s a t que tenha comprimento2 mnimo.
O problema no tem soluo se no existe passeio de s a t. Caso contrrio, existe um
caminho de s de t. Como o nmero de tais caminhos finito, h um (ou mais) caminhos
de comprimento mnimo.

5.1

Condies de existncia

Como possvel provar que um dado caminho de s a t tem comprimento mnimo? Em


outras palavras, como mostrar que nenhum caminho de s a t tem comprimento menor
que um dado inteiro ?
Um 1-potencial uma potencial y (ou seja, uma funo de N em Z) tal que
y(j) y(i) 1 para todo arco ij ,

(5.1)

ou seja, no existe arco ij com y(j) > y(i) + 1. (Se y um 1-potencial, o nmero y(i)
s vezes chamado rtulo (= label) do n i.) claro que a funo nula um 1-potencial;
1
Parte desse material est na seo 7.2, p.209, do AMO; outra parte est na seo 3.4, subseo BreadthFirst Search, p.76. Veja, em particular, o exerccio 3.30, p.90, de AMO. O material tambm est no captulo
23 (Elementary graph algorithms) do CLRS e no captulo 22 do CLR.
2
Convm lembrar que o comprimento de um passeio hi0 , . . . , ip i p e que o comprimento de um passeio
P denotado por |P | . Se P um caminho, ento |P | simplesmente o nmero de arcos de P .

32

FEOFILOFF

FLUXO EM REDES

15/11/2013

33

mas no um 1-potencial muito interessante. Se y um 1-potencial e f uma funo


constante ento evidente que y f tambm um 1-potencial.
Eis uma propriedade bsica de qualquer 1-potencial y : para qualquer passeio P com
origem s e trmino t,
y(t) y(s) |P | .
(5.2)
Esboo da prova: Se P = hs, i, j, ti ento y(t)y(s) = y(t)y(j)+y(j)y(i)+y(i)y(s)
1 + 1 + 1 = |P |.
Portanto, para mostrar que no existe caminho de comprimento menor que um determinado nmero, digamos 99, com origem s e trmino t basta exibir um 1-potencial y tal
que y(t) y(s) 99. Para mostrar que no existe caminho algum de s a t basta exibir
um 1-potencial y tal que y(t) y(s) n, onde n = |N |, pois o comprimento de qualquer
caminho no passa de n 1.

5.2

Algoritmo do caminho mais curto

O algoritmo de busca em largura (veja seo 3.4) resolve nosso problema. O algoritmo
recebe ns s e t de um grafo (N, A) e devolve um 1-potencial y ; se y(t) y(s) < n ento
tambm devolve um caminho P de s a t tal que y(t) y(s) = |P |.
B USCA - EM -L ARGURA (N, A, s, t)
01 para cada i em N faa
02
y(i) n  n faz o papel de
03
(i) NIL
04 y(s) 0
05 L hsi
06 enquanto L 6= hi faa
07
retire3 o primeiro elemento, digamos i, de L
08
para cada ij em A(i) faa
09
se y(j) > y(i) + 1  y(j) = n
10
ento y(j) y(i) + 1
11
(j) i
12
acrescente j ao final de L
13 se y(t) n
14
ento devolva y
15
seno seja P o caminho determinado por a partir de t
16
devolva y e P
3

Se L = hi1 , i2 , . . . , il i antes da operao, ento i = i1 e L = hi2 , . . . , il i depois da operao.

n = |N |

FEOFILOFF

FLUXO EM REDES

15/11/2013

34

Eu poderia simplesmente devolve y e no fim da execuo do bloco de linhas 0612 e


deixar que o usurio cuide da execuo das linhas 13 a 16. Com isso, o parmetro t seria
suprimido e o usurio poderia escolher qualquer n para fazer o papel de t.
O algoritmo faz o que promete? Para mostrar que o algoritmo est correto preciso
entender a relao entre as variveis no incio de cada iterao. Digamos que cada iterao comea na linha 06 imediatamente antes da comparao de L com a sequncia vazia.
Ao enunciar as invariantes, usaremos a notao S := {v : y(v) < n}. Diremos que um
arco vw est tenso se y(w) y(v) > 1, relaxado (ou folgado) de y(w) y(v) 1 e justo
se y(w) y(v) = 1.4 No comeo de cada iterao temos as seguinte invariantes:
(i1) cada arco no grafo de predecessores (N, A ) est justo;
(i2) (s) = NIL e y(s) = 0;
(i3) para cada v em S , existe um caminho de s a v no grafo de predecessores.
A essas invariantes preciso acrescentar mais algumas para caracterizar L. No comeo de cada iterao, seja i1 , i2 , . . . , il a sequncia de elementos de L (isto , L =:
hi1 , i2 , . . . , il i). Ento
(i4) cada arco tenso tem ponta inicial em L;
(i5) y(i1 ) y(i2 ) y(il ) e y(il ) y(i1 ) + 1;
(i6) y(w) y(i1 ) para cada n w em S {i1 , . . . , il }.
Prove as invariantes! ( verdade tambm que o grafo de predecessores no tem ciclos;
isso pode ser verificado com o mesmo raciocnio que prova (i1) e (i2).)
evidente que todas as invariantes valem no incio da primeira iterao. Suponha agora
que todas valem no incio da iterao corrente; vamos mostrar que elas continuam valendo
no incio da prxima iterao.
Prova de (i1): Todos os novos arcos introduzidos no grafo de predecessores esto em A(i).
evidente que todos eles so justos no fim da iterao corrente e portanto tambm no incio
da prxima iterao. Mas isso no prova o invariante! preciso mostrar que os arcos que j
estavam em A no incio da iterao no deixam de ser justos em virtude das alteraes de
y na linha 10. Mais especificamente, preciso provar que na linha 10 no h arco do grafo
de predecessores em A(j) , Faamos isso, ento. No incio da linha 10, o arco ij est tenso;
como i = i1 , (i5) e (i6) garante que y(j) = n . Por outro lado, o potencial da ponta inicial de
cada arco do grafo de predecessores menor que n , em virtude de (i1).
Prova de (i2): Basta mostrar que j 6= s em cada execuo da linha 10. Digamos que ij
um arco tenso e i = i1 . Por (i5) e (i6), y(j) = n . Por outro lado, y(s) = 0 . Logo j 6= s .
Prova de (i3): No incio da iterao, seja P um caminho com origem s no grafo de predecessores. Em virtude de (i1) e (i2), temos y(k) < n para cada k em P , ou seja, P jamais sai
4

Imagine que cada arco vw um pedao de barbante de comprimento 1 . Imagine tambm que y(v) e
y(w) so as alturas de v e w em relao ao cho. Veja analog solution, AMO, p.96.

(i5)
(i6)
(i1)
(i5)
(i6)

FEOFILOFF

FLUXO EM REDES

15/11/2013

35

de S . No comeo de cada execuo da linha 10, temos y(j) = n em virtude de (i5) e (i6);
portanto j no est em P . Concluso: no incio da prxima iterao, P continua sendo um
caminho no grafo de predcessores. Isso conclui a primeira parte da prova.
Falta mostrar que (i3) vale para os ns j que passam a fazer parte de S durante a iterao
corrente. Por (i3), h um caminho I de s a i no grafo de predecessores. Suponha que
estamos no incio de alguma das execues da linha 10 na iterao corrente. Como j mostramos h pouco, j no est em I . Logo, no fim dessa iterao (e portanto tambm no incio
da iterao seguinte), o passeio Ihi, ji um caminho de s a j no grafo de predecessores.
Prova de (i4): Durante a iterao corrente, todos os arcos em A(i) deixam de ser tensos. Portanto, ao retirar i de L na linha 07 no estamos comprometendo a validade de (i4). Resta
verificar que os arcos que ficam tensos durante a iterao tero sua ponta inicial acrescentada a L. Ora, os nicos arcos que podem ficar tensos so os que esto A(j), para algum
j em A(i) tal que y(j) alterado. Mas os ns j desse tipo so todos acrescentados a L na
linha 12.
As provas de (i5) e (i6) so muito fceis.

Suponha agora que estamos no incio da ltima iterao, quando L = hi. Ento, em
virtude de (i4), no h arcos tensos; portanto, y um 1-potencial. Se y(t) n, ento
y(t) y(s) n em virtude de (i2). Seno, de acordo com (i3), h um caminho P de s a t
no grafo de predecessores. Por (i1) e a desigualdade (5.2), |P | = y(t) y(s). Portanto, o
algoritmo realmente faz o que promete.

(i5)
(i6)

(i4)
(i2)
(i3)
(i1)

Consumo de tempo. Cada n entra em L no mximo uma vez (por que?) e cada iterao retira um elemento de L. Logo, teremos no mximo n iteraes.
Cada iterao examina a lista de adjacncias A(i) e consome O(|A(i)|). Como cada n
do grafo faz o papel de i no mximo uma P
vez, o consumo total de tempo em todas
as execues do bloco de linhas 0812 O( i |A(i)|). Como essa soma igual a m,
o consumo total de todas as execues do bloco de linhas 0812 O(m) unidades de
tempo.
O consumo de tempo das demais linhas (linhas 01-05 e 1316) O(n). Portanto, o consumo de tempo total do algoritmo
O(n + m) .
Como m < n2 , podemos dizer que o algoritmo O(n2 ). Se o grafo conexo ento
m n 1 e portanto o consumo de tempo
O(m) .

5.3

Potencial timo

Diremos que um 1-potencial y (s, )-timo (ou timo em relao origem s) se uma
das seguintes alternativas vale para cada n j :

m = |A|

FEOFILOFF

FLUXO EM REDES

15/11/2013

36

(1) existe algum caminho P de s a j tal que |P | = y(j) y(s) e


(2) y(j) y(s) n e no existe caminho de s a j .
O algoritmo que discutimos na seo anterior produz um 1-potencial (s, )-timo.
No difcil constatar que a partir de um tal 1-potencial possvel determinar caminhos
de comprimento mnimo de s a qualquer outro n (veja exerccio 5.4).

5.4

Caminhos mnimos invertidos

Eis uma variante importante do problema do caminho mais curto:5


Problema 5.2 (do caminho mnimo invertido) Dado um n t de um grafo (N, A), encontrar, para cada n i, um caminho de comprimento minimo de i a t.
Esse problema poderia ser reduzido ao problema usual de busca mediante inverso de
todos os arcos (ou seja, troca de cada arco ij por um arco ji). Mas em vez de modificar
o grafo melhor supor que dispomos de uma nova estrutura de dados: para cada n j ,
seja
e
A(j)
o conjunto de todos os arcos que entram em j . claro que o conceito de funopredecessor deve ser substitudo pelo de funo-sucessor: uma funo parcial
e de N
em N tal que ij A sempre que
e(i) = j . O grafo de sucessores (N, Ae ) em que Ae
o conjunto de todos os arcos da forma (i,
e(i)).
A definio de 1-potencial continua igual da seo 5.1: qualquer potencial y tal que
y(j) y(i) 1 para todo arco ij . Um 1-potencial y (, t)-timo (ou timo em relao
ao trmino t) se uma das seguintes alternativas vale para cada n i:
(1) existe algum caminho Q de i a t tal que |Q| = y(t) y(i) e
(2) y(t) y(i) n e no existe caminho de i a t.
Um algoritmo, digamos C AMINHOS -M NIMOS -I NVERTIDOS, para o problema deve devolver um 1-potencial (, t)-timo y um caminho Q de s a t tal que |Q| = y(t) y(s).
fcil escrever um tal algoritmo de modo que ele consuma O(n + m) unidades de tempo
(exerccio 5.10). Se o grafo conexo, teremos m n1 e portanto o algoritmo consumir
O(m) unidades de tempo.
5

Veja p.76 do AMO. Tambm seo 7.2, p.209, AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

37

Exerccios
5.1 [AMO 7.9(g), p.244] Seja s um n de um grafo (N, A) e y uma funo de N em Z
dotada da seguinte propriedade: para cada n j e qualquer caminho P de s a j ,
tem-se |P | y(j) y(s). verdade que y um 1-potencial?
5.2 [Bom] Seja s um n de um grafo (N, A). Para cada n j , seja Pj um caminho de s
a j . Descreva um algoritmo que permita decidir se a coleo de caminhos tima,
ou seja, se Pj um caminho de comprimento mnimo de s a j para cada j .
5.3 Prove que no incio de cada iterao do algoritmo B USCA - EM -L ARGURA (o incio da iterao fica na linha 06, imediatamente antes da comparao de L com a
sequncia vazia) vale a seguinte propriedade para todo n v : se y(v) < n ento
no existe caminho de s a v de comprimento menor que y(v).
5.4 Escreva uma verso do algoritmo B USCA - EM -L ARGURA que no calcula mas
apenas um 1-potencial (s, )-timo y . A partir desse y , calcule um caminho de s
a t que tenha comprimento y(t) y(s) (ou mostre qu um tal caminho no existe).
Quanto tempo esse clculo consome?
5.5 [Verso capacitada do problema] Suponha que cada arco ij de nosso grafo tem
uma capacidade uij . Um arco ij positivo se uij > 0. Um caminho positivo se todos os seus arcos so positivos. Problema: Dados ns s e t, encontrar
um caminho positivo de s a t que tenha comprimento mnimo. Qual a definio apropriada de funo-potencial? Escreva e analise um algoritmo que resolva o
problema.
5.6 Programe e teste o algoritmo de busca em largura. Sugesto: programe em C (no
preciso escrever em CWEB) e use a estrutura de dados do SGB (Stanford GraphBase). Inclua no seu mdulo pequenas funes de teste que permitam conferir as
respostas de sua implementao da busca em largura.
5.7 Brinque com o algoritmo de busca em largura que faz parte do sistema GIDEN
(giden.northwestern.edu/).
5.8 [AMO 3.19, p.88] Determinar existncia de ciclo mpar passando por um n i.
5.9 [Caminho mnimo invertidos] Escreva o algoritmo sugerido na seo 5.4.
5.10 Sejam s e t dois ns de um grafo (N, A). Seja y um 1-potencial (s, )-timo e z
um 1-potencial (, t)-timo. (1) Prove que para cada n i de qualquer caminho

FEOFILOFF

FLUXO EM REDES

15/11/2013

38

de comprimento mnimo de s a t tem-se z(i) z(s) = y(i) y(s) e y(t) y(i) =


z(t) z(i). (2) Prove que z(j) z(i) = 1 = y(j) y(i) para algum arco ij ento ij
pertence a um caminho de s a t que tem comprimento mnimo.

Captulo 6

Caminhos de custo mnimo


Este captulo1 trata de uma rede (N, A, c) em que c uma funo que atribui um nmero
inteiro a cada arco:
c:AZ.
Diremos que c uma funo-custo. Cada arco ij de nossa rede ter um custo inteiro cij ,
que pode ser positivo, negativo ou nulo.
O custo de um passeio (em particular, o custo de qualquer caminho ou ciclo) na rede a
soma dos custos dos arcos do passeio. O custo de um passeio P ser denotado por c(P ).
Um caminho P tem custo mnimo se c(P ) c(P 0 ) para todo caminho P 0 que tenha
a mesma origem e o mesmo trmino que P . s vezes omitiremos a palavra custo e
diremos simplesmente que P um caminho mnimo.
(Qual a diferena entre um caminho mnimo e um passeio mnimo? Um
passeio mnimo no necessariamente um caminho, pois pode ter ns repetidos. Um passeio pode conter ciclos de custo negativo ou nulo. Um
passeio mnimo pode conter ciclos de custo nulo. Exemplo: Suponha que
N = {a, b, c, d, e, f }, A = {ab, bc, cd, de, ef, be} e que os custos de bc, cd, de
e be so nulos. Ento ha, b, e, d, c, b, e, f i um passeio de custo mnimo e
ha, b, e, f i um caminho de custo mnimo.)

6.1

O problema dos caminhos mnimos

O presente captulo trata do seguinte problema: Dada uma rede (N, A, c) e dois ns s e t,
encontrar um caminho de custo mnimo de s a t. conveniente tratar de um problema
1

Trata-se de um resumo captulo 5 (Shortest Paths: Label-Correcting Algorithms) do AMO. Tudo isso est
muito melhor explicado no cap. 24 (especialmente sees 24.1, 24.2, e 24.5) do CLRS e no cap. 25 do CLR.
Veja tambm o mdulo GB _ DIJK do Stanford GraphBase de Knuth [Knu93].

39

FEOFILOFF

FLUXO EM REDES

15/11/2013

40

aparentemente um pouco mais geral:


Problema 6.1 (do caminho de custo mnimo) Dada uma rede (N, A, c) com funocusto c e um n s, encontrar, para cada n t, um caminho de custo mnimo de s a t.
Este problema uma generalizao do problema de busca (capitulo 3) e do problema do
caminho mais curto (capitulo 5): se c = 0 temos o primeiro problema e se c = 1 temos
o segundo. Num certo sentido, tambm uma generalizao do problema dos ciclos
(capitulo 4).
E XEMPLO : Suponha que os ns da rede so s, v, t, que os arcos so sv , vt e st e que os
custos so csv = 2, cvt = 3 e cst = 1. Encontre um caminho de s a t que tenha custo
mnimo.
O UTRO EXEMPLO : Suponha que os ns da rede so s, v, w, t, que os arcos so sv , vw , vt,
wt e tw e que os custos so csv = cvw = cvt = 1 e cwt = ctw = 3. Encontre um caminho
de s a t que tenha custo mnimo.

6.2

Redes sem ciclos negativos

Em geral, o problema computacionalmente muito difcil (NP-difcil).2 Mas ele fica relativamente simples se a rede no tiver ciclos de custo negativo,3 ou seja, se
c(O) 0 para todo ciclo O na rede.

(6.1)

Essa restrio est certamente satisfeita se c 0 (trataremos desse caso, em detalhes, no


captulo 8). A restrio tambm est satisfeita se a rede acclica (trataremos desse caso
no captulo 9). O presente captulo exige apenas a validade de (6.1). A verificao da
validade dessa restrio em uma dada rede ser considerada no captulo 7.
Para simplificar a anlise dos algoritmos, vamos tratar somente do caso em que o problema tem soluo, ou seja, somente do caso em que4
todos os ns da rede esto ao alcance de s.

(6.2)

No muito difcil remover essa hiptese (veja exerccio 6.20).


2

Por que o problema to difcil em geral? Eis uma pista (veja AMO, p.95). Algoritmos eficientes no
sabem procurar caminhos: s sabem procurar passeios. Na ausncia de ciclos negativos, um passeio de custo
mnimo um caminho (exceto talvez pela presena de ciclos de custo nulo). Mas quando a rede tem ciclos
negativos, h passeios de custo arbitrariamente negativo e portanto no existem passeios de custo mnimo.
3
Mais precisamente, basta que a rede no tenha ciclos negativos ao alcance de s .
4
Essa hiptese aparece no AMO, p.94, como Assumption 4.2.

FEOFILOFF

6.3

FLUXO EM REDES

15/11/2013

41

Condies de otimalidade: funo potencial

Como possvel certificar a minimalidade do custo de um dado caminho que vai de s


a t? Em outras palavras, como possvel provar que no existe caminho de s a t que
tenha custo menor que um dado nmero, digamos 99?
Um c-potencial5 um potencial y (ou seja, uma funo y de N em Z) tal que
y(j) y(i) cij

(6.3)

para cada arco ij . (Note que o conceito de potencial no envolve o n s.) Diremos que
esta a desigualdade triangular para o arco ij .
Potenciais tm a seguinte propriedade fundamental: o custo de qualquer passeio limitado inferiormente pela diferena de potencial entre seus extremos. Mais precisamente:
Lema 6.2 Se y um c-potencial ento, para qualquer passeio P com origem s e trmino t, temos
y(t) y(s) c(P ) .
Esboo da prova (no caso |P | = 3): Se P = hs, i, j, ti ento
y(t) y(s) = y(t) y(j) + y(j) y(i) + y(i) y(s)
cjt + cij + csi
= csi + cij + cjt
= c(P ) ,
como queramos demonstrar.
(A propsito, a existncia de um c-potencial prova a ausncia de ciclos de
custo negativo, pois, de acordo com o lema 6.2, 0 c(P ) para qualquer ciclo P . Voltaremos a esse assunto no prximo captulo.)
Agora podemos responder a pergunta que abriu esta seo: para provar que no existe
caminho de s a t que tenha custo menor que, digamos, 99 basta exibir um c-potencial y
tal que y(t) y(s) 99.6
5
Lamentavelmente, AMO confuso a respeito do conceito de funo-potencial. Veja seo 5.2, p.135.
AMO diz distance labels e escreve d no lugar do meu y .
6
Suponha que cij o pedgio que um viajante deve pagar para percorrer o arco ij . (O pedgio de alguns
arcos pode ser negativo!) Suponha que temos um Guia do Viajante Pobre que atribui um nmero y(i) a
cada n i da rede e garante a seguinte propriedade: impossvel ir de qualquer n s a qualquer outro n t
gastando menos que y(t) y(s) crditos. (Mas o guia no garante que y(t) y(s) crditos sejam suficientes
para viajar de s a t !) Nosso guia s serve, ento, para dissuadir um viajante pobre de empreender certas
viagens.

FEOFILOFF

FLUXO EM REDES

15/11/2013

42

Portanto, para resolver o problema do caminho mnimo basta exibir um c-potencial y


e, para cada t, um caminho P de s a t tal que y(t) y(s) = c(P ). ( claro que nesse
caso teremos y(j) y(i) = cij para todo arco ij de P .) Diremos que um tal c-potencial
y (s, )-timo.7 Como veremos adiante, toda rede sem ciclos negativos admite um
c-potencial (s, )-timo.

6.4

Algoritmo genrico

Eis um primeiro algoritmo genrico8 para o problema. O algoritmo recebe uma rede
(N, A, c) sem ciclos de custo negativo e um n s. Se a condio (6.2) estiver satisfeita,
o algoritmo produz um c-potencial y e uma funo-predecessor dotadas da seguinte
propriedade: para cada n t, a funo-predecessor determina um caminho P de s a t
tal que c(P ) = y(t) y(s).
F ORD (N, A, c, s)  (N, A, c) no tem ciclos negativos
1 para cada j em N faa
2
y(j)
3
(j) NIL
4 y(s) 0
5 enquanto y(j) > y(i) + cij para algum ij em A faa
6
y(j) y(i) + cij
7
(j) i
8 devolva y e
Na linha 5, estamos adotando a conveno + = , qualquer que seja . Na
prtica, o na linha 2 pode ser substitudo pelo nmero nC + 1, onde n := |N | e
C := maxijA |cij |, pois qualquer caminho na rede tem custo (n1)C = nC C nC .
Se essa substituio for feita, ser preciso adotar a conveno nC + 1 + = nC + 1 qualquer que seja .
Invariantes. Diremos que um arco vw est relaxado se y(w) y(v) cvw , justo se
y(w)y(v) = cvw e tenso se y(w)y(v) > cvw . No incio de cada iterao (imediatamente
antes de verificar a condio y(j) > y(i) + cij para algum ij em A na linha 5), valem
as seguintes propriedades:
(i1) cada arco em A est justo ou tenso;9
7

Veja seo 9.4, p.310, de AMO.


O algoritmo aparece, sob o nome label-correcting algorithm, na figura 5.1, p.137, de AMO. Segundo
CCPS, este o algoritmo de Ford.
9
Portanto, y(q) y(p) c(P ) para qualquer caminho P de p a q na rede de predecessores.
8

FEOFILOFF

FLUXO EM REDES

15/11/2013

43

(i2) para cada arco tenso hk , no existe caminho de k a h no grafo de predecessores


(N, A );
(i3) y(s) = 0 e (s) = NIL ;
(i4) se y(t) < ento h um caminho de s a t no grafo (N, A ).
(Prove essas invariantes!) A invariante (i2) consequncia de nossa hiptese sobre a
ausncia de ciclos de custo negativo. Juntas, as invariantes (i1) e (i2) garantem que a rede
de predecessores no tem ciclos.
evidente que todas as invariantes valem no incio da primeira iterao. Suponha agora
que todas valem no incio da iterao corrente; vamos mostrar que elas continuam valendo
no incio da prxima iterao.
Prova de (i1): O estado do arcos que no tm ponta j no afetado pela redefinio de y(j).
Os arcos que terminam em j sero retirados (pela atribuio (j) i) do grafo predecessores. Resta analisar os arcos de A que tm ponta inicial j . Com a redefinio de y(j),
um tal arco torna-se tenso (se era justo) ou continua tenso (se j era tenso).
Prova de (i2): Seja hk um arco e suponha que existe um caminho P de k a h na rede de
predecessores. Em virtude de (i1), temos y(h) y(k) c(P ) por um raciocnio anlogo ao
usado na prova do lema 6.2. Observe que P hh, ki um ciclo de custo c(P ) + chk . Como
nossa rede no tem ciclos de custo negativo, devemos ter y(k) y(h) chk , ou seja, hk no
tenso.
Prova de (i4): Suponha que estamos no incio da iterao e j escolhemos o arco ij . Como o
arco est tenso, temos y(i) < e portanto existe um caminho digamos I de s a i na
rede de predecessores. Caso 1: y(j) = . Ento (j) = , donde no h caminho de s a j
na rede de predecessores. Portanto, a atribuio (j) i estende at j o caminho I e no
altera nenhum dos demais caminhos na rede de predecessores. Caso 2: y(j) < . Nesse
caso, existe um caminho de s a j digamos J na rede de predecessores. Em virtude de
(i2), j no est em I . fcil verificar, ento, que depois da atribuio (j) i na linha 07
a propriedade (i4) continua vlida (ainda que o caminho J no mais pertena rede de
predecessores no fim da iterao).

(i1)

(i2)

O algoritmo est correto? Suponha que estamos no incio da ltima iterao. Ento
y(j) y(i) cij para todo arco ij . Portanto y um c-potencial, como o enunciado do
algoritmo promete.
Mostremos em seguida que y(v) < para todo n v . Se S denota o conjunto dos ns
v tais que y(v) < ento (S, N S) = , uma vez que y um c-potencial. Diante da
hiptese (6.2), isso s possvel se S = N . Portanto, y(v) < para todo n v . Agora
(i4) garante que, para todo n t, existe um caminho Pt de s a t na rede de predecessores.
Por um raciocnio anlogo ao que usamos para provar o lema 6.2, podemos deduzir de
(i1) que
y(t) y(s) c(Pt ) .
Como y um c-potencial, y(t) y(s) = c(Pt ). Assim, o algoritmo realmente faz o que
promete fazer.

(i4)
(i1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

44

Nmero de iteraes. No est claro que a execuo do algoritmo termina depois de


um nmero finito de iteraes. Para mostrar isso, preciso observar mais uma invariante.
Se S o conjunto {v : y(v) < }, ento, no incio de cada iterao,
(i5) para cada v em S , temos y(v) n0 C 0 , onde n0 := |S| e C 0 o mximo de |cpq |
para todos os arcos pq que tm ambas as pontas em S .
(Prove a invariante!) Segue imediatamente de (i5) que no incio de cada iterao temos
y(v) nC
para todo n v em S , sendo C := maxijA |cij |.10 Por outro lado, em virtude de (i1),
y(v) y(s) c(Pv ), onde Pv o caminho de s a v na rede de predecessores. Como
y(s) = 0 em virtude de (i3), temos y(v) c(Pv ). Como Pv tem no mximo n 1 arcos,
temos c(Pv ) (n 1)(C) = nC + C nC . Em suma,
y(v) nC .
Os valores de y so inteiros pois os valores de c so inteiros. Cada iterao reduz o valor
de y(j) em pelo menos uma unidade. Como nC y(j) nC , cada n v da rede pode
fazer o papel de j na linha 6 no mximo 2nC vezes. Logo, o nmero de execues do
bloco de linhas 57 no passa de
(2nC)n = 2n2 C .

(6.4)

Isso mostra, em particular, que a execuo do algoritmo termina depois de um nmero


finito de iteraes.
Consumo de tempo. Cada teste da condio na linha 5 consome O(m) unidades de
tempo. Logo, o consumo de tempo de cada iterao O(m). Como as linhas 14 consomem O(n) unidades de tempo, o algoritmo consome
O(mn2 C)
unidades de tempo. (O consumo de tempo to elevado porque o algoritmo pode examinar cada arco muitas vezes. Outra maneira de ver isso: o nmero de iteraes elevado
porque, para cada n i, o valor de y(i) pode diminuir muitas vezes antes de atingir seu
valor final.) Como o consumo de tempo depende de c (mais precisamente, o nmero de
iteraes depende de c) dizemos que o algoritmo pseudo-polinomial.

6.5

Algoritmo de Ford-Bellman

O algoritmo abaixo uma implementao genuinamente polinomial do algoritmo


F ORD.11 Do ponto de visa do consumo assinttico de tempo, esse o melhor algoritmo
10

Em AMO, topo da pgina 140, a justificativa dessa delimitao est errada.


AMO, p.142, diz que se trata de uma O(nm) implementation of the modified label-correcting algorithm. CLRS diz algoritmo de Bellman-Ford.
11

(i1)
(i3)

FEOFILOFF

FLUXO EM REDES

15/11/2013

45

conhecido para o problema do caminho mnimo com custos arbitrrios.


F ORD -B ELLMAN (N, A, s, c)  (N, A, c) no tem ciclos negativos
01 para cada i em N faa
02
y(i)
03
(i) NIL
04 y(s) 0
05 repita n 1 vezes
06
para cada arco ij em A faa
07
se y(j) > y(i) + cij
08
ento y(j) y(i) + cij
09
(j) i
10 devolva y e
O algoritmo recebe uma rede (N, A, c) sem ciclos de custo negativo e um n s. Se a
condio (6.2) estiver satisfeita, o algoritmo produz um c-potencial y e uma funopredecessor dotadas da seguinte propriedade: para cada n t, a funo determina
um caminho P de s a t tal que c(P ) = y(t) y(s).
Invariantes. Digamos que o incio de cada iterao fica na linha 06 (e no na linha 05),
imediatamente antes que um novo arco seja escolhido para fazer o papel de ij . No incio
de cada iterao, vamos denotar por a sequncia de arcos examinados at agora.12 Diremos que um caminho bem-casado com se tem origem s e sua sequncia de arcos
uma subsequncia13 de . (Convm observar que os caminhos na rede de predecessores
em geral no so bem-casados com .)
Alm das invariantes (i1)(i4), temos a seguinte: no incio de cada iterao,
(i6) cada n w tal que y(w) < trmino de um caminho bem-casado com ; ademais, y(w) c(W ) para qualquer caminho W bem-casado com que termina
em w .14
evidente que (i6) vale no incio da primeira iterao. Suponha agora que (i6) vale no
incio de uma iterao qualquer (antes, portanto, da escolha do prximo arco ij a ser
examinado). Uma vez escolhido o arco ij , preciso mostrar que (i6) vale com hiji no
lugar de . Suponha que W um caminho bem-casado em relao a hiji e seja w o
trmino de W . preciso considerar dois casos. Caso 1: W bem-casado em relao
a . Ento temos y(w) c(W ) no incio da iterao e portanto tambm y(w) c(W ) no
12

como se tivssemos a instruo hi entre as linhas 04 e 05 e a instruo hiji entre as


linhas 06 e 07. No fim da ltima iterao, ter exatamente n 1 cpias de cada arco do grafo.
13
Da mesma forma, por exemplo, que hb, c, e, hi uma subsequncia de ha, b, c, d, e, f, g, hi mas hc, ai
no subsequncia de ha, b, c, di .
14
O que no significa que todos os arcos do caminho estejam relaxados. Veja o exerccio 6.11.

FEOFILOFF

FLUXO EM REDES

15/11/2013

46

fim da iterao, uma vez que a execuo das linhas 0709 no aumenta o valor de y(w).
Caso 2: W no bem-casado em relao a . Nesse caso, hi, ji segmento terminal de
W e portanto w = j . Seja W 0 o segmento inicial de W que termina em i. claro que
W 0 bem-casado em relao a . Logo, y(i) c(W 0 ) no incio da iterao e portanto
tambm y(i) c(W 0 ) depois da execuo das linhas 0709. Portanto, no fim da iterao
temos y(w) y(j) = y(i) + cij c(W 0 ) + cij = c(W ). Isso prova (i6).
O algoritmo faz o que promete?
cer o seguinte lema:

Antes de analisar a ltima iterao, convm estabele-

Lema 6.3 Se a rede (N, A, c) no tem ciclos de custo negativo ento, para todo arco vw e
para todo caminho V de s a v , existe um caminho W de s a w tal que c(W ) c(V ) +
cvw .15
D EMONSTRAO : Se V hv, wi um caminho ento tome W := V hv, wi e observe que
c(W ) = c(V ) + cvw . Suponha agora que V hv, wi no um caminho e portanto V passa
por w . Seja V 0 o segmento inicial de V que termina em w e V 00 o segmento terminal de
V que comea em w . Como V 00 hv, wi um ciclo, temos c(V 00 ) + c(hv, wi) 0. Observe
agora que V 0 um caminho de s a w e que c(V 0 ) c(V 0 )+c(V 00 )+c(hv, wi) = c(V )+cvw .
Suponha agora que estamos no fim da execuo do algoritmo. Ento uma composio
de 1 , . . . , n1 , sendo cada k uma enumerao de A. Como todo caminho na rede tem
no mximo n 1 arcos, todo caminho na rede que comea em s bem-casado com .
Segue da e de (i6) que
y(w) c(W ) para qualquer caminho W de s a w .

(i6)

(6.5)

Podemos mostrar agora que y um c-potencial. Seja vw um arco. Em virtude da


hiptese (6.2), existe um caminho, digamos V , de s a v . Em virtude da invariante
(i1), temos y(v) y(s) c(V ). Como y(s) = 0 em virtude de (i3), podemos dizer
que y(v) c(V ). O lema 6.3 garante que existe um caminho W de s a w tal que
c(W ) c(V ) + cvw . Finalmente, em virtude de (6.5),

(i1)
(i3)

y(w) c(W ) c(V ) + cvw y(v) + cvw .


Isso mostra que vw relaxado. Como cada arco est relaxado, y um c-potencial.
Para concluir a anlise, seja t um n qualquer da rede. Em virtude da hiptese (6.2),
existe um caminho T de s a t na rede; em virtude de (6.5), temos y(t) c(T ) < .
Em vista de (i4), existe um caminho de s a t na rede de predecessores; digamos que esse
caminho P . Como y um c-potencial, o lema 6.2 garante que y(t) y(s) c(P ). Por
outro lado, y(t)y(s) c(P ) em virtude de (i1). Logo, y(t)y(s) = c(P ), como promete
o enunciado do algoritmo.
15

Esse o Lema 24.10, p.607, no CLRS. Tambm a equao (5.1), p.135, em AMO. A demonstrao no
AMO est errada.

(i4)
(i1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

47

Consumo de tempo. evidente que o algoritmo consome O(nm) unidades de tempo.


Como esse consumo depende apenas de n e m, dizemos que algoritmo fortemente
polinomial.
Como m = O(n2 ), pode-se dizer que o algoritmo O(n3 ).

6.6

Implementao FIFO do Ford-Bellman

O algoritmo F ORD -B ELLMAN examinha os arcos da rede em uma ordem arbitrria. Convm fazer isso de maneira um pouco mais organizada (ainda que isso no reduza o consumo assinttico de tempo):16
FIFO-F ORD -B ELLMAN (N, A, c, s)  (N, A, c) no tem ciclos negativos
01 para cada i em N faa
02
y(i)
03
(i) NIL
04 y(s) 0
05 L hsi
06 enquanto L 6= hi faa
07
retire o primeiro elemento, digamos i, de L
08
para cada ij em A(i) faa
09
se y(j) > y(i) + cij
10
ento y(j) y(i) + cij
11
(j) i
12
se j
/L
13
ento acrescente j ao final de L
14 devolva y e
A sequncia L manipulada de acordo com a poltica FIFO: o primeiro n a entrar na
fila tambm o primeiro a sair. No comeo de cada iterao, L contm todos os ns
que so ponta inicial de arcos tensos (mas pode tambm conter a pontas iniciais de arcos
relaxados).
Para mostrar que o algoritmo funciona corretamente, basta refazer a prova da correo
do algoritmo F ORD -B ELLMAN supondo que na sequncia todos os arcos que saem de
um mesmo n so consecutivos.
Graas ausncia de ciclos de custo negativo, cada arco da rede examinado (na linha 09)
no mximo n 1 vezes. Portanto, o algoritmo tem a mesma delimitao assinttica que
16

A seo 5.3, p.142, de AMO chama essa verso de FIFO implementation of the label-correcting algorithm (veja figura 5.5, p.141). FIFO a sigla da poltica First-In-First-Out que caracteriza a operao de uma
fila.

FEOFILOFF

FLUXO EM REDES

15/11/2013

48

o algoritmo de F ORD -B ELLMAN, ou seja, consome


O(mn)
unidades de tempo.

6.7

Apndice: Custos reduzidos

Suponha dado um c-potencial y (no necessariamente timo) para uma rede (N, A, c).
Seja c0 a funo-custo definida por c0ij = cij y(j) + y(i) para cada arco ij . Diz-se que c0
um custo reduzido. Observe que
c0ij 0
para cada ij . No difcil mostrar que qualquer caminho que tenha custo mnimo na
rede (N, A, c0 ) tambm tem custo mnimo na rede (N, A, c). Essa observao til pois
h algoritmos muito mais eficientes (veja captulo 8) que o de F ORD -B ELLMAN no caso em
que os arcos tm custos no negativos. A propsito, veja o mdulo GB _ DIJK do Stanford
GraphBase de Knuth [Knu93] e a referncia ao algoritmo A* na seo 8.5.

Exerccios
6.1 [CCPS 2.19, p.34. CLRS lema 24.1, p.582. AMO property 4.1, p.106.] Mostre (por
meio de um exemplo) que um segmento inicial de um caminho de custo mnimo
pode no ser um caminho de custo minimo se a rede tiver um ciclo de custo negativo.
6.2 Para cada n v da rede, seja (s, v) o custo de um caminho de custo mnimo de s
a v . Se a rede (N, A, c) no tem ciclos de custo negativo ento (s, w) (s, v)+cvw
para todo arco vw .17
6.3 [Bom] Seja s um n de uma rede (N, A, c). Para cada n j , seja Pj um caminho
de s a j . Descreva um algoritmo que permita decidir se a coleo de caminhos
tima, ou seja, se c(Pj ) mnimo para cada j .
6.4 [Parte de AMO 4.45] Suponha dada uma rede (N, A, c) com funo-custo c 0.
Suponha que s, t e p so trs ns da rede. Problema: encontrar um passeio18
de custo mnimo dentre os que comeam em s, passam por p, e terminam em t.
17

Esse lema consta como Lema 24.10, p.607, no CLRS e tambm como equao (5.1), p.135, em AMO. A
demonstrao no AMO est errada.
18
um passeio, ao contrrio de um caminho, pode passar mais de uma vez por um mesmo n

FEOFILOFF

FLUXO EM REDES

15/11/2013

49

1. Uma soluo do problem necessariamente um caminho? 2. Descreva informalmente um algoritmo para resolver o problema. Prove que o seu algoritmo resolve
o problema.
6.5 [CCPS 2.29, p.35. Generalizao do lema 6.2.] Suponha que para cada n i temos
um caminho s a i de custo zi . Suponha que para cada arco ij temos zj zi
cij + K . Prove que, para cada i, a diferena entre zi e o custo de um caminho
mnimo de s a i Kn.
6.6 [I MPORTANTE. AMO 5.21, p.160] Suponha que a funo-custo c de uma rede
(N, A, c) tem valores negativos. Digamos que = minijA cij . Some ao custo
de cada arco. Agora os custos so no negativos. Aplique o algoritmo de Dijkstra
(captulo 8) que muito mais eficiente que os algoritmos do presente captulo.
Os caminhos produzidos pelo algoritmo tm custo mnimo em relao funo c
original?
6.7 Que acontece se o algoritmo F ORD for aplicado a uma rede dotada de um ciclo de
custo negativo?
6.8 [AMO 5.1, 5.5, p.157] Resolva o problema do caminho mnimo nas redes da figura
5.10, p.158 de AMO.
6.9 [AMO 5.4, p.158] Resolva o problema do caminho mnimo nas redes da figura 5.10,
p.158, de AMO.
6.10 Mostre que est errada a seguinte alternativa para a invariante (i6) do algoritmo
F ORD -B ELLMAN: para cada n x tal que y(x) < tem-se y(x) y(s) = k (s, x),
onde k (s, x) o custo de um caminho de custo mnimo na rede dentre os que
caminhos que vo de s a x e tm comprimento < k .
6.11 Considere uma iterao qualquer do algoritmo F ORD -B ELLMAN. Seja P um caminho na rede de predecessores. Mostre que a sequncia de arcos de P no necessariamente uma subsequncia de (onde a sequncia de arcos examinados
at o momento).
6.12 Aplique o algoritmo F ORD -B ELLMAN a uma rede. Interrompa a aplicao do algoritmo em uma iterao qualquer e exiba, para cada n w , um caminho W com trmino w que seja bem-casado com (veja invariante (i6)). Construa o seu exemplo
de modo que um ou mais desses caminhos no estejam na rede de predecessores.
6.13 Prove que o algoritmo FIFO-F ORD -B ELLMAN funciona corretamente.

(i6)

FEOFILOFF

FLUXO EM REDES

15/11/2013

50

6.14 Suponha que todos os arcos de uma rede tm o mesmo custo Seja s um n de uma
rede. Qual o algoritmo mais rpido para determinar caminhos de custo mnimo
de s a cada um dos outros ns?
6.15 [Anlise de sensibilidade] Seja s um n de uma rede (N, A, c) sem ciclos de custo
negativo. Para cada n v , digamos que (v) a distncia de s a v , ou seja, o
custo de um caminho de custo mnimo de s a v . De quanto podemos diminuir o
custo de um certo arco pq sem que os valores da funo se alterem?
6.16 Digamos que o custo de um caminho definido como o mnimo dos custos de seus
arcos. (Seria mais sugestivo, nesse caso, trocar o termo custo por capacidade.)
Problema: Determine um caminho de custo mnimo dentre os vo de s a t.
6.17 [CCPS 2.42, p.36.] Considere o seguinte refinamento do algoritmo F ORD. Seja
v1 , . . . , vn uma enumerao de N tal que v1 = s. Seja A1 := {vi vj A : i < j} e
1 uma enumerao de A1 tal que vi vj precede vp vq se i < p. Seja A2 := {vi vj
A : i > j} e 2 uma enumerao de A2 tal que vi vj precede vp vq se i > p. Faa
com que o algoritmo F ORD examine os arcos na ordem 1 2 1 2 . Compare
o consumo de tempo desse algoritmo com o de F ORD -B ELLMAN.
6.18 Complete os detalhes da seo 6.7.
6.19 Refaa o captulo todo sem a hiptese (6.2). Procure resolver o problema sem introduzir novos arcos na rede.
6.20 [Scaling. CCPS 2.30, p.35.] Detalhe e discuta a seguinte variante do algoritmo
F ORD. Para algum inteiro p, suponha que durante o estgio p do algoritmo
executamos a relaxao y(j) y(i) cij somente para arcos ij que satisfazem
y(j) y(i) + cij + 2p . Quando no houver mais arcos desse tipo, o valor de p
diminudo de 1. Se fizermos isso com p = 0, teremos o algoritmo F ORD original.
Deduza do exerccio 6.5 uma delimitao do nmero de iteraes em cada estgio depois do primeiro. Em seguida, escolha o valor inicial de p de modo que a
delimitao tambm se aplique ao primeiro estgio. Qual o consumo de tempo
total do algoritmo?
6.21 [E XERCCIO DE MODELAGEM] Um pseudocaminho uma sequncia hi0 , i1 , . . . , iq i
de ns tal que, para cada k , tem-se ik1 ik A ou ik ik1 A. Os arcos do primeiro
tipo so diretos e os do segundo so inversos. Suponha que cada arco ij da
P rede
00
0
c0hi +
tem
P 00dois custos, cij e cij , ambos em Z. O custo de um pseudocaminho P
cjk , onde a primeira soma se estende a todos os arcos diretos de P e a segunda
a todos os arcos inversos de P . Problema: Determinar um pseudocaminho de
custo mnimo dentre os que vo de s a t. Enuncie uma condio de otimalidade
apropriada.

Captulo 7

Ciclos negativos
Este captulo1 trata de uma generalizao do problema dos ciclos que estudamos no captulo 4. Por outro lado, pode-se dizer que este captulo reexamina, de um ponto de
vista ligeiramente diferente, o captulo 6 (Caminhos de Custo Mnimo). Como naquele
captulo, temos uma rede (N, A, c) em que c uma funo-custo,
c:AZ,
que atribui um custo inteiro arbitrrio (positivo, negativo ou nulo) a cada arco.
Problema 7.1 (do ciclo negativo) Dada uma rede (N, A, c) com funo-custo c, encontrar um ciclo de custo negativo.
Este problema uma generalizao do problema dos ciclos (capitulo 4).

7.1

Condies de inexistncia

Um c-potencial qualquer potencial y tal que


y(j) y(i) cij

(7.1)

para cada arco ij . A funo nula no , em geral, um c-potencial (a menos que c 0).
Convm lembrar o lema 6.2: Se y um c-potencial ento, para qualquer passeio P com
origem s e trmino t,
y(t) y(s) c(P ) .
Segue da imediatamente o seguinte
1

Trata-se de um resumo da seo 5.5 do AMO. O material tambm est muito bem explicado no cap.24
(especialmente sees 24.1, 24.2 e 24.5) do CLRS.

51

FEOFILOFF

FLUXO EM REDES

15/11/2013

52

Corolrio 7.2 Se uma rede (N, A, c) admite um c-potencial ento c(O) 0 para todo
ciclo O .
Portanto, para provar que uma rede no tem ciclos de custo negativo, basta exibir um cpotencial. Em outras palavras, um c-potencial um certificado da inexistncia de ciclos
negativos em uma rede.
E XERCCIO : Prove que a rede abaixo no tem ciclo de custo negativo.
arco
custo

7.2

qp qr sr sp pt tq rt ts
1 2 3 4 +3 +0 +2 +1

Algoritmo genrico

O seguinte algoritmo resolve o problema do ciclo negativo.2 Ele essencialmente idntico


ao algoritmo F ORD do captulo 6 (mas note que o valor inicial de y 0 em todos os ns).3
Para no sobrecarregar o algoritmo com detalhes secundrios, vamos permitir que ele
devolva no um ciclo mas um quase caminho (veja seo 2.4) que tem um ciclo de custo
negativo como segmento inicial. (Veja exerccios 7.3 e 7.5).
F ORD (N, A, c)
01 C maxijA |cij |
02 para cada i em N faa
03
y(i) 0
04
(i) NIL
05 enquanto y(j) > y(i) + cij para algum ij em A faa
06
y(j) y(i) + cij
07
(j) i
08
se y(j) < nC
09
ento devolva j
10 devolva y
O algoritmo recebe uma rede (N, A, c), sendo c uma funo que associa custos inteiros
aos arcos. O algoritmo devolve um n j ou um c-potencial y . No primeiro caso, a
funo-predecessor determina, a partir de j , um quase caminho que tem um ciclo de
custo negativo como segmento inicial. No segundo caso, o c-potencial prova que a rede
no tem ciclo de custo negativo.
2

O algoritmo soluo do exerccio CCPS 2.20, p.34.


Isso um pouco diferente de AMO e CLR, que comeam o algoritmo com y(i) para todo i
diferente de s .
3

FEOFILOFF

FLUXO EM REDES

15/11/2013

53

Eis as invariantes vlidas no incio de cada iterao (como de hbito, diremos que um
arco vw est tenso se y(w) y(v) > cvw , relaxado se y(w) y(v) cvw e justo se
y(w) y(v) = cvw ):
(i1) cada arco em A est justo ou tenso;4
(i2) c(O) < 0 para todo ciclo O na rede de predecessores;
(i3) para cada n w , se (w) = NIL ento y(w) = 0.
Prove essas invariantes!
O algoritmo est correto? Se a execuo do algoritmo termina na linha 10 ento evidente que y um c-potencial. Suponha agora que a execuo do algoritmo termina na
linha 09. Suponha por um momento que a sequncia
hj, (j), ((j)), . . .i

(7.2)

finita e seja w o seu ltimo n. O inverso da sequncia (7.2) um caminho de w a j ,


digamos P , na rede de predecessores. De acordo com (i1), y(j) y(w) c(P ). Como
y(w) = 0 em virtude de (i3), temos y(j) c(P ). Mas c(P ) (n 1)(C) = nC + C
nC . Logo, y(j) nC , o que contradiz a condio da linha 08. Conclumos assim que
a sequncia (7.2) infinita. Portanto, a sequncia inversa um quase caminho. Algum
segmento inicial do quase caminho um ciclo. Por (i2), esse ciclo tem custo negativo.
Consumo de tempo. Pelas razes que j discutimos na seo 6.4, o algoritmo executa
n2 C iteraes. Portanto, o consumo total de tempo O(mn2 C).

7.3

Algoritmo de Ford-Bellman

O algoritmo de Ford-Bellman essencialmente o mesmo do captulo 6. Ele um aperfeioamento de F ORD.


F ORD -B ELLMAN (N, A, c)
01 para cada i em N faa
02
y(i) 0
03
(i) NIL
04 repita n 1 vezes  n := |N |
05
para cada arco ij em A faa
06
se y(j) > y(i) + cij
07
ento y(j) y(i) + cij
4

Portanto, y(q) y(p) c(P ) para qualquer caminho P de p a q na rede de predecessores.

(i1)
(i3)

(i2)

FEOFILOFF

08
09
10
11
12
13

FLUXO EM REDES

15/11/2013

54

(j) i
para cada arco ij em A faa
se y(j) > y(i) + cij
ento (j) i
devolva j
devolva y

O algoritmo est correto pelos mesmos motivos que o algoritmo F ORD -B ELLMAN do
captulo 6. O consumo de tempo , obviamente, O(mn).

7.4

Implementao FIFO

Como no captulo 6, podemos manter em uma fila os arcos que o algoritmo de FordBellman deve ainda examinar:
FIFO-F ORD -B ELLMAN (N, A, c)
01 para cada i em N faa
02
y(i) 0
03
(i) NIL
04
(i) 0
05 seja L uma sequncia de todos os ns
06 enquanto L 6= hi faa
07
retire o primeiro elemento, digamos i, de L
08
para cada ij em A(i) faa
09
se y(j) > y(i) + cij
10
ento y(j) y(i) + cij
11
(j) i
12
se j
/L
13
ento acrescente j ao final de L
14
(i) (i) + 1  i j foi examinado (i) vezes
15
se (i) > n 1
16
ento devolva j
17 devolva y
O consumo de tempo O(mn).

Exerccios
7.1 Escreva um algoritmo que receba um n s de uma rede (N, A, c) com c : A
Z e devolva (1) um n de um ciclo de custo negativo que esteja ao alcance de s

FEOFILOFF

FLUXO EM REDES

15/11/2013

55

ou (2) um c-potencial y e, para cada n t ao alcance de s, um caminho P de


s a t tal que c(P ) = y(t) y(s). O ciclo em (1) e os caminhos em (2) podem
ser representados por uma funo-predecessor. Implemente o algoritmo usando a
estrutura de dados do Stanford GraphBase. Escreva rotinas de teste.
7.2 A seguinte verso do algoritmo F ORD est correta?
F ORD-II (N, A, c)
1 para cada i em N faa
2
y(i) 0
3
(i) NIL
4 enquanto y(j) > y(i) + cij para algum ij em A faa
5
y(j) y(i) + cij
6
se (j) 6= i
7
ento (j) i
8
seno devolva j
9 devolva y

7.3 Suponha que o algoritmo F ORD devolve um n j . Mostre que j pode no pertencer a um ciclo.
7.4 No fim da execuo do algoritmo F ORD, verdade que todo arco ij que no pertence a um ciclo de custo negativo est relaxado?
7.5 Acrescente comandos ao algoritmo F ORD para que ele devolva um n de um ciclo
de custo negativo (quando tal ciclo existe). O ciclo propriamente dito definido
pela funo-predecessor.
7.6 [Ciclos de custo nulo. AMO 5.19, p.160] Suponha que uma rede (N, A, c) com
funo-custo c no tem ciclos de custo negativo. Seja y um c-potencial (s, )timo para algum n s. Seja E o conjunto dos arcos ij para os quais y(j) y(i) =
cij . Mostre que h uma correspondncia biunvoca entre ciclos de custo 0 em
(N, A, c) e ciclos em (N, E). Mostre como encontrar um ciclo em (N, E) em O(|A|)
unidades de tempo.
7.7 [Grafo tricolorido. AMO 6.29, p.203] Suponha que cada arco de um grafo (N, A)
verde, amarelo ou vermelho. Seja st um arco amarelo. Mostre que uma e apenas
uma das seguintes afirmaes verdadeira: (1) st pertence a um ciclo de arcos
amarelos e verdes em que todos os arcos amarelos tm uma mesma orientao;
(2) st pertence a um corte cujos arcos so amarelos e vermelhos e todos os arcos
amarelos tm a mesma orientao.
7.8 [Ciclos negativos no orientados] Suponha que cada arco de um grafo (N, A)
verde, amarelo ou vermelho. Suponha que cada arco ij tem um custo inteiro cij

FEOFILOFF

FLUXO EM REDES

15/11/2013

56

(positivo, nulo ou negativo). Um ciclo bom seus arcos diretos so verdes ou amarelos,
eP
seus arcos inversos so vermelhos ou amarelos. O custo de um ciclo
P
cij ckl , onde a primeira soma sobre os arcos diretos do ciclo e a segund sobre os inversos. Especifique uma funo-potencial que possa ser usada para provar
que no h ciclos bons de custo negativo.

Captulo 8

Caminhos mnimos
sob custos no negativos
Este captulo1 trata do problema dos caminhos mnimos (veja captulo 6) no caso em que
a funo-custo no negativa: cada arco da rede tem um custo inteiro
cij 0 .
Nesse caso, a hiptese (6.1) est trivialmente satisfeita e existem algoritmos bem mais
eficientes que os do captulo 6.
Problema 8.1 (do caminho mnimo sob custo no negativo) Dada uma rede (N, A, c)
com funo-custo c : A Z e um n s, encontrar, para cada n t, um caminho de
custo mnimo2 de s a t.
Para simplificar a anlise dos algoritmos, vamos tratar somente do caso em que o problema tem soluo, ou seja, somente do caso em que
todos os ns da rede esto ao alcance de s.3

(8.1)

No muito difcil remover essa hiptese, como sugere o exerccio 8.2.


1

Veja captulo 4 (Shortest Paths: Label-Setting Algorithms) do AMO. Melhor: veja no captulo 24 (especialmente sees 24.3 e 24.5) do CLRS ou o captulo 25 do CLR.
2
H quem diga que cij o comprimento do arco ij e que o custo de um caminho mnimo de s a t a
distncia de s a t . Prefiro no fazer isso e reservar a palavra comprimento para designar o nmero de arcos
do caminho.
3
No AMO, p.94, essa hiptese registrada como Assumption 4.2.

57

FEOFILOFF

8.1

FLUXO EM REDES

58

15/11/2013

Condies de otimalidade

Como j vimos no captulo 6, um c-potencial qualquer funo y de N em Z tal que


y(j) y(i) cij

(8.2)

para cada arco ij . Diremos que esta a desigualdade triangular para o arco ij .
Exemplo 1: A funo nula (y = 0) um c-potencial, uma vez que c 0. Exemplo 2: Se
y um c-potencial e f uma funo constante ento evidente que y f tambm um
c-potencial. Exemplo 3: Se y mede as distncias a partir de s, ou seja, se y(i) o custo
de um caminho mnimo de s a i, ento y um c-potencial. A prova desse fato no
trivial (veja exerccio 8.4).4
De acordo com o lema 6.2, se y um c-potencial ento, para qualquer passeio P temos
y(k) y(h) c(P ) ,

(8.3)

sendo h a origem e k o trmino de P . Logo, para provar a minimalidade do custo de


um caminho P de s a t, basta exibir um c-potencial y tal que y(t) y(s) = c(P ).
Assim, para resolver o problema do caminho mnimo basta exibir um c-potencial y e,
para cada t, um caminho P de s a t tal que y(t) y(s) = c(P ). Diremos que um tal
potencial y (s, )-timo. Como veremos adiante, um c-potencial (s, )-timo existe e
pode ser facilmente calculado.

8.2

Algoritmo de Dijkstra

O seguinte algoritmo, atribudo a Edsger W. Dijkstra, resolve o problema.5 Descreveremos aqui a verso genrica do algoritmo; algumas variantes de implementao sero
discutidas nas prximas sees.
D IJKSTRA (N, A, c, s)  c 0
01 para cada i em N faa
02
y(i)
03
(i) NIL
04 y(s) 0
05 Q N
06 enquanto Q 6= faa
07
escolha i em Q de modo que y(i) seja mnimo
4

Veja propriedade 4.2, p.107, do AMO.


Veja figura 4.6, seo 4.5, p.109, do AMO. Veja exemplo na figura 4.7, p.110, do AMO. Tambm seo
24.3 do CLRS.
5

FEOFILOFF

08
09
10
11
12

FLUXO EM REDES

15/11/2013

59

Q Q {i}
para cada ij em A(i) faa
se y(j) > y(i) + cij
 jQ
ento y(j) y(i) + cij
(j) i

Na prtica, o na linha 02 pode ser substitudo pelo nmero nC + 1, onde n := |N | e


C := maxijA cij , pois qualquer caminho na rede tem custo (n 1)C = nC C nC .
O algoritmo D IJKSTRA recebe uma rede (N, A, c), sendo c uma funo-custo no negativa, e um n s. Se a hiptese (8.1) estiver satisfeita,6 o algoritmo produz uma funopredecessor e um c-potencial y dotadas da seguinte propriedade: para cada n t, a
funo determina um caminho P de s a t tal que y(t) y(s) = c(P ).
O algoritmo faz o que promete? Para provar que o algoritmo faz o que promete, basta
verificar quatro propriedades invariantes. Ao enunciar essas propriedades, diremos que
um arco vw est tenso se y(w) y(v) > cvw , relaxado se y(w) y(v) cvw e justo se
y(w) y(v) = cvw .7
Eis as invariantes, vlidos em cada iterao imediatamente antes da comparao de Q
com na linha 06:
(i1)
(i2)
(i3)
(i4)

cada arco tenso pq tem ambas as pontas em Q;


cada arco na rede de predecessores justo;8
se y(w) < ento existe um caminho de s a w na rede de predecessores;
para todo arco vw da rede de predecessores tem-se v
/ Q.

Prove essas invariantes!


Suponha agora que estamos no incio da ltima iterao, quando Q = hi. Ento, em
virtude de (i1), no h arcos tensos; portanto, y um c-potencial. O lema 6.2 garante
ento que se y(v) = ento v no est ao alcance de s, o que contradiz a hiptese (8.1).
Logo, y(v) < para todo v . Por (i3), para todo t existe um caminho P de s a t na rede
de predecessores. Por (i2), y(t) y(s) = c(P ). Portanto, o algoritmo de fato faz o que
promete.
Consumo de tempo do algoritmo. O tempo gasto com a execuo do bloco de linhas
0105 O(n). O consumo de tempo de todas as execues da linha 06 tambm O(n),
6

Mesmo que a hiptese no esteja satisfeita, o algoritmo produz resultados corretos: basta interpret-los
de maneira apropriada.
7
Imagine que cada arco vw um pedao de barbante de comprimento cvw . Imagine tambm que y(v)
e y(w) so as alturas de v e w em relao ao cho. Veja analog solution, AMO, p.96.
8
Esta a condio de folgas complementares da programao linear.

(i1)
(i3)
(i2)

FEOFILOFF

FLUXO EM REDES

15/11/2013

60

pois Q diminui a cada iterao. O consumo de tempo de cada execuo da linha 07


O(|Q|) e portanto o consumo de todas as execues
O(n + (n 1) + + 2 + 1) = O(n(n + 1)/2) = O(n2 ) .
O consumo de tempo de todas as execues da linha 08 O(n). O consumo de tempo do
bloco de linhas 09-12 para cada
P i fixo O(|A(i)|). Logo, o consumo de todas as execues
daquele bloco de linhas O( i |A(i)|) = O(m). Em suma, o consumo total de tempo do
algoritmo
O(n) + O(n) + O(n2 ) + O(n) + O(m) = O(n2 + m) = O(n2 )
unidades de tempo, uma vez que m < n2 . Observe que a maior parte do tempo consumida pelo repetido clculo do mnimo na linha 07.
Eis uma verso mais simples dessa mesma anlise. O nmero de iteraes do bloco
de linhas 0712 no passa de n pois Q diminui a cada iterao. Em cada iterao,
o tempo gasto por cada execuo da linha 07 O(|Q|) e o tempo gasto com cada
execuo do bloco de linhas 0912 O(|A(i)|). Como |Q| n e |A(i)| n 1, o
consumo total de tempo do algoritmo O(n2 ) unidades de tempo.9
Se o grafo denso, isto , se m = (n2 ), no se conhece algoritmo assintoticamente
melhor que esse. Para grafos no densos, veja abaixo a implementao H EAP -D IJKSTRA.

8.3

Implementao de Dial

A operao crtica do algoritmo D IJKSTRA, do ponto de vista do consumo de tempo, est


na escolha de i em Q (linha 07). Eis uma implementao curiosa que tenta (com sucesso
duvidoso) tornar a linha 07 mais eficiente.10
Essa implementao explora o fato de que os custos dos arcos so nmeros inteiros. (Note
que o algoritmo D IJKSTRA funciona mesmo que os custos sejam nmeros no inteiros.)
Ela usa baldes (buckets) Q0 , Q1 , Q2 , . . . para armazenar ns.
D IAL -D IJKSTRA (N, A, c, s)
01 C maxijA cij
02 Q0 {s}
03 para k 1 at nC faa
04
Qk
05 QnC+1 N {s}
9
10

Esse o teorema 4.4, p.111, do AMO.


Veja seo 4.6, p.113, de AMO.

FEOFILOFF

06
07
08
09
10
11
12
13
14
15
16
17
18
19

FLUXO EM REDES

15/11/2013

61

para cada i em N faa


y(i)
(i) NIL
y(s) 0
enquanto Qk 6= para algum k faa
escolha o menor k tal que Qk 6=
escolha qualquer n i em Qk
Qk Qk {i}
para cada ij em A(i) faa
se y(j) > y(i) + cij
ento Qy(j) Qy(j) {j}
y(j) y(i) + cij
(j) i
Qy(j) Qy(j) {j}

Nessa implementao, claro que a unio Q0 QnC+1 dos buckets corresponde ao


conjunto Q do algoritmo D IJKSTRA. A invariante principal que envolve os buckets o
seguinte:
(i5) se v Qk ento y(v) = k .
O consumo de tempo de D IAL -D IJKSTRA O(m + nC) (mas na prtica o consumo fica
longe desse limite assinttico). Portanto, o algoritmo pseudopolinomial.

8.4

Implementao com heap

O ponto fraco do algoritmo D IJKSTRA em relao ao consumo de tempo est na escolha


de i em Q (linha 07). Para tornar o algoritmo mais eficiente, podemos tratar Q como um
min-heap com chave y .11
H EAP -D IJKSTRA (N, A, c, s)
01 para cada i em N faa
02
y(i)
03
(i) NIL
04 y(s) 0
05 seja Q o conjunto N organizado como um min-heap12 com chave y
06 enquanto Q 6= faa
07
i E XTRACT-M IN (Q)
11

Veja seo 24.3, p.595, do CLRS. O algoritmo tambm est na figura 4.10, p.115, seo 4.7 do AMO. Mas
AMO descreve o algoritmo de maneira um tanto suja e inconsistente com o algoritmo D IJKSTRA.
12
O elemento com menor chave fica no topo do heap.

FEOFILOFF

08
09
10
11
12

FLUXO EM REDES

15/11/2013

62

para cada ij em A(i) faa


valor y(i) + cij
se y(j) > valor
ento D ECREASE -K EY (valor , j, Q)
(j) i

A operao E XTRACT-M IN (Q) retira do min-heap Q um n i que minimiza y(i). e


rearranja o que sobrou de modo a restaurar a estrutura de min-heap.
A operao D ECREASE -K EY (valor , j, Q) restaura a estrutura de min-heap depois de fazer
y(j) valor .
Suponha que nosso min-heap binrio (cada pai tem no mximo dois filhos). Ento
cada execuo das linhas 07 e 11 consome O(log2 |Q|) = O(log2 n) unidades de tempo.
Logo, o consumo de todas as execues da linha 07 O(n log2 n) e o consumo de todas
as execues do bloco de linhas 0812 O(m log2 n). Como o consumo das linhas 0105
O(n), podemos dizer que o consumo de tempo total do algoritmo
O(n) + O(n) + O(n log2 n) + O(m log2 n) .
Como m n 1 em virtude da hiptese (8.1), podemos dizer que o consumo de tempo

O(m log2 n) .
Isso melhor que o consumo de tempo do algoritmo D IJKSTRA quando m =
O(n2 / log2 n).

Heap d-rio e valor timo de d


Podemos implementar Q como um min-heap d-rio, ou seja, um min-heap em que
cada pai tem no mximo d filhos.13 Ento cada execuo de D ECREASE -K EY consome
O(logd n) unidades de tempo e cada execuo de E XTRACT-M IN consome O(d logd n)
unidades de tempo. Logo, o consumo de todas as execues da linha 07 O(nd logd n)
e o consumo de todas as execues do bloco de linhas 0812 O(m logd n). O consumo
total de tempo do algoritmo
O(nd logd n + m logd n) .
Qual o valor timo de d, ou seja, o valor que minimiza nd logd n + m logd n? Pode ser
difcil determinar o valor timo exato; mas o valor timo aproximado, assinttico, fcil:
basta determinar o valor de d que torna as duas parcelas iguais.14 Assim, o valor timo
de d aproximadamente m/n (desde que esse nmero no seja menor que 2):
d = max (2, dm/ne) .
13
14

Veja p.116 e seo A.2, p.774, do AMO.


Seo 3.2, p.6566 (Parameter Balancing), do AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

63

Para esse valor de d, o consumo de tempo se reduz a


O(m logd n) .
Se m = (n1+ ) para algum  > 0 ento O(m logd n) = O(m).

8.5

Apndice: Reverse-Dijkstra

Considere a seguinte variao do problema do caminho mnimo sob custo no negativo:


Dada uma rede (N, A, c) com funo-custo c : A Z e um n t, encontrar, para cada
n s, um caminho de custo mnimo de s a t.15
Imagine que a rede representada pelos leques de entrada dos ns: para cada n i,
e
dado o conjunto A(i)
dos arcos que entram em i. Resta agora definir uma variante
apropriada do conceito de potencial e escrever uma variao apropriada do algoritmo
D IJKSTRA (essa variao conhecida como R EVERSE -D IJKSTRA). Veja exerccio 8.12.
Uma variante (bastante popular em certos crculos) do algoritmo de Dijkstra conhecida
como algoritmo A* (ou algoritmo A-estrela). Trata-se de uma heurstica que tende a
acelerar execuo do algoritmo de Dijkstra. Veja o verbete A* search algorithm na Wikipedia.

Exerccios
8.1 [I MPORTANTE. AMO 4.19, p.128. CCPS 2.36, p.36] Considere o problema do caminho de custo mnimo em que alguns arcos tm custo negativo. Construa um
exemplo desse tipo que o algoritmo de Dijkstra resolve corretamente. Construa
um exemplo que o algoritmo de Dijkstra no resolve corretamente.
8.2 Refaa o captulo todo sem a hiptese (8.1). Procure resolver o problema sem introduzir novos arcos na rede.
8.3 Seja (N, A, c) uma rede com funo-custo c 0. Prove que segmentos iniciais
de caminhos mnimos so caminhos mnimos. Mais precisamente, mostre que se
hi1 , . . . , ip , . . . , iq i um caminho de custo mnimo ento hi1 , . . . , ip i tambm um
caminho de custo mnimo.16

15
16

Veja seo 4.5, p.112, de AMO.


CLRS lema 24.1, p.582. AMO property 4.1, p.106.

FEOFILOFF

FLUXO EM REDES

15/11/2013

64

8.4 Seja s um n de uma rede (N, A, c) com funo-custo c 0. Prove a propriedade


triangular (s, w) (s, v) + cvw onde (s, x) o custo de um caminho de custo
mnimo dentre os que comeam em s e terminam em x.17
8.5 Inventei o algoritmo abaixo para competir com o algoritmo de Dijkstra. O algoritmo funciona bem?
1 y(s) 0
2 S {s}
3 enquanto S 6= N faa
4
escolha i em S tal que y(i) mnimo
5
escolha ij em A(i) tal que cij mnimo
6
y(j) y(i) + cij
7
S S {j}
8.6 Inventei o algoritmo abaixo para competir com o de Dijkstra:
01 y(s) 0
02 S {s}
03 se A(s) 6=
04
ento X {s}
05
seno X
06 enquanto X 6= faa
07
escolha i em X tal que y(i) mnimo
08
escolha ij em A(i) tal que cij mnimo
09
y(j) y(i) + cij
10
S S {j}
11
X X {j}
12
para cada p em X faa
13
retire de A(p) todos os arcos da forma pq com q S
14
se A(p) =
15
entao X X {p}
O algoritmo funciona bem? Justifique.
8.7 Considere a seguinte variante do algoritmo de Dijkstra.
1 y(s) 0
2 S {s}
3 B A(s)
4 enquanto B 6= faa
5
escolha ij em B tal que y(i) + cij mnimo
6
retire de B todos os arcos com ponta final j
17

CLRS lema 24.10, p.607. AMO theorem 5.1, p.136.

FEOFILOFF

FLUXO EM REDES

15/11/2013

65

7
acrescente a B todos os arcos da forma jq com q em N S
8
y(j) y(i) + cij
9
S S {j}
O algoritmo funciona bem? Que cara tem B no incio de cada iterao? Quanto
tempo o algoritmo consome no pior caso?
8.8 [CCPS 2.22, p.34] Seja (N, A, c) uma rede com funo-custo c 0. Sejam S e T
subconjuntos de N , sendo S T = . Queremos encontrar um caminho de custo
mnimo dentre os comeam em S e terminam em T . Mostre como reduzir esse
problema a um problema ordinrio de caminho de custo mnimo.
8.9 [AMO 4.44, p.130. Anlise de sensibilidade.] Seja (N, A, c) uma rede com funocusto c 0. Seja uma funo-predecessor que descreve caminhos de custo
mnimo a partir de um n fixo s.
1. Seja pq um arco fora da rede de predecessores (ou seja, (q) 6= p). Mostre como
calcular o maior nmero cpq dotado da seguinte propriedade: se trocarmos
cpq por cpq ento continuar descrevendo caminhos de custo mnimo.
2. Suponha que ij um arco na rede de predecessores (ou seja, (j) = i). Mostre
como calcular, em tempo O(|A|), o maior nmero com a seguinte propriedade:
se trocarmos cij por cij + a funo continuar descrevendo caminhos de custo
mnimo.
8.10 [CCPS 2.38, p.36] Seja (N, A, c) uma rede com funo-custo c 0. Considere o
problema de encontrar um passeio de custo mnimo dentre os passeios de comprimento par que ligam um n s a um n t. (Um passeio de custo mnimo pode
no ser um caminho.) Mostre como o problema pode ser reduzido a um problema
ordinrio de caminho de custo mnimo mediate a substituio de cada n distinto
de s e t por dois ns. Repita com impar no lugar de par.
8.11 Complete os detalhes da seo 8.5.
8.12 [Minimum-capacity path. AMO 4.37, p.129] Suponha dada uma rede (N, A, u)
sendo u uma funo de A em Z . Para cada arco ij , interprete uij como a capacidade do arco. A capacidade de um caminho ento o mnimo de uij sobre todos
os arcos ij do caminho. Probema: Dados ns s e t, determinar um caminho de s
a t que tenha capacidade mxima.

Captulo 9

Caminhos mnimos em redes


acclicas
Este captulo1 volta a tratar do problema dos caminhos mnimos (captulo 6) mas restringe a ateno a grafos acclicos. Se (N, A) um grafo acclico (= DAG) ento, qualquer
que seja a funo-custo c, a rede (N, A, c) no tem ciclos de custo negativo e portanto a
condio (6.1) est satisfeita.
fcil resolver o problema dos caminhos de custo mnimo em redes acclicas; nem
preciso adotar a hiptese (6.2).

9.1

Algoritmo

Como se sabe (veja captulo 4), um grafo (N, A) acclico se e s se admite uma ordem topolgica, ou seja, uma enumerao hv1 , v2 , . . . , vn i dos ns tal que todo arco vi vj
tem i < j . Eis um algoritmo2 que recebe uma rede acclica (N, A, c), uma ordem topolgica dos ns e um ndice o (no confunda o com 0) e produz um c-potencial y e,
para cada t, um caminho P de vo a t tal que c(P ) = y(t) y(vo ).
M IN -C OST-PATH - IN -DAG (N, A, c, hv1 , . . . , vn i, o)
lgica
1 para cada j em N faa
2
y(j)
3
(j) NIL
4 y(vo ) 0
1
2

 hv1 , . . . , vn i ordem topo-

Trata-se de um resumo da seo 4.4, p.107, do AMO. Tambm da seo 24.2, p.592, do CLRS.
O algoritmo usa o paradigma da programao dinmica.

66

FEOFILOFF

5
6
7
8
9

FLUXO EM REDES

15/11/2013

67

para h o at n faa
para cada ij em A(vh ) faa
se y(j) > y(i) + cij
ento y(j) y(i) + cij
(j) i

Na prtica, o na linha 2 pode ser substitudo pelo nmero nC + 1, onde n := |N | e


C := maxijA |cij |, pois qualquer caminho na rede tem custo (n1)C = nC C nC .
No incio de cada iterao (linha 5, imediatamente antes que i seja comparado com n)
temos as seguintes propriedades invariantes:
(i0) y(vo ) = 0;
(i1) para cada p, se y(vp ) < ento existe um caminho de s a vp na rede de
predecessores;
(i2) cada arco da rede de predecessores justo;
(i3) todo arco com ponta inicial vp tal que p < h, est relaxado (se convencionarmos
que todo arco com na ponta inicial est relaxado).
Prove essas invariantes!
Consumo de tempo. Durante a execuo do algoritmo, cada arco examinado no mximo uma vez. Logo, o algoritmo consome
O(m)
unidades de tempo. Portanto, fortemente polinomial.

Exerccios
9.1 [CCPS 2.35, p.36] Suponha dadas tarefas t1 , . . . , tk . A execuo de cada tarefa ti
exige um tempo pi . Para certos pares (i, j), a execuo de ti deve preceder a execuo de tj . Queremos planejar a execuo das tarefas de modo que as restries de
precedncia sejam respeitadas e todas as tarefas sejam terminadas to cedo quanto
possvel (vrias tarefas podem ser execudas ao mesmo tempo).

Parte II

Fluxo mximo
entre dois ns

68

Captulo 10

Fluxo: introduo
Este captulo1 introduz o conceito de fluxo entre dois ns de uma rede. O captulo serve
tambm para introduzir algumas importantes convenes de notao e discutir algumas
propriedades bsicas de fluxos.

10.1

Fluxo

Um fluxo2 em uma rede (N, A) qualquer funo de A em Z .3 Em outras palavras,


um fluxo uma funo que atribui um inteiro no negativo a cada arco da rede.
A coisa mais fundamental a respeito de um fluxo o seu excesso em cada n. Para
definir esse conceito, precisamos introduzir uma conveno de notao. Suponha que x
um fluxo e T uma parte de N . Denote por T o complemento de T (ou seja, T := N T )
e por x(T , T ) a soma dos valores de x sobre os arcos que entram em T :
P
x(T , T ) := ij(T ,T ) xij .
bvio que x(T, T ) a soma dos valores de x nos arcos que saem de T .
O excesso, ou acmulo, de x em T a diferena entre o que entra de T e o que sai de T :4
x(T , T ) x(T, T ) .
1

Corresponde s sees 6.1 e 3.5 do AMO. Tambm seo 26.1 do CLRS.


AMO s vezes diz pseudoflow para se referir a esse conceito muito geral. Alguns livros exigem que um
fluxo tenha excesso nulo em quase todos os ns. No presente texto, vamos associar essa condio apenas a
expresses como fluxo de s a t ou (s, t) -fluxo.
3
Em geral, permite-se que um fluxo tenha valores no inteiros. Mas no presente texto vamos nos restringir aos valores inteiros no negativos. Veja exerccio 11.16.
4
AMO d nfase ao conceito contrrio: o que sai de T menos o que entra em T .
2

69

FEOFILOFF

FLUXO EM REDES

15/11/2013

70

Para qualquer n t, usaremos a abreviatura x(t, t) para a expresso x({t}, {t}). Assim,
x(t, t) x(t, t).5 o excesso de x em t.
Lema 10.1 (da soma de excessos) Para qualquer fluxo x em uma rede (N, A) e qualquer
parte T de N ,
P
tT (x(t, t) x(t, t)) = x(T , T ) x(T, T ) .
D EMONSTRAO : Considere os arcos que tm ambas P
as pontas em T . Cada arco pq
desse tipo participa exatamente duas vezes da soma
tT (x(t, t) x(t, t)): uma vez
(quando q faz o papel de t) ele contribui com xpq e outra vez (quando p faz o papel de t)
ele contribui com xpq . Portanto, a contribuio dos arcos que tm ambas as pontas em
T nula. Sobra a contribuio dos arcos que tm uma ponta em T e outra em T , ou seja,
a contribuio dos arcos em (T , T ) (T, T ). A contribuio desses arcos exatamente
x(T , T ) x(T, T ).
Uma consequncia bvia mas importante do lema:
P
tN (x(t, t) x(t, t)) = 0 .

10.2

(10.1)

Circulao

Uma circulao em uma rede qualquer fluxo que tenha acmulo nulo em cada n. Mais
precisamente, uma circulao qualquer fluxo x tal que
x(j, j) = x(j, j)
para todo j em N . claro que o fluxo nulo uma circulao, ainda que no seja uma
circulao muito interessante.
Decomposio em ciclos. Toda circulao pode ser representada por uma coleo de
(no mais que m) ciclos, como mostraremos no restante da seo.6 Seja C um ciclo e
um inteiro no negativo. Agora considere o fluxo x definido por
xij :=

se C passa por ij
0 em caso contrrio .

fcil perceber que x uma circulao. Diremos que essa a circulao definida por C
e . Diremos que circulaes desse tipo so elementares7 .
5
6
7

e
Seria mais consistente com a notaco anterior escrever x(A(t))
x(A(t)) .
Veja seo 3.5 (Flow decomposition algorithms), p.79, do AMO.
AMO no usa esse termo.

FEOFILOFF

FLUXO EM REDES

15/11/2013

71

Agora suponha que C uma coleo de ciclos e que temos um inteiro no negativo C
associado a cada ciclo C em C ; diremos que C a quantidade de fluxo conduzida
por C . Para cada arco ij , defina
P
xij := CCij C ,
onde Cij a coleo de ciclos em C que passam pelo arco ij . fcil perceber que x
uma circulao. A recproca (toda ciculao pode ser descrita por uma coleo de ciclos)
um pouco menos evidente.8
Lema 10.2 (da decomposio de circulaes) ParaPtoda circulao x, existe uma coleo
C de ciclos e uma funo : C Z tal que xij = CCij C para cada arco ij . Ademais,
C pode ser escolhido de modo que |C| m.
A prova do teorema algortmica. O algoritmo que esboaremos a seguir recebe uma
circulao x e devolve C e .
D ECOMPOSIO - DE -C IRCULAO (N, A, x)
01 C
02 Ax {ij A : xij > 0}
03 enquanto Ax 6= faa
04
escolha pq em Ax
05
P B USCA (N, Ax , q, p)
06
C P hp, qi
07
C C {C}
08
C min{xij : ij arco de C }
09
para cada arco ij de C faa
10
xij xij C
11
se xij = 0
12
ento Ax Ax {ij}
13 devolva C e
Na linha 05, o algoritmo B USCA produz um caminho de q a p no grafo (N, Ax ). O
algoritmo o mesmo discutido na seo 3.3. Se no existe caminho de q a p, o algoritmo
devolve uma prova desse fato; mas no presente caso, isso no pode acontecer [por que?].

10.3

Fluxo entre dois ns

Dados dois ns s e t do grafo, um fluxo de s a t qualquer fluxo que tenha excesso nulo
em todos os ns distintos de s e t e excesso no negativo em t. Mais precisamente, um
8

Veja teorema 3.5 de AMO, p.80.

FEOFILOFF

FLUXO EM REDES

15/11/2013

72

fluxo de s a t ou (s, t)-fluxo qualquer fluxo x tal que


x(j, j) x(j, j) = 0 para todo j em {s, t}
e x(t, t) x(t, t) 0. O excesso de x em t o valor de x e ser denotado por val(x):
val(x) := x(t, t) x(t, t) .y
De acordo com (10.1), val(x) = x(s, s) + x(s, s).
Um conjunto T de ns separa s de t se t T e s T . Diremos tambm, nessas
circunstncias, que o corte (T , T ) separa s de t ou ainda que (T , T ) um (s, t)corte. Como consequncia do lema 10.1, o valor de um (s, t)-fluxo pode ser medido em
qualquer desses cortes:
Corolrio 10.3 Para qualquer (s, t)-fluxo x e qualquer (s, t)-corte (T , T ),
val(x) = x(T , T ) x(T, T ) .
Decomposio em caminhos e ciclos.
negativo ento o fluxo x definido por
xij :=

Se P um caminho de s a t e um inteiro no

se P passa por ij
0 em caso contrrio

um (s, t)-fluxo e que val(x) = . Diremos que esse o fluxo definido por P e .
Diremos que um (s, t)-fluxo desse tipo elementar9 .
Suponha agora que P uma coleo de caminhos, todos de s a t.10 Suponha tambm
que h um inteiro no negativo P associado a cada caminho P em P ; diremos que P
a quantidade de fluxo conduzida por P . Para cada arco ij , defina
P
xij := P Pij P ,
onde Pij a coleo de caminhos
P em P que passam pelo arco ij . fcil perceber que x
um (s, t)-fluxo e que val(x) = P P P . A recproca (todo fluxo de um n a outro pode
ser descrito por uma coleo de caminhos) um pouco menos evidente.11 Dizemos
P que
uma coleo P e uma funo : P Z representam um fluxo x se val(x) = P P e
nenhum elemento de P passa por um arco ij tal que xij = 0.
Lema 10.4 (da decomposio de fluxo) Para todo (s, t)-fluxo x, existe uma coleo P de
caminhos de s a t e uma funo : P Z que, juntas, representam x. Ademais, P
pode ser escolhido de modo que |P| m.
A prova do teorema algortmica. O algoritmo que esboaremos a seguir recebe um
(s, t)-fluxo x e devolve P e .
9
10
11

AMO no usa esse termo.


Veja seo 3.5 (Flow decomposition algorithms), p.79, do AMO.
Veja teorema 3.5 de AMO, p.80.

FEOFILOFF

FLUXO EM REDES

15/11/2013

73

D ECOMPOSIO (N, A, s, t, x)
01 P
02 enquanto val(x) > 0 faa
03
Ax {ij A : xij > 0}
04
P B USCA (N, Ax , s, t)
05
P P {P }
06
P min {xij : ij arco de P }
07
P min {P , val(x)}
08
para cada arco ij de P faa
09
xij xij P
10 devolva P e
No fim da execuo do algoritmo,12 teremos x(i, i)x(i, i) = 0 para todo n i, inclusive s
e t, mas no necessariamente verdade que x = 0. (Embora isso seja suprfluo, podemos
completar o servio de decomposio doP
fluxo com uma
C de ciclos e uma funo
P coleo
0
0
e uma funo : C Z tal que xij = P Pij P + CCij C para cada arco ij .)

Exerccios
10.1 Seja
P x um fluxo em um grafo (N, A) e T um subconjunto de N . verdade que
jT x(j, j) = x(T , T )?
10.2 Seja x um fluxo em um grafo (N, A). Seja X o conjunto dos ns j para os quais
x(j, j) 6= x(j, j). Mostre que se |X| 2 ento x um (s, t)-fluxo para algum par
(s, t) de ns.
10.3 Mostre que a soma de duas circulaes e uma circulao.
10.4 Seja x uma ciculao e x0 um (s, t)-fluxo. Mostre que x + x0 um (s, t)-fluxo e
que val(x + x0 ) = val(x0 ).
10.5 Suponha que x e x0 so (s, t)-fluxos. Mostre que x + x0 um (s, t)-fluxo. Mostre
que val(x + x0 ) = val(x) + val(x0 ).
10.6 Seja P um caminho de s a t. Defina e da seguinte maneira: se ij um arco
de P ento eij = 1, seno eij = 0. Mostre que e um (s, t)-fluxo. Mostre que
val(e) = 1.
12

Juan Gutirrez Alva apontou um erro na verso anterior do algoritmo.

FEOFILOFF

FLUXO EM REDES

15/11/2013

74

10.7 Prove que na linha 04 do algoritmo D ECOMPOSIO, existe caminho de s a t no


grafo (N, Ax ).
10.8 Escreva o algoritmo de decomposio de fluxo de maneira detalhada. O seu algoritmo no deve chamar outros algoritmos. Faa uma anlise da correo e do
consumo de tempo do seu algoritmo.

Captulo 11

Fluxo mximo
Este captulo1 introduz o problema do fluxo mximo entre dois ns de uma rede com
restries de capacidade. O captulo culmina com o teorema do fluxo mximo e corte mnimo (= max-flow min-cut) de Ford-Fulkerson e Kotzig. (O teorema tambm foi publicado,
independentemente, por Elias, Feinstein e Shannon.)

11.1

Problema do fluxo mximo

Um funo-capacidade em um grafo (N, A) qualquer funo de A em Z :


u : A Z .
Para cada arco ij , o inteiro no negativo uij a capacidade do arco ij na rede (N, A, u).
Diremos que uma funo x de A em Z respeita u se
xu,
ou seja, se xij uij para cada arco ij .2
Problema 11.1 (do fluxo mximo) Dados ns s e t de uma rede (N, A, u) com funocapacidade u, encontrar um (s, t)-fluxo que respeite u e tenha valor mximo.
Em outras palavras, queremos encontrar uma funo x de A em Z tal que x u,
x(j, j) x(j, j) = 0 para todo i distinto de s e de t e x(t, t) x(t, t) mximo. Para
simplificar, dizemos fluxo mximo no lugar de fluxo de valor mximo.
Quaisquer que sejam u, s e t, existe um (s, t)-fluxo que respeita: o fluxo nulo, por exemplo, tem essa propriedade. Assim, todas as instncias do problema de fluxo mximo so
1
2

Corresponde ao captulo 6 (Maximum Flow: Basic Ideas) do AMO.


A letra u a inicial de upper bound.

75

FEOFILOFF

FLUXO EM REDES

15/11/2013

76

viveis. fcil verificar que no h problemas ilimitados de fluxo mximo: o valor de


qualquer (s, t)-fluxo x no passa de mU , onde m = |A| e U = maxijA uij . Como veremos adiante, o valor de qualquer (s, t)-fluxo x tambm no passa de nU (uma vez que
nossos grafos no tm arcos paralelos).
Os ns s e t so s vezes chamados fonte (= source) e sorvedouro (= sink), respectivamente, da rede. Mas preciso cuidado com essa terminologia porque em outros contextos uma fonte um n com grau de entrada nulo e um sorvedouro um n com grau de
sada nulo. No presente contexto, no h qualquer restrio ou hiptese sobre os graus
da fonte s e do sorvedouro t.
fcil perceber que o problema do fluxo mximo poderia ter sido formulado assim: Dado
um arco ts em uma rede (N, A, u) com funo-capacidade u, encontrar uma circulao
x u que maximize xts .

11.2

Condies de otimalidade

A capacidade de um corte3 (T , T ) o nmero4


P
u(T , T ) := ij(T ,T ) uij .
O seguinte lema, muito simples mas muito importante, mostra que o valor de qualquer
fluxo limitado pela capacidade de qualquer corte.5
Lema 11.2 (fluxo-versus-corte) Se x um (s, t)-fluxo que respeita u e (T , T ) um
(s, t)-corte ento val(x) u(T , T ).6
D EMONSTRAO : Considere a identidade val(x) = x(T , T ) x(T, T ) que discutimos no
corolrio 10.3. Ento
val(x) = x(T , T ) x(T, T )
P
P
=
ij(T ,T ) xij
ij(T,T ) xij
P

ij(T ,T ) uij ,
pois x u e x 0. Em suma, val(x) u(T , T ).
Portanto, para mostrar que o valor de qualquer (s, t)-fluxo que respeita u no pode ser
maior que um dado nmero, por exemplo 99, basta exibir um (s, t)-corte (T , T ) tal que
u(T , T ) 99. Em outras palavras, para mostrar que um (s, t)-fluxo x que respeita u
mximo basta exibir um (s, t)-corte (T , T ) que tem capacidade igual a val(x).
3
4
5
6

AMO escreve (S, S) no lugar de (T , T ) .


Ateno! No confunda com u(T , T ) u(T, T ) !
Esse lema um caso particular do Teorema Fraco da Dualidade de programao linear.
Esta a propriedade 6.1, p.179, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

77

Corolrio 11.3 Se x um (s, t)-fluxo que respeita u e val(x) u(T , T ) para algum
(s, t)-corte (T , T ) ento x tem valor mximo.
A propsito, nessas mesmas circunstncias conclumos que (T , T ) um (s, t)-corte de
capacidade mnima. Diremos, simplesmente, que (T , T ) um corte mnimo.

11.3

Teorema do fluxo mximo e corte mnimo

A recproca do corolrio 11.3 verdadeira, como mostra o teorema a seguir. A prova


do teorema contm o germe de todos os algoritmos para o problema do fluxo mximo
(problema 11.1).
Teorema 11.4 Para quaisquer dois ns s e t em uma rede (N, A, u) com funocapacidade u, existe um (s, t)-fluxo x que respeita u tal que
val(x) = u(T , T )
para algum (s, t)-corte (T , T ).
D EMONSTRAO : Digamos
que
um
pseudocaminho

uma
sequncia
hi0 , a1 , i1 , . . . , aq , iq i em que i0 , . . . , iq so ns distintos dois a dois, e, para cada k ,
ak o arco ik1 ik ou o arco ik ik1 . Os arcos do primeiro tipo so diretos e os do
segundo so inversos. Denotaremos por P o conjunto dos arcos diretos de P e por P` o
conjunto dos arcos inversos.
Seja x um (s, t)-fluxo mximo dentre os que respeitam u. Diremos que pseudocaminho
P de incremento se7
xij < uij se ij P

xkl > 0 se kl P` .

Seja S o conjunto de todos os ns que so trmino de algum caminho de incremento


que comea em s. Suponha por um instante que t S . Seja P um pseudocaminho
de incremento que comea em s e termina em t. Escolha o maior nmero tal que
uij xij para cada ij em P e xij para cada ij em P` . Seja x0 o fluxo definido a
partir de x como segue:
x0ij

xij + se ij P
= xij se ij P`
xij
em qualquer outro caso.

claro que x0 um (s, t)-fluxo que respeita u. claro tambm que val(x0 ) = val(x) + .
Como > 0, a existncia de x0 incompatvel com a maximalidade de x.
7

Tudo isso est discutido no fim da seo 6.4, p.181183, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

78

Devemos concluir, portanto, que t


/ S . Assim, o (s, t)-corte (S, S). Mas a definio de
S garante que
x(S, S) = u(S, S) e x(S, S) = 0 .
(11.1)
O corolrio 10.3 garante ento que val(x) = u(S, S), como queramos demonstrar.
O teorema continua vlido mesmo se nossa definio de fluxo permitir valores no inteiros (ou seja, mesmo que fluxo seja uma atribuio de nmeros racionais no negativos
aos arcos). De acordo com o teorema, o valor mximo de tal fluxo igual capacidade de
um (s, t)-corte de capacidade mnima. Portanto, o valor de um fluxo de valor mximo
continua inteiro, desde que as capacidades dos arcos sejam todas inteiras.8
O teorema 11.4, juntamente com o lema 11.2, levam ao clebre teorema do fluxo mximo
e corte mnimo (max-flow min-cut). O teorema foi publicado em 1956 por Ford e Fulkerson
e, independentemente, por Kotzig.
Teorema 11.5 (do fluxo mximo e corte mnimo) Para quaisquer dois ns s e t em uma
rede (N, A, u) com funo-capacidade u tem-se
max val(x) = min u(T , T ) ,
xu

onde o mximo tomado sobre todos os (s, t)-fluxos que respeitam u e o mnimo
tomado sobre todos os (s, t)-cortes.

Exerccios
11.1 Mostre que o problema do fluxo mximo equivalente ao seguinte: dado um arco
ts em uma rede (N, A, u), encontrar uma circulao x que respeite u e maximize xts .
11.2 [Importante!] Considere a seguinte tentativa de inventar um algoritmo para o problema do fluxo mximo. Comece com o fluxo nulo e faa incrementos sucessivos:
em cada iterao, acrescente um fluxo elementar (veja seo 10.3) ao fluxo j existente. Assim, cada iterao comea com um (s, t)-fluxo x que respeita u e consiste
no seguinte: (1) encontre um fluxo elementar e que respeita u x e tem valor no
nulo; (2) comece nova iterao com o fluxo x + e no lugar de x. Esse algoritmo
resolve o problema?
11.3 Um (s, t)-fluxo x que respeita uma funo-capacidade u maximal se no existe
(s, t)-fluxo elementar e tal que val(e) > 0 e x + e respeita u. Escreva um algoritmo que calcule um (s, t)-fluxo maximal. Mostre que um fluxo maximal no
necessariamente mximo.
8

Veja exerccio 11.16.

cor 10.3

FEOFILOFF

FLUXO EM REDES

79

15/11/2013

11.4 [AMO 6.14, p.201, fig.6.23] A matriz abaixo d as capacidades dos arcos de uma
rede simtrica (veja figura 6.23, p.201, de AMO). Encontre um (s, t)-fluxo de valor
mximo. Exiba o estado da rede no incio de cada iterao. Mostre um (s, t)-corte
de capacidade mnima.
s

4
3

s
a
b
c
d
e
t

a
4

2
3

b
3

2
2

5
4

11.5 [AMO 6.15, p.201, fig.6.24] A matriz abaixo d as capacidades dos arcos de uma
rede (veja figura 6.24, p.201, de AMO).
s
2
3
4
5
t

2
1

3
1
1

4
1

5 t


1
1 1
1

Encontre uma coleo mxima de caminhos de s a t disjuntos nos arcos. Enumere todos os (s, t)-cortes. Observe que o nmero mximo de caminho de s a t
disjuntos nos arcos igual cardinalidade minima de um corte do tipo (T , T ).
11.6 [Programa linear inteiro] Formule o problema do fluxo mximo (problema 11.1)
como um programa linear inteiro. Escreva o dual da relaxao linear do programa.
Prove o teorema fraco da dualidade para esse par de problemas. Compare com o
lema 11.2.
11.7 Considere o seguinte problema, que equivalente ao problema do fluxo mximo:
dado um arco ts em uma rede (N, A, u) com funo-capacidade u, encontrar uma
circulao x u que maximize xts . Formule o problema como um programa
linear inteiro. Escreva o dual da relaxao linear do programa. Prove o teormea
fraco da dualidade para esse par de programas lineares.
11.8 Sejam s e t dois ns de uma rede (N, A, u) em que u uma funo-capacidade.
Suponha que y uma funo de N em Z e z uma funo de A em Z tais que
y(j) y(i) zij

(11.2)

FEOFILOFF

FLUXO EM REDES

15/11/2013

80

para cada arco ij . Mostre que para qualquer (s, t)-fluxo tem-se
val(x) (y(t) y(s)) zu ,

(11.3)

P
onde zu := ijA zij uij . Deduza da que se vale a igualdade em (11.3) ento x
um fluxo de valor mximo.
11.9 Nas condies do exerccio 11.8, mostre que existe um (s, t)-fluxo x e um par (y, z)
que satisfaz (11.2) bem como a igualdade
val(x) (y(t) y(s)) = zu .
Sugesto: use o teorema do fluxo mximo e corte mnimo (teorema 11.5); use y e z
com valores em {0, 1}.
11.10 [AMO 6.26, p.203] Queremos resolver o problema do (s, t)-fluxo mximo em uma
rede (N, A, u). Suponha que um n i distinto de s e de t tem grau de entrada nulo.
Podemos remover esse n (sem afetar o valor de um fluxo de valor mximo)? E se
i tem grau de sada nulo?
11.11 [Grafo tricolorido. AMO 6.29, p.203] Suponha que cada arco de um grafo (N, A)
verde, amarelo ou vermelho. Seja st um arco amarelo. Mostre que uma e apenas
uma das seguintes afirmaes verdadeira: (1) st pertence a um ciclo de arcos
amarelos e verdes em que todos os arcos amarelos tm uma mesma orientao;
(2) st pertence a um corte cujos arcos so amarelos e vermelhos e todos os arcos
amarelos tm a mesma orientao.
11.12 [AMO 6.34, p.204] Quais das seguinte afirmaes so verdadeiras e quais so falsas? Todas tm como contexto uma rede (N, A, u) e ns s e t. Os fluxos so sempre
de s a t e os cortes so sempre os que separam s de t.
1. Se um fluxo x mximo ento xij = 0 ou xji = 0 para cada arco ij .
2. Existe um fluxo de valor mximo x tal que xij = 0 ou xji = 0 para cada
arco ij .
3. Se as capacidades dos arcos forem todas diferentes, ento h um nico corte
de capacidade mnima.
11.13 [AMO 6.28, p.203] Suponha dado um (s, t)-fluxo de valor mximo em uma
rede (N, A, u). Mostre como possvel encontrar um corte de capacidade mnima
em tempo O(m). Agora suponha dado um (s, t)-corte de capacidade mnima.
Esse corte pode ser usado para obter um fluxo de valor mximo rapidamente (ou
seja, em tempo menor que o necessrio para resolver o problema sem qualquer
informao adicional)?

FEOFILOFF

FLUXO EM REDES

15/11/2013

81

11.14 [Fluxo mpar. AMO 6.33, p.204] Esta questo se refere a (s, t)-fluxos em uma rede
com funo-capacidade u. Digamos que u par se uij par para todo arco ij e
mpar se uij impar para todo ij . Definies anlogas valem para os conceitos de
fluxo par e fluxo mpar. Se todos os arcos tm capacidade par, verdade que qualquer fluxo de valor mximo par? Nas mesmas condies, verdade que o valor
de qualquer fluxo de valor mximo par? Se todos os arcos tm capacidade mpar,
verdade que qualquer fluxo de valor mximo mpar? Nas mesmas condies,
verdade que o valor de qualquer fluxo de valor mximo mpar?
11.15 [Rede bipartida, capacidade unitria] Suponha que (N, A) um grafo bipartido,
ou seja, N = N1 N2 , N1 N2 = e e todo arco tem uma das pontas (inicial ou
final) em N1 e a outra em N2 . Sejam s e t dois ns em N1 e seja x um (s, t)-fluxo
tal que xij 1 para cada arco ij . Supondo que |N1 | 10|N2 |, d uma delimitao
superior para o valor de x.
11.16 [Importante: Fluxo no inteiro. AMO 6.40, p.205] Seja (N, A, u) uma rede com
funo-capacidade u (como de hbito, os valores de u so inteiros no negativos).
Sejam s e t dois ns da rede. Relaxe nossa definio oficial de fluxo: permita que
um fluxo relaxado tenha valores reais no negativos arbitrrios. Suponha agora
que x um fluxo relaxado de s a t que tem valor mximo. Sugira um algoritmo
que converta x em um fluxo usual (ou seja, com valores em Z ) de mesmo valor.
Qual o consumo de tempo do seu algoritmo?
11.17 [Arco universal. AMO 6.30, p.203] Seja ij um arco de uma rede (N, A, u). Suponha que para todo fluxo de valor mximo x de um n s a um n t tem-se xij = uij .
Mostre que ij pertence a algum (s, t)-corte (T , T ) que minimiza u(T , T ).
11.18 [Importante: Submodularidade. AMO 6.386.39, p.204] Sejam s e t dois ns de
uma rede (N, A, u) com funo-capacidade u. Esta questo se refere s capacidades dos cortes que separam s de t. Prove que se (X, X) e (Y , Y ) so cortes de capacidade mnima ento tambm (X Y , X Y ) e (X Y , X Y ) tm capacidade
mnima. Sugesto: prove preliminarmente a seguinte propriedade submodular:
u(X Y , X Y ) + u(X Y , X Y ) u(X, X) + u(Y , Y ).
11.19 [Corte mnimo com nmero mnimo de arcos. AMO 7.27, p.247] Sejam s e t dois
ns de uma rede (N, A, u) com funo-capacidade u. Queremos determinar um
(s, t)-corte de capacidade mnima. que tenha o menor nmero possvel de arcos.
Para cada arco ij , seja u0ij := muij + 1, onde m := |A|. Mostre que um corte de
capacidade mnima na rede (N, A, u0 ) resolve nosso problema.
11.20 [Bom] Discuta o seguinte problema: dados ns s e t de uma rede (N, A, u) e um
nmero inteiro , encontrar um (s, t)-fluxo x tal que val(x) = .

FEOFILOFF

FLUXO EM REDES

15/11/2013

82

11.21 [Capacidades nos ns. AMO 6.25, p.203] Suponha que em nossa rede no s cada
arco tem uma capacidade como tambm cada n i distinto de s e t tem uma capacidade no negativa a(i) que limita a quantidade de fluxo que passa por i. Como
resolver o problema de determinar um fluxo de um n s a um n t que respeite
todas as capacidades e seja mximo? Transforme esse problema em um problema
padro de fluxo mximo (que s tem capacidades nos arcos). Do ponto de vista de
complexidade de pior caso, o problema com capacidades nos ns mais difcil que
o problema padro?
11.22 [Caminhos disjuntos. AMO 6.45, p.205] Seja (N, A) um grafo e sejam S e T dois
subconjuntos de N , ambos no vazios. Uma coleo de caminhos de S a T
disjunta se cada arco do grafo pertence a no mximo um dos caminhos da coleo.
Descreva um algoritmo que encontre uma coleo disjunta mxima.

Mais exerccios
Esta srie de exerccios discute (1) o efeito de alteraes na rede e (2) algumas aplicaes.
11.23 [Capacidades infinitas. AMO 6.23, p.203] Suponha que alguns arcos de uma rede
(N, A, u) tm capacidade infinita (ao contrrio de nossas definies usuais). Digamos que B o conjunto de arcos com capacidade infinita. Suponha tambm que
no h caminho de s a t cujos arcos esto todos em B . Mostre que, do ponto de
vista do problema doPfluxo mximo, podemos substituir a capacidade de cada arco
em B pelo nmero ijAB uij .
11.24 [Arcos paralelos. AMO 6.24, p.203] Como podemos aplicar nossa teoria e algoritmos a um grafo com arcos paralelos (dado que em nossas definies usuais grafos
no tm arcos paralelos).
11.25 [Arcos vitais. AMO 7.7, p.244] Sejam s e t dois ns de uma rede (N, A, u). Nesse
exerccio, todo fluxo um (s, t)-fluxo que respeita u e todo corte um (s, t)-corte.
Um arco pq vital se a reduo de upq a 0 causa a maior reduo possvel no valor
do fluxo de valor mximo. Prove ou desprove cada uma das afirmao a seguir:
a. Se pq vital ento upq mximo.
b. Seja x um fluxo de valor mximo. Se pq vital ento xpq mximo.
c. Seja x um fluxo de valor mximo. Se pq vital ento existe um corte de
capacidade mnima tal que xpq xij para todo ij no corte.
d. Se pq vital ento pq pertence a algum corte de capacidade mnima.
e. Um arco vital pode no ser nico.

FEOFILOFF

FLUXO EM REDES

15/11/2013

83

11.26 [Arco menos vital. AMO 7.8, p.244] Sejam s e t dois ns de uma rede (N, A, u).
Todo fluxo nesse exerccio um (s, t)-fluxo que respeita u e todo corte um (s, t)corte. Um arco kl secundrio (= least vital) se a reduo de ukl a 0 causa a menor
reduo possvel no valor do fluxo de valor mximo. Prove ou desprove cada uma
das afirmao a seguir:
a. Seja x um fluxo de valor mximo. Se xkl = 0 ento kl secundrio.
b. Se x um fluxo de valor mximo Se xkl mnimo ento kl secundrio.
c. Se ij pertence a um corte de capacidade mnima ento ij no secundrio.
11.27 [AMO 6.34, p.204] Quais das seguinte afirmaes so verdadeiras e quais so falsas? Todas tm como contexto uma rede (N, A, u) e ns s e t. Os fluxos so sempre
de s a t e respeitam u; os cortes so sempre os que separam s de t.
1. Se multiplicarmos a capacidade de cada arco por um nmero positivo , um
corte de capacidade mnima continua tendo capacidade mnima.
2. Se somarmos um nmero positivo capacidade de cada arco, um corte de
capacidade mnima continua tendo capacidade mnima.
11.28 [AMO 7.9(ab), p.244] Sejam s e t dois ns de uma rede capacitada (N, A, u) e x
um (s, t)-fluxo de valor mximo dentre ps que respeitam u. Quais das seguinte
afirmaes so verdadeiras?
a. Se a capacidade de cada arco um mltiplo de , ento xij mltiplo de
para cada ij .
b. Se somarmos capacidade de cada arco, estaremos somando um mltiplo
de ao valor do fluxo mximo.
11.29 [AMO 7.26, p.247] Sejam s e t dois ns de uma rede capacitada (N, A, u) e considere o valor v de um (s, t)-fluxo de valor mximo dentre os que respeitam u.
Para cada par (i, j) de ns, seja [i, j] o aumento no valor de v que obteramos
se uij fosse (se ij no for um arco, introduza um tal arco no grafo).
a. Mostre que [i, j] [s, j] e [i, j] [i, t].
b. Mostre que [i, j] = min{[s, j], [i, t]}.
b. Mostre como [i, j] pode ser calculado para todo par (i, j) mediante resoluo de O(n) problemas de fluxo mximo.
11.30 [Re-otimizao. AMO 6.35, p.204] Suponha dado um (s, t)-fluxo x, de valor mximo, em uma rede (N, A, u). Suponha agora que um nmero k > 0 foi somado
capacidade de um determinado arco pq . Mostre como resolver o problema em
tempo O(km). Agora suponha que um nmero k > 0 foi subtrado da capacidade
de um determinado arco pq ; possvel re-otimizar o problema em tempo O(km)?

FEOFILOFF

FLUXO EM REDES

84

15/11/2013

11.31 [Escalonamento de avies. AMO 6.32, p.204] Uma companhia de aviao quer
servir p voos com o menor nmero possvel de avies. Para isso, ela precisa combinar esses voos da maneira mais eficiente possvel. Cada voo i deve comear no
instante ai e termina no instante bi . Um avio precisa de rij horas para retornar do
destino do voo i origem do voo j . Sugira uma maneira de resolver o problema.
11.32 [Escalonamento em mquinas paralelas uniformes. AMO 6.17, p.201] A tabela
abaixo descreve um problema de escalonamento em mquinas paralelas uniformes
(veja Application 6.4, p.172, AMO). Formule o problema como um problema de
fluxo mximo. Resolva o problema supondo que h duas mquinas disponveis
diariamente.
tarefa (j)
1
tempo de processamento (pj dias) 2.1
tempo de liberao (rj )
1
prazo (dj )
3

2
3.1
5
7

3
5.0
0
6

4
1.8
2
5

Captulo 12

Redes simtricas e pseudofluxo


muito desconfortvel escrever algoritmos que envolvam pseudocaminhos como os que
usamos na seo 11.3. Para evitar esse incmodo, vamos nos restringir a grafos simtricos
e trabalhar com pseudofluxo.

12.1

Fluxo em redes simtricas

Um grafo (N, A) simtrico se ji A sempre que ij A. Ao resolver o problema do


fluxo mximo podemos nos restringir a redes simtricas:1
Fato 12.1 suficiente resolver o problema 11.1 do fluxo mximo em grafos simtricos.
D EMONSTRAO : Seja (N, A, u) uma rede arbitrria com funo-capacidade u. Para
cada arco ij , se ji no um arco ento acrescente ji ao grafo e defina
uji := 0 .
Seja (N, A0 , u0 ) a rede simtrica resultante dessas operaes.
Suponha dado um fluxo x0 na nova rede. claro que a restrio x de x0 a A tem os
mesmos excessos em cada n que x0 :
x(i, i) x(i, i) = x0 (i, i) x0 (i, i)
para cada n i. Em particular, se x0 um (s, t)-fluxo ento x tambm um (s, t)-fluxo e
val(x) = val(x0 ).
1

Essa a Assumption 6.4 na seo 6.1, p.168, de AMO.

85

FEOFILOFF

FLUXO EM REDES

15/11/2013

86

Suporemos que a estrutura de dados que representa o grafo permite acesso rpido so
irmo de cada arco: dado um arco ij , possvel obter o arco ji em tempo O(1).
Numa rede simtrica, um fluxo x normalizado2 se, para cada arco ij , tem-se xij = 0
ou xji = 0. Qualquer fluxo x pode ser transformado facilmente num fluxo normalizado
x0 de mesmo valor: para cada arco ij , se xij xji ento faa x0ij = xij xji e x0ji = 0;
seno, faa x0ji = xji xij e x0ij = 0.

12.2

Pseudofluxo

Numa rede simtrica, cada par (ij, ji) de arcos ser tratado como um nico objeto. Dado
um fluxo x, podemos entender o nmero xij xji como a intensidade do fluxo de i a
j ao longo do par (ij, ji). Analogamente, o nmero xji xij pode ser entendido como
a intensidade do fluxo de j a i ao longo do par de arcos. Dois fluxos x e x0 sero
considerados equivalentes se tivermos
x0ij x0ji = xij xji
para cada arco ij . evidente que se x0 e x so equivalentes nesse sentido ento x0 (i, i)
x0 (i, i) = x(i, i) x(i, i) para cada n i.
Essa consideraes levam ao conceito de pseudofluxo. Um pseudofluxo3 em um grafo
(N, A) qualquer funo de A em Z. Em outras palavras, um pseudofluxo associa nmeros inteiros (positivos, nulos ou negativos) aos arcos do grafo. Embora o conceito faa
sentido em qualquer grafo, ele s usado em grafos simtricos.
Um pseudofluxo ser usualmente denotado por x
. A notao no muito feliz, porque
d a falsa impresso de que um operador aplicado a algum objeto x previamente
definido. Mas teremos que conviver com esse desconforto.
O excesso, P
ou acmulo, de um pseudofluxo x
em um subconjunto T de N o nmero
x
(T , T ) := ijA x
ij . Se T = {t}, o excesso de x
em t denotado por x
(t, t). O lema 10.1
pode ser reformulado assim: para qualquer pseudofluxo x
em uma rede (N, A) e qualquer parte T de N ,
P
(t, t) = x
(T , T ) .
tT x
Segue da imediatamente a seguinte definio: dados dois ns s e t de um grafo simtrico
(N, A), um (s, t)-pseudofluxo qualquer pseudofluxo x
tal que x
(i, i) = 0 para cada n
i em N {s, t} e x
(t, t) 0.
Numa rede simtrica (N, A, u) com funo-capacidade u, dizemos que um pseudofluxo
x
respeita u se
uji x
ij uij
2
3

AMO no usa esse termo.


AMO usa o termo pseudoflow para designar um conceito diferente.

FEOFILOFF

FLUXO EM REDES

15/11/2013

87

para cada arco ij . O lema 11.2 pode ento ser reformulado assim: se x
um (s, t)pseudofluxo que respeita u e (T , T ) um (s, t)-corte ento x
(t, t) u(T , T ).

12.3

Pseudofluxo versus fluxo

Em grafos simtricos, pseudofluxos so equivalentes a fluxos num sentido que passamos


a discutir. Dado um fluxo x em um grafo simtrico (N, A), o correspondente pseudofluxo x
definido da seguinte maneira:
x
ij = xij xji
para cada arco ij .4 Observe que x
ij =
xji para cada arco ij . Eis um pequeno algoritmo
que recebe um fluxo x e devolve, em tempo O(m), o correspondente pseudofluxo:
P SEUDOFLUXO (x)
1 para cada ij em A faa
2
x
ij xij xji
3 devolva x

Eis uma relao fundamental entre um fluxo x e o correspondente pseudofluxo x


num
grafo simtrico: os excessos de x e x
em cada n so os mesmos, ou seja,
x(t, t) x(t, t) = x
(t, t)
para cada n j (veja exerccio 12.1). Segue da que
x um (s, t)-fluxo se e s se x
um (s, t)-pseudofluxo.

(12.1)

fcil verificar tambm que x


(T , T ) =
x(T, T ) para qualquer conjunto T de ns.
Outra relao fundamental entre um fluxo x e o correspondente pseudofluxo x
numa
rede simtrica com funo-capacidade u:
x respeita u se e s se x
respeita u.

(12.2)

(Veja exerccio 12.2.)


Agora considere a transformao de um pseudofluxo em um fluxo. Dado qualquer pseudofluxo x
em uma rede simtrica (N, A) o correspondente fluxo x definido por
xij := max{0, x
ij }
para cada arco ij . evidente que x normalizado. Eis um pequeno algoritmo que faz a
transformao, em tempo O(m):
4

No lugar de pseudofluxo, AMO usa o conceito de capacidade residual. Esse conceito est na seo 6.3,
p.177. Tambm discutido sob Working with Residual Networks, na seo 2.4, p.44, do AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

88

F LUXO (
x)
1 para cada ij em A faa
2
se x
ij 0
3
ento xij x
ij
4
seno xij 0
5 devolva x
fcil verificar que para qualquer peudofluxo x
em um grafo simtrico,
P SEUDOFLUXO (F LUXO (
x)) = x
.

12.4

Caminhos de incremento

Suponha que x um fluxo que respeita u numa rede simtrica (N, A, u). Seja x
o correspondente pseudofluxo. Seja Ax
ij < uij no nulo:
o conjunto dos arcos ij que tm x
Ax
ij < uij } .
:= {ij A : x
Diremos (N, Ax
) o grafo residual (= residual graph) correspondente a x.
Numa rede simtrica, os pseudocaminhos de incremento introduzidos na prova do teorema 11.4 so substitudos por caminhos de incremento (= augmenting paths). Um caminho de incremento qualquer caminho (dirigido) no grafo residual.
No contexto de (s, t)-fluxos, estamos particularmente interessados em caminhos de incremento que comeam em s e, mais ainda, nos que comeam em s e terminam em t.
Tanto assim que, s vezes, o termo caminho de incremento supe implicitamente que
o caminho comea em s e at mesmo que termina em t.

Exerccios
12.1 [Importante] Suponha que x um fluxo e x
o correspondente pseudofluxo num
grafo simtrico. Mostre que x(T , T ) x(T, T ) = x
(T , T ) para qualquer conjunto
T de ns.
12.2 [Importante] Suponha que x um fluxo e x
o correspondente pseudofluxo numa
rede simtrica (N, A, u). Mostre que x respeita u se e s se x
respeita u.
12.3 Se x
um pseudofluxo, verdade que P SEUDOFLUXO (F LUXO (
x)) = x
? Se x
um fluxo, verdade que F LUXO (P SEUDOFLUXO (x)) = x?
12.4 Seja x
um pseudofluxo numa rede simtrica. Considere arcos ij e ji. Se x
ij < uij
ex
ji = uji , o que posso concluir sobre o valor de x := F LUXO (
x) em ij e ji?

Captulo 13

Algoritmo de Ford-Fulkerson
Este captulo discute o clebre algoritmo de Ford e Fulkerson (ou algoritmo dos caminhos
de incremento) para o problema do fluxo mximo de um n dado a outro em uma rede
com funo-capacidade. Trata-se, simplesmente, da formalizao do algoritmo implcito
na prova do teorema 11.4. A formalizao se restringe a redes simtricas, no esprito do
captulo 12 e usa o conceito de pseudofluxo, evitando assim os pseudocaminhos usados
na prova do teorema 11.4.

13.1

Um esboo do algoritmo

Eis um primeiro esboo do algoritmo dos caminhos de incremento de Ford e Fulkerson.1 Ele supe que o grafo (N, A) simtrico e procura, em cada iterao, por um
caminho de incremento, ou seja, um caminho de s a t no grafo residual.
01
02
03
04
05
06
07
08

x0
x
P SEUDOFLUXO (x)
repita
Ax
ij < uij }
{ij A : x
seja P um caminho de s a t no grafo (N, Ax
)
se tal caminho no existe
ento devolva F LUXO (
x)
min {uij x
ij : ij arco de P }  > 0

Esse algoritmo aparece na figura 6.12, p.180, seo 6.4, do AMO sob o nome (Generic) Augmenting Path
algorithm.

89

FEOFILOFF

09
10
11
12
13

FLUXO EM REDES

15/11/2013

90

para cada arco ij de P faa


se xji = 0
ento xij xij +
seno xji xji
x
P SEUDOFLUXO (x)

No comeo de cada iterao, x um (s, t)-fluxo normalizado que respeita u. No fim do


bloco de linhas 0912, o valor do fluxo x ter aumentado de .
As converses de fluxo em pseudofluxo nas linhas 02 e 13 so, na verdade, desnecessrias: melhor operar o tempo todo com pseudofluxos e voltar ao fluxo somente no fim
do processo iterativo.
01
02
03
04
05
06
07
08
09
10

x
0
repita
Ax
ij < uij }
{ij A : x
seja P um caminho de s a t no grafo (N, Ax
)
se tal caminho no existe
ento devolva F LUXO (
x)
min {uij x
ij : ij arco de P }  > 0
para cada arco ij de P faa
x
ij x
ij +
x
ji x
ji

No comeo de cada iterao, x


o (s, t)-pseudofluxo que respeita u e portanto x :=
F LUXO (
x) um (s, t)-fluxo que respeita u.2

13.2

Algoritmo de Ford e Fulkerson

O esboo da seo anterior no detalha a maneira de procurar um caminho de s a t no


grafo residual. Se detalharmos essa busca, teremos o algoritmo descrito abaixo.3 Ele
recebe uma rede simtrica (N, A, u) e devolve um (s, t)-fluxo x e um conjunto T que
separa s de t tais que val(x) = u(T , T ).
2

Veja the effect of augmentation na figura 6.14, p.182, de AMO.


Esse , com pequenas modificaes, o algoritmo que consta da figura 6.17, p.185, seo 6.5 do AMO, sob
o nome Labelling algorithm.
3

FEOFILOFF

FLUXO EM REDES

15/11/2013

91

F ORD -F ULKERSON (N, A, u, s, t)  (N, A) simtrico


01 x
0
02 repita
03
Ax
ij < uij }
{ij A : x
04
hy, P i B USCA (N, Ax
, s, t)
05
se y(t) y(s) 0
06
ento x
I NCREMENTE -F LUXO (
x, P )
07 at que y(t) y(s) > 0
08 x F LUXO (
x)
09 T {j : y(j) y(s) > 0}
10 devolva x e T
O algoritmo B USCA na linha 04 j foi descrito na seo 3.3. Ao receber um grafo (N, E)
e ns s e t, ele devolve um 0-potencial y (ou seja, uma funo y de E em {0, 1} tal que
y(j) y(i) 0 para todo arco ij ); se y(t) y(s) 0 ento o algoritmo tambm devolve
um caminho P de s a t.4
A rotina I NCREMENTE -F LUXO usa o caminho P calculado na linha 04 para produzir um
incremento (= augmentation) do valor do fluxo. Podemos dizer, informalmente, que ela
envia unidades de fluxo ao longo do caminho P .
I NCREMENTE -F LUXO (
x, P )
1 min {uij x
ij : ij arco de P }
2 para cada arco ij de P faa
3
x
ij x
ij +
4
x
ji x
ji
5 devolva x

 >0

O algoritmo faz o que promete? Para entender o funcionamento do algoritmo preciso


entender as invariantes do processo iterativo codificado no bloco de linhas 0207. No
comeo de cada iterao,
(i1) x
inteiro;
(i2) x
um (s, t)-pseudofluxo;
(i3) x
respeita u (ou seja, uji x
ij uij para cada arco ij ).
fcil verificar essas invariantes. Em particular, no incio da linha 06 temos x
ij < uij para
todo arco ij do caminho P . Esse fato, aliado a (i1), garante que I NCREMENTE -F LUXO
produz um incremento de pelo menos 1 unidade no valor do fluxo x := F LUXO (
x).
4

Na prtica, melhor trocar a linhas 0405 por uma adaptao apropriada do cdigo de B USCA que se
encontra na seo 3.3. Com isso, no ser necessrio calcular Ax
explicitamente: basta ignorar os arcos ij
que tm x
ij = uij , como j sugerimos na seo 3.5.

FEOFILOFF

FLUXO EM REDES

15/11/2013

92

Garante tambm que x


permanece inteiro depois da execuo de I NCREMENTE -F LUXO e
assim (i1) continua vlida no incio da prxima iterao.
Depois da ltima iterao, o conjunto T definido na linha 20 separa s de t. Ademais,
como y um 0-potencial em (N, Ax
ij uij para cada arco ij em (T , T ).
), temos x
Em virtude de (i3), x
ij = uij para cada arco ij em (T , T ). Logo, depois da linha 08,
xij = uij

e xji = 0

para cada ij (T , T ). Portanto, o valor do fluxo x (veja lema 11.2) val(x) =


x(T , T ) x(T, T ) = u(T , T ), e assim, o conjunto T devolvido pelo algoritmo de fato
tem a propriedade prometida.

13.3

Consumo de tempo

No bvio que a execuo do algoritmo termina depois de um nmero finito de iteraes. Mostraremos em seguida que o nmero de iteraes de fato finito; mostraremos
que no passa de nU , onde U = maxijA uij .
Cada iterao do bloco de linhas 0306 produz um incremento do valor do fluxo. Quantos
incrementos (ou seja, quantas iteraes) o algoritmo pode fazer no mximo? De acordo
com a invariante (i1), o incremento produzido por I NCREMENTE -F LUXO inteiro; portanto, o valor do fluxo F LUXO (
x) aumenta de uma unidade, pelo menos, em cada iterao.
Por outro lado, como nossos grafos no tm arcos paralelos, o lema 11.2 garante que o
valor do fluxo no pode passar de u(t, t), que por sua vez no passa de nU :
val(x) u(t, t) nU .
Assim, o nmero de iteraes no passa de nU e o consumo total de tempo O((n +
m)nU ). Se a rede conexa, temos m n 1 e portanto podemos dizer que o consumo
de tempo do algoritmo
O(nmU ) .
No pior caso, o consumo de tempo (nmU ).5 Em suma, o algoritmo F ORD -F ULKERSON
apenas pseudo-polinomial.

13.4

Fluxo mximo e caminho de incremento

A anlise do algoritmo F ORD -F ULKERSON prova o seguinte lema:


5

Veja Pathological example, figura 6.18, p.187, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

93

Lema 13.1 (dos caminhos de incremento) Para quaisquer dois ns s e t em uma rede
simtrica (N, A, u), um (s, t)-fluxo x mximo se e s se no existe caminho de incremento de s a t.
Talvez seja apropriado lembrar que um caminho de incremento qualquer caminho no
grafo residual, ou seja, qualquer caminho cada um de cujos arcos ij tem x
ij < uij .

Exerccios
13.1 [Sutilezas do I NCREMENTE -F LUXO] A expresso I NCREMENTE -F LUXO (
x, P ) pode
ter efeitos curiosos se P for um passeio que passa por um arco ij e pelo seu
irmo siams ji. Suponha, por exemplo, que P = hi, ji. Como a expresso
I NCREMENTE -F LUXO (
x, P ) afeta x
?
13.2 [Upward/downward critical arcs. AMO 7.12, p.245] Sejam s a t dois ns de uma
rede capacitada (N, A, u) (se isso for conveniente, suponha a rede simtrica).
1. Um arco pq crtico-para-cima (upward critical) se o aumento do valor de
upq produz um aumento do valor mximo do (s, t)-fluxo que respeita u.
verdade que toda rede tem um arco crtico-para-cima? Descreva um algoritmo que determine todos os arcos crticos-para-cima em uma rede. (O consumo de tempo do seu algoritmo no pior caso deve ser bem melhor que o da
soluo de m problemas de fluxo mximo.)
2. Um arco kl crtico-para-baixo (downward critical) se a reduo do valor
de upq produz uma reduo do valor mximo do (s, t)-fluxo que respeita u.
O conjunto dos arcos crticos-para-baixo coicide com o conjunto dos arcos
crticos-para-cima? Se no for, descreva um algoritmo que determine todos
os arcos crticos-para-baixo. Qual o consumo de tempo do seu algoritmo no
pior?
13.3 [AMO 7.10, p.245] Sejam s e t dois ns de uma rede capacitada simtrica (N, A, u).
Sejam e K dois nmeros inteiros positivos e suponha que a capacidade de cada
arco pertence ao conjunto {, 2, 3, . . . , K}. Mostre que o consumo de tempo
do algoritmo F ORD -F ULKERSON para esse tipo de rede O(m2 K).
13.4 [Capacidades unitrias] Qual o consumo de tempo do algoritmo F ORD F ULKERSON se a funo-capacidade constante?

Captulo 14

Fluxo: capacity-scaling
O algoritmo F ORD -F ULKERSON apenas pseudo-polinomial. O presente captulo1 elabora modifica aquele algoritmo de modo a torn-lo polinomial, ainda que apenas fracamente polinomial. A ideia dar prioridade aos grandes incrementos de fluxo.

14.1

Grandes incrementos de fluxo

Eis um esboo de um algoritmo2 que resolve o problema do fluxo mximo dando preferncia aos grandes incrementos de fluxo. Continuamos supondo, com base no fato 12.1,
que nosso grafo simtrico.
C APACITY-S CALING (N, A, u, s, t)
01
02
03
04
05
06
07
08
09
10
11
12
1
2

 (N, A) simtrico

U maxijA uij
x
0
2blg U c
enquanto 1 faa
Ax
ij + uij }
{ij A : x
hy, P i B USCA (N, Ax
, s, t)
se y(t) y(s) 0
ento x
I NCREMENTE -F LUXO (
x, P )
seno /2
T {j : y(j) y(s) > 0}
x F LUXO (
x)
devolva x e T

AMO, seco 7.3, p.211. Tambm exerccio 3.11, p.46, no CCPS. Acho que no tem no CLRS.
Este o algoritmo que est na figura 7.3, p.212, do AMO.

94

FEOFILOFF

FLUXO EM REDES

15/11/2013

95

O algoritmo B USCA na linha 06 j foi descrito na seo 3.3. Ao receber um grafo (N, E)
e ns s e t, ele devolve um 0-potencial y ; se y(t) y(s) 0 ento o algoritmo tambm
devolve um caminho P de s a t.3

14.2

Consumo de tempo

O valor do fluxo F LUXO (


x) aumenta, durante a execuo da linha 08, de pelo menos
unidades. O valor de permanece constante durante a execuo do bloco de linhas
0508. Diremos que cada execuo desse bloco de linhas (que envolve vrias iteraes)
uma fase (= scaling phase). O fim de cada fase marcado pela execuo da linha 09.
claro que o algoritmo executa no mais que
1 + blg U c
fases. Cada fase tem
no mximo 2m iteraes,

(14.1)

como mostraremos a seguir. Suponha que estamos no fim de uma fase e portanto prestes
a executar a linha 09. Seja x := F LUXO (
x). De acordo com o teorema do fluxo mximo e
corte mnimo (teorema 11.5), existe T separando s de t tal que x
ij + > uij para cada
arco ij em (T , T ). Logo, x
(T , T ) + m > u(T , T ) no incio da linha 09. Se x um
fluxo de valor mximo ento no difcil concluir que
val(x ) val(x) + (u x
)(T , T ) < val(x) + m = val(x) + 2m(/2)
no incio da linha 09. Cada iterao da prxima fase incrementar o valor de fluxo
de /2. Logo. a prxima fase ter menos que 2m iteraes. Isso prova (14.1). Resumindo: o algoritmo excuta no mais que
2m(1 + blg U c)
operaes de incremento do fluxo.
O consumo de tempo de cada execuo de B USCA O(n + m) e o de cada execuo
de I NCREMENTE -F LUXO O(n). Logo, o consumo de tempo total do algoritmo O((n +
m)m lg U ). Se a rede conexa ento m n1 e portanto podemos dizer que o algoritmo
consome
O(m2 lg U )
unidades de tempo. Assim, o algoritmo polinomial. ainda que apenas fracamente
polinomial. Mas isso j um avano em relao ao algoritmo pseudopolinomial F ORD F ULKERSON.
3

Na prtica, melhor trocar a linhas 0607 por uma adaptao apropriada do cdigo de B USCA que se
encontra na seo 3.3. Com isso, no ser necessrio calcular Ax
explicitamente: basta ignorar os arcos ij
que tm x
ij + > uij .

FEOFILOFF

FLUXO EM REDES

15/11/2013

96

Exerccios
14.1 [Capacidades unitrias] Qual o consumo de tempo do algoritmo C APACITYS CALING se a funo-capacidade constante?
14.2 [AMO 7.17, p.246] Decreva uma generalizao do algoritmo C APACITY-S CALING
em que dividido por um inteiro 2 em cada fse. Inicialmente, =
dlog U e ; Analise a relao entre e o consumo de tempo do seu algoritmo.

Captulo 15

Fluxo: algoritmo de Edmonds-Karp


Os algoritmos para o problema do fluxo mximo (problema 11.1) estudados nos captulos anteriores so ineficientes porque o nmero de incrementos de fluxo1 que executam
depende de U (mais precisamente, proporcional a U ou a lg U no pior caso). Mas supreendentemente fcil2 criar um algoritmo em que o nmero de incrementos de fluxo no
depende de U : basta usar caminhos de incremento que tenham comprimento minimo!
A estratgia simples mas sua justificativa delicada. Ela foi descoberta por Edmonds e
Karp (1972).

15.1

Caminhos de incremento mnimos

Com base no fato 12.1, suporemos que nosso grafo simtrico. para que possamos operar
com pseudofluxos. Eis o algoritmo de Edmonds e Karp (1972), tambm conhecido como
algoritmo dos caminhos de incremento mnimos (= shortest augmenting path algorithm):
1
2

Ou seja, o nmero chamadas da rotina I NCREMENTE -F LUXO.


Veja sees 7.2 e 7.4 de AMO. Veja seo 3.2, p.44, de CCPS.

97

FEOFILOFF

FLUXO EM REDES

15/11/2013

98

E DMONDS -K ARP (N, A, u, s, t)  (N, A) simtrico


1 x
0
2 repita
3
Ax
ij < uij }
{ij : x
4
(y, P ) C AMINHO -M NIMO (N, Ax
, s, t)
5
se y(t) y(s) < n
6
ento x
I NCREMENTE -F LUXO (
x, P )
7
seno devolva F LUXO (
x)
O algoritmo C AMINHO -M NIMO essencialmente o mesmo que B USCA - EM -L ARGURA
do captulo 5.
Ele devolve um 1-potencial (s, )-timo (veja seo 5.3) y no
grafo (N, Ax
).
Portanto,
y(j) y(i) 1 para cada arco ij em Ax

e uma das seguinte


alternativas vale para cada n j :
(1) existe um caminho Q de s a j em (N, Ax
) tal que |Q| = y(j) y(s) ou
(2) y(t) y(s) n e no existe caminho de s a t em (N, Ax
).
Se y(t) y(s) < n ento C AMINHO -M NIMO devolve tambm um caminho P de s a t
tal que y(t) y(s) = |P |. claro que P um caminho de comprimento mnimo de s
ate
y(j) y(i) = 1
(15.1)
para cada arco ij em P .

15.2

Nmero de iteraes

O nmero de iteraes do algoritmo no passa de nm. A demonstrao desse fato ser


feita em trs passos, representados pelos trs lemas a seguir.
Lema 15.1 Para cada n j , a diferena de potencial y(j) y(s) no decresce de uma
iterao para a seguinte.
D EMONSTRAO : Considere as variveis x
, y e P no comeo de uma iterao. Sejam r ,
y e P os valores dessas variveis no comeo da iterao anterior. Vamos mostrar que
y(j) y(s) y(j)

y(s)

para cada n j .
Suponha por um instante que y(j) y(s) < y(j)

y(s)

para algum n j e escolha j de


modo que y(j) seja mnimo. Como y um 1-potencial (s, )-timo, existe um caminho
Q de s a j em (N, Ar ) tal que |Q| = y(j) y(s). claro que j 6= s e portanto Q tem
um penltimo n, digamos i. Como y(j) y(i) = 1, temos y(i) < y(j) e portanto

FEOFILOFF

FLUXO EM REDES

15/11/2013

99

y(i) y(s) y(i)


y(s)

em virtude da maneira como j foi escolhido. Em suma,


y(j)

y(s)

> y(j) y(s)


= y(i) + 1 y(s)
= y(i) y(s) + 1
y(i)
y(s)

+1.
Portanto, a diferena de potencial entre as pontas do arco ij era maior que 1:
y(j)

y(i)
>1.

(15.2)

Como y um 1-potencial em (N, Ar ), conclumos que ij


/ Ar , ou seja, que rij = 0. Mas
ij Ar , ou seja x
ij < uij , e portanto (veja a rotina I NCREMENTE -F LUXO na linha 6) ji
pertence ao caminho de incremento P . De acordo com (15.1), temos y(i)
y(j)

= 1. Mas
isso inconsistente com (15.2). A contradio prova o lema.

(15.1)

O 1-potencial y mede distncias a partir de s no grafo (N, Ax


): a distncia (em nmero
de arcos) de s a qualquer n j y(j)y(s). Ser necessrio tambm medir a distncia de
qualquer n at t. Para isso, convm imaginar que no incio de cada iterao temos, alm
de y , um 1-potencial z que (, t)-timo (veja seo 5.4) no grafo (N, Ax
). evidente
que
z(j) z(i) = 1 = y(j) y(i)
(15.3)
para qualquer arco ij de qualquer caminho de s a t que tenha comprimento mnimo
(pois o comprimento de tal caminho igual a z(t) z(s) e tambm a y(t) y(s)). Segue
da imediatamente que
z(i) z(s) = y(i) y(s)

y(t) y(i) = z(t) z(i)

(15.4)

para qualquer n i de qualquer caminho mnimo de s a t.


Lema 15.2 Para cada n i, a diferena de potencial z(t) z(i) no decresce de uma iterao para a seguinte.
D EMONSTRAO : Anloga demonstrao do lema 15.1.
Os lemas 15.1 e 15.2 tm a seguinte consequncia: o comprimento do caminho de incremento P em uma iterao pelo menos to grande quanto o comprimento do caminho
de incremento na iterao anterior. As iteraes do algoritmo podem, portanto, ser agrupadas em fases: duas iteraes pertencem mesma fase se os correspondentes caminhos
de incremento tm o mesmo comprimento. claro que o nmero de fases no passa de
n 1, uma vez que o comprimento de qualquer caminho menor que n.
Resta estimar o nmero de iteraes em cada fase. Isso equivale a estimar o nmero de
execues da rotina I NCREMENTE -F LUXO em cada fase. Cada execuo dessa rotina faz

15.1
15.2

FEOFILOFF

FLUXO EM REDES

15/11/2013

100

com que x
ij fique igual a uij para algum arco ij ; dizemos que um tal arco sofre uma
saturao. Para mostrar que I NCREMENTE -F LUXO executada no mximo m vezes em
cada fase, basta mostrar que cada arco sofre no mximo uma saturao durante uma fase.
Lema 15.3 Em cada fase, cada arco sofre no mximo uma saturao.
D EMONSTRAO : Suponha que um arco ij sofre uma saturao durante a iterao corrente. Portanto, x
ij < uij e ij pertence ao caminho P no incio da iterao corrente.
Digamos que a iterao corrente a -sima e suponha que o arco ij j sofreu uma saturao durante a -sima iterao, para algum < . evidente ento que, para algum
entre e , o arco ji pertenceu ao caminho de incremento da -sima iterao. Mostraremos abaixo que e no pertencem mesma fase. Deduziremos da imediatamente
que e tambm no pertencem mesma fase.
Sejam y , z e P os valores das variveis y , z e P no incio da -sima iterao. Queremos
mostrar que |P | < |P |. Como ji est em P e ij est em P , (15.1) garante que y(i)

y(j)

=
1 e y(j) y(i) = 1. Segue da, em virtude de (15.4) e dos lemas 15.1 e 15.2, que
|P | = y(t) y(s)

(15.1)
(15.4)
15.1
15.2

= y(t) y(j) + y(j) y(i) + y(i) y(s)


= y(t) y(j) + 1 + y(i) y(s)
= z(t) z(j) + 1 + y(i) y(s)
z(t)
z(j)

+ 1 + y(i)
y(s)

= y(t)
y(j)

+ 1 + y(i)
y(s)

= y(t)
+ y(i)
y(j)

+ 1 y(s)

= y(t)
+ 1 + 1 y(s)

= y(t)
y(s)

+2
= |P | + 2 ,
como queramos demonstrar.

15.3

Consumo de tempo

O lema 15.4 mostra que a rotina I NCREMENTE -F LUXO executada no mximo m vezes
em cada fase e portanto no mximo nm vezes ao longo da execuo do algoritmo. Cada
execuo de I NCREMENTE -F LUXO consome O(n) unidades de tempo e cada execuo
de C AMINHO -M NIMO consome O(n + m) unidades de tempo. Logo, o consumo do
algoritmo E DMONDS -K ARP
O(n2 m + nm2 ) .

15.4

FEOFILOFF

FLUXO EM REDES

15/11/2013

101

O algoritmo , portanto, fortemente polinomial. Se o grafo conexo ento m n 1 e


podemos dizer que o consumo de tempo do algoritmo
O(nm2 ) .

Exerccios
15.1 [AMO 7.3, fig.7.21(a), p.243] Use o algoritmo E DMONDS -K ARP para resolver o
problema do fluxo mximo descrito na figura 7.21(a), p.243, de AMO. Conte o
nmero de incrementos de fluxo.
15.2 Sejam s a t dois de um grafo (N, A). Seja y um 1-potencial (s, )-timo e z um 1potencial (, t)-timo. (a) Suponha que P um caminho de comprimento mnimo
de s a t. Mostre que z(j) z(i) = 1 = y(j) y(i) para cada arco ij de P .
(b) Suponha que z(j) z(i) = 1 = y(j) y(i) para um arco ij do grafo. verdade
que ij pertence a um caminho de s a t que tem comprimento mnimo?
15.3 [Capacidades constantes. AMO 8.4, p.288] Seja (N, A, u) uma rede com funo
capacidade u constante, digamos uij = 999 para cada arco ij . Dados ns s e
t, queremos encontrar um (s, t)-fluxo de valor mximo que respeita u. Descreva
informalmente o algoritmo mais eficiente (em termos de notao O) que voc conhece para resolver o problema.
15.4 [Grafo bipartido.] Uma bipartio de um grafo (N, A) uma partio (N1 , N2 ) de
N tal que todo arco tem uma das pontas (inicial ou final) em N1 e a outra em N2 .
Suponha que o algoritmo E DMONDS -K ARP aplicado a um grafo dotado de uma
bipartio (N1 , N2 ). Mostre que o algoritmo faz no mximo 2n1 m incrementos de
fluxo, sendo n := |N1 |.

Captulo 16

Fluxo: algoritmo de Dinits


Depois de cada incremento de fluxo, o algoritmo E DMONDS -K ARP descarta os resultados
da busca em largura que produziu um caminho mnimo de incremento. Em geral, entretanto, outros caminhos mnimos de incremento podem ser obtidos sem fazer uma nova
busca em largura (usando o 1-potencial z implicitamente calculado durante a busca).1
O algoritmo de Dinits explora essa possibilidade e obtm um fluxo mximo em O(n2 m)
unidades de tempo.

16.1

Uma rotina auxiliar

O algoritmo de Dinits comea com um 1-potencial (, t)-timo.2 O conceito j foi discutido na seo 5.4 e novamente na seo 15.1, mas vamos repetir as definies uma vez
mais. Dado um n t, um 1-potencial z (, t)-timo se uma das seguintes alternativas
vale para cada n i:
(1) existe algum caminho Q de i a t tal que |Q| = z(t) z(i) ou
(2) z(t) z(i) n e no existe caminho de i a t.
(O nmero z(i) s vezes chamado rtulo (= label)3 do n i.) fcil calcular um 1potencial (, t)-timo:
P OTENCIAL - TIMO -T RMINO (N, A, t)
01 para cada i em N faa
02
z(i) 0
1

Veja seo 7.5, p.221, de AMO.


Segundo AMO, p.242, esse conceito passou a ser usado no contexto de algoritmos de fluxo mximo a
partir de Goldberg [1985].
3
AMO, p.209, usa a expresso distance labels para designar potenciais (, t) -timos.
2

102

FEOFILOFF

03
04
05
06
07
08
09
10
11

FLUXO EM REDES

15/11/2013

103

z(t) n
L hti
enquanto L 6= hi faa
retire o primeiro elemento, digamos j , de L
e
para cada ij em A(j)
faa  arco ij entra em j
se z(i) < z(j) 1  z(i) = 0
ento z(i) z(j) 1  z(i) aumenta
acrescente i ao final de L
devolva z

e
Na linha 07, A(j)
o conjunto de todos os arcos que entram em j . claro que no fim da
execuo do algoritmo temos
0 z(t) z(i) n
(16.1)
para todo n i. Ademais, z(t) z(i) = n se e s se no existe caminho de i a t no grafo.

16.2

Algoritmo de Dinits

A verso original do algoritmo de Dinits4 [1970] usava o conceito de redes em camadas (= layered networks)5 . Aqui, vamos representar as camadas por um 1-potencial
6
(, t)-timo no grafo residual (N, Ax
). Esse 1-potencial permite que um caminho de
incremento seja encontrado rapidamente (em tempo amortizado O(n)).
No incio de cada iterao teremos um pseudofluxo x
e um 1-potencial z no grafo
(N, Ax
).
Diremos
que
um
arco
ij

justo
se
z(j)

z(i)
=
1.7

D INITS (N, A, u, s, t)
01
02
03
04
05
06
07
08
09
4

 (N, A) simtrico

x
0
Ax
ij < uij }
{ij A : x
repita
z P OTENCIAL - TIMO -T RMINO (N, Ax
, t)
se z(t) z(s) n
ento x F LUXO (
x)
devolva x
N
P hsi

AMO escreve Dinic.


Cada camada o conjunto dos ns i para os quais z(i) tem um determinado valor, sendo z um
z
potencial. A rede em camadas (N, Azx
ij < uij e z(j)
) , onde Ax
o conjunto dos arcos ij tais que x
z(i) = 1 .
6
o que AMO faz nas sees 7.4 e 7.5, p.213223.
7
AMO chama admissible um arco justo no grafo residual. Veja seo 7.2, p.210.
5

FEOFILOFF

10
11
12
13
14
15
16
17
20
22

FLUXO EM REDES

15/11/2013

104

is
enquanto i
/ N faa
se i = t
ento x
I NCREMENTE -F LUXO (
x, P )
Ax

{ij
:
x

<
u
}
ij
ij

P hsi
is
se algum ij em Ax
/ N
(i) justo e j
ento AVANCE (ij)
seno R ETROCEDA (i)

AVANCE (ij)
23 acrescente j ao final de P
24 i j
R ETROCEDA (i)
25 N N {i}  n i est bloqueado
26 se i 6= s
27
ento remova o ltimo n de P
28
i ltimo n de P
Eis as principais invariantes do algoritmo D INITS: no comeo de cada iterao,
(i1) z um 1-potencial no grafo (N, Ax
);
(i2) para cada i em N no existe caminho de i a t em (N, Ax
) cujos arcos sejam
justos;
(i3) P um caminho de s a i em (N, Ax
);
(i4) todos os arcos de P so justos;
(i5) todos os ns de P esto em N N , exceto talvez se P = hsi;
(i6) F LUXO (
x) um (s, t)-fluxo e respeita u.
Em virtude da invariante (i2), dizemos que os ns em N esto bloqueados. Em consequncia da invariante (i4), o comprimento do caminho P z(t) z(s). Assim, em
virtude da invariante (i1), P um caminho de comprimento mnimo na rede (N, Ax
).
Nesse aspecto, o algoritmo tem o mesmo comportamento que E DMONDS -K ARP: os caminhos de incremento tm comprimento mnimo no grafo residual (N, Ax
).
Na ltima iterao temos z(t) z(s) n na linha 05. Como z um 1-potencial, conclumos que no existe caminho de s a t no grafo (N, Ax
). Portanto, no existe caminho
de incremento e assim o fluxo F LUXO(
x) mximo, como j mostramos ao discutir o
algoritmo F ORD -F ULKERSON.
O algoritmo D INITS poderia devolver um corte de capacidade mnima juntamente com

(i2)
(i4)
(i1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

105

o fluxo de valor mximo: na linha 06, se T o conjunto dos ns i tais que z(t) z(i) < n
ento (T , T ) um tal corte.

16.3

Nmero de incrementos de fluxo

Digamos que uma fase uma uma execuo do bloco de linhas 0422, que define o processo iterativo externo. Durante cada fase, o 1-potencial z permanece constante.
Lema 16.1 O nmero de fases no passa de n.
D EMONSTRAO : No fim de cada fase temos i N . Nessa ocasio, i = s em virtude
de (i5). Portanto, de acordo com (i2), todo caminho de s a t em (N, Ax
) tem comprimento maior que z(t) z(s). Segue da que a prxima excuo de P OTENCIAL - TIMO T RMINO vai resultar num aumento do valor de z(t) z(s). Assim, o nmero total de
execues de P OTENCIAL - TIMO -T RMINO no passa de n. Portanto, o nmero de fases
tambm no passa de n.

(i5)
(i2)

Lema 16.2 Em cada fase, a rotina I NCREMENTE -F LUXO executada no mximo m vezes.8
D EMONSTRAO : Cada execuo de I NCREMENTE -F LUXO satura algum arco ij , ou seja,
faz com que x
ij fique igual a uij . Como ij justo, o arco inverso ji no justo e portanto
no pode fazer parte de um caminho de incremento em alguma iterao futura da fase
corrente. Com isso, x
ij permanece igual a uij e assim ij no pode voltar a ser usado por
um caminho de incremento.
Em suma, cada arco pode ser saturado no mximo uma vez em cada fase. Segue da
imediatamente que o nmero de incrementos no passa de m.
Lema 16.3 Em cada fase, a rotina R ETROCEDA executada no mximo n vezes.
D EMONSTRAO : Cada execuo da rotina acrescenta um novo n a N . Cada n pode
ser acrescentado a N no mximo uma vez, pois nenhum n sai de N at o fim da fase.
Portanto, R ETROCEDA executada no mximo uma vez para cada n.
Lema 16.4 Em cada fase, a rotina AVANCE executada no mximo nm vezes.
D EMONSTRAO : De acordo com o lema 16.2, I NCREMENTE -F LUXO executada no m8

Lema 7.8 e 7.9, p.217218, de AMO.

16.2

FEOFILOFF

FLUXO EM REDES

106

15/11/2013

ximo m vezes em cada fase. Portanto, basta mostrar que cada n pode fazer o papel de
j na linha 20 no mximo uma vez entre cada duas ocorrncias de I NCREMENTE -F LUXO.
Considere, pois, um n q e suponha que AVANCE executado sobre algum arco da
forma iq . O n q passa a fazer parte do caminho P . Enquanto estiver em P , o n q no
pode fazer o papel de j na linha 20, essencialmente em virtude de (i1) e (i4). Suponha
agora que o n q deixa de fazer parte de P antes que ocorra o prximo I NCREMENTE F LUXO. Isso s pode acontecer se R ETROCEDA for executado sobre q , ou seja, se a linha 22
for executada com q no papel de i. Nesse caso, q passa a fazer parte de N e portanto
no mais pode fazer o papel de j na linha 20 at o fim da fase.
Como o nmero de fases no passa de n, os nmeros totais de incrementos de fluxo,
de execues de R ETROCEDA e de execues de AVANCE no passam de nm, n2 e n2
respectivamente.
rotina

nmero mximo de execues

P OTENCIAL - TIMO -T RMINO


I NCREMENTE -F LUXO
R ETROCEDA
AVANCE

16.4

n
nm
nn
n nm

Consumo de tempo do algoritmo

Para que possamos analisar o consumo de tempo do algoritmo, preciso reescrev-lo de


maneira um pouco mais detalhada, com a introduo do current-arc data structure.
D INITS (N, A, u, s, t)
01 x
0
02 repita
03
Ax
ij < uij }
{ij A : x
04
z P OTENCIAL - TIMO -T RMINO (N, Ax
, t)
05
se z(t) z(s) n
06
ento devolva F LUXO (
x)
07
para cada i em N faa
08
A0 (i) A(i)  current-arc data structure

09
N
10
P hsi
11
is
12
enquanto i
/ N faa
13
se i = t
14
ento x
I NCREMENTE -F LUXO (
x, P )

(i1)
(i4)

FEOFILOFF

15
16
17
18
19
20
21
22

FLUXO EM REDES

15/11/2013

107

P hsi
is
0
se A (i) 6=
ento escolha um arco ij de A0 (i)
se x
ij < uij e z(j) z(i) = 1 e j
/ N
ento AVANCE (ij)
seno retire ij de A0 (i)
seno R ETROCEDA (i)

Alm das invariantes (i1) a (i6), temos a seguinte:


(i7) para cada pq em A(p) A0 (p), x
pq = upq ou z(q) z(p) < 1 ou q N .
(Veja exerccio 16.4.) Ela necessria para mostrar que (i2) continua valendo no incio da
prxima iterao.

(i2)

De acordo com o lema 16.5, o nmero de execues da linha 20 no passa de nm em cada


fase. Cada arco pode fazer o papel de ij na linha 21 uma s vez em cada fase e portanto
a linha 21 executada no mximo m vezes por fase. Logo, a linha 19, e portanto tambm
a linha 18, ser executada no mximo nm + m vezes durante uma fase.

16.5

De acordo com o lema 16.3, a linha 22 ser executada no mximo n vezes em cada fase.
Portanto, a linha 17 ser executada no mximo nm + m + n vezes em cada fase. Segue
da que a linha 13 no pode ser executada mais que nm + m + n vezes em cada fase.

16.3

Assim, se levarmos em conta os lemas 16.1 e 16.2, o consumo total de tempo do algoritmo
D INITS
O(n2 m) .

16.1
16.2

(Compare com o consumo de tempo O(nm2 ) do algoritmo E DMONDS -K ARP.)

FEOFILOFF

FLUXO EM REDES

15/11/2013

linha

consumo de tempo

01
02
0304
05
06
0708
0911
1213
14
1516
17
1819
20
21
22

O(1)
O(n)
n O(n + m)
n O(1)
n O(m)
n O(n)
n O(1)
n (nm + m + n) O(1)
n m O(n)
n m O(1)
n (nm + m + n) O(1)
n (nm + m) O(1)
n nm O(1)
n m O(1)
n n O(1)

108

Como se v, a linha 14 crtica em termos de consumo de tempo. Isso serve de motivao


para o algoritmo G ENERIC -P REFLOW-P USH, a ser examinhado no prximo captulo.

Exerccios
16.1 [Bom. AMO 7.1, fig.7.20, p.243] A figura 7.20, p.243, de AMO especifica uma rede
(N, A, u) e um (s, t)-fluxo x. Seja x
o pseudofluxo P SEUDOFLUXO (x). (1) Calcule
um 1-potencial (, t)-timo z no grafo (N, Ax
), onde Ax
o conjunto dos arcos ij
com x
ij < uij . (2) Modifique x, sem alterar val(x), de modo que z(s) aumente
em uma unidade. (3) Modifique x, sem alterar val(x), de modo que z(s) diminua
em uma unidade.
16.2 [AMO 7.9(g), p.244] Seja t um n de um grafo (N, A) e z uma funo de N em
Z dotada da seguinte propriedade: para cada n i e qualquer caminho P de i
a t, tem-se |P | z(t) z(i). verdade que z um 1-potencial (ou seja, que
z(j) z(i) 1 para cada arco ij )?
16.3 Prove as invariantes (i1) a (i6) do algoritmo D INITS.
16.4 [Property 7.7, p.217, de AMO] Prove a invariante (i7).
16.5 Suponha que a rotina P OTENCIAL - TIMO -T RMINO na linha 04 do algoritmo D I NITS seja trocada por outra que devolve uma funo z de N em Z tal que
z(t) z(i) =

0 se existe caminho de i a t no grafo (N, Ax


)
n caso contrrio.

FEOFILOFF

FLUXO EM REDES

15/11/2013

109

O algoritmo continua correto? Qual o efeito sobre o consumo assinttico de tempo?

Captulo 17

Preflow-push: algoritmo bsico


Em todos os algoritmos para o problema do fluxo mximo (problema 11.1) vistos at
aqui, cada iterao comea com um (s, t)-fluxo. O ponto crtico desses algoritmos est no
consumo de tempo de cada incremento de fluxo (a linha 14 do algoritmo D INITS descrito
na seo 16.4 mostra isso claramente).
Para obter algoritmos mais eficientes, preciso desistir da ideia de manter um (s, t)-fluxo
em cada iterao e contentar-se com o conceito mais fraco de pr-fluxo.1

17.1

Pr-fluxo

Suponha que s um n de uma rede (N, A, u) com funo-capacidade u. Um fluxo x


um pr-fluxo (= preflow) com fonte s se tem excesso no negativo em cada n distinto de
s, ou seja, se
x(i, i) x(i, i)
para todo i distinto de s. Em virtude de (10.1), x(s, s) x(s, s).
Eis uma consequncia simples do lema 10.1:
Lema 17.1 Para qualquer pr-fluxo x com fonte s, qualquer n t e qualquer conjunto T
que separa s de t, se x(t, t) > x(t, t) ento x(T , T ) > 0.
D EMONSTRAO : x(T , T ) x(T , T ) x(T, T ) =
x(t, t) > 0.
1

jT (x(j, j)

x(j, j)) x(t, t)

A figura 7.10, p.224, de AMO d uma boa motivao para os algoritmos do presente captulo.

110

FEOFILOFF

17.2

FLUXO EM REDES

111

15/11/2013

Algoritmo preflow-push bsico

O seguinte algoritmo para o problema do fluxo mximo pode ser atribudo a Karzanov
[1974], ShiloachVishkin [1982] e GoldbergTarjan [1986]. O algoritmo recebe ns s e t
de uma rede (N, A, u) e produz um fluxo de valor mximo de s a t dentre os que respeitam u. Como de hbito, o algoritmo supe que o grafo (N, A) simtrico para que seja
possvel operar com pseudofluxos.
O algoritmo comea com um pr-processamento que inunda com fluxo os arcos que saem
de s, calcula o excesso e(j) em cada n j e em seguida calcula um 1-potencial (, t)timo.
P R -P ROCESSAMENTO ()
01
02
03
04
05
06
07
08
09

x
0
e0
para cada sj em A(s) faa
x
sj usj
x
js usj
e(j) e(j) + usj
e(s) e(s) usj
Ax
ij < uij }
{ij A : x
z P OTENCIAL - TIMO -T RMINO (N, Ax
, t)

 z(t) z(s) = n

No incio de cada iterao temos um pr-fluxo x := F LUXO (


x). Diremos que um n
ativo se tiver excesso estritamente positivo. Se t o nico n ativo ento x um fluxo
de s a t.
G ENERIC -P REFLOW-P USH2 (N, A, u, s, t)

 (N, A) simtrico

00
10
11
12
13
14

P R -P ROCESSAMENTO ()
enquanto e(i) > 0 para algum i em N {t} faa
Ax
ij < uij }
{ij A : x
se algum ij em Ax
(i) justo
ento P USH (ij)
seno R ELABEL (i)

15
16

x F LUXO (
x)
devolva x

 i ativo

Em cada iterao, o algoritmo escolhe um n ativo i e procura empurrar o excesso


de x em i em direo a t (ou em direo a s, no caso das ltimas iteraes). A
direo determinado pelo 1-potencial z (que na primeira iterao (, t)-timo).
2

O algoritmo est nas figuras 7.11 e 7.12, p.225, de AMO. O nome do algoritmo poderia ser traduzido
como Empurre-Pr-Fluxo.

FEOFILOFF

FLUXO EM REDES

15/11/2013

112

Mais precisamente, o excesso em i empurrado ao longo de um arco justo, ou seja,


um arco ij tal que z(j) z(i) = 1.
P USH3 (ij)
17 min {e(i), uij x
ij }
18 x
ij x
ij +
19 x
ji x
ji
20 e(i) e(i)
21 e(j) e(j) +

 >0

R ELABEL4 (i)
22 z(i) max {z(j)1 : ij Ax
(i)}

 z(i) decresce

No incio de cada iterao do bloco de linhas 1114, seja x := F LUXO (


x). Ento
(i1)
(i2)
(i3)
(i4)
(i5)
(i6)
(i7)

x pr-fluxo com fonte s;


e(i) = x(i, i) x(i, i) para cada i em N ;
x respeita u;
z um 1-potencial em (N, Ax
);
z(t) z(s) = n;
z(t) z(i) 0 para todo i;
5
se e(p) > 0 ento existe um caminho de p a s em (N, Ax
).

Prove essas invariantes!


Uma consequncia imediata da invariante (i7): se e(j) > 0 ento o conjunto {z(j)1 :
ij Ax
(i)} na linha 22 no vazio, e portanto z(i) est bem definido depois da execuo
dessa linha.

(i7)

As invariantes (i4), (i5) e (i7) tm a seguinte consequncia, fundamental para a estimativa


do consumo de tempo do algoritmo:6 no incio de cada iterao,

(i4)
(i5)
(i7)

z(t) z(p) < 2n para cada n p.

(17.1)

Eis um esboo da prova: z(t) z(p) = z(t) z(s) + z(s) z(p) = n + z(s) z(p) < n + n.
No incio da ltima iterao temos e(i) = 0 para todo i em N {s, t}. Portanto, x um
fluxo de s a t e val(x) = e(t). Como z um 1-potencial em (N, Ax
) e z(t)z(s) n, no
existe caminho de incremento para o fluxo x que comece em s e termine em t. Portanto,
x um fluxo de valor mximo.
3
4
5
6

Veja figura 7.11, p.225, AMO.


Veja figura 7.11, p.225, AMO.
Ateno: eu disse de p a s e no o contrrio. Esse o lema 7.11, p.227, de AMO.
Trata-se do lema 7.12, p.228, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

113

Nmero de iteraes. No evidente que a execuo do algoritmo termina depois de


um nmero finito de iteraes. Para verificar esse fato, observe a evoluo das somas
P
P
(17.2)
p6=s (z(t) z(p)) e
p6=s e(p)(z(t) z(p)) .
Em virtude de (17.1), temos z(t) z(p) < 2n, donde o valor da primeira soma no passa
de
2n2
e o valor da segunda no passa de
2n

p6=s e(p)

= 2nE ,

onde E o excesso total sjA(s) usj . Por


P outro lado, em virtude de (i1), (i2) e (i6), o
valor da segunda soma nunca negativo: p6=s e(p)(z(t) z(p)) 0.
Agora observe como o valor das duas somas varia em cada iterao. A cada execuo
de R ELABEL (linha 14), o valor da primeira soma aumenta. E a cada execuo de P USH
(linha 13), o valor da primeira soma no se altera mas o valor da segunda diminui (pois
z(t) z(j) menor que z(t) z(i) na linha 13). Assim, o nmero total de iteraes no
passa de
2n2 2nE .
Na prxima seo, clculo bem mais delicado mostrar que o nmero de iteraes no
passa de 2n2 + nm + 2n2 m.

17.3

Nmero de relabels e pushes

Em cada iterao do bloco de linhas 1114 ocorre uma execuo de P USH ou uma execuo de R ELABEL.
Lema 17.2 A rotina R ELABEL executada menos que 2n vezes para cada n.
D EMONSTRAO : Seja p um n qualquer e considere as execues de R ELABEL com p
no papel de i. A cada execuo, o valor de z(p) descresce de pelo menos uma unidade.
Em virtude de (i6), temos z(p) z(t) antes da primeira execuo. Em virtude de (17.1),
temos z(p) > z(t) 2n depois da ltima execuo. Logo, o nmero de execues de
R ELABEL com p no papel de i menor que 2n.
Um arco ij sofre uma saturao quando x
ij fica igual a uij . Diremos que uma execuo
de P USH saturante (saturating) se x
ij = uij depois da linha 18 e no saturante (nonsaturating) em caso contrrio.
Lema 17.3
7

O nmero de execues saturantes de P USH no passa de nm.

Lema 7.8, p.217, de AMO.

(i6)
(17.1)

FEOFILOFF

FLUXO EM REDES

114

15/11/2013

D EMONSTRAO : Seja pq um arco qualquer e considere as execues saturantes de


P USH com pq no papel de ij . Toda vez que pq sofre uma saturao, pq justo, ou
seja, z(q) z(p) = 1.
Depois da saturao, pq sai de Ax
. Antes que pq volte a Ax
, preciso que a rotina P USH
seja executada sobre o arco inverso qp. Para que isso acontea, preciso que o arco qp se
torne justo. Para isso necessrio que o valor de z(q) decresa e, mais tarde, que o valor
de z(p) decresa. As alteraes do potencial z somente ocorrem na rotina R ELABEL.
Como R ELABEL executada menos que 2n vezes com q no papel de i e menos que 2n
vezes com p no papel de i, o nmero de execues saturantes de P USH com pq no papel
de ij deve ser menor que n.
Como temos n ns, o nmero total de execues de R ELABEL limitado por 2n2 . Como
temos m arcos, o nmero total de execues saturantes de P USH no passa de nm.
Lema 17.4 O nmero total de execues no saturantes de P USH no passa de 2n2 (m+2).
D EMONSTRAO : Vamos recorrer a uma tcnica de anlise amortizada. Antes de cada
execuo do bloco de linhas 1114, digamos que a carga de um n p o nmero
(p) =

z(t) z(p) se e(p) > 0


0
em caso contrrio.

Digamos que a carga8 da rede a soma das cargas dos ns:


nmero no negativo.

pN

(p). claro que esse

Digamos que R o conjunto dos naturais tais que um R ELABEL ocorre durante a sima iterao. Analogamente, seja S o conjunto das iteraes em que ocorre um P USH
saturante e P o conjunto das iteraes em que ocorre um P USH no saturante.
Digamos que a variao da carga da rede durante a -sima iterao, ou seja, a
diferena entre a carga no fim e a carga no incio da -sima iterao. Podemos dizer que
a variao total da carga da rede entre a primeira e a ltima iteraes
P
P
P
P .
R +
S +
Em virtude de (17.1), a carga da rede no incio da primeira iterao menor que 2n2 , e
portanto a carga da rede no fim da ltima iterao ser menor que
P
P
P
2n2 + R + S + P .
Agora considere o efeito de uma execuo das rotinas P USH e R ELABEL sobre a carga da
rede:
8
O termo mais usual para esse conceito potencial e no carga. Mas esse potencial no deve ser
confundido com o potencial z .

(17.1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

115

A cada R ELABEL, a carga de i aumenta e a carga dos demais ns no se altera. Como


0 (i) = z(t) z(i) < 2n em virtude de (i6) e de (17.1), temos
P
Ri < 2n .
Durante um P USH saturante, somente as cargas dos ns i e j se alteram. A carga de
i pode se tornar nula (se i deixar de ser ativo) e a carga de j pode se tornar positiva
(se j se tornar ativo e for diferente de j ). De qualquer forma, em virtude de (17.1) a
carga total da rede aumenta em no mximo 2n unidades. Portanto, se S ento

(17.1)

< 2n .
A cada P USH no saturante, a carga do n i reduzida de z(t) z(i) a 0. A carga do
n j pode aumentar para z(t) z(j) (se o n j estava inativo no incio da iterao)
e as cargas dos demais ns permanecem inalteradas. Portanto, se P ento
(z(t) z(j)) (z(t) z(i)) = (z(j) z(i)) = 1 .
O lema 17.2 garante que |Rp | < 2n para cada p, sendo Rp o conjunto das iteraes em
que ocorre R ELABEL com p no papel de i. O lema 17.3 garante que |S| < nm. Logo, no
incio da ltima iterao a carga da rede ser menor que
P
P
P
2n2 + R + S + P
P P
P
P
= 2n2 + p Rp + S + P
P
< 2n2 + p 2n + 2n|S| |P|
< 2n2 + 2n2 + 2n2 m |P|
= 2n2 (m + 2) |P| .
Como a carga da rede nunca negativa, temos |P| < 2n2 (m + 2) como queramos demonstrar.
Podemos supor que o nmero de execues no saturantes de P USH no passa de 2n2 m,
uma vez que estamos interessados apenas na anlise assinttica. No sentido amortizado,
pode-se dizer que o nmero de execuo no saturantes de P USH sobre cada arco menor
que 2n2 .
rotina nmero mximo de execues
R ELABEL
P USH saturante
P USH no saturante

2n2
nm
2n2 m

17.2
17.3

FEOFILOFF

17.4

FLUXO EM REDES

15/11/2013

116

Consumo de tempo do algoritmo

Para analisar o consumo de tempo do algoritmo, convm reescrev-lo de maneira um


pouco mais detalhada, mostrando como administrar o conjunto de ns ativos e como
implementar as linhas 10 e 12 de maneira eficiente.
G ENERIC -P REFLOW-P USH (N, A, u, s, t)

 (N, A) simtrico

00
30
31
32
33
34
35

P R -P ROCESSAMENTO ()
N ?  ns ativos
para cada j em N faa
se e(j) > 0
ento N ? N ? {j}
para cada i em N faa
A0 (i) A(i)

36
37
38
39
40
41
42
43
44

enquanto N ? {t} =
6 faa
escolha um n i de N ? {t}
se A0 (i) 6=
ento escolha ij em A0 (i)
se x
ij < uij e z(j) z(i) = 1
ento P USH (ij)
seno retire ij de A0 (i)
seno R ELABEL (i)
A0 (i) A(i)

45

devolva F LUXO (
x)

P USH (ij)
46 min {e(i), uij x
ij }  > 0
47 x
ij x
ij +
48 x
ji x
ji
49 e(i) e(i)
50 se e(i) = 0
51
ento N ? N ? {i}
52 e(j) e(j) +
53 se e(j) > 0  j 6= s
54
ento N ? N ? {j}
R ELABEL (i)
55 z(i)
56 para cada ij em A(i) faa
57
se x
ij < uij e z(i) < z(j) 1

FEOFILOFF

FLUXO EM REDES

15/11/2013

117

ento z(i) z(j) 1

58

Alm das invariantes (i1) a (i7), valem tambm as seguintes:


(i8) para todo n p, e(p) > 0 se e s se p N ? ;
(i9) para cada arco pq em A(p) A0 (p), x
pq = upq ou z(q) z(p) < 1.
A invariante (i8) bvia. J a prova de (i9) exige algum esforo (veja exerccio 17.5).
Consumo de tempo. Para cada n p, de acordo com o lema 17.2, a rotina R ELABEL
na linha 43 executada menos que 2n vezes com p no papel de i. Cada uma dessas
execues consome O(|A(p)|) unidades de tempo. Logo, o consumo total de tempo de
R ELABEL
P
2n O( p |A(p)|) = 2n O(m) .

17.2

Cada n p faz o papel de i nas linhas 43 e 44 menos que 2n vezes. Portanto, o conjunto
de arcos A(p) de cada n p examinado menos
que 2n vezes. Segue da que o nmero
P
de execues da linha 42 limitado por 2n p |A(p)| = 2nm. O consumo de tempo total
da linha 42 , portanto, 2nm O(1).
De acordo com os lemas 17.3 e 17.4, o nmero total de execues da linha 41 (rotina P USH)
menor que nm + 2n2 m. Cada execuo da rotina consome O(1) unidades de tempo.
Logo, o consumo total de tempo da linha 41 (nm + 2n2 m) O(1).
O nmero de execues das linhas 3940 no maior que a soma dos nmeros de execues das linhas 41 e 42, ou seja, nm + 2n2 m + 2nm = 3nm + 2n2 m. O nmero de
execues da linha 38 no maior que o nmero de execues da linha 39 mais o nmero
de execues da linha 43, ou seja, no maior que 3nm + 2n2 m + 2n2 .
Concluso final: o algoritmo G ENERIC -P REFLOW-P USH consome
O(n2 m)
unidades de tempo.
rotina

linha

consumo de tempo

P R -P ROCESSAMENTO
P R -P ROCESSAMENTO

0107
0809
3033
3435
3638
3940
41
42
43
44
45

nO(1)
O(n + m)
n O(1)
n O(1)
(3nm + 2n2 m + 2n2 ) O(1)
(3nm + 2n2 m) O(1)
(nm + 2n2 m) O(1)
2nm O(1)
2n O(m)
2n2 O(1)
O(m)

P USH
R ELABEL

17.3
17.4

FEOFILOFF

FLUXO EM REDES

15/11/2013

118

Exerccios
17.1 Suponha que x um pr-fluxo com origem s e que x(t, t) x(t, t) > 0. Prove que
existe um caminho de s a t tal que xij > 0 para cada arco ij do caminho.
17.2 [AMO 7.4, fig.7.22, p.243] Use o algoritmo G ENERIC -P REFLOW-P USH para resolver
o problema de fluxo mximo descrito na figura 7.22, p.243, de AMO. Ao executar
o algoritmo, considere os ns em ordem crescente de nmero; use essa ordem para
escolher o prximo n ativo; para percorrer o conjunto A(i), use a ordem crescente
da ponta final dos arcos. Exiba o estado da rede no incio de cada iterao. Conte o
nmero de pushes saturantes, o nmero de pushes no saturantes e o nmero de
relabels.
17.3 [AMO 7.14, fig.7.23, p.245] Aplique o algoritmo G ENERIC -P REFLOW-P USH ao
grafo da figura 7.23, p.245, de AMO. Ao executar o algoritmo, d preferncia aos
ns com maior z e resolva empates em favor de ns com menor nmero. Conte o
nmero de pushes saturantes, o nmero de pushes no saturantes e o nmero de
relabels.
17.4 Prove as invariantes do algoritmo G ENERIC -P REFLOW-P USH.
17.5 [Property 7.7, p.217, de AMO] Prove a invariante (i9).
17.6 [AMO 7.9(c), p.244] Seja v o valor de um fluxo de valor mximo de s a t em
uma rede capacitada (N, A, u). Prove ou desprove a seguinte afirmao: no incio

de
P qualquer iterao do algoritmo G ENERIC -P REFLOW-P USH tem-se v x(t, t)
i6=s, i6=t e(i).
17.7 [Converso de pr-fluxo mximo em fluxo mximo. AMO 7.11, p.245] Sejam s e
t dois ns de uma rede capacitada simtrica (N, A, u) e seja x um pr-fluxo com
origem s. Diremos que o valor de x o nmero val(x) = x(t, t) x(t, t). Diremos
que x mximo se seu valor mximo (dentre os pr-fluxos com origem s que
respeitam u).
a. Suponha que x um pr-fluxo mximo. Mostre que existe um fluxo mximo
x de s a t que respeita x (ou seja, xij xij para cada arco ij ) e satisfaz
val(x ) = val(x). (Sugesto: Use decomposio de fluxo, seo 10.3.)
b. Esboce um algoritmo que converta um pr-fluxo mximo em um fluxo mximo fazendo no mais que n + m incrementos.
c. Esboce um algoritmo que use caminhos de incremento de comprimento mnimo (veja seo 15) para converter um pr-fluxo mximo em um fluxo mximo. O seu algoritmo deve consumir O(nm) unidades de tempo. (Sugesto:
Calcule um 1-potencial (s, )-timo e mostre que o algoritmo produzir no
mximo m saturaes de arcos.)

FEOFILOFF

FLUXO EM REDES

15/11/2013

119

17.8 Suponha que a rotina P OTENCIAL - TIMO -T RMINO na linha 09 do P R P ROCESSAMENTO seja trocada por outra que devolve um 1-potencial z constante
(ou seja, uma funo z de N em Z tal que z(i) = z(t) para todo n i). O algoritmo
continua correto? Qual o efeito sobre o consumo assinttico de tempo?
17.9 [AMO 7.22, p.247] Considere as polticas descritas abaixo para escolher ns ativos
na linha 10 do algoritmo G ENERIC -P REFLOW-P USH. Descreva os detalhes de implementao em cada caso. D uma delimitao para o nmero de execues de
P USH e R ELABEL em cada caso.
1. Escolhe um n ativo i que tenha o maior z(i).
2. Escolhe um n ativo i que tenha maior e(i).
3. Escolhe um n ativo i que tenha sido usado mais recentemente.
4. Escolhe um n ativo i que tenha sido usado menos recentemente.
17.10 [Bom! AMO 8.9, p.289] D uma boa delimitao assinttica do consumo de tempo
do algoritmo G ENERIC -P REFLOW-P USH quando restrito a redes com capacidades
unitrias (uij = 1 para cada ij )?

Captulo 18

Preflow-push: implementao FIFO


Este captulo trata de uma implementao do algoritmo G ENERIC -P REFLOW-P USH em
que o conjunto N ? de ns ativos tratado como uma fila.

18.1

Algoritmo FIFO Preflow-push

O algoritmo abaixo uma implementao do G ENERIC -P REFLOW-P USH em que N ?


organizado em uma fila. Ele pode ser atribudo a Goldberg [1985], que baseou o seu
trabalho no de ShiloachVishkin [1982].
FIFO-P REFLOW-P USH (N, A, u, s, t)

 (N, A) simtrico

00
10
11
12
13

P R -P ROCESSAMENTO ()
L hi
para cada j em N faa
se e(j) > 0 e j 6= t
ento acrescente j ao final de L

14
15
16
17
18

enquanto L 6= hi faa
seja i o primeiro n em L
retire i de L
N ODE -E XAMINATION (i)
devolva F LUXO (
x)

120

FEOFILOFF

FLUXO EM REDES

15/11/2013

121

N ODE -E XAMINATION (i)


19 A0 A(i)
20 enquanto e(i) > 0 e A0 6= faa
21
retire um arco ij de A0
22
se x
ij < uij e z(j) z(i) = 1
23
ento P USH (ij)
24 se e(i) > 0
25
ento R ELABEL (i)
P USH (ij)
26 min {e(i), uij x
ij }  > 0
27 x
ij x
ij +
28 x
ji x
ji
29 e(i) e(i)
30 e(j) e(j) +
31 se e(j) > 0 e j 6= t  j 6= s
32
ento acrescente j ao final de L
R ELABEL (i)
33 z(i)
34 para cada ij em A(i) faa
35
se x
ij < uij e z(i) < z(j) 1
36
ento z(i) z(j) 1
37 acrescente i ao final de L
Invariantes: alm dos invariantes (i1) a (i7) do algoritmo G ENERIC -P REFLOW-P USH valem tambm os seguintes
(i8) os ns na sequncia L so distintos dois a dois;
(i9) para todo p em N {t}, e(p) > 0 se e s se p est em L.

18.2

Consumo de tempo

A anlise do consumo de tempo um refinamento da anlise de G ENERIC -P REFLOWP USH que fizemos na sees 17.3 e 17.4. A anlise depende do conceito de fase: uma fase
uma sequncia de iteraes que tratados ns que esto em L no fim da fase anterior.
Para tornar esse conceito mais claro, convm reescrever o algoritmo de modo que L seja
a concatenao de duas sequncias, L1 e L2 .
FIFO-P REFLOW-P USH (N, A, u, s, t)
00

P R -P ROCESSAMENTO ()

FEOFILOFF

FLUXO EM REDES

15/11/2013

10
11
12
13

L1 L2 hi
para cada j em N faa
se e(j) > 0 e j 6= t
ento acrescente j ao final de L1

14
15
16
17
18
19
20
21

enquanto L1 6= hi ou L2 6= hi faa
se L1 = hi
ento L1 L2
L2 hi
seno seja i o primeiro n em L1
retire i de L
N ODE -E XAMINATION (i)
devolva F LUXO (
x)

122

P USH (ij)
26 min {e(i), uij x
ij }  > 0
27 x
ij x
ij +
28 x
ji x
ji
29 e(i) e(i)
30 e(j) e(j) +
31 se e(j) > 0 e j 6= t  j 6= s
32
ento acrescente j ao final de L2
R ELABEL (i)
33 z(i)
34 para cada ij em A(i) faa
35
se x
ij < uij e z(i) < z(j) 1
36
ento z(i) z(j) 1
37 acrescente i ao final de L2
Cada fase uma sequncia de iteraes do processo no bloco de linhas 1517 entre duas
ocorrncias consecutivas de L1 = hi.
Lema 18.1 O nmero de fases no passa de 2n2 + n.
D EMONSTRAO : Exerccio.
Cada n submetido rotina N ODE -E XAMINATION no mximo uma vez durante cada
fase. Cada N ODE -E XAMINATION executa no mximo um P USH no saturante (veja seo 17.3). Logo, o nmero total de execues no saturantes de P USH no passa de
2n3 + n2 .

FEOFILOFF

FLUXO EM REDES

15/11/2013

123

Segue da que o consumo total de tempo do algoritmo


O(n3 ) .
Essa anlise do consumo de tempo baseada em Cheriyan and Maheshwari [1989].

Exerccios
18.1 [AMO 7.5, fig.7.21(a), p.243] Use o algoritmo FIFO-P REFLOW-P USH para resolver
o problema de fluxo mximo descrito na figura 7.21(a). Ao executar o algoritmo,
considere os ns em ordem crescente de nmero; use essa ordem para escolher o
prximo n ativo; para percorrer o conjunto A(i), use a ordem crescente da ponta
final dos arcos. Exiba o estado da rede no incio de cada iterao. Conte o nmero
de pushes saturantes, o nmero de pushes no saturantes e o nmero de relabels.
18.2 [AMO 7.15, fig.7.24, p.246] Aplique o algoritmo FIFO-P REFLOW-P USH ao grafo da
figura 7.24. Determineo nmero de pushes em funo dos parmetros L e W (o
nmero de ns e as capacidades dependem desses parmetros). Para um dado n,
que valores de L e W produzem o maior nmero de pushes?
18.3 [AMO 7.10, p.245] Sejam s e t dois ns de uma rede capacitada simtrica (N, A, u).
Sejam e K dois nmeros inteiros positivos. Suponha que a capacidade de cada
arco pertence ao conjunto {, 2, 3, . . . , K}. Mostre que o consumo de tempo
do algoritmo FIFO-P REFLOW-P USH para esse tipo de rede O(min(Knm, n3 )).

Parte III

Fluxo vivel
de custo mnimo

124

Captulo 19

Fluxo vivel
Este captulo1 trata de uma importante generalizao do problema do fluxo mximo (problema 11.1). O captulo culmina com o teorema de Gale, que d condies necessrias e
suficientes para a existncia de um fluxo vivel, ou seja, um fluxo que respeita restries
de capacidade e satisfaz dadas exigncias de excesso em cada n.

19.1

Ns com demandas

Uma funo-demanda em um grafo (N, A) qualquer funo que associa um nmero


inteiro b(i) a cada n i, ou seja, qualquer funo
b:N Z.
P
Como de hbito, b(T ) :=
jT b(j) para qualquer subconjunto T de N . Se b uma
funo-demanda, diz-se s vezes que b uma funo-oferta (ou funo-suprimento).
Como dissemos na seo 10.1, um fluxo uma funo de A em Z sem quaisquer restries. Dizemos que um fluxo x satisfaz uma funo-demanda b se, para cada n i, o
excesso de x em i igual a b(i), ou seja, se
x(i, i) x(i, i) = b(i) .
Podemos dizer tambm que um tal x um b-fluxo. Como j fizemos nos captulos anteriores, diremos que x respeita u se x u.
Esta seo2 trata do problema de determinar um fluxo vivel, ou seja, um fluxo que
satisfaz b e respeita u.
1
2

Resumo da seo 6.7, p.191, do AMO.


Trata-se de um resumo da subseo Application 1: Feasible flow problem, p. 169, de AMO.

125

FEOFILOFF

FLUXO EM REDES

15/11/2013

126

Problema 19.1 (do fluxo vivel) Dada uma rede (N, A, u, b) em que u uma funocapacidade e b uma funo-demanda, encontrar um fluxo que satisfaa b e respeite u.

19.2

Condies de viabilidade

fcil verificar que uma condio necessria para que o problema tenha soluo b(N ) =
0 (veja exerccio 19.1). Tambm fcil verificar outra condio necessria: b(T ) u(T , T )
para todo subconjunto T de N (veja exerccio 19.2).
Lema 19.2 Dada uma rede (N, A, u, b) em que u uma funo-capacidade e b uma
funo-demanda, se existe fluxo que satisfaz b e respeita u ento
u(T, T ) b(T ) u(T , T )

(19.1)

para todo subconjunto T de N .


D EMONSTRAO : Suponha que x um fluxo que respeita u e satisfaz b. Ento
P
P
b(N ) = iN b(i) = iN (x(i, i) x(i, i)) = 0 ,
de acordo com o lema 10.1. Por outro lado, para qualquer conjunto T de ns, b(T ) =
x(T , T ) x(T, T ) u(T , T ) 0 = u(T , T ) .
claro que a condio b(N ) e um caso particular de (19.1).
E XEMPLO: O grafo tem ns i, j, k, l . dada uma funo-demanda b. O conjunto T :=
{j, l} viola a condio b(T ) u(T , T ) e assim mostra que no existe fluxo que satisfaz b
e respeita u.
arco u
n
b
ij
2
i 4
jk 2
j
0
jk 2
k 1
jl
3
l +5
kl
2

19.3

Teorema de Gale

A condio necessria discutida no lema 19.2 tambm suficiente, como mostraremos a


seguir. Nossa demonstrao uma generalizao do teorema do fluxo mximo e corte
mnimo (teorema 11.5), o que mostra que problema do fluxo vivel pode ser considerado
um caso particular do problema 11.1 do fluxo mximo.

FEOFILOFF

FLUXO EM REDES

15/11/2013

127

Teorema 19.3 (de Gale, 1957) Dada uma rede (N, A, u, b) em que u uma funocapacidade e b uma funo-demanda, se
u(T, T ) b(T ) u(T , T )

(19.2)

para todo subconjunto T de N ento existe fluxo que satisfaz b e respeita u.3
P
D EMONSTRAO : Digamos que a discrepncia de um fluxo x o nmero i |b(i)e(i)|,
onde e(i) := x(i, i) x(i, i). claro que um fluxo satisfaz b se e s se sua discrepncia
nula.
Seja x um fluxo de discrepncia mnima dentre os que respeitam u. Vamos mostrar que
x tem discrepncia nula ou as condies (19.2) de Gale esto violadas.
P
P
Suponha inicialmente que e(i) b(i) para todo n i. Ento iN b(i) iN e(i) e
portanto, em virtude de (10.1),
b(N ) x(, N ) x(N, ) = 0 .
Se b(N ) > 0 ento N viola a condio de Gale. Caso contrrio, donde e(i) = b(i) para
todo i e portanto x tem discrepncia nula.
Suponha agora que e(s) > b(s) para algum n s. Adote a definio de pseudocaminho
que usamos no captulo 11. Seja P o conjunto dos arcos diretos e P` o conjunto dos arcos
inversos de qualquer pseudocaminho P . Diremos que um pseudocaminho P positivo
se xij < uij para cada ij em P e xkl > 0 para cada kl em P` . Seja S o conjunto de todos
os ns que so trmino de algum pseudocaminho positivo que comea em s. A definio
de S garante que
x(S, S) = u(S, S) e x(S, S) = 0 .
(19.3)
Suponha agora e(t) < b(t) para algum t em S . Seja P um pseudocaminho positivo de
s a t. Escolha o maior nmero que satisfaa as seguintes restries: uij xij para
cada ij em P , xij para cada ij em P` , e(s) b(s) e b(t) e(t). Seja x0 o
fluxo definido a partir de x como segue:
x0ij

xij + se ij P
= xij se ij P`
xij
em qualquer outro caso.

claro que o fluxo x0 respeita u. Como > 0, a discrepncia de x estritamente menor


que a de x. Isso inconsistente com nossa escolha de x. Devemos concluir portanto que
e(i) b(i)
para cada j em S . Como e(s) > b(s), o conjunto S viola a condio de Gale:
P
P
b(S) = iS b(i) < iS e(i) = x(S, S) x(S, S) = u(S, S) ,
em virtude do lema 10.1 e de (19.3).
3

Veja teorema 6.12, p.196, de AMO. Veja tambm exerccio 6.43, p.205, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

128

A prova do teorema um algoritmo para o problema do fluxo vivel. A prxima seo


descreve o algoritmo em detalhe, depois de restringir o problema a grafos simtricos.

19.4

Algoritmo do fluxo vivel

Com base no fato 12.1, podemos nos restringir a redes simtricas. O algoritmo abaixo
recebe uma rede simtrica (N, A, u, b) com funo-capacidade u e funo-demanda b e
devolve (1) um fluxo vivel x ou (2) um subconjunto S de N que viola ao condio (19.1).
F LUXO -V IVEL4 (N, A, u, b)  (N, A) simtrico
01 se b(N ) 6= 0
02
ento devolva N
03 x
0
04 e 0
05 enquanto existe s em N tal que e(s) > b(s) faa
06
Ax
ij < uij }
{ij A : x
07
hy, i C AMINHO (N, Ax
, s)
08
se existe t em N tal que y(t) = 0 e e(t) < b(t)
09
ento I NCREMENTE -F LUXO -V IVEL (u, x
, A , s, t)
10
seno S {i : y(i) = 0}
11
devolva S
12 x F LUXO (
x)
13 devolva x
O algoritmo C AMINHO uma pequena adaptao do algoritmo B USCA discutido na seo 3.3: ele recebe um n s de um grafo (N, E) e devolve um 0-potencial y e uma
funo-predecessor tais que, para cada n t tal que y(t) y(s) = 0, existe um caminho
de s a t no grafo (N, E ). Convm lembrar que o 0-potencial uma funo y de N em
{0, 1} tal que y(j) y(i) 0 para cada arco ij .
I NCREMENTE -F LUXO -V IVEL (u, x
, A , s, t)
14 seja P um caminho de s a t em (N, A )
15 min {uij x
ij : ij arco de P }
16 min {, e(s) b(s), b(t) e(t)}  > 0
17 para cada arco ij de P faa
18
x
ij x
ij +
19
x
ji x
ji
20 e(s) e(s)
21 e(t) e(t) +
4

Veja algoritmo Successive Shortest Paths, figura 9.9, p.321 do AMO.

fato 12.1

FEOFILOFF

FLUXO EM REDES

15/11/2013

129

Ao longo da execuo do algoritmo, seja x o fluxo associado a x


, isto , x := F LUXO (
x).
No comeo de cada iterao do bloco de linhas 0611,
(i1) e(i) = x(i, i) x(i, i) para cada n i;
P
(i2)
iN (b(i) e(i)) = 0;
(i4) x respeita u.
Suponha que a execuo do algoritmo F LUXO -V IVEL termina na linha 11.
P Seja S :=
{i
:
y(i)
=
0}.
Como
e(i)

b(i)
para
todo
i
em
S
e
e(s)
>
b(s),
temos
iS (b(i) <
P
iS e(i). Pela invariante (i1) e o lema 10.1,
P
b(S) < iS (x(i, i) x(i, i)) = x(S, S) x(S, S) .
Como devemos ter y(j) y(i) 0 para cada arco ij em Ax
, o corte (S, S) vazio no
grafo (N, Ax
ij = uij para cada arco ij no corte (S, S) do grafo (N, A). Logo,
), donde x
xij = uij e xji = 0 para cada arco ij no corte (S, S) do grafo (N, A), donde
x(S, S) = u(S, S) e

x(S, S) = 0 .

Segue-se que b(S) < u(S, S) e portanto S viola as condies de Gale.


Se a execuo do algoritmo termina na linha 13 ento temos e(i) b(i) para todo i e
portanto, em virtude da invariante (i2), e(i) = b(i) e portanto x satisfaz b.
P
Consumo de tempo. Em cada iterao, a soma i |b(i) e(i)| diminui em pelo menos
duas unidades. O valor mximo dessa soma nB , sendo B := maxiN |b(i)|.5 Logo, o
nmero de iteraes de F LUXO -V IVEL no passa de nB .
O consumo de tempo da rotina C AMINHO O(n + m) e o consumo de tempo de
I NCREMENTE -F LUXO O(n). Logo, o consumo de tempo total de F LUXO -V IVEL
O((n + m)nB) .
Portanto, o algoritmo apenas pseudopolinomial.
Algoritmo fortemente polinomial. O algoritmo F LUXO -V IVEL pode ser aperfeioado
e transformado em um algoritmo fortemente polinomial da mesma maneira que F ORD F ULKERSON foi transformado em um algoritmo polinomial em captulos anteriores. Em
particular, F LUXO -V IVEL pode ser implementado de modo que seu consumo de tempo
seja
O(n2 m)
Uma maneira alternativa de resolver o problema do fluxo vivel em tempo polinomial
aplicar a uma rede auxiliar qualquer algoritmo para o problema do fluxo mximo. Eis
5

Por algum misterioso motivo, AMO usa a letra U no lugar do meu B . Veja p.323.

FEOFILOFF

FLUXO EM REDES

15/11/2013

130

como isso pode ser feito. Escolha objetos s0 e t0 que no estejam em N . Seja N 0 o
conjunto N {s0 , t0 }. Seja S o conjunto de todos os ns j em N para os quais b(j) < 0.
Seja T o conjunto dos ns i para os quais b(i) > 0. Seja A0 o conjunto A {s0 j : j
S} {it0 : i T }. Defina a funo-capacidade u0 sobre A0 da seguinte maneira:
u0ij
u0s0 j
u0it0

= uij
se ij A
= b(j) para cada j S
= b(i)
para cada i T .

Qualquer fluxo x que satisfaz b e respeita u na rede (N, A, u, b) corresponde, naturalmente, a um (s0 , t0 )-fluxo x0 na rede (N 0 , A0 , u0 ) que respeita u0 e satura todos os arcos
que saem de s0 , ou seja, tal que x0s0 i = u0s0 i para todo j em S . claro que um tal x0 tem valor mximo. Reciprocamente, pode-se verificar que um (s0 , t0 )-fluxo na rede (N 0 , A0 , u0 )
que respeita u0 e satura todos os arcos que saem de s0 corresponde a um fluxo que satisfaz b e respeita u na rede (N, A, u, b).

Exerccios
19.1 Suponha que x um fluxo que satisfaz uma funo-demanda b em uma rede
(N, A, b). Prove diretamente que b(N ) = 0. Mostre que a recproca no verdadeira.
19.2 Seja (N, A, u, b) uma rede em que u uma funo-capacidade e b uma funodemanda. Seja x um fluxo que satisfaz b e respeita u. Prove diretamente que
b(i) u(i, i) para cada n i. Prove diretamente que b(T ) u(T , T ) para cada
subconjunto T de N . Mostre que a recproca no verdadeira (ou seja, a validada
dessas condies no garante a existncia de um fluxo vivel).
19.3 Seja (N, A, u, b) uma rede em que u uma funo-capacidade e b uma funodemanda. (1) Suponha que essa rede satisfaz as hipteses do lema 19.2. Prove
que b(N ) = 0. (2) Agora suponha que b(N ) = 0 e b(T ) u(T , T ) para todo
subconjunto T de N e prove que a rede satisfaz as hipteses do lema 19.2.
19.4 Seja x0 um (s0 , t0 )-fluxo de valor mximo na rede (N 0 , A0 , u0 ) definida na fim da
seo 19.4. (1) Suponha que x0 satura todos os arcos que saem de s0 , ou seja,
que x0s0 i = u0s0 i para todo j em S . Mostre que a restrio de x a A um fluxo
que satisfaz b e respeita u. (2) Agora suponha que x0 no satura todos os arcos que saem de s0 . Seja (T , T ) um (s0 , t0 )-corte de capacidade mnima. Mostre
como extrair desse corte um conjunto que viola as condies de Gale na rede original (N, A, u, b).
19.5 Deduza o teorema de Gale (teorema 19.3) do teorema do fluxo mximo e corte
mnimo (teorema 11.5).

FEOFILOFF

FLUXO EM REDES

15/11/2013

131

19.6 Suponha dados nmeros inteiros no negativos 1 , . . . , n e 1 , . . . , n . Queremos


construir um grafo bipartido com bipartio ({10 , . . , n0 }, {100 , . . , n00 }) tal que cada
n i0 tenha grau de sada (i) e e cada n i00 tenha grau de entrada (i):
|A(i0 )| = i

e 00 )| = i .
e |A(i

Mostre como resolver o problema. (Sugesto: Reduza a um problema de fluxo


mximo.)
19.7 Seja (N, A) um grafo com N = {1, . . . , n}. Suponha dados nmeros inteiros positivos 1 , . . . , n e 1 , . . . , n . Queremos encontrar um subconjunto B de A tal
que cada n i em (N, B) tenha grau de sada (i) e grau de entrada (i):
|B(i)| = i

e
|B(i)|
= i .

Mostre como resolver o problema. (Sugesto: Veja exerccio anterior. Separa cada
n i em um par (i0 , i00 ); os arcos que entram em i passam a entrar em i0 e os que
saem de i passam a sair de i00 ; no h arcos ligando i0 a i00 .)
19.8 Formule o problema do fluxo vivel (problema 19.1) como um programa linear
inteiro. Escreva o dual da relaxao linear do programa. Prove o teorema fraco da
dualidade para esse par de programas lineares.
19.9 [Fluxo vivel paramtrico. AMO 7.28, p.248] Seja (N, A, u, b) uma rede em que u
uma funo-capacidade e b uma funo-demanda. Suponha
P que b0 varia com o
0

tempo:
b(i) = b (i) + b (i) para cada n i. Suponha que iN b (i) = 0, que
P
(i) = 0 e que a rede (N, A, u, b0 ) vivel. Queremos determinar o maior
b
iN
valor inteiro de tal que (N, A, u, b0 + b ) vivel. Proponha um algoritmo
eficiente para resolver o problema.

Captulo 20

Fluxo vivel de custo mnimo:


introduo
Este captulo introduz o problema do fluxo vivel de custo mnimo (min-cost flow problem),
que o assunto central do texto e do curso. A soluo do problema, a ser estudada nos
prximos captulos, depende dos problemas do caminho mnimo, do ciclo negativo e do
fluxo mximo.

20.1

O problema

Uma funo-custo para um grafo (N, A) qualquer funo de A em Z, ou seja, qualquer


funo que associa um nmero inteiro cij com cada arco ij do grafo. O nmero cij o
custo do arco e pode ser positivo, negativo ou nulo. O custo de um fluxo x na rede
(N, A, c) o nmero
P
cx := ijA cij xij .
Problema 20.1 (do fluxo vivel de custo mnimo) Dada uma rede (N, A, u, b, c) com
funo-capacidade u, funo-demanda b e funo-custo c, encontrar um fluxo vivel
de custo mnimo que satisfaa b e respeite u.
Como j dissemos no captulo 19, um fluxo vivel se satisfaz b e respeita u. De acordo
com o teorema 19.3, um tal fluxo existe se e s se u(T, T ) b(T ) u(T , T ) para todo
subconjunto T de N . Podemos enunciar o problema assim:
encontrar um fluxo vivel de custo mnimo.
Diremos que um tal fluxo timo.

132

FEOFILOFF

20.2

FLUXO EM REDES

15/11/2013

133

Condio de otimalidade

Suponha que um fluxo x soluo do problema 20.1; como possvel provar que cx
mnimo? Em outras palavras, dado um nmero , como possvel provar que no
existe um fluxo vivel de custo menor que ? A resposta a seguir baseada na teoria da
dualidade de programao linear.
Lema 20.2 Em qualquer rede, se x um fluxo vivel ento
cx yb wu
para qualquer funo-custo w 0 e qualquer (c + w)-potencial y .
Convm lembrar que uma funo-custo qualquer funo de A em Z. Convm lembrar
tambm (veja captulo 6) que um (c + w)-potencial qualquer potencial y tal que y(j)
y(i) cij + wij para cada arco ij . Na falta de um nome melhor, podemos dizer que
um par (y, w) uma soluo dual-vivel se w uma funo-custo no negativa e y
Pum (c + w)-potencial.
P Uma ltima observao: o lema adota as abreviaturas yb :=
y(i)b(i)
e
wu
:=
ijA wij uij .
iN
D EMONSTRAO : Como x satisfaz b, temos
P
yb =
y(i) b(i)

Pi
=
i y(i) x(i, i) x(i, i)
P
P
=
y(i)x(i, i)
i y(i)x(i, i)
P
Pi
=
y(j)x(j, j)
y(i)x(i, i)
Pj
P
Pi
P
=
i y(j)
ij xij
i y(i)
ij xij
P
P
=
y(j)xij
ij y(i)xij
Pij
=
(20.1)
ij (y(j) y(i)) xij .
P
P
claro que
Pas expresses da forma ij devem
P ser entendidas como ijA e expresses
da forma i devem ser entendidas como iN . Ento
P
yb =
(y(j) y(i)) xij
Pij

ij (cij + wij ) xij


= (c + w)x
cx + wu ,
uma vez que x respeita u.
Portanto, para mostrar que uma dada rede (N, A, u, b, c) no admite um fluxo vivel de
custo menor que um determinado nmero, digamos 99, basta exibir funes y e w 0
tais que y um (c + w)-potencial e yb wu 99.

FEOFILOFF

FLUXO EM REDES

134

15/11/2013

Corolrio 20.3 Se x um fluxo vivel cx = yb wu para alguma funo-custo w 0 e


algum (c + w)-potencial y ento x fluxo timo.
Como veremos nos prximos captulos, a recproca do corolrio verdadeira: se x um
fluxo vivel que minimiza cx ento existe uma funo-custo w 0 e um (c+w)-potencial
y tais que cx = yb + wu.

20.3

Folgas complementares

A condio de otimalidade dada no corolrio 20.3 pode ser reformulada em termos de


folgas complementares. Seja x um fluxo que respeita u e y um potencial (ou seja, uma
funo de N em Z). Diremos que as folgas de x e y so complementares se, para cada
arco ij ,1
xij > 0 y(j) y(i) cij
xij < uij

y(j) y(i) cij .

claro que essas condies poderiam ter sido igualmente bem formuladas assim: y(j)
y(i) < cij xij = 0 e y(j) y(i) > cij xij = uij . Uma consequncia imediata da
condio de folgas complementares: se 0 < xij < uij ento y(j) y(i) = cij .
O conceito de folgas complementares permite que o corolrio 20.3 seja reformulado da
seguinte maneira:
Corolrio 20.4 Se x um fluxo vivel e suas folgas so complementares s de algum
potencial y ento x timo.
D EMONSTRAO : Adote a menor funo-custo w 0 para a qual y um (c + w)potencial, ou seja, defina w da seguinte maneira: para cada arco ij ,
wij := max {0 , y(j) y(i) cij } .
Com essa definio, evidente que y um (c + w)-potencial. Para provar o corolrio,
basta mostrar que cx = ybwu. Seja D o conjunto dos arcos ij para os quais y(j)y(i) <
cij . Seja E o conjunto dos arcos ij para os quais y(j) y(i) = cij . Seja F o conjunto
dos arcos ij para os quais y(j) y(i) > cij . Como as folgas de y so complementares s
1

Eis a intuio que motiva o conceito. O nmero cij (y(j) y(i)) o custo reduzido do arco ij . Se
o custo reduzido de ij for estritamente positivo, ento devemos diminuir o valor de xij para minimizar o
custo do fluxo; mas isso s pode ser feito se xij > 0 . Por outro lado, se o custo reduzido for negativo ento
devemos aumentar xij ; mas isso s possvel se xij < uij . Assim, as condies de folgas complementares
parecem caracterizar a otimalidadade do fluxo.

FEOFILOFF

FLUXO EM REDES

135

15/11/2013

de x,
xij = 0 e wij = 0

para cada ij em D,

y(j) y(i) = cij e wij = 0

para cada ij em E,

xij = uij e wij = y(j) y(i) cij

para cada ij em F .

Logo,
cx =

wu =

cij xij

D cij xij

y(i))xij +

+
P

y(i))xij

cx + wu =

y(i))xij +

y(i))xij

D (y(j)

E cij xij

cij xij

E (y(j)

y(i))xij +

y(i))xij +

cij uij

wij uij

F (y(j)

D (y(j)
ij (y(j)

cij uij

E (y(j)

F (y(j)

y(i)xij

= yb
em virtude de (20.1). Como cx = yb wu, o corolrio 20.3 garante que cx mnimo.
Portanto, para mostrar que um fluxo vivel x tem custo mnimo, basta exibir um potencial y que tenha folgas complementares s de x.
A propsito, fcil mostrar que a recproca do corolrio verdadeira: se x um fluxo
vivel e cx = ybwu para alguma funo-custo w 0 e algum (c+w)-potencial y ento
as folgas de y so complementares s de x.
E XEMPLO:2 O grafo tem ns i, j, k, l . dado um fluxo vivel x. A ltima tabela registra
y e w tais que y um (c + w)-potencial e cx = 14 = yb wu.
n
b
i 4
j
0
k
0
l +4

arco
ij
ik
jk
jl
kl

c
2
2
1
3
1

x
2
2
2
0
4

u
4
2
2
3
5

n
i
j
k
l

y
0
2
4
5

arco w
ij
0
ik
2
jk
1
jl
0
kl
0

Exerccios
20.1 Seja (N, A, u, c) uma rede em que u uma funo-capacidade e c uma funocusto. Seja y um c-potencial. Especifique um fluxo x que respeite u e tenha folgas
complementares com as de y .
2

Este o exemplo da fig.9.8, p.318, de AMO.

(20.1)
20.3

FEOFILOFF

FLUXO EM REDES

15/11/2013

136

20.2 [Fluxo de custo mnimo sob capacidades infinitas] Seja b uma funo-demanda e
c uma funo-custo (no necessariamente c 0) em um grafo (N, A). Seja x um
fluxo que satisfaz b. Seja y um c-potencial. (1) Prove que cx yb. (2) Suponha
que y(j) y(i) = cij para todo arco ij tal que xij > 0. Prove que cx = yb.
20.3 Seja (N, A, c) uma rede com funo-custo c 0. Seja s um n da rede e seja b a
seguinte funo-demanda:
b(i) = 1 para cada i em N {s} e b(s) = (n 1),
onde n = |N |. Suponha que existe um fluxo que satisfaz b. Qual o melhor algoritmo que voc conhece para determinar um fluxo x que satisfaa b e um cpotencial y tais que cx = yb?
20.4 [Programa linear] Escreva um programa linear para representar o problema do
fluxo vivel de custo mnimo. Escreva o dual do programa linear. Prove o lema
fraco da dualidade para esse par de problemas. Compare o resultado com o
lema 20.2.
20.5 Seja x um fluxo que respeita u e y um potencial. Suponha que x e y tm folgas
complementares. Se uij = 0 para algum arco ij , que valor pode ter a diferena
y(j) y(i)?
20.6 Suponha que x um fluxo vivel e seja y um potencial. Mostre que as folgas de y
so complementares s de x se e s se existe uma funo-custo w 0 tal que y
um (c + w)-potencial e cx = yb wu.
20.7 Suponha que y um c-potencial em uma rede (N, A, c), ou seja, suponha que
y(j) y(i) cij para cada arco ij . Defina cy da seguinte maneira: cyij := cij
(y(j) y(i)) para cada arco ij . Mostre que se y 0 um cy -potencial ento y + y 0
um c-potencial.

Captulo 21

Fluxo em redes simtricas


Para que possamos ter algum conforto ao escrever algoritmos para o problema do fluxo
vivel de custo mnimo (ou seja, para possamos escrever os algoritmos sem recorrer a
pseudocaminhos nem pseudociclos), conveniente restringir a ateno a redes simtricas, ou seja, redes em que a presena de um arco ij implica na presena do arco inverso ji. Alm disso, em alguns algoritmos convm supor que c 0.
Este captulo mostra que todas essas restries podem ser feitas sem perda de generalidade. Para interpretar corretamente o sem perda de generalidade, devemos entender
que uma soluo completa do problema do fluxo vivel de custo mnimo consiste no s
em um fluxo vivel x mas tambm em um potencial y cujas folgas so complementares
s de x.

21.1

Redes antissimtricas e custo no negativo

Nossa primeira providncia mostrar que podemos restringir o problema do fluxo vivel
de custo mnimo, sem perder generalidade, a grafos anti ssimtricos, ou seja, grafos em
que a presena de um arco ij implica na ausncia do arco inverso ji.
Fato 21.1 suficiente resolver o problema 20.1 do fluxo vivel de custo mnimo para
grafos antissimtricos.
D EMONSTRAO : Seja (N, A, u, b, c) uma rede arbitrria com funo-capacidade u,
funo-demanda b e funo-custo c.
Suponha que o grafo (N, A) tem um arco hj e tambm um arco jh. Subdivida o arco hj
por um novo n i (ou seja, escolha um objeto i que no esteja em N , acrescente i a N e
troque hj por hi e ij ). Defina
b(i) := 0 , uhi := uhj , uij := uhj , chi := chj , cij := 0 .
137

FEOFILOFF

FLUXO EM REDES

15/11/2013

138

Suponha dado um fluxo vivel x0 na nova rede. Suponha dada tambm um potencial
y 0 na nova rede que tem folgas complementares s de x0 . claro que x0 corresponde,
naturalmente, a um fuxo vivel x na rede original. claro tambm que x0 e x tm o
mesmo custo. Alm disso, a restrio de y 0 a N tem folgas complementares s de x na
rede original. (Verifique!)
Fato 21.2 suficiente resolver o problema 20.1 do fluxo vivel de custo mnimo em redes
antissimtricas com funo-custo no negativa.1
D EMONSTRAO : Seja (N, A, u, b, c) uma rede arbitrria com funo-capacidade u,
funo-demanda b e funo-custo c. De acordo com o fato 21.1, podemos supor, sem
perder generalidade, que o grafo (N, A) antissimtrico.2

fato 21.1

Suponha agora que cpq < 0 para algum arco pq . Defina uma nova rede antissimtrica
(N, A0 , u0 , b0 , c0 ) da seguinte maneira: A0 := (A {pq}) {qp},
u0qp := upq , b0 (p) := b(p) + upq , b0 (q) := b(q) upq , c0qp := cpq ,
c0ij := cij para ij 6= qp, u0ij := uij para ij 6= qp, e b0 (i) := b(i) para todo n i distinto de
p e de q .
Suponha dado um fluxo vivel x0 na nova rede. Suponha dada tambm um potencial
y 0 que tem folgas complementares s de x0 . Para transformar x0 num fluxo vivel x na
rede original, basta definir
xpq := upq x0qp
e xij := x0ij para os demais arcos ij . O potencial y 0 ter folgas complementares s de x
na rede original.

21.2

Redes simtricas

Fato 21.3 suficiente resolver o problema 20.1 do fluxo vivel de custo mnimo em redes
simtricas. Podemos supor que uij = 0 ou uji = 0 para cada arco ij . Podemos supor,
alm disso, que cij 0 sempre que uij > 0.
D EMONSTRAO : Seja (N, A, u, b, c) uma rede arbitrria com funo-capacidade u,
funo-demanda b e funo-custo c. De acordo com o fato 21.1, podemos supor, sem
perder generalidade, que o grafo (N, A) antissimtrico. De acordo com o fato 21.2,
podemos supor tambm que c 0.
1

Veja Arc Reversal na seo 2.4, p.40, de AMO.


Isso necessrio apenas porque pretendemos introduzir um novo arco ji para cada arco ij e no
queremos que essa operao crie arcos paralelos.
2

fato 21.1
fato 21.2

FEOFILOFF

FLUXO EM REDES

15/11/2013

139

Para cada arco ij , acrescente ao grafo um novo arco ji e atribua valor 0 a uji e valor
abitrrio a cji :
uji := 0 e cji := arbitrrio .
claro que o novo grafo ser simtrico e as funes c e u tero a seguinte propriedade:
para cada arco ij ,
uij > 0 cij 0 .
Agora suponha dado um fluxo vivel x0 na nova rede. Suponha dado tambm um potencial y 0 na nova rede que tem folgas complementares s de x0 . evidente que a restrio
de x0 rede original um fuxo vivel; ademais, os dois fluxos tm o mesmo custo. Alm
disso, y 0 tambm tem folgas complementares s da restrio de x0 rede original.

21.3

Custo antissimtrico

Redes simtricas tm a vantagem de permitir que cada par (ij, ji) de arcos ser tratado
como um nico objeto. Em particular, dado um fluxo x, o nmero xij xji pode ser
tratado como a intensidade do fluxo de i a j ao longo do par (ij, ji). Dois fluxos x e x0
sero considerados equivalentes se x0ij x0ji = xij xji para cada arco ij . evidente
que se x0 e x so equivalentes ento x0 (i, i) x0 (i, i) = x(i, i) x(i, i) para cada n i.
Portanto, se x satisfaz b ento x0 tambm satisfaz b.
Gostaramos que fluxos equivalentes x e x0 tivessem o mesmo custo. Para isso ser
necessrio exigir que a funo-custo c seja antissimtrica, isto , que
cji = cij
para cada arco ij em A. Os fatos 21.1 e 21.3 garantem que podemos restringir a ateno,
sem perder generalidade, a redes em que a funo-custo antissimtrica.

21.4

Folgas complementares em redes simtricas

O conceito de pseudofluxo numa rede simtrica ser definida como na seo 12.2: o pseudofluxo associado a um fluxo x x
:= P SEUDOFLUXO (x). Se a rede tem custo antissimtrico, a condio de folgas complementares adquire uma forma particularmente simples.
Lema 21.4 Seja (N, A, u, c) uma rede simtrica com custo antissimtrico, x um fluxo que
respeita u e y um potencial. As folgas de x e y so complementares se e s se
x
ij < uij
para cada arco ij .

y(j) y(i) cij

(21.1)

fato 21.1
fato 21.3

FEOFILOFF

FLUXO EM REDES

15/11/2013

140

claro que a condio (21.1) tambm pode ser escrita assim: se y(j) y(i) > cij ento
x
ij = uij .
D EMONSTRAO : Suponha que as folgas de x e y so complementares, ou seja, suponha
que para cada arco ij
y(j) y(i) < cij

xij = 0 e

y(j) y(i) > cij

xij = uij .

Agora tome um arco ij tal que y(j) y(i) > cij . Ento y(i) y(j) = (y(j) y(i)) <
cij = cji , uma vez que c antissimtrica. A complementaridade das folgas no arco ji
garante ento que xji = 0. Por outro lado, a complementaridade da folgas em ij garante
que xij = uij . Logo, x
ij = xij xji = uij .
Suponha agora que x
ij < uij y(j) y(i) cij para cada arco ij . Tome qualquer arco
ij e suponha que y(j) y(i) < cij . Ento
y(i) y(j) = (y(j) y(i)) > cij = cji
donde x
ji = uji . Como 0 x u, temos xij = 0. Agora suponha que y(j) y(i) > cij .
Ento (21.1) garante que x
ij = uij . Como 0 x u, temos xij = uij .

(21.1)

Em vista desse lema, o corolrio 20.4 pode ser reformulado assim:

corol 20.4

Corolrio 21.5 Se a funo-custo c antissimtrica, x um fluxo vivel e existe um potencial y tal que x
ij < uij y(j) y(i) cij para cada arco ij ento x timo.

Exerccios
21.1 Complete as demonstraes dos fatos 21.1, 21.2 e 21.3.

Captulo 22

Algoritmo de Klein
Este captulo descreve um primeiro algoritmo para o problema do fluxo vivel de custo
mnimo. O algoritmo revela a importncia dos ciclos de custo negativo no grafo residual.

22.1

Algoritmo de Klein

O algoritmo descrito abaixo atribudo a Klein [1967]. Ao descrever o algoritmo podemos supor, sem perda de generalidade, de acordo com o fato 21.3, que a rede simtrica.
Vamos supor que a funo-custo antissimtrica, para que possamos usar o lema 21.4.
O algoritmo de Klein recebe uma rede simtrica (N, A, u, b, c) com c antissimtrico e
devolve (1) um subconjunto T de N que viola a condio de Gale (veja (19.1)) ou (2) um
fluxo vivel x e um potencial y que tem folgas complementares s de x. Conforme o
corolrio 20.4, a alternativa (2) garante que x um fluxo timo.
K LEIN1 (N, A, u, b, c)
01
02
03
04
1

 cji = cij

hx0 , T i F LUXO -V IVEL (N, A, u, b)


se x0 no est definido
ento devolva T
r P SEUDOFLUXO (x0 )

Veja Cycle-canceling algorithm na fig.9.7, p.317, de AMO.

141

FEOFILOFF

05
06
07
08
09
10
11
12
13
14

FLUXO EM REDES

15/11/2013

142

repita
Ax
ij < uij }
{ij A : x
hO, yi C ICLO -N EGATIVO (N, Ax
, c)
se O est definido
ento min {uij x
ij : ij arco de O }
para cada arco ij de O faa
x
ij x
ij +
x
ji x
ji
seno x F LUXO (
x)
devolva x, y

O algoritmo auxiliar F LUXO -V IVEL produz um fluxo vivel x0 se tal existe (seja seo 19.4). O algoritmo auxiliar C ICLO -N EGATIVO qualquer dos algoritmos discutidos
no capitulo 7 (F ORD -B ELLMAN, por exemplo). Ao receber um grafo (N, E) e uma funocusto c, o algoritmo devolve um ciclo (dirigido) O tal que c(O) < 0 ou um c-potencial y .
Como se sabe, um c-potencial um potencial y tal que y(j) y(i) cij para cada arco
ij em E . A existncia de um c-potencial prova a inexistncia de ciclo de custo negativo.
Eis as invariantes do algoritmo: no comeo de cada iterao do bloco de linhas 0614,
(i1) x satisfaz b,
(i2) x respeita u,
onde x := F LUXO (
x). (Prove essas invariantes!)
Na linha 13, y um c-potencial em (N, Ax
ij < uij y(j) y(i) cij para
). Portanto, x
cada arco ij em A. De acordo com o lema 21.4, y tem folgas complementares s de x.
Assim, o algoritmo comporta-se conforme prometido.
Se adotarmos wij := max {0 , y(j) y(i) cij } na linha 13, podemos dizer tambm que
y um (c + w)-potencial e cx = yb wu. Isso garante que o fluxo vivel x tem custo
mnimo, conforme corolrios 20.3 e 20.4.
Consumo de tempo. Digamos que U := maxij uij e C := maxij |cij |. Para qualquer
fluxo x que respeita u, evidente que
mU C cx mU C .
A cada iterao, cx diminui estritamente, uma vez qeu > 0 e r inteira. Portanto, o
nmero de iteraes no passa de
2mU C .
Supondo que cada execuo de F LUXO -V IVEL consome O(nm2 ) unidades de tempo e
que C ICLO -N EGATIVO consome O(nm) unidade de tempo (veja captulo 7), podemos
dizer que o consumo de tempo do algoritmo K LEIN O(nm2 + nm2 U C), ou seja,
O(nm2 U C) .

lema 21.4

cor 20.3
cor 20.4

FEOFILOFF

FLUXO EM REDES

15/11/2013

143

Portanto, o algoritmo apenas pseudopolinomial.

22.2

Custo mnimo e ciclo negativo

A anlise do algoritmo K LEIN prova o seguinte lema:


Lema 22.1 (dos ciclos negativos) Em qualquer rede (N, A, u, b, c) com funo-custo c
antissimtrica, um fluxo vivel x tem custo mnimo se e s se no existe ciclo de custo
negativo na rede residual.
Talvez seja apropriado lembrar que a rede residual (N, Ax
, c), sendo Ax
:= {ij A :
x
ij < uij } e x
:= P SEUDOFLUXO (x).

22.3

Teorema do fluxo vivel de custo mnimo

O algoritmo de Klein e sua anlise, aliados ao fato 21.3 e ao lema 21.4, provam a recproca
dos corolrios 20.3.
Teorema 22.2 (do fluxo vivel de custo mnimo) Em qualquer rede (N, A, u, b, c), se x
um fluxo que satisfaz b, respeita u e minimiza cx ento existe um funo-custo w 0 e
um (c + w)-potencial y tais que cx = yb wu.
Isso tambm pode ser formulado como a recproca do corolrio 20.4:
Teorema 22.3 Em qualquer rede (N, A, u, b, c), se x um fluxo que satisfaz b, respeita u
e minimiza cx ento existe um potencial y cujas folgas so complementares s de x.

Exerccios
22.1 Seja (N, A, u, b) um grafo simtrico com funo-capacidade u e uma funodemanda b. Suponha que para cada arco ij temos uij = 0 ou uji = 0. Sejam
x e x0 dois fluxos que respeitam u e satisfazem b. Mostre que existe uma circulao x
tal que x0 = x + x
.

FEOFILOFF

FLUXO EM REDES

15/11/2013

22.2 Aplique o algoritmo de Klein rede representada na tabela:


ij
12
13
14
23
34
42
51
52

xij
0
2
4
0
0
0
3
2

22.3 Prove as invariantes do algoritmo K LEIN.

uij
1
2
5
3
1
5
4
4

cij
2
4
1
3
9
1
1
1

144

Captulo 23

Algoritmo de Jewell
Este captulo trata de uma extenso do algoritmo F LUXO -V IVEL (veja seo 19.4) que
resolve o problema do custo de fluxo mnimo. O algoritmo atribudo a Jewell [1958] e
Iri [1960], bem como a Busacker e Gowen [1961].

23.1

O algoritmo

O algoritmo J EWELL opera sobre uma rede (N, A, u, b, c) com funo-capacidade u,


funo-demanda b e funo-custo c. O algoritmo supe que o grafo (N, A) simtrico,
que c antissimtrica e que
uij > 0 cij 0
(23.1)
para cada arco ij . Com mostram os fatos 21.1, 21.2 e 21.3, essas hipteses no trazem
perda de generalidade. O algoritmo de Jewell devolve (1) um subconjunto T de N que
viola a condio de Gale (veja (19.1)) ou (2) um fluxo vivel x e um potencial y que tem
folgas complementares s de x. Conforme o corolrio 21.5, a alternativa (2) garante que
x um fluxo vivel de custo mnimo.
J EWELL1 (N, A, u, b, c)
01
02
03
04
05
06
07
1

 cji = cij e uij > 0 cij 0

ru
e0
y0
enquanto existe s em N tal que e(s) > b(s) faa
Ax
ij < uij }
{ij A : x
para cada arco ij em Ax
faa
0
cij cij (y(j) y(i))  c0 o custo reduzido

Veja o algoritmo Successive Shortest Paths na figura 9.9, p.321, do AMO.

145

FEOFILOFF

08
09
10
11
12
13
14
15

FLUXO EM REDES

15/11/2013

146

0
hy 0 , i D IJKSTRA (N, Ax
, s, c )
se existe t em N tal que (t) 6= NIL e e(t) < b(t)
ento I NCREMENTE -F LUXO -V IVEL (
x, A , s, t)
0
y y+y
seno T {j N : (j) = NIL}
devolva T
x F LUXO (
x)
devolva x e y

O algoritmo auxiliar I NCREMENTE -F LUXO -V IVEL foi descrito na seo 19.4. Ele tem o
efeito de enviar a maior quantidade possvel de fluxo ao longo de um caminho de s a t
no grafo de predecessores (N, A ).
O algoritmo D IJKSTRA foi descrito no captulo 8. A invariante (i4) abaixo garante que y
0
um c-potencial na rede (N, Ax
, c); logo, cij = cij (y(j) y(i)) 0 para cada ij em Ax
,
estando assim asseguradas as condies de aplicabilidade do algoritmo D IJKSTRA. Ao
receber um n s de uma rede (N, E, c0 ) com funo-custo c 0, o algoritmo D IJKSTRA
devolve um c-potencial y (portanto, y(j) y(i) cij para cada arco ij em E ) e uma
funo-predecessor tais que, para cada n t tal que y(t) y(s) < nC , onde C =
maxij |cij |, existe um caminho de s a t no grafo (N, E ).
Eis as invariantes do algoritmo, escritas em termos de x := F LUXO (
x):
(i1)
(i2)
(i3)
(i4)

e(i) = x(i, i) x(i, i) para cada n i;


P
iN (b(i) e(i)) = 0;
x respeita u;
x
ij < uij y(j) y(i) cij para cada arco ij .

Note que (i4) poderia ter sido formulada assim: y um c-potencial no grafo (N, Ax
).
Prova da invariante (i4): A invariante vale no incio da primeira iterao, pois nessa
ocasio temos y = 0 e vale a hiptese (23.1). Suponha agora que (i4) vale no incio
de uma iterao qualquer que no a ltima. No fim da linha 08 teremos
y 0 (j) y 0 (i) c0ij = cij (y(j) y(i))
0
0
para cada arco ij em Ax
. Segue da que (y(j)+y (j))(y(i)+y (i)) cij para cada
ij em Ax
. Logo, no fim da linha 11, y(j) y(i) cij para cada ij em Ax
, ou seja,
para cada arco ij que tenha x
ij < uij antes da execuo da rotina I NCREMENTE F LUXO -V IVEL.
Mas a execuo dessa rotina pode colocar novos arcos em Ax
: os arcos ij cujo
inverso ji pertence ao caminho de s a t em (N, A ). Cada arco ji desse caminho
justo, ou seja, satisfaz y 0 (i) y 0 (j) = c0ji e portanto

y 0 (j) y 0 (i) = c0ji = c0ij .

(23.1)

FEOFILOFF

FLUXO EM REDES

15/11/2013

147

Logo, (y(j) + y 0 (j)) (y(i) + y 0 (i)) = cij para cada arco ji do caminho. Portanto,
depois da linha 11, y(j) y(i) = cij para cada arco ji do caminho.
Em suma, (i4) est satisfeita depois da linha 11, e portanto tambm no incio da
prxima iterao.
No fim da ltima iterao (linha 14), de acordo com a invariante (i4) e o lema 21.4, y tem
folgas complementares s de x. Assim, ao devolver x e y o algoritmo est se comportando como prometeu.

23.2

Consumo de tempo

Tal como no algoritmo F LUXO -V IVEL, o nmero de iteraes de J EWELL no passa de


nB , sendo B := maxiN |b(i)|. O consumo de tempo de cada iterao iterao dominado pelo consumo de D IJKSTRA, que O(n2 ). Logo, o consumo total do J EWELL
O(n3 B)
unidades de tempo. Portanto, o algoritmo apenas pseudopolinomial.

Captulo 24

Algoritmo Cost Scaling


Este captulo discute1 um algoritmo polinomial para o problema do fluxo vivel de custo
mnimo. O algoritmo cost scaling combina ideias do algoritmo Capacity Scaling (captulo 14) com as do Preflow-Push.

24.1

Folgas complementares relaxadas

O algoritmo Cost Scaling depende da seguinte relaxao do conceito de folgas complementares. Para qualquer nmero no negativo (no necessariamente inteiro) , um vetor
y tem folgas -complementares2 com um fluxo x se
xij > 0 y(j) y(i) cij 
xij < uij

y(j) y(i) cij + 

para cada arco ij . Essa condio poderia igualmente bem ser formulada assim: y(j)
y(i) < cij  xij = 0 e y(j) y(i) > cij +  xij = uij . Quando  = 0, temos as
folgas complementares ordinrias discutidas na seo 20.3.
Se o grafo (N, A) simtrico e a funo-custo c antissimtrica, as folgas de y e x so
-complementares se e s se
x
ij < uij

y(j) y(i) cij +  .

A prova dessa afirmao anloga prova do lema 21.4. claro que essa condio
poderia tambm ser formulada assim: y(j) y(i) > cij +  x
ij = uij .
1
2

Veja seo 10.3, pp.362372, de AMO.


Veja figura 10.2, p.363, de AMO.

148

lema 21.4

FEOFILOFF

24.2

FLUXO EM REDES

15/11/2013

149

O algoritmo

Ao contrrio de todos os algoritmos anteriores, o algoritmo C OST-S CALING usa uma


funo potencial y cujos valores no so necessariamente inteiros.3 fcil verificar que
todos os resultados sobre folgas complementares valem para essa generalizao.
C OST-S CALING4 (N, A, u, b, c)
01
02
03
04
05
06
07
08
09
10
11
12
13
14

 cji = cij

(x0 , T ) F LUXO -V IVEL (N, A, u, b)


se x0 no est definido
ento devolva T
y0
 C maxijA |cij |
enquanto  1/n faa
para cada ij em A faa
se y(j) y(i) < cij
ento xij 0
seno se y(j) y(i) > cij
ento xij uij
P USH -R ELABEL ()
 /2
devolva x

P USH -R ELABEL ()
15
16
17
18
19
20
21
22
23
24
25
26

para cada i em N faa


e(i) x(i, i) x(i, i)
r P SEUDOFLUXO (x)
enquanto e(i) > b(i) para algum i faa
se existe arco tenso ij em A(i) tal que x
ij < uij
ento min {e(i) b(i), uij x
ij }
x
ij x
ij +
x
ji x
ji
e(i) e(i)
e(j) e(j) +
seno y(i) y(i) /2
x F LUXO (
x)

Na linha 19, um arco ij tenso se y(j) y(i) > cij .


3
Mas isso pode ser facilmente evitado: basta substituir c por nc antes de executar o algoritmo e trocar a
linha 05 por  2dlog2 Ce .
4
Figuras 10.3 e 10.4, pp.364365, de AMO.

FEOFILOFF

FLUXO EM REDES

15/11/2013

150

Ao contrrio dos algoritmos anteriores, o potencial y no necessariamente inteiro (ou


seja, pode ter valors fracionrios) ao longo da execuo do algoritmo. Mas isso no tem
quaisquer consequncias,
Seja x o fluxo F LUXO (
x). Ento, no comeo de cada iterao do bloco de linhas 0713,
(i1)
(i2)
(i3)
(i4)

x respeita u;
x satisfaz b;
y(j) y(i) < cij  xij = 0 para cada arco ij ;
y(j) y(i) > cij +  xij = uij para cada arco ij .

No comeo de cada execuo da rotina P USH -R ELABEL, x pode no satisfazer b mas


respeita u e suas folgas so complementares com as de y Portanto (veja lema 21.4), x
ij <
uij y(j) y(i) cij para cada arco ij . No comeo de cada iterao do bloco de linhas
1925,

21.4

(i5) x respeita u;
(i6) x
ij < uij y(j) y(i) cij + /2 para cada arco ij .
No fim de cada execuo de P USH -R ELABEL, o fluxo x satistaz b (pois e(i) b(i) para
cada i, e(N ) = 0 em virtude de (10.1) e b(N ) = 0 uma vez que existe fluxo vivel).
ltima iterao. No incio da ltima iterao teremos  < 1/n. Seja O um ciclo na rede
(N, Ax
ij < uij }. Digamos que AO o conjunto de arcos e NO o
), onde Ax
:= {ij : x
conjunto de ns de O . Ento, em virtude das invariantes (i3) e (i4) combinados com o
lema 21.4,
P
cij
c(O) =
P
P
PijAO
=
iNO y(i)
jNO y(j)
ijAO cij +
P
P
cij + ijAO (y(i) y(j))
=
PijAO
=
(cij (y(j) y(i)))
PijAO

ijAO ()
= k
n
> 1 .
Como os valores de c so inteiros, podemos concluir que c(O) 0. Conclumos assim
que todo ciclo na rede (N, Ax
) tem custo no negativo. De acordo com o lema 22.1 isso
garante que o fluxo x timo.

lema 22.1

FEOFILOFF

24.3

FLUXO EM REDES

15/11/2013

151

Consumo de tempo

O valor de  varia de C a 1/n e dividido por 2 a cada iterao. Logo, o nmero de


iteraes o menor tal que C/21 < 1/n. Portanto, o nmero de iteraes no passa
de
1 + blog2 (nC)c .
Uma anlise no trivial revela que o consumo de tempo de cada iterao O(n2 m). Logo,
o consumo de tempo total de C OST-S CALING
O(n2 m log(nC)) .
Assim, o algoritmo polinomial.

Exerccios
24.1 Prove as invariantes do algoritmo C OST-S CALING.
24.2 Verifique que as linhas 08-11 do algoritmo C OST-S CALING podem ser substitudas
por
08
09

se y(j) y(i) > cij


ento x
ij uij

Captulo 25

Algoritmo do ciclo de custo mdio


mnimo
Este captulo1 discute um algoritmo fortemente polinomial para o problema do fluxo
vivel de custo mnimo (problema 20.1).

25.1

Ciclos de custo mdio mnimo

Dada uma rede arbitrria com funo-custo c, o custo mdio de um ciclo (dirigido) O
o nmero
c(O)
.
|O|
Em outras palavras, o custo mdio de O o nmero (racional) tal que c(O) = |O|.
Exemplo: se O e O0 so ciclos e c(O) = c(O0 ) < 0 ento o ciclo mais curto tem menor
custo mdio.
Eis uma observao til. Digamos que positivo e o custo mdio de um ciclo O .
Ento (c + )(O) = 0, sendo c + a funo-custo definida da maneira bvia: (c + )ij =
cij + . Ademais, (c + )(O) < 0 para qualquer < .
Esta seo trata do seguinte problema: Dada uma rede (N, E, c), encontrar um ciclo de
custo mdio mnimo. Convm denotar por (c) o custo mdio de tal ciclo:
(c) := min
O

c(O)
.
|O|

Trataremos do problema apenas no caso em que a rede tem um ciclo de custo estritamente
negativo; nesse caso, o problema tem soluo e c(O) < 0 para qualquer soluo O .
1

Trata-se de um resumo da seo 10.5, pp.376382, e da seo 5.7, pp.150154, de AMO.

152

FEOFILOFF

FLUXO EM REDES

15/11/2013

153

Alm de supor que a rede tem um ciclo de custo negativo, o algoritmo abaixo supe
que cij mltiplo de 2n2 para cada arco ij ;2 com isso, todos os nmeros gerados pelo
algoritmo sero inteiros.
M IN -M EAN -C YLE (N, E, c)
01
02
03
04
05
06
07
08
09
10

 2n2 divide c

1 0
2 maxijE |cij |
enquanto 2 1 > 1 faa
b(1 + 2 )/2c
hO, yi C ICLO -N EGATIVO (N, E, c + )
se O est definido
ento 1
seno 2
hO, yi C ICLO -N EGATIVO (N, E, c + 1 )  O est definido
devolva O

O algoritmo C ICLO -N EGATIVO qualquer dos algoritmos discutidos no capitulo 7


(F ORD -B ELLMAN, por exemplo). O algoritmo recebe uma rede (N, E) e uma funocusto (inteira) c0 e devolve um ciclo O tal que c0 (O) < 0 ou um c0 -potencial y (que prova
a inexistncia de ciclo negativo). O algoritmo exige que seu terceiro argumento seja uma
funo inteira, e isso garantido pela invariante (i1) abaixo.

(i1)

O algoritmo M IN -M EAN -C YLE mantm as seguintes invariantes:


(i1) 1 e 2 esto em Z e 0 1 < 2 ;
(i2) c(O)/|O| 2 para todo ciclo O ;
(i3) c(O)/|O| < 1 para algum ciclo O .
A invariante (i2) pode ser reformulada assim: (c + 2 )(O) 0 para todo ciclo O . A
invariante (i3) pode ser reformulada assim: (c + 1 )(O) < 0 para algum ciclo O .
ltima iterao. Digamos que um nmero (racional) bom se existe um ciclo cujo
custo mdio . No comeo da ltima iterao, quando 2 1 1, existe um s nmero bom menor que 1 . Eis a prova desse fato, por contradio. Suponha que existem dois nmeros bons abaixo de 1 . Ento existem ciclos O e O0 tais que c(O)/|O| e
c(O0 )/|O0 | so diferentes e ambos menores que 1 . Como os valores de c so mltiplos
de 2n2 e todo ciclo tem no mximo n ns,



c(O) c(O0 ) c(O)|O0 | c(O0 )|O| 2n2




1 2 1

=
=2.

|O|
|O0 |
|O||O0 |
n2
Essa contradio, juntamente com (i1) e (i3), prova nossa tese.
2

Portanto, multiplique todos os custos por 2n2 antes de aplicar o algoritmo.

(i1)
(i3)

FEOFILOFF

FLUXO EM REDES

15/11/2013

154

Como s existe um nmero bom abaixo de 1 , todos os ciclos negativos na rede


(N, E, c + 1 ) tm o mesmo custo mdio na rede (N, E, c). Isso justifica as linhas 09
10 do algoritmo.
Consumo de tempo. O algoritmo M IN -M EAN -C YLE executa 1+dlg Ce iteraes, sendo
C := maxijE |cij |. Cada execuo de C ICLO -N EGATIVO consome O(nm) unidades de
tempo (veja capitulo 7). Logo, M IN -M EAN -C YLE consome
O(nm lg C)
unidades de tempo.

25.2

Ciclo de custo mdio mnimo: programao dinmica

H um algoritmo para o problema do ciclo de custo mdio mnimo que mais eficiente
que o da seo anterior.
M IN -M EAN -C YLE -D YN -P ROG (N, E, c)
01
02
03
04
05
06
07
08
09
10
11
12
13
14

para cada i em N faa


d[0, i]
escolha s em N
d[0, s] 0
para 0 at n 1 faa
para cada j em N faa
d[ + 1, j] minijA(j)
(d[, i] + cij ))
e
para cada j em N faa
m[j] max0n1 (d[n, j] d[, j])/(n )
maxjN m[j]
hO, yi C ICLO -N EGATIVO (N, E, c )  devolve y
E 0 {ij E : y(j) y(i) = cij }
hO0 , y 0 i DAG (N, E 0 )
devolva O0

Adote a seguinte notao: para cada entre 0 e n e cada n j ,


d(, j, c) = min c(P ) ,
P P

(25.1)

onde P o conjunto de todos os passeios de comprimento que comeam em s e terminam em j . Ento claro que no fim da execuo do bloco de linhas 17 teremos
d[, j] = d(, j, c) .

FEOFILOFF

FLUXO EM REDES

15/11/2013

155

Assim, suficiente provar que


(c) = min
jN

d(n, j, c) d(, j, c)
.
0n1
n
max

(25.2)

Para qualquer racional , seja c a funo-custo definida por (c )ij := cij .


claro que (c ) = (c) , claro tambm que
d(n, j, c ) d(, j, c )
(d(n, j, c) d(, j, c)
=
,
n
n
uma vez que d(, j, c ) = d(, j, c) para cada e cada j .
Agora tome = (c) e seja c a funo-custo c . suficiente provar que (25.2) vale
com c no lugar de c. .................
Consumo de tempo. O algoritmo consome
O(nm)
unidades de tempo. Vamos denotar esse algoritmo por M IN -M EAN -C YLE0 .

25.3

Algoritmo para fluxo vivel de custo mnimo

Podemos tratar agora do problema do fluxo vivel de custo mnimo. Vamos supor, com
base no fato 21.3, que nossa rede simtrica e que a funo-custo antissimtrica.
M IN -M EAN -K LEIN (N, A, u, b, c)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

 cji = cij

hx0 , T i F LUXO -V IVEL (N, A, u, b)


se x0 no est definido
ento devolva T
r P SEUDOFLUXO (x0 )
repita
Ax
ij < uij }
{ij A : x
hO, yi C ICLO -N EGATIVO (N, Ax
, c)
se O est definido  c(O) < 0
ento O M IN -M EAN -C YLE0 (N, Ax
, c)
min {uij x
ij : ij arco de O }
para cada arco ij de O faa
x
ij x
ij +
x
ji x
ji
seno x F LUXO (
x)
devolva x e y

FEOFILOFF

FLUXO EM REDES

15/11/2013

156

(Note que o ciclo O produzido por M IN -M EAN -C YLE0 tem comprimento |O| 3, pois
todos os ciclos de comprimento 2 tm custo nulo, dada a antissimetria de c.)
A anlise da correo do algoritmo um tanto complexa e ser omitida. exceto pelo
seguinte esboo vago. Digamos que a otimalidade de um fluxo vivel x o menor  > 0
dotado da seguinte propriedade: existe um potencial y tal que
xij > 0 y(j) y(i) cij 
xij < uij

y(j) y(i) cij + 

para cada arco ij . A correo do algoritmo se apoia no seguinte fato no trivial: no incio
de cada iterao a otimalidade de x , sendo o custo de um ciclo de custo mdio
mnimo na rede (N, Ax
, c).

25.4

Consumo de tempo

A anlise do consumo de tempo do algoritmo M IN -M EAN -K LEIN no trivial e ser


omitida. Diremos apenas que o algoritmo consome
O(n2 m3 log n)
unidades de tempo.3

Veja seo 10.5, pp.376382, de AMO.

Captulo 26

Circulaes
Este captulo1 trata de uma importante generalizao do problema do fluxo mximo (problema 11.1). O captulo culmina com o teorema de Hoffman.

26.1

Circulaes com delimitaes inferiores

Como j dissemos no captulo 10, uma circulao em uma rede um fluxo que tem acmulo nulo em cada n. Diremos que uma circulao x respeita uma funo-capacidade
u se x u.
Uma funo-limite-inferior qualquer funo l de A em Z . Uma circulao x satisfaz
uma funo l se x l . Diremos que uma circulao x vivel se satisfaz l e respeita u,
ou seja, se l x u.
Problema 26.1 (da circulao vivel) Dada uma rede (N, A, l, u) com funo-limiteinferior l e funo-capacidade u, encontrar uma circulao que seja vivel.
Esse problema pode ser reduzido ao problema do fluxo mximo como explicaremos a
seguir.
Se existe uma circulao que satisfaz l e respeita u ento evidente que l u. Alm
disso, em virtude do lema 10.1, para qualquer parte T de N ,
l(T, T ) u(T , T ) .

(26.1)

Estas condies so, portanto, necessrias para a existncia de uma circulao vivel. As
condies tambm so suficientes:
1

Resumo da seo 6.7, p.191, do AMO.

157

FEOFILOFF

FLUXO EM REDES

15/11/2013

158

Teorema 26.2 (Hoffman, 1960) Uma rede (N, A, l, u) tem uma circulao vivel se e s
se2 l u e
l(T, T ) u(T , T )
para cada parte T de N .
A prova decorre do teorema do fluxo mximo e corte mnimo (teorema 11.5).

26.2

Apndice: Fluxos com delimitaes inferiores

Suponha que acrescentamos mais uma exigncia ao problema do fluxo mximo (problema 11.1): o fluxo em cada arco ij deve valer pelo menos lij , onde l uma funolimite-inferior. Como resolver essa generalizao do problema?

Exerccios
26.1 [Teorema de Hoffman] Mostre que ambas as condies enunciadas no teorema de
Hoffman (teorema 26.2) so necessrias. Mostre que as condies so suficientes.
26.2 Escreva um algoritmo que receba uma rede (N, A, l, u), com funo-capacidada u
e funo-limite-inferior l , e devolva (1) uma circulao que satifaz l e respeita u
ou (2) uma prova de que uma tal circulao no existe. Escreva duas verses do
algoritmo: uma usa o algoritmo F ORD -F ULKERSON como caixa preta enquanto
a outra faz uma adaptao apropriada do F ORD -F ULKERSON.
26.3 Resolva o problema sugerido na seo 26.2.

Na seo 6.8, teorema 6.11, AMO erra ao omitir a primeira condio.

Bibliografia
[AMO93] R.K. Ahuja, T.L. Magnanti, and J.B. Orlin. Network Flows: Theory, Algorithms
and Applications. Prentice Hall, 1993. 1
[CCPS98] W.J. Cook, W.H. Cunningham, W.R. Pulleyblank, and A. Schrijver. Combinatorial Optimization. John Wiley, 1998. 1
[CLR91]

T.H. Cormen, C.E. Leiserson, and R.L. Rivest. Introduction to Algorithms. MIT
Press and McGraw-Hill, 1991. 1

[CLRS01] T.H. Cormen, C.E. Leiserson, R.L. Rivest, and C. Stein. Introduction to Algorithms. MIT Press and McGraw-Hill, second edition, 2001. 1
[Knu93]

D.E. Knuth. The Stanford GraphBase: A Platform for Combinatorial Computing.


ACM Press and Addison-Wesley, 1993. 39, 48

159

Lista de Tabelas
B USCA -G ENRICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

B USCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

T OPOLOGICAL -O RDERING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

DAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

DAG-G ENRICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

B USCA - EM -L ARGURA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

F ORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

F ORD -B ELLMAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

FIFO-F ORD -B ELLMAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

F ORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

F ORD -B ELLMAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

FIFO-F ORD -B ELLMAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

F ORD-II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

D IJKSTRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

D IAL -D IJKSTRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

H EAP -D IJKSTRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

M IN -C OST-PATH - IN -DAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

D ECOMPOSIO - DE -C IRCULAO . . . . . . . . . . . . . . . . . . . . . . . . . .

71

160

FEOFILOFF

FLUXO EM REDES

15/11/2013

161

D ECOMPOSIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

P SEUDOFLUXO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

F LUXO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88

F ORD -F ULKERSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

I NCREMENTE -F LUXO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

C APACITY-S CALING

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

E DMONDS -K ARP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

P OTENCIAL - TIMO -T RMINO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

D INITS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
AVANCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
R ETROCEDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
D INITS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
P R -P ROCESSAMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
G ENERIC -P REFLOW-P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
G ENERIC -P REFLOW-P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
FIFO-P REFLOW-P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
N ODE -E XAMINATION

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
FIFO-P REFLOW-P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
P USH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

FEOFILOFF

FLUXO EM REDES

15/11/2013

162

R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
F LUXO -V IVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
I NCREMENTE -F LUXO -V IVEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
K LEIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
J EWELL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
C OST-S CALING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
P USH -R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
M IN -M EAN -C YLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
M IN -M EAN -C YLE -D YN -P ROG . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
M IN -M EAN -K LEIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

ndice
A* (algoritmo), 63
A-estrela (algoritmo), 63
acmulo, 69, 86
alcance, 13
ao alcance, 13
arco, 11
direto, 26, 50, 77
entra, 11
folgado, 31, 34
inverso, 26, 50, 77
justo, 31, 34, 42, 53, 59, 103, 112
positivo, 25, 37
relaxado, 31, 34, 42, 53, 59
sai, 11
secundrio, 83
tenso, 31, 34, 42, 53, 59, 149
vital, 82
arcos
antiparalelos, 11
inversos, 11
Bellman, 53
bipartio, 101
Busacker, 145
busca
em largura, 24
em profundidade, 24
caminho, 13
bem-casado, 45
de incremento, 88
determinado por, 14
mnimo, 39
capacidade
de arco, 75
de corte, 76
carga, 114
de n, 114
ciclo, 13
circulao, 70, 157

definida por, 70
elementar, 70
respeita, 157
circulao
satisfaz, 157
coleo
disjunta, 82
comprimento
de passeio, 13
concatenao
de passeios, 13
corte, 15, 19
determinado por, 15
mnimo, 77
custo
de arco, 39, 132
de fluxo, 132
de passeio, 39
mdio, 152
mnimo, 39
reduzido, 48
demanda, 16
desigualdade
triangular, 41, 58
Dial, 60
Dijkstra, 58
Dinits, 103
Edmonds, 97
excesso, 69, 86
fase
de algoritmo, 95, 105, 121, 122
fluxo, 69, 72, 125
de . . . a. . . , 72
definido por, 72
elementar, 72
maximal, 78
mximo, 118
normalizado, 86

163

FEOFILOFF

timo, 132
respeita, 125
satisfaz, 125
vivel, 125, 132
folgas complementares, 134, 148
fonte, 76
Ford, 53, 78, 90
fortemente polinomial, 17
fracamente polinomial, 17
Fulkerson, 78, 90
funo parcial, 14
funo-capacidade, 16, 75
mpar, 81
par, 81
funo-custo, 16, 39, 51, 132
antissimtrica, 139
funo-demanda, 125
funo-limite-inferior, 157
funo-predecessor, 14
funo-sucessor, 36
Gale, 127
Gowen, 145
grafo, 11
acclico, 27
de predecessores, 14
de sucessores, 36
denso, 12
dirigido, 11
esparso, 12
orientado, 11
residual, 88
simtrico, 11, 85
simples, 11
grau
entrada, 11
sada, 11
Hoffman, 158
invariantes, 20
Iri, 145
Jewell, 145
Karp, 97
Klein, 141, 143
lista
incidncia, 12

FLUXO EM REDES

15/11/2013

matriz
adjacncias, 12
incidncia, 12
n, 11
ativo, 111
ordem
topolgica, 28
origem
de passeio, 13
otimalidade
de fluxo, 156
passeio, 13
degenerado, 13
ponta
final, 11
inicial, 11
negativa, 11
positiva, 11
potencial, 16, 19, 27, 32, 41, 51, 58
timo, 35, 36, 42, 58
pr-fluxo, 16, 110
problema
dual, 9
ilimitado, 9
vivel, 9
pseudocaminho, 26, 50, 77
de incremento, 77
positivo, 127
pseudofluxo, 16, 86
respeita, 86
pseudopolinomial, 17
quantidade
de fluxo, 71, 72
quase caminho, 13
rede, 15
representam, 72
respeita, 75
rtulo, 32, 102
saturao
de arco, 100, 113
segmento
de passeio, 13
final, 13
inicial, 13
separa, 15, 19, 72

164

FEOFILOFF

soluo
dual-vivel, 133
tima, 9
vivel, 9
sorvedouro, 76
subgrafo, 12
teorema
Gale, 127
Hoffman, 158
trmino
de passeio, 13
vai de. . . a. . . , 13
valor
de fluxo, 72, 118

FLUXO EM REDES

15/11/2013

165