Escolar Documentos
Profissional Documentos
Cultura Documentos
FluxoEmRedes PDF
FluxoEmRedes PDF
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 Combi-
natria (MAC5781 e MAC0325) no IMEUSP (Instituto de Matemtica e Estatstica da
Universidade de So Paulo). As notas foram baseadas em dois livros:
1
Sumrio
I Caminhos e ciclos 18
3 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
2
FEOFILOFF FLUXO EM REDES 15/11/2013 3
7 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 FLUXO EM REDES 15/11/2013 4
10 Fluxo: introduo 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
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 5
14 Fluxo: capacity-scaling 94
14.1 Grandes incrementos de fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . 94
14.2 Consumo de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
26 Circulaes 157
26.1 Circulaes com delimitaes inferiores . . . . . . . . . . . . . . . . . . . . 157
26.2 Apndice: Fluxos com delimitaes inferiores . . . . . . . . . . . . . . . . . 158
Captulo 1
1.1 O problema
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 di-
ferente 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
8
FEOFILOFF FLUXO EM REDES 15/11/2013 9
minimize cx
sob as restries (1.1)
M x = b e x 0.
Infelizmente, a terminologia tradicional abusa da palavra soluo e diz que uma solu-
o 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
maximize yb
sob as restries (1.2)
yM c.
yb cx . (1.3)
yb = y(M x) = (yM )x cx .
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.
1 0 +1 1 0
0 1 0 0 0
+1 +1 0 0 +1
0 0 1 +1 1
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
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.
2
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 c-
pias de um mesmo arco (i, j) . Se tomarmos cuidado, poderemos lidar com isso sem criar confuso.
11
FEOFILOFF FLUXO EM REDES 15/11/2013 12
n := |N | e m := |A| .
m n(n 1) < n2 .
A(i) .
2.4 Funo-predecessor
6
AMO diz walk, mas CLRS diz path. J CCPS, diz dipath.
7
AMO diz path, enquanto CLRS diz simple path e CCPS diz simple dipath.
8
Nem AMO nem CLRS tm esse conceito. Mas eu acho que ele muito til.
9
Cuidado: eu disse primeiro e no ltimo.
10
Esta o termo usado por AMO. CLRS diz simple cycle.
FEOFILOFF FLUXO EM REDES 15/11/2013 14
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 , pred
hf, g, h, i, ji
hg, e, f, g, h, i, ji
Eis um algoritmo trivial que calcula o caminho ou o quase caminho determinado por
a partir de um n j :
0 P hji
1 J {j}
2 enquanto (j) 6= NIL e (j) /J
3 faa j (j)
4 acrescente j ao incio de P
5 J J {j}
6 se (j) = NIL
7 ento P um caminho
8 seno acrescente (j) ao incio de P
9 P um quase caminho
Veja exerccio 2.1.
2.6 Cortes
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
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 .
g(i) .
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 algo-
ritmo 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 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 0-
potencial 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.
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 execu-
tado a partir de qualquer configurao que satisfaa as invariantes. Em outras palavras, qualquer configu-
rao que satisfaa as invariantes pode ser usada como inicializao do algoritmo.
FEOFILOFF FLUXO EM REDES 15/11/2013 21
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.
n1,
onde n := |N |. n = |N |
Cada execuo da linha 4 consome O(m) unidades de tempo, onde m := |A|, e as linhas 5 m = |A|
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) .
Mais grosseiramente, podemos dizer que o consumo de tempo total O(n3 ), uma vez
que m < n2 .
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 FLUXO EM REDES 15/11/2013 23
08 escolha um n i em L
09 se A0 (i) 6=
10 ento retire6 um arco ij de A0 (i)
11 se y(j) = 1
12 ento y(j) 0
13 (j) i
14 L L {j}
15 seno L L {i}
16 se y(t) = 1
17 ento devolva y
18 seno devolva o caminho de s a t em (N, A )
Na prtica, da lista de adjacncia A(i) implementado como uma sequncia (mais preci-
samente, 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:
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 (i4)
y(t) = 1 ento, em virtude de (i1), y(t) y(s) = 1 > 0. Seno, de acordo com (i3), h um (i1)
caminho de s a t no grafo de predecessores. Em suma, o algoritmo faz o que promete. (i3)
6
Est implcita a a operao A0 (i) A0 (i) {ij} .
7
Veja p.75 do AMO. Veja tambm a figura 7.7, p.217, de AMO.
8
Mas pode existir arco pq com p em L e y(q) = 0 .
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 (i5)
primeiro tipo no passa de X
|A(k)| ,
kN
n+m.
Cada iterao consome O(1) undidades de tempo9 . Logo, o consumo total do bloco de
linhas 07-15
O(n + m) .
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).
9
Ou seja, o consumo de tempo limitado por uma quantidade que no depende de n nem de m .
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
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
j , seja A(j)
e 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 algo-
ritmo B USCA -G ENRICO e pelo algoritmo B USCA no tem ciclos.
3.4 [AMO 3.24, p.89] Desenhe as rvores de busca em largura e busca em profundi-
dade 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.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.
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.
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
27
FEOFILOFF FLUXO EM REDES 15/11/2013 28
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 qual-
quer 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 |.
O seguinte algoritmo tem base na seguinte observao: todo grafo acclico tem pelo me-
nos 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
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
Esse o algoritmo topological ordering da figura 3.8, p.79, do AMO.
6
Veja CLRS seo 22.4, p.550.
FEOFILOFF FLUXO EM REDES 15/11/2013 30
04 (i) NIL
05 rtulo 1
06 enquanto y(s) = n + 1 para algum s em N faa
07 L hsi
08 enquanto L 6= hi faa L funciona como uma pilha
09 seja i o primeiro elemento de L
10 se A0 (i) 6=
11 ento retire7 um arco ij de A0 (i)
12 se y(j) = n + 1
13 ento (j) i
14 se j est em L
15 ento devolva j e pare
16 seno acrescente j ao incio de L
17 seno y(i) rtulo
18 rtulo rtulo + 1
19 elimine o primeiro elemento8 de L
20 devolva y
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).
7
Est implcita a a operao A0 (i) A0 (i) {ij} .
8
Ou seja, i .
FEOFILOFF FLUXO EM REDES 15/11/2013 31
(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 .
Exerccios
4.1 Escreva uma variante do algoritmo DAG que use a funo-predecessor no lugar
da pilha L.
Captulo 5
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.
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 Breadth-
First 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
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 |.
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 itera-
o 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:
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 (i5)
cada arco do grafo de predecessores menor que n , em virtude de (i1). (i6)
Prova de (i2): Basta mostrar que j 6= s em cada execuo da linha 10. Digamos que ij (i1)
um arco tenso e i = i1 . Por (i5) e (i6), y(j) = n . Por outro lado, y(s) = 0 . Logo j 6= s . (i5)
Prova de (i3): No incio da iterao, seja P um caminho com origem s no grafo de prede- (i6)
cessores. 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.
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); (i5)
portanto j no est em P . Concluso: no incio da prxima iterao, P continua sendo um (i6)
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 mos-
tramos 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. Por-
tanto, 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 acrescen-
tada 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 (i4)
y(t) y(s) n em virtude de (i2). Seno, de acordo com (i3), h um caminho P de s a t (i2)
no grafo de predecessores. Por (i1) e a desigualdade (5.2), |P | = y(t) y(s). Portanto, o (i3)
algoritmo realmente faz o que promete. (i1)
Consumo de tempo. Cada n entra em L no mximo uma vez (por que?) e cada itera-
o 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, m = |A|
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 con-
sumo 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) .
Diremos que um 1-potencial y (s, )-timo (ou timo em relao origem s) se uma
das seguintes alternativas vale para cada n j :
FEOFILOFF FLUXO EM REDES 15/11/2013 36
Problema 5.2 (do caminho mnimo invertido) Dado um n t de um grafo (N, A), en-
contrar, 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
A(j)
e
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 in-
cio 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 posi-
tivo 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 defini-
o apropriada de funo-potencial? Escreva e analise um algoritmo que resolva o
problema.
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.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
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.
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
Problema 6.1 (do caminho de custo mnimo) Dada uma rede (N, A, c) com funo-
custo c e um n s, encontrar, para cada n t, um caminho de custo mnimo de s a t.
Em geral, o problema computacionalmente muito difcil (NP-difcil).2 Mas ele fica rela-
tivamente simples se a rede no tiver ciclos de custo negativo,3 ou seja, se
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 FLUXO EM REDES 15/11/2013 41
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 limi-
tado 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 tr-
mino t, temos
y(t) y(s) c(P ) .
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
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).
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:
7
Veja seo 9.4, p.310, de AMO.
8
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.
FEOFILOFF FLUXO EM REDES 15/11/2013 43
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 predeces-
sores. 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 (i1)
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 (i2)
a propriedade (i4) continua vlida (ainda que o caminho J no mais pertena rede de
predecessores no fim da iterao).
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. (i4)
Por um raciocnio anlogo ao que usamos para provar o lema 6.2, podemos deduzir de
(i1) que (i1)
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.
FEOFILOFF FLUXO EM REDES 15/11/2013 44
(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), (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, (i3)
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.
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 Di-
remos 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 ; ade-
mais, 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? Antes de analisar a ltima iterao, convm estabele-
cer o seguinte lema:
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
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 (i6)
O algoritmo F ORD -B ELLMAN examinha os arcos da rede em uma ordem arbitrria. Con-
vm fazer isso de maneira um pouco mais organizada (ainda que isso no reduza o con-
sumo assinttico de tempo):16
16
A seo 5.3, p.142, de AMO chama essa verso de FIFO implementation of the label-correcting algo-
rithm (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(mn)
unidades de tempo.
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 nega-
tivo.
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
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 (i6)
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 cami-
nho na rede de predecessores. Mostre que a sequncia de arcos de P no neces-
sariamente 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 algo-
ritmo em uma iterao qualquer e exiba, para cada n w , um caminho W com tr-
mino 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.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.19 Refaa o captulo todo sem a hiptese (6.2). Procure resolver o problema sem in-
troduzir 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 est-
gio 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?
Ciclos negativos
Este captulo1 trata de uma generalizao do problema dos ciclos que estudamos no ca-
ptulo 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, encon-
trar um ciclo de custo negativo.
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 c-
potencial. 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 qp qr sr sp pt tq rt ts
custo 1 2 3 4 +3 +0 +2 +1
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.
3
Isso um pouco diferente de AMO e CLR, que comeam o algoritmo com y(i) para todo i
diferente de s .
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 ):
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).
4
Portanto, y(q) y(p) c(P ) para qualquer caminho P de p a q na rede de predecessores.
FEOFILOFF FLUXO EM REDES 15/11/2013 54
08 (j) i
09 para cada arco ij em A faa
10 se y(j) > y(i) + cij
11 ento (j) i
12 devolva j
13 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).
Como no captulo 6, podemos manter em uma fila os arcos que o algoritmo de Ford-
Bellman deve ainda examinar:
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
7.3 Suponha que o algoritmo F ORD devolve um n j . Mostre que j pode no perten-
cer a um ciclo.
7.4 No fim da execuo do algoritmo F ORD, verdade que todo arco ij que no per-
tence 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 ama-
relos,
P ePseus arcos inversos so vermelhos ou amarelos. O custo de um ciclo
cij ckl , onde a primeira soma sobre os arcos diretos do ciclo e a segund so-
bre 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 pro-
blema tem soluo, ou seja, somente do caso em que
1
Veja captulo 4 (Shortest Paths: Label-Setting Algorithms) do AMO. Melhor: veja no captulo 24 (especial-
mente 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 FLUXO EM REDES 15/11/2013 58
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
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.
5
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.
FEOFILOFF FLUXO EM REDES 15/11/2013 59
08 Q Q {i}
09 para cada ij em A(i) faa
10 se y(j) > y(i) + cij jQ
11 ento y(j) y(i) + cij
12 (j) i
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:
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.
FEOFILOFF FLUXO EM REDES 15/11/2013 60
unidades de tempo, uma vez que m < n2 . Observe que a maior parte do tempo consu-
mida 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
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.
O(m log2 n) .
Isso melhor que o consumo de tempo do algoritmo D IJKSTRA quando m =
O(n2 / log2 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
Veja p.116 e seo A.2, p.774, do AMO.
14
Seo 3.2, p.6566 (Parameter Balancing), do AMO.
FEOFILOFF FLUXO EM REDES 15/11/2013 63
O(m logd n) .
Exerccios
8.1 [I MPORTANTE. AMO 4.19, p.128. CCPS 2.36, p.36] Considere o problema do ca-
minho 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 in-
troduzir 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
Veja seo 4.5, p.112, de AMO.
16
CLRS lema 24.1, p.582. AMO property 4.1, p.106.
FEOFILOFF FLUXO EM REDES 15/11/2013 64
8.5 Inventei o algoritmo abaixo para competir com o algoritmo de Dijkstra. O algo-
ritmo 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.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 funo-
custo 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 com-
primento 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.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 capaci-
dade 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
Este captulo1 volta a tratar do problema dos caminhos mnimos (captulo 6) mas res-
tringe 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 or-
dem 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 topo-
lgica 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 ).
66
FEOFILOFF FLUXO EM REDES 15/11/2013 67
5 para h o at n faa
6 para cada ij em A(vh ) faa
7 se y(j) > y(i) + cij
8 ento y(j) y(i) + cij
9 (j) i
(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).
O(m)
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 execu-
o 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
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.
2
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 restrin-
gir 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 .
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 ) .
10.2 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
se C passa por ij
xij :=
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
Seria mais consistente com a notaco anterior escrever x(A(t))
e x(A(t)) .
6
Veja seo 3.5 (Flow decomposition algorithms), p.79, do AMO.
7
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.
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
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.
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
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.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 ).
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 m-
nimo (= max-flow min-cut) de Ford-Fulkerson e Kotzig. (O teorema tambm foi publicado,
independentemente, por Elias, Feinstein e Shannon.)
Problema 11.1 (do fluxo mximo) Dados ns s e t de uma rede (N, A, u) com funo-
capacidade u, encontrar um (s, t)-fluxo que respeite u e tenha valor mximo.
75
FEOFILOFF FLUXO EM REDES 15/11/2013 76
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
AMO escreve (S, S) no lugar de (T , T ) .
4
Ateno! No confunda com u(T , T ) u(T, T ) !
5
Esse lema um caso particular do Teorema Fraco da Dualidade de programao linear.
6
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.
Teorema 11.4 Para quaisquer dois ns s e t em uma rede (N, A, u) com funo-
capacidade u, existe um (s, t)-fluxo x que respeita u tal que
val(x) = u(T , T )
xij + se ij P
x0ij = 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
O teorema continua vlido mesmo se nossa definio de fluxo permitir valores no intei-
ros (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
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 maxi-
mize xts .
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 a b c d e t
s 4 3
a 4 2 3
b 3 2
c 2 2 5
d 3 4
e 5 4 8
t 8
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
s 1 1 1
2 1
3 1 1
4 1 1
5 1
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.
para cada arco ij . Mostre que para qualquer (s, t)-fluxo tem-se
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
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 fal-
sas? 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 qual-
quer 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). Supo-
nha 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.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.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 capa-
cidade 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). Diga-
mos 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 algorit-
mos 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 fal-
sas? 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 con-
sidere 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 resolu-
o 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 m-
ximo, 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 15/11/2013 84
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 com-
binar 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.
Fato 12.1 suficiente resolver o problema 11.1 do fluxo mximo em grafos simtricos.
uji := 0 .
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
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 n-
meros 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, Pou acmulo, de um pseudofluxo x em um subconjunto T de N o nmero
x ij . Se T = {t}, o excesso de x
(T , T ) := ijA 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 qual-
quer parte T de N , P
tT x
(t, t) = x
(T , T ) .
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
respeita u se
x
uji x
ij uij
2
AMO no usa esse termo.
3
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 ).
ij = xij xji
x
x(t, t) x(t, t) = x
(t, t)
x um (s, t)-fluxo se e s se x
um (s, t)-pseudofluxo. (12.1)
(T , T ) =
fcil verificar tambm que x 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)
ij }
xij := max{0, x
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 ij 0
se x
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
Suponha que x um fluxo que respeita u numa rede simtrica (N, A, u). Seja x o cor-
respondente pseudofluxo. Seja Ax
o conjunto dos arcos ij que tm x
ij < uij no nulo:
:= {ij A : x
Ax ij < uij } .
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.3 Se x
um pseudofluxo, verdade que P SEUDOFLUXO (F LUXO ( ? Se x
x)) = 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
exji = 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.
01 x0
02 P SEUDOFLUXO (x)
x
03 repita
04 Ax {ij A : x
ij < uij }
05 seja P um caminho de s a t no grafo (N, Ax )
06 se tal caminho no existe
07 ento devolva F LUXO ( x)
08 ij : ij arco de P } > 0
min {uij x
1
Esse algoritmo aparece na figura 6.12, p.180, seo 6.4, do AMO sob o nome (Generic) Augmenting Path
algorithm.
89
FEOFILOFF FLUXO EM REDES 15/11/2013 90
01 0
x
02 repita
03 Ax {ij A : x
ij < uij }
04 seja P um caminho de s a t no grafo (N, Ax )
05 se tal caminho no existe
06 ento devolva F LUXO ( x)
07 ij : ij arco de P } > 0
min {uij x
08 para cada arco ij de P faa
09 ij x
x ij +
10 ji x
x ji
2
Veja the effect of augmentation na figura 6.14, p.182, de AMO.
3
Esse , com pequenas modificaes, o algoritmo que consta da figura 6.17, p.185, seo 6.5 do AMO, sob
o nome Labelling algorithm.
FEOFILOFF FLUXO EM REDES 15/11/2013 91
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 } >0
2 para cada arco ij de P faa
3 ij x
x ij +
4 ji x
x ji
5 devolva x
(i1) x
inteiro;
(i2) x
um (s, t)-pseudofluxo;
respeita u (ou seja, uji x
(i3) x ij uij para cada arco ij ).
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 xij = uij , como j sugerimos na seo 3.5.
FEOFILOFF FLUXO EM REDES 15/11/2013 92
val(x) u(t, t) nU .
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 incre-
mento de s a t.
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 algo-
ritmo que determine todos os arcos crticos-para-cima em uma rede. (O con-
sumo 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).
Fluxo: capacity-scaling
Eis um esboo de um algoritmo2 que resolve o problema do fluxo mximo dando prefe-
rncia aos grandes incrementos de fluxo. Continuamos supondo, com base no fato 12.1,
que nosso grafo simtrico.
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
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
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). Resu-
mindo: o algoritmo excuta no mais que
2m(1 + blg U c)
Exerccios
14.1 [Capacidades unitrias] Qual o consumo de tempo do algoritmo C APACITY-
S 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
Os algoritmos para o problema do fluxo mximo (problema 11.1) estudados nos captu-
los 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 su-
preendentemente 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).
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
Ou seja, o nmero chamadas da rotina I NCREMENTE -F LUXO.
2
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
Lema 15.1 Para cada n j , a diferena de potencial y(j) y(s) no decresce de uma
iterao para a seguinte.
y(j)
y(s)
> y(j) y(s)
= y(i) + 1 y(s)
= y(i) y(s) + 1
y(i)
y(s)
+1.
y(j)
y(i)
>1. (15.2)
Lema 15.2 Para cada n i, a diferena de potencial z(t) z(i) no decresce de uma ite-
rao para a seguinte.
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 cor-
rente. 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 satu-
rao durante a -sima iterao, para algum < . evidente ento que, para algum
entre e , o arco ji pertenceu ao caminho de incremento da -sima iterao. Mostra-
remos 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)
= (15.1)
1 e y(j) y(i) = 1. Segue da, em virtude de (15.4) e dos lemas 15.1 e 15.2, que (15.4)
15.1
|P | = y(t) y(s) 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)
y(s)
+ 1 + y(i)
y(j)
= y(t) y(s)
+ 1 + y(i)
= y(t) y(j)
+ y(i) + 1 y(s)
+ 1 + 1 y(s)
= y(t)
y(s)
= y(t) +2
= |P | + 2 ,
O lema 15.4 mostra que a rotina I NCREMENTE -F LUXO executada no mximo m vezes 15.4
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 ) .
FEOFILOFF FLUXO EM REDES 15/11/2013 101
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 1-
potencial (, 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 co-
nhece 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
102
FEOFILOFF FLUXO EM REDES 15/11/2013 103
03 z(t) n
04 L hti
05 enquanto L 6= hi faa
06 retire o primeiro elemento, digamos j , de L
07 para cada ij em A(j)
e faa arco ij entra em j
08 se z(i) < z(j) 1 z(i) = 0
09 ento z(i) z(j) 1 z(i) aumenta
10 acrescente i ao final de L
11 devolva z
10 is
11 enquanto i / N faa
12 se i = t
13 ento x I NCREMENTE -F LUXO ( x, P )
14 Ax {ij : x
ij < uij }
15 P hsi
16 is
17 se algum ij em Ax (i) justo e j / N
20 ento AVANCE (ij)
22 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
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.
Digamos que uma fase uma uma execuo do bloco de linhas 0422, que define o pro-
cesso iterativo externo. Durante cada fase, o 1-potencial z permanece constante.
Lema 16.2 Em cada fase, a rotina I NCREMENTE -F LUXO executada no mximo m ve-
zes.8
8
Lema 7.8 e 7.9, p.217218, de AMO.
FEOFILOFF FLUXO EM REDES 15/11/2013 106
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 (i1)
agora que o n q deixa de fazer parte de P antes que ocorra o prximo I NCREMENTE - (i4)
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.
D INITS (N, A, u, s, t)
01 x 0
02 repita
03 Ax {ij A : x ij < uij }
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 )
FEOFILOFF FLUXO EM REDES 15/11/2013 107
15 P hsi
16 is
17 0
se A (i) 6=
18 ento escolha um arco ij de A0 (i)
19 se x / N
ij < uij e z(j) z(i) = 1 e j
20 ento AVANCE (ij)
21 seno retire ij de A0 (i)
22 seno R ETROCEDA (i)
(Veja exerccio 16.4.) Ela necessria para mostrar que (i2) continua valendo no incio da (i2)
prxima iterao.
De acordo com o lema 16.5, o nmero de execues da linha 20 no passa de nm em cada 16.5
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.
De acordo com o lema 16.3, a linha 22 ser executada no mximo n vezes em cada fase. 16.3
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.
Assim, se levarmos em conta os lemas 16.1 e 16.2, o consumo total de tempo do algoritmo 16.1
D INITS 16.2
O(n2 m) .
(Compare com o consumo de tempo O(nm2 ) do algoritmo E DMONDS -K ARP.)
FEOFILOFF FLUXO EM REDES 15/11/2013 108
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 xij < 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.
17.1 Pr-fluxo
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.
P
D EMONSTRAO : x(T , T ) x(T , T ) x(T, T ) = jT (x(j, j) x(j, j)) x(t, t)
x(t, t) > 0.
1
A figura 7.10, p.224, de AMO d uma boa motivao para os algoritmos do presente captulo.
110
FEOFILOFF FLUXO EM REDES 15/11/2013 111
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 respei-
tam 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 0
x
02 e0
03 para cada sj em A(s) faa
04 sj usj
x
05 js usj
x
06 e(j) e(j) + usj
07 e(s) e(s) usj
08 Ax {ij A : x
ij < uij }
09 z P OTENCIAL - TIMO -T RMINO (N, Ax
, t) z(t) z(s) = n
P USH3 (ij)
17 min {e(i), uij x
ij } >0
18 x ij xij +
19 x ji xji
20 e(i) e(i)
21 e(j) e(j) +
R ELABEL4 (i)
22 z(i) max {z(j)1 : ij Ax
(i)} z(i) decresce
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
) e z(t)z(s) n, no
fluxo de s a t e val(x) = e(t). Como z um 1-potencial em (N, Ax
existe caminho de incremento para o fluxo x que comece em s e termine em t. Portanto,
x um fluxo de valor mximo.
3
Veja figura 7.11, p.225, AMO.
4
Veja figura 7.11, p.225, AMO.
5
Ateno: eu disse de p a s e no o contrrio. Esse o lema 7.11, p.227, de AMO.
6
Trata-se do lema 7.12, p.228, de AMO.
FEOFILOFF FLUXO EM REDES 15/11/2013 113
Em cada iterao do bloco de linhas 1114 ocorre uma execuo de P USH ou uma execu-
o de R ELABEL.
Lema 17.2 A rotina R ELABEL executada menos que 2n vezes para cada n.
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 (non-
saturating) em caso contrrio.
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).
Em virtude de (17.1), a carga da rede no incio da primeira iterao menor que 2n2 , e (17.1)
portanto a carga da rede no fim da ltima iterao ser menor que
2n2 + R + S + P .
P P 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 .
FEOFILOFF FLUXO EM REDES 15/11/2013 115
< 2n .
O lema 17.2 garante que |Rp | < 2n para cada p, sendo Rp o conjunto das iteraes em 17.2
que ocorre R ELABEL com p no papel de i. O lema 17.3 garante que |S| < nm. Logo, no 17.3
incio da ltima iterao a carga da rede ser menor que
2n2 + R + S + P
P P P
= 2n2 + p Rp + S + P
P P P P
Como a carga da rede nunca negativa, temos |P| < 2n2 (m + 2) como queramos de-
monstrar.
P USH (ij)
46 min {e(i), uij x ij } > 0
47 x ij xij +
48 x ji xji
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 xij < uij e z(i) < z(j) 1
FEOFILOFF FLUXO EM REDES 15/11/2013 117
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 17.2
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) .
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
P que 2n vezes. Segue da que o nmero
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) 17.3
menor que nm + 2n2 m. Cada execuo da rotina consome O(1) unidades de tempo. 17.4
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 exe-
cues 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.
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.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 m-
ximo fazendo no mais que n + m incrementos.
c. Esboce um algoritmo que use caminhos de incremento de comprimento m-
nimo (veja seo 15) para converter um pr-fluxo mximo em um fluxo m-
ximo. 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.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 im-
plementao 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
120
FEOFILOFF FLUXO EM REDES 15/11/2013 121
P USH (ij)
26 min {e(i), uij x ij } > 0
27 x ij xij +
28 x ji xji
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 xij < 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 va-
lem tambm os seguintes
10 L1 L2 hi
11 para cada j em N faa
12 se e(j) > 0 e j 6= t
13 ento acrescente j ao final de L1
14 enquanto L1 6= hi ou L2 6= hi faa
15 se L1 = hi
16 ento L1 L2
17 L2 hi
18 seno seja i o primeiro n em L1
19 retire i de L
20 N ODE -E XAMINATION (i)
21 devolva F LUXO (
x)
P USH (ij)
26 min {e(i), uij x ij } > 0
27 x ij xij +
28 x ji xji
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 xij < 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.
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 se-
o 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
O(n3 ) .
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 (pro-
blema 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.
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 res-
tries. 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
Podemos dizer tambm que um tal x um b-fluxo. Como j fizemos nos captulos ante-
riores, 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
Resumo da seo 6.7, p.191, do AMO.
2
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 funo-
capacidade e b uma funo-demanda, encontrar um fluxo que satisfaa b e respeite u.
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
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 ) .
Teorema 19.3 (de Gale, 1957) Dada uma rede (N, A, u, b) em que u uma funo-
capacidade 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:
xij + se ij P
x0ij = xij se ij P`
xij em qualquer outro caso.
Com base no fato 12.1, podemos nos restringir a redes simtricas. O algoritmo abaixo fato 12.1
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).
Suponha que a execuo do algoritmo F LUXO -V IVEL termina na linha 11. P Seja S :=
{i
P : y(i) = 0}. Como e(i) b(i) para todo i em S e e(s) > b(s), temos iS (b(i) <
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
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) .
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 = uij se ij A
u0s0 j = b(j) para cada j S
u0it0 = b(i) para cada i T .
Qualquer fluxo x que satisfaz b e respeita u na rede (N, A, u, b) corresponde, natural-
mente, 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 va-
lor 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 satis-
faz 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 ver-
dadeira.
19.2 Seja (N, A, u, b) uma rede em que u uma funo-capacidade e b uma funo-
demanda. 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 funo-
demanda. (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.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
|A(i0 )| = i e 00 )| = i .
e |A(i
19.7 Seja (N, A) um grafo com N = {1, . . . , n}. Suponha dados nmeros inteiros po-
sitivos 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)|
e = 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
tempo: 0
b(i) = b (i) + b (i) para cada n i. Suponha que iN b (i) = 0, que
(i) = 0 e que a rede (N, A, u, b0 ) vivel. Queremos determinar o maior
P
iN b
valor inteiro de tal que (N, A, u, b0 + b ) vivel. Proponha um algoritmo
eficiente para resolver o problema.
Captulo 20
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
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.
132
FEOFILOFF FLUXO EM REDES 15/11/2013 133
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.
cx yb wu
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 15/11/2013 134
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:
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 15/11/2013 135
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,
P
cx = cij xij
P P P
= D cij xij + E cij xij + F cij xij
P P P
= D (y(j) y(i))xij + E (y(j) y(i))xij + F cij uij
P
wu = wij uij
P P
= F (y(j) y(i))xij F cij uij
P P P
cx + wu = D (y(j) y(i))xij + E (y(j) y(i))xij + F (y(j) y(i)xij
P
= ij (y(j) y(i))xij
= yb
em virtude de (20.1). Como cx = yb wu, o corolrio 20.3 garante que cx mnimo. (20.1)
20.3
Portanto, para mostrar que um fluxo vivel x tem custo mnimo, basta exibir um poten-
cial 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.
arco c x u arco w
n b n y
ij 2 2 4 ij 0
i 4 i 0
ik 2 2 2 ik 2
j 0 j 2
jk 1 2 2 jk 1
k 0 k 4
jl 3 0 3 jl 0
l +4 l 5
kl 1 4 5 kl 0
Exerccios
20.1 Seja (N, A, u, c) uma rede em que u uma funo-capacidade e c uma funo-
custo. 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.
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:
onde n = |N |. Suponha que existe um fluxo que satisfaz b. Qual o melhor al-
goritmo que voc conhece para determinar um fluxo x que satisfaa b e um c-
potencial y tais que cx = yb?
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
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 simtri-
cas, ou seja, redes em que a presena de um arco ij implica na presena do arco in-
verso ji. Alm disso, em alguns algoritmos convm supor que c 0.
Este captulo mostra que todas essas restries podem ser feitas sem perda de generali-
dade. 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.
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.
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
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.
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.
1
Veja Arc Reversal na seo 2.4, p.40, de AMO.
2
Isso necessrio apenas porque pretendemos introduzir um novo arco ji para cada arco ij e no
queremos que essa operao crie arcos paralelos.
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 poten-
cial 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.
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, fato 21.1
sem perder generalidade, a redes em que a funo-custo antissimtrica. fato 21.3
O conceito de pseudofluxo numa rede simtrica ser definida como na seo 12.2: o pseu-
dofluxo associado a um fluxo x x := P SEUDOFLUXO (x). Se a rede tem custo antissim-
trico, 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 y(j) y(i) cij (21.1)
claro que a condio (21.1) tambm pode ser escrita assim: se y(j) y(i) > cij ento
ij = uij .
x
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
ij = xij xji = uij .
que xij = uij . Logo, x
Suponha agora que xij < uij y(j) y(i) cij para cada arco ij . Tome qualquer arco
ij e suponha que y(j) y(i) < cij . Ento
donde xji = uji . Como 0 x u, temos xij = 0. Agora suponha que y(j) y(i) > cij .
ij = uij . Como 0 x u, temos xij = uij .
Ento (21.1) garante que x (21.1)
Em vista desse lema, o corolrio 20.4 pode ser reformulado assim: corol 20.4
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.
141
FEOFILOFF FLUXO EM REDES 15/11/2013 142
05 repita
06 Ax {ij A : x
ij < uij }
07 hO, yi C ICLO -N EGATIVO (N, Ax , c)
08 se O est definido
09 ento min {uij x ij : ij arco de O }
10 para cada arco ij de O faa
11 ij x
x ij +
12 ji x
x ji
13 seno x F LUXO ( x)
14 devolva x, y
O algoritmo auxiliar F LUXO -V IVEL produz um fluxo vivel x0 se tal existe (seja se-
o 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 funo-
custo 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. lema 21.4
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. cor 20.3
cor 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) .
FEOFILOFF FLUXO EM REDES 15/11/2013 143
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.
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.
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 funo-
demanda 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 circula-
tal que x0 = x + x
o x .
FEOFILOFF FLUXO EM REDES 15/11/2013 144
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
1
Veja o algoritmo Successive Shortest Paths na figura 9.9, p.321, do AMO.
145
FEOFILOFF FLUXO EM REDES 15/11/2013 146
08 hy 0 , i D IJKSTRA (N, Ax 0
, s, c )
09 se existe t em N tal que (t) 6= NIL e e(t) < b(t)
10 ento I NCREMENTE -F LUXO -V IVEL (
x, A , s, t)
11 y y+y 0
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):
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 (23.1)
de uma iterao qualquer que no a ltima. No fim da linha 08 teremos
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 compor-
tando como prometeu.
O(n3 B)
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 (cap-
tulo 14) com as do Preflow-Push.
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 lema 21.4
poderia tambm ser formulada assim: y(j) y(i) > cij + x
ij = uij .
1
Veja seo 10.3, pp.362372, de AMO.
2
Veja figura 10.2, p.363, de AMO.
148
FEOFILOFF FLUXO EM REDES 15/11/2013 149
24.2 O algoritmo
P USH -R ELABEL ()
15 para cada i em N faa
16 e(i) x(i, i) x(i, i)
17 r P SEUDOFLUXO (x)
18 enquanto e(i) > b(i) para algum i faa
19 se existe arco tenso ij em A(i) tal que xij < uij
20 ento min {e(i) b(i), uij x
ij }
21 ij x
x ij +
22 ji x
x ji
23 e(i) e(i)
24 e(j) e(j) +
25 seno y(i) y(i) /2
26 x F LUXO ( x)
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
(i1) x respeita u;
(i2) x satisfaz b;
(i3) y(j) y(i) < cij xij = 0 para cada arco ij ;
(i4) y(j) y(i) > cij + xij = uij para cada arco ij .
(i5) x respeita u;
ij < uij y(j) y(i) cij + /2 para cada arco ij .
(i6) x
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
:= {ij : x
), onde Ax
(N, Ax ij < uij }. Digamos que AO o conjunto de arcos e NO o
conjunto de ns de O . Ento, em virtude das invariantes (i3) e (i4) combinados com o
lema 21.4,
P
c(O) = cij
PijAO P P
= ijAO cij + iNO y(i) jNO y(j)
P P
= cij + ijAO (y(i) y(j))
PijAO
= (cij (y(j) y(i)))
PijAO
ijAO ()
= k
n
> 1 .
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)) .
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 se y(j) y(i) > cij
09 ento xij uij
Captulo 25
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(O)
(c) := min .
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.
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 n-
mero bom menor que 1 . Eis a prova desse fato, por contradio. Suponha que exis-
tem 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. (i1)
(i3)
2
Portanto, multiplique todos os custos por 2n2 antes de aplicar o algoritmo.
FEOFILOFF FLUXO EM REDES 15/11/2013 154
O(nm lg C)
unidades de tempo.
H um algoritmo para o problema do ciclo de custo mdio mnimo que mais eficiente
que o da seo anterior.
d[, j] = d(, j, c) .
FEOFILOFF FLUXO EM REDES 15/11/2013 155
O(nm)
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.
(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
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).
O(n2 m3 log n)
unidades de tempo.3
3
Veja seo 10.5, pp.376382, de AMO.
Captulo 26
Circulaes
Este captulo1 trata de uma importante generalizao do problema do fluxo mximo (pro-
blema 11.1). O captulo culmina com o teorema de Hoffman.
Como j dissemos no captulo 10, uma circulao em uma rede um fluxo que tem ac-
mulo 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-limite-
inferior 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 ,
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 .
Suponha que acrescentamos mais uma exigncia ao problema do fluxo mximo (pro-
blema 11.1): o fluxo em cada arco ij deve valer pelo menos lij , onde l uma funo-
limite-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.
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. Combinato-
rial 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 Algo-
rithms. 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 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
R ELABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
K LEIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
J EWELL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
163
FEOFILOFF FLUXO EM REDES 15/11/2013 164
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