Você está na página 1de 207

Curso de

Otimização Combinatória
www.ime.usp.br/~pf/otimizacao-combinatoria/

Paulo Feofiloff
Departamento de Ciência da Computação
Instituto de Matemática e Estatística
Universidade de São Paulo

2022-03-10
2 FEOFILOFF
Prefácio

Estas notas de aula foram escritas para as disciplinas de Otimização Combinatória do


Instituto de Matemática e Estatística da Universidade de São Paulo. As notas discutem
algoritmos para alguns problemas de otimização combinatória, como o problema do
caminho mínimo, o do fluxo máximo, o do fluxo de custo mínimo, o do corte não-
dirigido mínimo, o do emparelhamento máximo, e o do emparelhamento de custo
mínimo.
Supõe-se que o leitor tem algum conhecimento prévio de teoria dos grafos, de progra-
mação linear, de análise de algoritmos, e de estruturas de dados básicas.
As notas foram baseadas, em grande parte, no livro de Cook, Cunningham, Pulley-
blank e Schrijver [CCPS98], que apelidei de CCPS, e nas notas de aula de Schrij-
ver [Sch17], que apelidei de Sch17. A maior parte das figuras foi copiada (sem per-
missão) daquele livro e daquelas notas.
Os livros de Schrijver [Sch03], Grötschel, Lovász, Schrijver [GLS88], Ahuja, Magnanti
e Orlin [AMO93], e Bondy e Murty [BM08] também serviram de referência e fonte
de material. A maneira de escrever pseudocódigo foi copiada de Cormen, Leiserson,
Rivest e Stein [CLRS01]. Apelidei esses livros de Sch03, GLS, AMO, BM08 e CLRS
respectivamente.
Os exercícios marcados com “?” complementam pontos que o texto indicou mas não ?
desenvolveu. Exercícios particularmente interessantes ou importantes também são
marcados com “?”. Mas essas indicações não são sistemáticas nem consistentes.
Use e abuse dos apêndices (a partir da página 151) e do índice remissivo (na pá-
gina 191) para encontrar as definições de conceitos e termos técnicos.

—P.F.

i
ii FEOFILOFF
Sumário

1 Caminhos dirigidos de custo mínimo 1


1.1 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Potencial viável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Algoritmo de Ford . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Algoritmo de Ford–Bellman . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5 Ciclos dirigidos negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6 Algoritmo especial para redes acíclicas . . . . . . . . . . . . . . . . . . . . 9
1.7 Algoritmo especial para custos não-negativos . . . . . . . . . . . . . . . . 10
1.8 Custos unitários e busca em largura . . . . . . . . . . . . . . . . . . . . . 11
1.9 Programação linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.10 Poliedros e seus vértices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.11 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2 Fluxo máximo e corte mínimo 23


2.1 Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 O problema do fluxo máximo . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.3 Condições de otimalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4 Teorema do fluxo máximo e corte mínimo . . . . . . . . . . . . . . . . . . 28
2.5 Algoritmo de Ford–Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.6 Versão Edmonds–Karp do algoritmo . . . . . . . . . . . . . . . . . . . . . 31
2.7 Programação linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.8 Poliedros e seus vértices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.9 Capacidades infinitas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.10 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3 Aplicações de fluxo máximo e corte mínimo 43

iii
iv SUMÁRIO FEOFILOFF

3.1 Emparelhamentos bipartidos e cobertura por nós . . . . . . . . . . . . . . 43


3.2 O problema do transporte . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3 O problema de Gale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4 O problema de Hoffman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.5 Fluxo mínimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.6 Coberturas por caminhos . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4 Fluxo viável de custo mínimo 63


4.1 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2 Programação linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.3 Condições de otimalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.4 Ciclos de aumento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.5 Algoritmo dos ciclos de aumento . . . . . . . . . . . . . . . . . . . . . . . 69
4.6 Capacidades infinitas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.7 Algoritmo Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.8 Simplex para redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.9 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

5 Cortes globalmente mínimos 87


5.1 Cortes localmente mínimos . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.2 Submodularidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.3 Corte globalmente mínimo . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.4 Algoritmo para corte globalmente mínimo . . . . . . . . . . . . . . . . . 91
5.5 Coleções laminares de cortes localmente mínimos . . . . . . . . . . . . . 95
5.6 Árvores de cortes mínimos . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

6 Emparelhamentos perfeitos 103


6.1 Emparelhamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.2 Caminhos alternantes e o teorema de Berge . . . . . . . . . . . . . . . . . 104
6.3 Emparelhamentos perfeitos . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.4 Condições de existência de solução . . . . . . . . . . . . . . . . . . . . . . 105
6.5 Árvores alternantes e nós coloridos . . . . . . . . . . . . . . . . . . . . . . 107
FEOFILOFF SUMÁRIO v

6.6 O caso dos grafos bipartidos . . . . . . . . . . . . . . . . . . . . . . . . . . 108


6.7 Flores e contrações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
6.8 Algoritmo das flores para emparelhamento perfeito . . . . . . . . . . . . 112
6.9 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

7 Emparelhamentos máximos 119


7.1 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.2 Componentes ímpares e o teorema de Tutte–Berge . . . . . . . . . . . . . 120
7.3 Algoritmo do emparelhamento máximo . . . . . . . . . . . . . . . . . . . 122
7.4 Prova não algorítmica do teorema de Tutte–Berge . . . . . . . . . . . . . 125
7.5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

8 Emparelhamentos perfeitos de custo mínimo 131


8.1 O problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.2 Um programa linear para ep mínimo . . . . . . . . . . . . . . . . . . . . . 132
8.3 Algoritmo para ep mínimo em grafo bipartido . . . . . . . . . . . . . . . 134
8.4 Um programa linear mais poderoso . . . . . . . . . . . . . . . . . . . . . 138
8.5 Algoritmo para ep mínimo em grafo arbitrário . . . . . . . . . . . . . . . 141
8.6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

9 Poliedro dos emparelhamentos perfeitos 145


9.1 O poliedro dos ep’s fracionários . . . . . . . . . . . . . . . . . . . . . . . . 145
9.2 Vértices meio-binários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
9.3 O poliedro dos ep’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
9.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

A Conjuntos, vetores e matrizes 151


A.1 Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
A.2 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
A.3 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
A.4 Produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
A.5 Álgebra linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
A.6 Coleções laminares de conjuntos . . . . . . . . . . . . . . . . . . . . . . . 155
A.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
vi SUMÁRIO FEOFILOFF

B Poliedros 157
B.1 O que é um poliedro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
B.2 Vértices de poliedros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
B.3 Poliedros limitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
B.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

C Programação linear 163


C.1 Programas lineares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
C.2 Dualidade em programação linear . . . . . . . . . . . . . . . . . . . . . . 165
C.3 Folgas complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
C.4 Algoritmos para programas lineares . . . . . . . . . . . . . . . . . . . . . 167
C.5 Lema de Farkas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
C.6 Programação inteira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
C.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

D Politopos 171
D.1 Cascos convexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
D.2 Hiperplanos separadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
D.3 Politopos versus poliedros limitados . . . . . . . . . . . . . . . . . . . . . 173
D.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

E Grafos não-dirigidos 175


E.1 Grafos e suas arestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
E.2 Caminhos e ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
E.3 Florestas e árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
E.4 Cortes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
E.5 Álgebra linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
E.6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

F Grafos dirigidos 179


F.1 Grafos dirigidos e seus arcos . . . . . . . . . . . . . . . . . . . . . . . . . . 179
F.2 Caminhos e ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
F.3 DAGs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
F.4 Florestas e árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
F.5 Cortes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
FEOFILOFF SUMÁRIO vii

F.6 Redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183


F.7 Álgebra linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
F.8 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

G Problemas, algoritmos, tempo 187


G.1 Problemas e instâncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
G.2 Consumo de tempo de algoritmos . . . . . . . . . . . . . . . . . . . . . . 187
G.3 Comparação assintótica de funções . . . . . . . . . . . . . . . . . . . . . . 188
G.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Bibliografia 190

Índice Remissivo 191


viii SUMÁRIO FEOFILOFF
Capítulo 1

Caminhos dirigidos de custo mínimo

Este capítulo discute o problema dos caminhos dirigidos de custo mínimo em grafos.
Algoritmos para esse problema são usados como ferramenta na resolução de muitos
problemas de otimização combinatória.
(Veja a terminologia e os conceitos básicos de grafos dirigidos no apêndice F. Para
outros termos e conceitos, consulte o índice remissivo na página 191.)

1.1 O problema
Uma rede (= network) consiste em um grafo dirigido D e uma função c que atribui um
número real — positivo, negativo, ou nulo — a cada arco de D. (Seria mais realista
supor que os custos são números racionais, uma vez que computadores digitais não
conhecem números irracionais.) Dizemos que c é uma função-custo ou vetor de custos.
Para cada arco e, o número ce é o custo do arco.1
O custo de um caminho dirigido2 (v0 , e1 , v1 , e2 , . . . , ep , vp ) na rede (D, c) é o número
ce1 + ce2 + · · · + cep . (Note que cada arco contribui para essa soma tantas vezes quantas
aparece em P .) Se o nome do caminho é P , seu custo é denotado por c(P ). Se P não
tem arcos repetidos e todos os arcos têm custo 1 então c(P ) é o número de arcos de P .
Um caminho dirigido P tem custo mínimo se c(P ) ≤ c(P 0 ) para todo caminho dirigido
P 0 que tenha a mesma origem e o mesmo término que P .

Problema 1.A (dos caminhos dirigidos mínimos) Dado um nó r de uma rede (D, c),
encontrar, para cada nó v, um caminho dirigido de r a v que tenha custo mínimo.

Dizemos que r é o nó inicial da rede. Podemos incorporar r à definição da rede e


dizer “rede (D, c, r)”. Além disso, podemos adotar a abreviatura “caminho dirigido
mínimo” para a expressão “caminho dirigido de custo mínimo”.
1
O custo de um arco não é necessariamente medido em unidades monetárias. Ele pode ser medido
em quilômetros, toneladas, horas, etc. e pode até ser negativo.
2
Um caminho é dirigido se todos os seus arcos são diretos, ou seja, apontam “da esquerda para a
direita”. Veja o índice remissivo na página 191.

1
2 1.1. O PROBLEMA FEOFILOFF

É importante lembrar que um caminho pode não ser simples nem quase-simples. Mais
precisamente, um caminho pode ter nós repetidos e até arcos repetidos. Entretanto,
se os custos de todos os arcos forem positivos então todo caminho dirigido mínimo
é simples. Se os custos forem arbitrários, todo caminho dirigido mínimo tem um
subcaminho que é simples, mínimo, e tem a mesma origem e o mesmo término do
caminho original.
Para que uma instância do problema 1.A tenha solução, é necessário que todos os nós
da rede estejam ao alcance do nó inicial r. É fácil verificar algoritmicamente se essa
condição está satisfeita.
Uma segunda condição necessária para a existência de solução é mais difícil de veri-
ficar: é preciso que todos os ciclos dirigidos tenham custo não-negativo. Adotaremos
a abreviatura “ciclo dirigido negativo” para a expressão “ciclo dirigido de custo ne-
gativo”. Se uma instância do problema tem um tal ciclo então, para algum nó v da
rede, não existe caminho dirigido mínimo de r a v pois existem caminhos dirigidos de
r a v que têm custo menor que qualquer número dado. Poderíamos dizer que o custo
mínimo é −∞ nesse caso.
Cabe perguntar: as duas condições necessárias que acabamos de apontar são suficien-
tes? Em outras palavras, é verdade que toda instância do problema 1.A que satisfaz as
duas condições tem solução? Mostraremos adiante que a resposta é afirmativa.

E XEMPLO 1.1: Considere o grafo dirigido representado pela matriz de adjacências à esquerda e o
vetor de custos representado à direita. Um caminho dirigido mínimo de r a u tem sequência de
nós (r, v, w, u). É um bom exercício encontrar os demais caminhos dirigidos mínimos.

r s u v w rs su rw wu rv vw
r − 1 − 1 1 2 −2 4 −3 3 −1
s − − 1 − −
u − − − − −
v − − − − 1
w − − 1 − −

E XEMPLO 1.2: No grafo dirigido descrito abaixo não há caminho dirigido algum de r a s. Essa
instância do problema 1.A não tem solução qualquer que seja a função-custo.

r s t
r − − 1
s − − 1
t − − −

E XEMPLO 1.3: Considere o grafo dirigido com custos representado abaixo. Essa instância do
problema 1.A não tem solução porque não existe caminho dirigido mínimo de r a s. (É um bom
exercício exibir todos os caminhos dirigidos simples de custo mínimo que têm origem r.)

r u v w s ru uv vw wu us
r − 1 − − − 1 1 −3 1 1
u − − 1 − 1
v − − − 1 −
w − 1 − − −
s − − − − −
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 3

1.2 Potencial viável


Como certificar a minimalidade de um caminho dirigido? Dados nós r e v, como
provar que nenhum caminho dirigido de r a v tem custo menor que um dado número,
digamos 999?
Um potencial numa rede (D, c) é qualquer função que atribui um número real a cada
nó da rede. Podemos também dizer que um potencial é um vetor indexado pelos nós
da rede. Usamos a seguinte terminologia para descrever o estado de um arco vw em
relação a um potencial y:
se yw − yv ≤ cvw então vw está relaxado,
se yw − yv = cvw então vw está justo,
se yw − yv > cvw então vw está tenso.3
Um potencial y é viável (= feasible) se deixa todos os arcos relaxados. Em outras pala-
vras, um potencial y é viável se yw − yv ≤ cvw para cada arco vw. Dizemos que esta
é a desigualdade triangular para o arco vw. A desigualdade pode se verbalizada assim:
o custo de um arco relaxado é pelo menos a diferença entre o potencial de sua ponta
final e o potencial de sua ponta inicial.

E XEMPLO 1.4: Se c ≥ 0 e y tem o mesmo valor em todos os nós então y é um potencial viável.

E XEMPLO 1.5: Suponha que uma instância do problema 1.A tem solução. Para cada nó v, seja dv
o custo de um caminho dirigido mínimo de r a v. Então d é um potencial viável. Com efeito, se
um arco vw estivesse tenso, teríamos dv + cvw < dw e então um caminho dirigido que vai de r a w
passando por vw teria custo menor que dw , o que é contraditório.

Em relação a um dado potencial, se todos os arcos da rede estão relaxados então todos
os caminhos dirigidos também estão “relaxados” num certo sentido. O seguinte lema
torna essa afirmação precisa:

Lema 1.1 (delimitação inferior) Se y é um potencial viável e P é um caminho dirigido


com origem r e término s então ys − yr ≤ c(P ).

P ROVA : Seja (v0 , e1 , v1 , . . . , vk−1 , ek , vk ) o caminho P . Adote as abreviaturas c(i) := cei e


y(i) := yvi . Então

c(P ) = c(k) + c(k − 1) + · · · + c(2) + c(1)


≥ y(k) − y(k − 1) + y(k − 1) − y(k − 2) + · · · + y(2) − y(1) + y(1) − y(0)
= y(k) − y(0).

Portanto, c(P ) ≥ ys − yr , como queríamos provar.


3
Para justificar as palavras tenso e relaxado, você pode imaginar que cada nó v está no ponto de
ordenada yv de uma reta e cada arco vw é um barbante de comprimento cvw . Se a “distância” yw − yv é
maior que o comprimento cvw , o arco vw está esticado. Senão, o arco está folgado.
4 1.3. ALGORITMO DE FORD FEOFILOFF

A prova do lema mostra, em particular, que c(P ) = ys − yr se e somente se todos os


arcos de P estão justos em relação a y.
O lema tem a seguinte consequência: se c(P ) = ys − yr então P é mínimo. Isso leva à
seguinte condição de minimalidade para o problema 1.A:

Corolário 1.2 (condição de minimalidade) Numa rede (D, c) com nó inicial r, dada
uma coleção (Pw : w ∈ V (D)) de caminhos dirigidos em que cada Pw tem origem r e
término w, se existe um potencial viável y tal que c(Pw ) = yw − yr para cada w então
cada Pw é um caminho dirigido mínimo.

E XEMPLO 1.6: Veja novamente o exemplo 1.1, repetido abaixo. O potencial y é viável. Seja P o
caminho cuja sequência de nós é (r, v, w, u). Como c(P ) = −1 = yu − yr , o caminho é mínimo.

r s u v w rs su rw wu rv vw y
r − 1 − 1 1 2 −2 4 −3 3 −1 r 5
s − − 1 − − s 7
u − − − − − u 4
v − − − − 1 v 8
w − − 1 − − w 7

1.3 Algoritmo de Ford


O seguinte algoritmo tenta resolver o problema 1.A. O algoritmo recebe uma rede
(D, c, r) e tenta encontrar uma coleção de caminhos dirigidos mínimos: para cada nó
w da rede, um caminho dirigido Pw com origem r e término w. O algoritmo só tem
sucesso se (1) todos os nós estão ao alcance de r e (2) a rede não tem ciclos dirigidos
negativos. Se a condição (2) não estiver satisfeita, a execução do algoritmo pode não
parar (a palavra “algoritmo” é um abuso de linguagem nesse caso).
O algoritmo foi proposto (1957) por L.R. Ford [For]. Para certificar a minimalidade dos
caminhos dirigidos, o algoritmo produz um potencial viável y tal que c(Pw ) = yw − yr
para cada w.

F ORD (D, c, r)  (D, c) não tem ciclos dirigidos negativos


1 para cada w em V (D) faça yw ← ∞
2 yr ← 0
3 enquanto o potencial y não é viável faça
4 escolha vw em E(D) tal que yw − yv > cvw  vw está tenso
5 yw ← yv + cvw  relaxação de vw
6 pw ← v
7 devolva y e p

Na linha 4, E(D) é o conjunto dos arcos de D e o código adota a convenção ∞ + λ =


∞ qualquer que seja λ. Na linha 6, o vetor p representa caminhos com origem r da
seguinte maneira: para cada w diferente de r, pw é o nó anterior a w em um caminho
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 5

dirigido de r a w. Dizemos que p é uma função-predecessor ou vetor de predecessores.


Portanto, a sequência (w, pw , ppw , pppw , . . . , r) é o inverso de um caminho dirigido de r
até w. O subgrafo de D induzido pelo conjunto de arcos da forma (pw , w) é uma árvore
radicada com raiz r.
A ideia do algoritmo é simples: relaxar os arcos tensos, em qualquer ordem, até que
todos fiquem relaxados. A operação de relaxação de um arco tenso (linha 5 do código)
consiste em baixar o potencial da ponta final do arco.
A relaxação de um arco tenso vw pode tornar tenso outro arco wz que estava relaxado.
Com isso, pode ser necessário relaxar um mesmo arco várias vezes. Não está claro,
portanto, se a execução do algoritmo termina depois de um número finito de iterações.

E XEMPLO 1.7: Aplique o algoritmo de Ford à rede que tem nós r s u v w e os arcos e custos
indicados na tabela. (Use o gabarito de posição dos nós para fazer uma figura.)

rs su rw wu rv vw r s
2 −2 4 −3 3 −1 v
w u

Veja os valores de y (tabela esquerda) e p (tabela direita) no início de sucessivas iterações. A última
coluna da figura registra o arco que é relaxado no fim da iteração:

r s u v w r s u v w
0 ∞ ∞ ∞ ∞ − − − − − rs
0 2 ∞ ∞ ∞ − r − − − rv
0 2 ∞ 3 ∞ − r − r − rw
0 2 ∞ 3 4 − r − r r wu
0 2 1 3 4 − r w r r su
0 2 0 3 4 − r s r r vw
0 2 0 3 2 − r s r v wu
0 2 −1 3 2 − r w r v

No fim da última iteração, y é um potencial viável e p descreve caminhos dirigidos mínimos a


partir de r.

Para analisar o algoritmo de Ford, é preciso estabelecer os invariantes (não muito intui-
tivos) do processo iterativo descrito nas linhas 3 a 6. O enunciado desses invariantes
usa a seguinte notação: V ∗ é o conjunto dos nós i para os quais yi < ∞ e D(p) é o V ∗
subgrafo de D induzido pelo conjunto de arcos da forma (pj , j). D(p)

Lema 1.3 (dos invariantes) Se a rede (D, c, r) não tem ciclo dirigido negativo então, no
início de cada iteração,
(i1) todo arco do grafo D(p) está justo ou tenso,
(i2) para cada arco ij de D, se existe caminho dirigido de j a i em D(p)
então ij não está tenso,
(i3) para cada i em V ∗ , existe um caminho dirigido de r a i em D(p),
(i4) para cada i em V ∗ , tem-se yi ≤ |V ∗ | ω, sendo ω := maxvw∈E(D) |cvw |.4

4
Não confunda “ω” com “w”.
6 1.3. ALGORITMO DE FORD FEOFILOFF

E SBOÇO DE PROVA : A relaxação de um arco tenso vw na linha 5 do código pode fazer


com que outro arco iw, que estava justo ou tenso, perca essa propriedade. Como a
linha 6 retira iw de D(p), o invariante (i1) é preservado.
Para provar o invariante (i2), suponha que P é um caminho dirigido simples de j a i
em D(p). Um raciocício análogo ao da prova do lema 1.1, combinado com (i1), mostra
que yi − yj ≥ c(P ). Como P · (i, j) é um ciclo dirigido, temos c(P ) + cij ≥ 0 e portanto
o arco ij não está tenso.
Para provar o invariante (i3), considere o arco vw que será relaxado durante a iteração.
No início da iteração, seja P um caminho dirigido de r a v em D(p). Em virtude de (i2),
w não pertence a P . Logo, no fim da iteração, P · (v, w) será um caminho de r a w
em D(p).

Os invariantes do (i1) a (i4) são a base da prova da correção do algoritmo de Ford. A


prova começa supondo que (1) todos os nós da rede estão ao alcance de r e (2) a rede
não tem ciclos dirigidos negativos. Quando a execução do algoritmo termina, todos
os arcos estão relaxados, e portanto o potencial y é viável. Em particular, não existe
arco vw tal que yv < ∞ mas yw = ∞. Como todos os nós estão ao alcance de r, temos
yw < ∞ para todo w, e portanto V ∗ = V (D). O invariante (i3) garante agora que, para
cada w, há um caminho dirigido Pw de r a w em D(p). O invariante (i1) garante que

c(Pw ) ≤ yw − yr

(basta fazer um raciocínio análogo ao da prova do lema 1.1). Por outro lado, c(Pw ) ≥
yw −yr pelo lema 1.1. Assim, c(Pw ) = yw −yr . Segue daí e da condição de otimalidade 1.2
que o caminho Pw é mínimo, como desejamos.
Para concluir a prova, precisamos garantir que a execução do algoritmo termina depois
de um número finito de iterações se as hipóteses (1) e (2) estiverem satisfeitas. Será
preciso supor também que o vetor c não tem componentes irracionais. Comecemos
supondo que c é inteiro. Então, no início de cada iteração, temos yi ≤ nω para cada
n i em V ∗ , sendo n o número de nós de D. Por outro lado, se Pi é o caminho dirigido
simples de r a i em D(p) então yi − yr ≥ c(Pi ) por um raciocínio análogo ao da prova
do lema 1.1. Como yr = 0 e Pi tem menos que n arcos, temos yi ≥ c(Pi ) ≥ −nω. Em
suma,
−nω ≤ yi ≤ nω
para cada i em V ∗ . Ao longo da execução do algoritmo, todas as componentes do
vetor y permanecem inteiras e cada iteração subtrai pelo menos 1 unidade de alguma
componente de y. Como −nω ≤ yw ≤ nω, cada nó da rede pode fazer o papel de w na
linha 6 no máximo 2ωn vezes. Como y tem n componentes, o número de iterações não
passa de 2ωn2 . Em particular, a execução do algoritmo termina depois de um número
finito de iterações se c for inteiro.
Esse raciocínio pode ser estendido às instâncias em que os custos são racionais. Se c
é racional, então existe ζ em Z+ tal que ζce ∈ Z para cada e. Com isso, o número de
iterações não passa de 2ωn2 ζ. Em particular, a execução do algoritmo termina depois
de um número finito de iterações se c é racional.
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 7

Como a cota superior do número de iterações depende dos custos dos arcos, não po-
demos dizer que o algoritmo de Ford é polinomial, mas apenas pseudopolinomial.
A próxima seção introduz uma variante do algoritmo que organiza a ordem em que os
arcos são relaxados e assim torna o algoritmo polinomial.

1.4 Algoritmo de Ford–Bellman


Seja S := (e1 , e2 , e3 , . . . , eL ) uma sequência de arcos em que cada arco do grafo aparece
pelo menos uma vez. Imagine executar a parte central do algoritmo de Ford exami-
nando os arcos na ordem dada por S:
para j = 1, . . . , L faça
se ej está tenso
então relaxe ej
Dizemos então que S é a sequência de varredura usada pelo algoritmo. Que condições
uma sequência de varredura deve satisfazer para que esse processo deixe todos os
arcos do grafo relaxados?
Para discutir essa questão, é preciso introduzir o seguinte conceito: um caminho diri-
gido está imerso na sequência de varredura S se tiver origem r e a sequência de seus
arcos for uma subsequência de S. (Suponha, por exemplo, que S = (a, c, d, a, b, d, e, c,
b, a, d, b). Um caminho dirigido com origem r e sequência de arcos (c, a, d, e, b) está
imerso em S. Já um caminho dirigido com origem r e sequência de arcos (c, e, d, a) não
está imerso em S.)

Lema 1.4 Depois que uma sequência de varredura S tiver sido processada, tem-se yv ≤
c(P ) para cada nó v e todo caminho dirigido P de r a v que está imerso em S.

P ROVA : Seja (v0 , e1 , v1 , e2 , v2 , . . . , ek , vk ) o caminho dirigido em discussão. Imediata-


mente depois da primeira ocorrência de e1 em S temos yv1 ≤ yr + ce1 = ce1 pois yr = 0
(veja exercício 1.13). Desse momento em diante, a desigualdade yv1 ≤ ce1 permanece
válida pois o valor de yv1 não aumenta.
Depois da primeira ocorrência de e2 em S subsequente à primeira ocorrência de e1 ,
temos yv2 ≤ yv1 + ce2 ≤ ce1 + ce2 . E assim por diante. Depois da primeira ocorrência de
ek em S subsequente às ocorrências de e1 , e2 , . . . , ek−1 , temos yvk ≤ ce1 +· · ·+cek = c(P ).

Digamos que uma sequência de varredura S é boa se todo caminho dirigido simples
com origem r estiver imerso em S. Como todo caminho dirigido mínimo é simples, ao
final do processamento de uma sequência boa teremos yv ≤ c(P ) para todo caminho
dirigido mínimo P de r a v. Por outro lado, existe um caminho dirigido de r a v de
custo yv (veja o lema 1.3). Logo, o vetor y representa os custos de todos os caminhos
dirigidos mínimos com origem r (a menos, é claro, que a rede tenha um ciclo dirigido
negativo). Segue daí que a execução do algoritmo termina assim que uma sequência
de varredura boa for examinada.
8 1.4. ALGORITMO DE FORD–BELLMAN FEOFILOFF

Um tipo natural de sequência de varredura boa para uma rede com n nós é a que
resulta da concatenação de sequências S1 , S2 , . . . , Sn−1 em que cada Si uma permu-
tação do conjunto de arcos da rede. Essa ideia leva ao algoritmo proposto por R. E.
Bellman [Bel] (1958):

F ORD B ELLMAN (D, c, r)


1 para cada w em V (D) faça yw ← ∞
2 yr ← 0
3 repita |V (D)| − 1 vezes
4 para cada vw em E(D) faça
5 se yw − yv > cvw  vw está tenso
6 então yw ← yv + cvw  relaxação de vw
7 pw ← v
8 devolva y e p

No fim da execução do algoritmo, se o potencial y é viável então p define caminhos


dirigidos mínimos de r a cada um dos demais nós e yw é o custo do caminho dirigido
que termina em w; senão, a rede tem um ciclo dirigido negativo.
O algoritmo de Ford–Bellman executa no máximo nm iterações, sendo n := |V (D)| e
m := |E(D)|. (O número de iterações não depende do vetor de custos, como acontece
no algoritmo de Ford.) A análise de correção que fizemos na seção anterior prova o
seguinte:

Teorema 1.5 (Ford–Bellman) Se a rede (D, c, r) não tem ciclo dirigido negativo e todos
os nós estão ao alcance de r, o algoritmo de Ford–Bellman produz um potencial viá-
vel y e um vetor de predecessores p tais que, para cada nó w, o caminho dirigido de r
a w definido por p tem custo yw − yr .

O teorema tem a seguinte consequência: se a rede não tem ciclo dirigido negativo e
todos os nós estão ao alcance de r, então existe um potencial viável y tal que, para cada
nó w, a diferença yw − yr é a distância de r a w, ou seja, o custo de uma caminho de
custo mínimo de r a w. Há quem diga que um tal y é um potencial viável máximo.

Consumo de tempo. Cada iteração do algoritmo de Ford–Bellman consome O(1)


unidades de tempo. Portanto o algoritmo consome

O(nm)

unidades de tempo. Com isso, o algoritmo pode ser considerado fortemente polino-
mial (veja o apêndice G). Não se conhece uma versão do algoritmo de Ford que seja
assintoticamente mais rápida. Para certos tipos de redes, entretanto, há versões bem
mais rápidas do algoritmo, como veremos nas próximas seções.
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 9

1.5 Ciclos dirigidos negativos


O algoritmo de Ford–Bellman pode ser adaptado para procurar ciclos dirigidos nega-
tivos (ou seja, ciclos dirigidos de custo negativo) num grafo dirigido. Se a execução do
algoritmo terminar com um potencial y não-viável, o vetor de predecessores p registra
um ciclo dirigido negativo a partir de qualquer arco que não esteja relaxado.

1.6 Algoritmo especial para redes acíclicas


Quando restrito a DAGs, ou seja, a grafos acíclicos, o algoritmo de Ford–Bellman pode
ser organizado de modo a examinar cada arco uma só vez. Comece com uma permu-
tação topológica v1 , v2 , . . . , vn dos nós (conforme o lema F.2 no apêndice F, um grafo é
acíclico se e somente se tem uma permutação topológica). Examine os arcos que saem
de v1 , depois os que saem de v2 , e assim por diante.
Como não tem ciclos dirigidos, todo DAG satisfaz uma das condições necessárias para
que o problema 1.A tenha solução. Para que a outra condição — todos os nós ao alcance
do nó inicial r — esteja satisfeita é necessário (mas não suficiente) que tenhamos r = v1 .
A versão do algoritmo de Ford–Bellman especializado em DAGs recebe uma per-
mutação topológica v1 , v2 , . . . , vn dos nós da rede e procura resolver o problema dos
caminhos dirigidos mínimos a partir do nó inicial v1 :

F ORD B ELLMAN DAG (D, c, (v1 , . . . , vn ))


1 para cada w em V (D) faça yw ← ∞
2 yv1 ← 0
3 para i ← 1 até n − 1 faça
4 para cada vw em ∂ − (vi ) faça
5 se yw − yv > cvw
6 então yw ← yv + cvw
7 pw ← v
8 devolva y e p

Na linha 4, ∂ − (vi ) denota o conjunto de todos os arcos que saem de vi , conforme se-
ção F.5 do apêndice F.
A análise do algoritmo usa a ideia de sequências de varredura boas da seção 1.4. Diga-
mos que S é a sequência em que o algoritmo examina os arcos. Então S tem a seguinte
propriedade: se i < j então todos os arcos em ∂ − (vi ) aparecem em S antes de todos
os arcos em ∂ − (vj ). Portanto, todo caminho dirigido com origem r está imerso em S.
De acordo com o lema 1.4, o potencial y fica viável tão logo o algoritmo termina de
percorrer S.

Consumo de tempo. Como cada arco aparece apenas uma vez em S, o algoritmo
consome apenas O(m) unidades de tempo.
10 1.7. ALGORITMO ESPECIAL PARA CUSTOS NÃO-NEGATIVOS FEOFILOFF

No fim da execução do algoritmo, o vetor de predecessores p define caminhos dirigi-


dos mínimos de v1 a cada nó que esteja ao alcance de v1 . Portanto, essa instância do
problema 1.A está resolvida se e somente se o algoritmo termina com yw < ∞ para
todo w.

1.7 Algoritmo especial para custos não-negativos


Em redes sem arcos de custo negativo (e portanto sem ciclos dirigidos negativos) é
possível acelerar o algoritmo de Ford–Bellman. Para fazer isso, basta examinar os nós
numa ordem “especial,” à maneira do que fizemos com redes acíclicas. Mas nesse caso
a permutação dos nós não pode ser estabelecida de antemão, devendo ser calculada
à medida que o algoritmo é executado: no começo de cada iteração, o próximo nó da
permutação é um nó v que tem potencial mínimo dentre os nós que ainda não foram
examinados. Essa é a ideia do algoritmo que E.W. Dijkstra [Dij] descobriu (1959).
O algoritmo de Dijkstra recebe uma rede (D, c, r) com c ≥ 0 e produz um vetor de
predecessores p e um potencial viável y. Se todos os nós estiverem ao alcance de r, o
vetor p define um caminho dirigido Pv de r a v tal que c(Pv ) = yv − yr .

D IJKSTRA (D, c, r)  c ≥ 0
01 para cada w em V (D) faça yw ← ∞
02 yr ← 0
03 Q ← V (D) r {r}
04 enquanto Q 6= ∅ faça
05 escolha v em Q tal que yv é mínimo
06 Q ← Q r {v}
07 para cada vw em ∂ − (v) faça
08 se yw − yv > cvw  vw está tenso
09 então yw ← yv + cvw  relaxação de vw
10 pw ← v
11 devolva p e y

O algoritmo mantém um conjunto Q de nós que ainda não foram completamente pro-
cessados. Para provar que o algoritmo está correto, basta verificar que no início de cada
iteração temos (i1) yu ≤ yq para cada u em V (D) r Q e cada q em Q e (i2) para cada u
em V (D) r Q, todos os arcos em ∂ − (u) estão relaxados. Assim, no fim da execução do
algoritmo, todos os arcos estarão relaxados e portanto o potencial y terá a propriedade
desejada.

Consumo de tempo. O algoritmo consome tempo O(m) + O(n2 ), sendo n o número


de nós e m o número de arcos do grafo. O termo O(m) reflete o fato de que cada arco é
processado no máximo uma só vez. O termo O(n2 ) é uma delimitação do tempo total
dispendido em todas as execuções de linha 05 (que escolhe v em Q). Como m < n2 , o
algoritmo consome O(n2 ) unidades de tempo.
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 11

1.8 Custos unitários e busca em largura


A versão especializada do algoritmo de Dijkstra para o caso em que c = 1 é particular-
mente simples. O conjunto Q do algoritmo D IJKSTRA pode ser tratado como uma fila
e inicializado com {r}.

B USCA E M L ARGURA (D, r)


01 para cada w em V (D) faça yw ← ∞
02 yr ← 0
03 Q ← I NICIALIZA F ILA (r)
04 enquanto F ILA N ÃO VAZIA (Q) faça
05 v ← T IRA D A F ILA (Q)
06 para cada vw em ∂ − (v) faça
07 se yw − yv > cvw  vw está tenso
08 então yw ← yv + cvw  relaxação de vw
09 pw ← v
10 P ÕE N A F ILA (Q, w)
11 devolva p e y

Esta versão do algoritmo de Dijkstra é conhecida como busca em largura. Ela consome
O(m) unidades de tempo.

1.9 Programação linear


Retornamos agora ao problema 1.A sem quaisquer restrições: procuramos caminhos
dirigidos de custo mínimo em grafos arbitrários (não necessariamente acíclicos) com
custos arbitrários (não necessariamente não-negativos).
Esta seção estuda o problema do ponto de vista da programação linear (veja o apên-
dice C). A aplicação de uma ferramenta contínua, como programação linear, a um
problema discreto e combinatório pode parecer surpreendente. Mas problemas com-
binatórios têm aspectos geométricos de que podemos tirar bom proveito por meio da
programação linear. Essa intrusão do mundo contínuo no mundo discreto é bem-vinda
e muito frutífera.
Nosso ponto de partida é a delimitação inferior 1.1 e o teorema 1.5 de Ford–Bellman.
Esses resultados têm a seguinte consequência:

Teorema 1.6 (min-max) Dados dois nós r e s de uma rede (D, c), se s está ao alcance
de r e a rede não tem ciclo dirigido negativo então

max (ys − yr ) = min c(P ),


y P

sendo maxy tomado sobre todos os potenciais viáveis y e minP tomado sobre todos os
caminhos dirigidos P de r a s.
12 1.9. PROGRAMAÇÃO LINEAR FEOFILOFF

O problema de encontrar um potencial viável y que maximize ys − yr é facilmente


formulado como um programa linear: encontrar um vetor y indexado por V (D) que
maximize ys − yr
(1)
sujeito a yw − yv ≤ cvw para cada vw em E(D) .

Convém reescrever este pl5 em termos da matriz de incidências A do grafo. Como a


coluna vw de A tem um −1 na linha v, um +1 na linha w, e 0 nas demais linhas, o pl (1)
equivale a
maximize yb
sujeito a yA ≤ c ,

onde b é o vetor definido por br = −1, bs = +1, e bv = 0 para todo v diferente de r e


de s.

E XEMPLO 1.8: Seja y o vetor e A a matriz representados abaixo. Suponha que o vetor y e as linhas
da matriz A são indexados por r, v, w, s de cima para baixo. Então o vetor representado abaixo de
A é yA.
−2 −1 −1 0 0 0
3 +1 0 −1 −1 0
−4 0 +1 +1 0 −1
5 0 0 0 +1 +1
5 −2 −7 2 9

Programa dual. O dual do pl (1) pede um vetor x indexado por E(D) que
minimize cx
sujeito a Ax = b
x ≥ 0.
Para verificar que este é de fato o dual, tome qualquer solução viável y do primal,
qualquer solução viável x do dual, e observe que a prova “yb = y(Ax) = (yA)x ≤ cx”
do teorema fraco da dualidade usa todas as restrições dos dois pl’s.

E XEMPLO 1.9: Seja A a matriz e x o vetor representados abaixo com x na horizontal abaixo de A.
Suponha que o vetor x e as colunas de A são indexados por a, b, c, d, e da esquerda para a direita.
Então o vetor representado à direita de A é Ax.
−1 −1 0 0 0 −1
+1 0 −1 −1 0 0
0 +1 +1 0 −1 0
0 0 0 +1 +1 +1
1 0 1 0 1

Na matriz de incidências A de D, a linha que corresponde ao nó v tem um −1 na coluna


de cada arco que entra em v, um +1 na coluna de cada arco que sai de v, e 0 nas demais
colunas. Portanto, o pl pode ser reescrito assim:
5
A sigla “pl” é abreviatura de “programa linear”.
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 13
P
minimize e∈E ce xe
sujeito a x (r) − x− (r) = −1
+

x+ (v) − x− (v) = 0 para v em V r {r, s} (2)


x+ (s) − x− (s) = +1
xe ≥ 0 para e em E,
sendo E := E(D) e V := V (D). A expressão x+ (v) é uma abreviatura de x(∂ + (v)) x+ (v)
e denota a soma dos valores de x nos arcos que entram em v. Analogamente, x− (v) x− (v)
éPa soma dos valores dePx nos arcos que saem em v. Em notação formal, x+ (v) :=

u : uv∈E xuv e x (v) := w : vw∈E xvw .

O pl (2) está relacionado com os caminhos dirigidos mínimos de r a s. De fato, para


todo caminho dirigido simples P de r a s, o vetor característico do conjunto de arcos
de P é uma solução viável do pl (e portanto c(P ) ≥ cx∗ para qualquer solução ótima
x∗ do pl).

Folgas complementares. A relação fraca de dualidade entre os pl’s (1) e (2) consiste
na sequência de desigualdades yb = y(Ax) = (yA)x ≤ cx, válida para qualquer solução
viável y do pl primal e qualquer solução viável x do dual. Portanto, yb = cx se e
somente se (yA)x = cx, ou seja, se e somente se
P
vw∈E ((yw − yv ) − cvw )xvw = 0.

Como (yw − yv ) ≤ cvw e x ≥ 0, essa igualdade vale se e somente se, para cada arco vw,
xvw = 0 ou yw − yv = cvw .
Essas são as condições de folgas complementares (veja a seção C.3) do par dual de
pl’s. Essas condições correspondem à seguinte afirmação: todos os arcos de qualquer
caminho dirigido mínimo de r a s estão justos em relação ao potencial y.

Soluções ótimas dos pl’s. Suponha que o pl (1) é viável e o pl (2) é viável. Nessas
condições, o teorema forte da dualidade C.2 (veja a seção C.2) garante que o pl (1) tem
uma solução ótima y ∗ , que o pl (2) tem uma solução ótima x∗ , e que
y ∗ b = cx∗ .

Mesmo que x∗ não seja o vetor característico de um caminho dirigido, o número cx∗
é igual ao custo de um caminho mínimo de r a s. Para verificar essa afirmação, basta
lembrar que cx∗ = y ∗ b e observar que o teorema de Ford–Bellman 1.5 garante que y ∗ b é
igual ao custo de um caminho mínimo.

1.10 Poliedros e seus vértices


Para entender a relação entre os pl’s (1) e (2) e o problema 1.A, é preciso estudar
os poliedros dos pl’s. Quais são as propriedades geométricas desses poliedros? Em
que condições esses poliedros são vazios? Como são os vértices (veja a seção B.2 do
apêndice B) desses poliedros?
14 1.10. POLIEDROS E SEUS VÉRTICES FEOFILOFF

1.10.1 O poliedro dos potencias viáveis

Y (·) Seja Y (D, c) o poliedro do pl (1), isto é, o conjunto de todos os vetores y que satisfazem
as restrições yA ≤ c.
Se o grafo D tem um ciclo dirigido negativo então Y (D, c) é vazio conforme o lema 1.1.
A recíproca é verdadeira, embora menos óbvia: se a rede não tem um ciclo dirigido
negativo então Y (D, c) não é vazio.
Agora considere a existência de vértices em Y (D, c). Para qualquer y em Y (D, c), os
vetores y + 1 e y − 1 também estão em Y (D, c), pois yw + 1 − yv + 1 = yw − yv . (Aqui,
“1” representa o vetor constante cujas componentes são todas iguais a 1.) Portanto,
Y (D, c) não tem vértices. A continuação dessa argumentação acaba por mostrar que
Y (D, c) não é limitado (ou seja, não cabe em um cubo).

E XEMPLO 1.10: Seja D a rede com nós r v w s definida pela matriz de incidências A à esquerda e
considere o vetor de custos c à direita.

rv rw vw vs ws rv rw vw vs ws
r −1 −1 5 7 1 8 6
v +1 −1 −1
w +1 +1 −1
s +1 +1

Veja as restrições que definem o poliedro Y (D, c) escritas explicitamente abaixo. Veja também um
vetor de Y (D, c) mais à direita.

yv − yr ≤ 5
yw − yr ≤ 7 r 0
v 5
yw − yv ≤ 1
w 6
ys − yv ≤ 8 s 12
ys − yw ≤ 6

Observe que 1A = 0. (Toda matriz de incidências tem essa propriedade. Na linguagem da álgebra
linear, diríamos que o conjunto das linhas de A é linearmente dependente.) Logo, para qualquer
y em Y (D, c), temos (y ± 1)A = yA ≤ c. Isso mostra que Y (D, c) não tem vértices. Ademais, o
poliedro Y (D, c) não é limitado, uma vez que y+α1 está em Y (D, c) qualquer que seja y em Y (D, c)
e α real.

1.10.2 O poliedro dos caminhos

X(·) Seja X(D, r, s) o poliedro do pl (2), isto é, o conjunto de todos os vetores x que satis-
fazem as restrições Ax = b e x ≥ 0. Em que condições o poliedro é vazio? Em que
condições é limitado? Como são seus vértices?
É evidente que o vetor característico de qualquer caminho dirigido de r a s pertence
ao poliedro X(D, r, s). Reciprocamente, para qualquer vetor x do poliedro, existe um
caminho dirigido de r a s cujos arcos pertencem ao suporte (veja a seção A.2 do apên-
dice A) de x. Assim, X(D, r, s) é vazio se e somente se não existe caminho dirigido de
r a s. (Veja o exercício 1.54.)
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 15

Quanto à limitação, o poliedro X(D, r, s) é limitado se e somente se D é um DAG (veja


o exercício 1.55). Mas isso não impede que uma instância do pl (2) tenha solução ótima
mesmo que D tenha ciclos dirigidos.
Agora considere as propriedades dos vértices do poliedro. É fácil constatar que o vetor
característico de qualquer caminho dirigido simples de r a s é vértice do poliedro (veja
o exercício 1.56). Como mostraremos a seguir, esses são os únicos vértices do poliedro.
Seja x um vetor de X(D, r, s) e C um ciclo (dirigido ou não) de D cujos arcos estão no
suporte de x. Seja ε := mine∈E(C) xe e d o vetor definido assim: de vale ε se e é um arco
direto de C, vale −ε se e é um arco inverso de C, e vale 0 em todos os demais casos.
Então d não é nulo e tanto x + d quanto x − d estão no poliedro. (Veja o exercício 1.57.)
A existência de um tal d mostra que x não é vértice do poliedro. Concluímos assim
que, para todo vértice x do poliedro, todo ciclo de D tem pelo menos um arco e tal que
xe = 0. Em outras palavras, se S é o suporte de um vértice do poliedro então o grafo
(V (D), S) é uma floresta orientada (veja a seção F.4 do apêndice F). Como nenhum nó,
exceto r e s, é folha da floresta, todo vértice do poliedro é o vetor característico de um
caminho dirigido simples de r a s. (Veja o exercício 1.58.)

E XEMPLO 1.11: Considere novamente a rede D do exemplo 1.10. Ela tem nós r v w s e é definida
pela matriz de incidências abaixo.
rv rw vw vs ws
r −1 −1
v +1 −1 −1
w +1 +1 −1
s +1 +1
Veja as restrições lineares que definem o poliedro X(D, r, s):

−xrv − xrw = −1
xrv − xvw − xvs = 0
xrw + xvw − xws = 0
xvs + xws = +1
xrv ≥ 0
xrw ≥ 0
xvw ≥ 0
xvs ≥ 0
xws ≥ 0.

Os vetores x0 , x00 , x000 e x00000 abaixo pertencem ao poliedro X(D, r, s).


rv rw vw vs ws
0
x 1 0 0.5 0.5 0.5
x00 0.6 0.4 0.3 0.3 0.7
x000 1 0 1 0 1
x0000 1 0 0 1 0
O vetor x0 , por exemplo, não é vértice pois tanto x0 + d0 quanto x0 − d0 estão em X(D, r, s) quando d0
é o vetor dado abaixo. Esse vetor é definido pelo ciclo (v, w, s, v) e todos os arcos deste ciclo estão
no suporte de x0 .
rv rw vw vs ws
d0 0 0 0.1 −0.1 0.1
O vetor x00 não é vértice de X(D, r, s) em virtude do ciclo (r, w, s, v, r). Os vetores x000 e x0000 são
vértices do poliedro X(D, r, s). Ambos representam caminhos dirigidos simples de r a s.
16 1.11. EXERCÍCIOS FEOFILOFF

E XEMPLO 1.12: Seja X(D, r, s) o poliedro definido pelas restrições Ax = b e x ≥ 0, onde A é a


matriz de adjacências abaixo. (Use o gabarito de posição dos nós para fazer uma figura do grafo.)
Os vetores x e x0 representados à direita pertencem a X(D, r, s). O vetor x sugere que X(D, r, s)
não é limitado (note o ciclo dirigido (u, v, w, u)).

ru uv us vw wu ru uv vw wu us
r −1 r u s x 1 99 99 99 1
u +1 −1 −1 +1 x0 1 0 0 0 1
v +1 −1 w v
w +1 −1
s +1

Se d é o vetor característico do ciclo (u, v, w, u), então tanto x+d quanto x−d pertencem a X(D, r, s).
Logo, x não é vértice de X(D, r, s). Já x0 é vértice de X(D, r, s). Note que x0 é o vetor característico
de um caminho dirigido simples de r a s.

Suponha que o pl (2) tem solução ótima para um determinado vetor de custos c. De
acordo com o corolário C.3 no apêndice C, alguma solução ótima do pl é um vértice
do poliedro X(D, r, s). Portanto, alguma solução ótima do pl é (o vetor característico
de) um caminho dirigido simples de r a s. Podemos supor então (veja a seção C.4) que
qualquer algoritmo de programação linear — como o Simplex, por exemplo — resolve
o problema 1.A. Mas é claro que um algoritmo especializado, como o de Ford-Bellman,
é mais eficiente.

1.11 Exercícios
Seção 1.1
1.1 Esboce um algoritmo que decida se todos os nós de um grafo dirigido estão ao alcance de um dado
nó r.
1.2 ? Caminhos mínimos simples. Seja P um caminho dirigido mínimo numa rede (D, c). Mostre que
algum subcaminho P 0 de P é dirigido, é mínimo, é simples, e tem a mesma origem e o mesmo
término de P .
1.3 ? Subcaminhos de caminhos mínimos. Prove que qualquer subcaminho de um caminho dirigido
mínimo é mínimo. Mostre que essa propriedade deixa de valer se nos restringirmos a caminhos
dirigidos simples. [CCPS 2.19]
1.4 Árvores. Calcule um caminho dirigido mínimo de r a v numa rede (D, c) em que D é uma árvore
radicada. Calcule um caminho mínimo de r a v numa rede (D, c) em que D é uma árvore orientada.
1.5 ? Problema dos caminhos dirigidos simples mínimos. Por que não restringir o problema 1.A aos cami-
nhos dirigidos quase-simples? Melhor ainda: por que não restringir o problema 1.A aos caminhos
dirigidos simples? Se fizermos isso, ciclos dirigidos negativos deixarão de ser um empecilho para
a existência de solução.
1.6 Dada uma rede (D, c) e subconjuntos disjuntos R e S de V (D) queremos encontrar um caminho
dirigido mínimo dentre os que vão de algum nó de R algum nó de S. Mostre como esse problema
pode ser reduzido ao problema 1.A. [CCPS 2.22]
1.7 No problema 1.A, podemos supor que o grau de entrada de r é 0?
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 17

Seção 1.2
1.8 Árvores. Calcule um potencial viável numa rede (D, c) em que D é uma árvore radicada. Calcule
um potencial viável numa rede (D, c) em que D é uma árvore orientada.
1.9 Seja y um potencial viável e α um número. Mostre que y − α1 é um potencial viável. (Aqui, 1 é um
vetor indexado pelos nós cada um de cujos elementos vale 1.)
1.10 Prove o corolário 1.2. Prove também que a condição “existe um potencial viável y tal que c(Pw ) =
yw − yr para cada w” equivale à condição “existe um potencial viável y tal que todos os arcos de
cada Pw estão justos”.
1.11 ? Potencial versus ciclo dirigido negativo. Suponha que y é um potencial viável numa rede. Deduza
do lema 1.1 que a rede não tem ciclos dirigidos negativos.
1.12 Seja (D, c, r) uma rede. Para cada nó w, suponha dado um caminho dirigido simples Pw de r a w.
Descreva um algoritmo que decida se a coleção (Pw : w ∈ V (D)) é uma solução dessa instância do
problema 1.A.

Seção 1.3
1.13 Complete a prova do lema 1.3. Deduza de (i2) e (i3) que yr = 0 no início de cada iteração.
1.14 Complete os detalhes da prova da correção do algoritmo de Ford.
1.15 Árvores. Aplique o algoritmo de Ford a uma rede (D, c, r) em que D é uma árvore radicada. Aplique
o algoritmo de Ford a uma rede (D, c, r) em que D é uma árvore orientada.
1.16 Potencial finito. Mostre que na linha 1 do algoritmo F ORD o ∞ pode ser substituído pelo número nω,
onde ω := 1 + max (|ce | : e ∈ E(D)) e n := |V (D)|. (Dica: Qualquer caminho dirigido simples na
rede tem custo menor que nω.) (Se essa substituição for feita, será preciso adotar a convenção
nω + λ = nω qualquer que seja λ.)

Seção 1.4
1.17 ? Corolário do teorema de Ford–Bellman. Prove o seguinte corolário do teorema 1.5: Uma instância
(D, c, r) do problema 1.A tem solução se e somente se (1) todos os nós de D estão ao alcance de r e
(2) a rede (D, c) não há ciclo dirigido negativo. (Dica: Enuncie e prove em separado a parte “se” e
a parte “somente se”.)
1.18 ? Potencial e distâncias. Prove o seguinte corolário do teorema 1.5: se a rede (D, c, r) não tem ciclo
dirigido negativo e todos os nós estão ao alcance de r, então existe um potencial viável y tal que,
para cada nó w, a diferença yw − yr é a distância de r a w.
1.19 Ciclos dirigidos negativos versus potencial. Conforme o exercício 1.11, se uma rede tem um potencial
viável então não tem ciclo dirigido negativo. Use o teorema 1.5 para provar a recíproca.
1.20 Considere uma instância do problema 1.A em que todos os custos são não-negativos e todos os nós
estão ao alcance de r. Deduza do teorema 1.5 que essa instância tem solução.
1.21 Considere uma instância do problema 1.A em que o grafo é acíclico e todos os nós estão ao alcance
de r. Deduza do teorema 1.5 que essa instância tem solução.
1.22 Aplique o algoritmo F ORD B ELLMAN ao grafo dirigido com nós r s t u v w e arcos rs st tu uv vw .
Todos os arcos têm custo 1 e o nó inicial é r. Examine o conjunto de arcos sempre na ordem
(vw, uv, tu, st, rs).
1.23 Prove a seguinte afirmação (feita depois da prova do lema 1.4): se a rede não tem ciclo dirigido ne-
gativo e a sequência de varredura S é boa então o potencial y torna-se viável assim que o algoritmo
tiver processado S.
18 1.11. EXERCÍCIOS FEOFILOFF

1.24 No algoritmo F ORD B ELLMAN, não seria suficiente repetir o bloco de linha 4–7 até que y se “estabi-
lize”? Discuta essa ideia.
1.25 Potencial inteiro. Suponha que a vetor c de custos é inteiro. Mostre que o potencial y produzido pelo
algoritmo de Ford–Bellman é inteiro.
1.26 Nem tudo ao alcance de r. Como interpretar o resultado (y, p) do algoritmo F ORD B ELLMAN no caso
em que nem todos os nós da rede estão ao alcance de r?
1.27 Árvores. Escreva uma versão especializada do algoritmo F ORD B ELLMAN para redes (D, c) em que
D é uma árvore radicada. Escreva uma versão especializada de F ORD B ELLMAN para redes (D, c)
em que D é uma árvore orientada.
1.28 Aplique o algoritmo de Ford–Bellman à rede cujos nós são r a b f g h j k e cujos arcos e custos são
dados pela tabela a seguir. [CCPS 2.21]

ra rk rb ad af bk bf dh fg fj gh gj jh kd kh kg kf
2 7 5 8 4 3 2 5 3 7 4 3 3 2 9 6 1

1.29 Mostre todos os caminhos dirigidos mínimos a partir do nó r. Mostre um potencial viável que
prove a minimalidade dos caminhos. [Sch17 1.2]

Seção 1.5
1.30 Acrescente código ao algoritmo F ORD B ELLMAN para que ele devolva um ciclo dirigido negativo
se tal existir.
1.31 Arbitragem cambial. Seja (D, c, r) uma rede com custos positivos. Para cada nó v, queremos en-
contrar um caminho dirigido de r a v que maximize o produto dos custos dos arcos do caminho
dirigido. Como resolver o problema? (Aplicação: Cada nó é uma moeda, como dólar, euro, real,
yen, etc., e o custo de um arco vw é a taxa de câmbio na conversão de v em w.)

Seção 1.6
1.32 Árvores radicadas. Escreva uma versão especial do algoritmo F ORD B ELLMAN DAG para tratar de
árvores radicadas.
1.33 Aplique o algoritmo F ORD B ELLMAN DAG à rede acíclica (D, c, r) com nós r s t u v e os arcos e
custos definidos abaixo. Adote a permutação topológica (r, s, t, u, v).

rs rt su st tv uv
2 2 4 3 1 −4

1.34 Mostre todos os caminhos dirigidos mínimos a partir do nó r no grafo abaixo. Mostre um potencial
viável que prove a minimalidade dos caminhos. [Sch17 1.2]
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 19

1.35 Suponha que v1 , v2 , . . . , vn é uma permutação topológica dos nós de uma rede. Quero encontrar
caminhos dirigidos mínimos a partir de um nó vh , com h > 1. Modifique o algoritmo F ORD -
B ELLMAN DAG para resolver o problema.
1.36 Aplique o algoritmo F ORD B ELLMAN DAG à rede do exercício 1.28. [CCPS 2.21]
1.37 ? Segmento de soma mínima. Dados números e1 , . . . , en , queremos encontrar i e j, 1 ≤ i ≤ j ≤ n + 1,
tais que ei + · · · + ej−1 seja mínimo. Dê um algoritmo que resolva o problema em O(n) unidades
de tempo. [CCPS 2.34]
1.38 ? Escalonamento de tarefas. Suponha dadas tarefas T1 , . . . , Tn . A execução de cada tarefa Ti consome
tempo ci ≥ 0. Para certos pares (i, j), a execução de Ti deve preceder a execução de Tj (ou seja, o
processamento de Tj só pode começar depois que o processamento de Ti tiver terminado). Quere-
mos planejar a execução das tarefas de modo que as restrições de precedência sejam respeitadas e
cada tarefa seja concluída tão cedo quanto possível. (Note que várias tarefas podem ser executadas
ao mesmo tempo.) Reduza esse problema ao cálculo de um potencial viável máximo em um DAG.
[CCPS 2.35]

Seção 1.7
1.39 Mostre que o algoritmo de Dijkstra pode dar resultados errados se a rede tiver ciclos dirigidos
negativo. [CCPS 2.36]
1.40 Prove os invariantes (i1) e (i2) do algoritmo D IJKSTRA.
1.41 Prove que w ∈ Q sempre que o arco vw está tenso na linha 08 do algoritmo D IJKSTRA.
1.42 Para i = 1, 2, . . . , vn−1 , seja vi o nó que o algoritmo D IJKSTRA escolha na linha 05 na i-ésima
iteração. Adote v0 := r. Agora considere a sequência S = (e1 , e2 , . . . , em ) de arcos que o algoritmo
examina nas sucessivas passagens pela linha 07: primeiro todos os arcos que saem de v0 , depois
todos os arcos que saem de v1 , e assim por diante. Mostre que no fim da execução do algoritmo
todos os caminhos dirigidos mínimos que começam em r estão imersos em S.
1.43 Aplique o algoritmo de Dijkstra à rede do exercício 1.28. [CCPS 2.21]
1.44 Translação de custos. Suponha que a função-custo c de uma rede tem valores negativos. Eis uma
ideia simples para eliminar os custos negativos. Seja µ := min(ce : e ∈ E(D)) e subtraia µ do custo
de cada arco. Agora todos os custos são não-negativos. Execute o algoritmo de Dijkstra usando os
novos custos. Os caminhos dirigidos mínimos produzidos pelo algoritmo têm custo mínimo em
relação à função c original? [AMO 5.21]
1.45 Redes não-dirigidas. Considere a variante do problema 1.A que procura por caminhos não-dirigi-
dos mínimos em grafos não-dirigidos com custos não-negativos nas arestas. Mostre como reduzir
esse problema ao problema 1.A. Qual a dificuldade de usar a mesma redução no caso de custos
arbitrários? [CCPS 2.37]

Seção 1.8
1.46 Árvores. Escreva uma versão especial de B USCA E M L ARGURA para árvores radicadas. Escreva uma
versão especial de B USCA E M L ARGURA para árvores orientadas.
1.47 ? Caminhos versus cortes. Sejam r e s dois nós de um grafo dirigido. Dizemos que um corte dirigido
separa s de r se existe um conjunto S de nós tal que s ∈ S, r ∈
/ S e ∂ + (S) = ∅. Mostre que um corte
dirigido separa s de r se e somente se não existe caminho dirigido de r a s. (Dica: Enuncie e prove
em separado a parte “se” e a parte “somente se”.)
20 1.11. EXERCÍCIOS FEOFILOFF

Seção 1.9
1.48 Prove o teorema min-max 1.6 a partir do teorema de Ford–Bellman 1.5 e do lema 1.1.
1.49 É verdade que toda solução ótima x do pl (2) tem a propriedade 0 ≤ x ≤ 1?
1.50 Prove que todo caminho dirigido simples de r a s descreve uma solução viável do pl (2). Prove que
qualquer caminho dirigido mínimo de r a s descreve uma solução ótima do pl (2).
1.51 É verdade que toda solução viável binária do pl (2) descreve um caminho dirigido de r a s? É ver-
dade que toda solução ótima do pl (2) descreve um caminho dirigido de r a s?
1.52 ? Escalonamento de tarefas (mais uma vez). Refaça o exercício 1.38 depois de representar o problema
por um programa linear. [CCPS 2.35]

Seção 1.10
1.53 Mostre que Y (D, c) = ∅ se e somente se a rede tem um ciclo dirigido negativo.
1.54 ? Mostre que X(D, r, s) = ∅ se e somente se não existe caminho dirigido de r a s.
1.55 ? Mostre que X(D, r, s) é limitado se e somente se D não tem ciclos dirigidos.
1.56 ? Seja P um caminho dirigido de r a s. Seja x o vetor característico de E(P ). Mostre que x é vértice
do poliedro X(D, r, s).
1.57 ? Vértices versus ciclos. Prove que x é vértice de X(D, r, s) se e somente se D não tem ciclo (dirigido
ou não) cujos arcos estão no suporte de x.
1.58 ? Vértices são caminhos dirigidos. Mostre que todo vértice do poliedro X(D, r, s) é o vetor caracterís-
tico de um caminho dirigido simples de r a s.

Exercícios adicionais
1.59 Suponha dada uma rede (D, c, r) e um nó w que incide em exatamente dois arcos (ou seja, apenas
dois arcos têm w como ponta inicial ou ponta final). Mostre como reduzir o problema dos caminhos
dirigidos mínimos nessa rede a uma rede menor. [CCPS 2.23]
1.60 ? Árvores. Seja (T, c) uma rede em que T é uma árvore orientada e c uma função-custo. Escreva um
algoritmo que receba T , c, e um nó r e calcule, para cada nó v, um caminho (não necessariamente
dirigido!) de custo mínimo de r a v em T .
1.61 Suponha que (D, c, r) é uma rede em que todos os arcos têm o mesmo custo. Qual o algoritmo
assintoticamente mais rápido para resolver o problema dos caminhos dirigidos mínimos nessa
rede?
1.62 Suponha dada uma rede com custos não-negativos. Suponha que r, s e t são três nós da rede.
Queremos encontrar um caminho dirigido mínimo dentre os que começam em r, passam por s,
e terminam em t. Uma solução desse problema é necessariamente um caminho dirigido simples?
Descreva informalmente um algoritmo para resolver o problema. Prove que o seu algoritmo resolve
o problema. [AMO 4.45]
1.63 Capacidade mínima. Digamos que a capacidade de um caminho dirigido é o mínimo dos custos de
seus arcos. Problema: Determine um caminho dirigido de capacidade mínima dentre os que vão
de r a s.
1.64 Custos diretos e custos inversos. Suponha que cada arco e de uma rede tem
P 0doisPcustos, c0e e c00e , ambos
em R. O custo de um caminho P , não necessariamente dirigido, é ce + c00e , onde a primeira
soma se estende a todos os arcos diretos de P e a segunda a todos os arcos inversos de P . Problema:
Determinar um caminho de custo mínimo dentre os que vão de um nó r a um nó s. Enuncie uma
condição de otimalidade apropriada.
FEOFILOFF CAMINHOS DIRIGIDOS DE CUSTO MÍNIMO 21

1.65 Caminhos dirigidos de comprimento ímpar. Numa rede com custos não-negativos e dois nós r e s,
considere o problema de encontrar um caminho dirigido mínimo de r a s dentre os que têm um
número ímpar de arcos. Note que um caminho dirigido pode não ser simples. Mostre como reduzir
esse problema ao problema ordinário dos caminhos dirigidos mínimos (sem restrição de paridade).
(Sugestão: Troque cada nó diferente de r e s por dois novos nós.) Repita o problema depois de
trocar “ímpar” por “par”. [CCPS 2.38]
1.66 Análise de sensibilidade. Seja (D, c, r) uma rede sem ciclos dirigidos negativos. Para cada nó v,
digamos que dv é a distância de r a v, ou seja, o custo de um caminho dirigido mínimo de r a v. De
quanto podemos diminuir o custo de um certo arco ij sem que os valores da função d se alterem?
22 1.11. EXERCÍCIOS FEOFILOFF
Capítulo 2

Fluxo máximo e corte mínimo

O problema do fluxo máximo entre dois nós de uma rede é fundamental em otimi-
zação combinatória. O correspondente teorema Max-flow Min-cut é uma poderosa
ferramenta com muitas aplicações.
(Use o índice remissivo na página 191 para localizar as definições de conceitos e termos
técnicos.)

2.1 Fluxo
Um fluxo em um grafo dirigido D é qualquer função de E(D) em R+ . Em outras
palavras, um fluxo é uma função que atribui um número real1 não-negativo a cada
arco de D.
Se x é um fluxo e R é um conjunto de nós do grafo, denotamos por x(∂ + (R)) a soma
dos valores de x nos arcos de ∂ + (R), ou seja, nos arcos que entram em R. Convém
simplificar essa expressão e escrever apenas x+ (R).2 Portanto,
P
x+ (R) := (xuv : uv ∈ ∂ + (R)) .

Analogamente, denotamos por x− (R) a soma dos valores de x nos arcos que saem
de R: 3 P
x− (R) := (xvw : vw ∈ ∂ − (R)) .
É claro que x− (R) = x+ (R), sendo R := V (D) r R. O excesso, ou acúmulo, ou saldo
(= net flow) de x em R é a “quantidade” de fluxo que fica “retida” em R. Esse excesso é
denotado por x+− (R):
x+− (R) := x+ (R) − x− (R) .
1
Poderíamos nos restringir aos números racionais, uma vez que computadores digitais não conhe-
cem números irracionais.
2
Já usamos essa notação na seção 1.9.
3
Para justificar os superscritos “+” e “−”, você pode imaginar que os nós são contas bancárias e os
arcos representam movimentação de dinheiro: tudo que entra numa conta é somado ao saldo e tudo
que sai é subtraído.

23
24 2.1. FLUXO FEOFILOFF

Lema 2.1 (soma de excessos) Para qualquer fluxo x em um grafo dirigido D e qual-
quer subconjunto R de V (D), a soma dos excessos nos nós de R é igual ao excesso
em R: P
v∈R x− (v) = x− (R) .
+ +

P P
P ROVA : Para mostrar que v∈R x+ (v) − v∈R x− (v) = x+ (R) − x− (R), basta verificar
que cada arco do grafo dá a mesma contribuição para o lado esquerdo e o lado direito
dessa igualdade.
Um arco ij que tem ambas as pontas em R contribui xij para o primeira somatória e xij
para o segunda somatória, e portanto a contribuição total para o lado esquerdo é nula.
A contribuição de ij para o lado direito também é nula. Um raciocínio análogo mostra
que é nula a contribuição dos arcos que têm ambas as pontas em R.
Um arco que entra em R contribui apenas para o primeira somatória do lado esquerdo
e para o primeiro termo do lado direito. Analogamente, um arco que sai de R contribui
apenas para o segunda somatória do lado esquerdo e o segundo termo do lado direito.
Resumindo: cada arco com uma ponta em R e outra em R dá a mesma contribuição
para os dois lados da igualdade.

2.1.1 Circulação

Uma circulação (= circulation) em uma grafo dirigido é qualquer fluxo que tenha ex-
cesso nulo em cada nó. Mais precisamente, uma circulação é qualquer fluxo x tal que

x+− (v) = 0

para cada nó v. (Essa igualdade é conhecida como conservação de fluxo em v.) Segue do
lema 2.1 que a “quantidade” de circulação que atravessa um corte “da esquerda para
a direita” é igual à “quantidade” que atravessa o corte “da direita para a esquerda”:

Corolário 2.2 Para qualquer circulação x e qualquer conjunto R de nós, vale a igual-
dade x− (R) = x+ (R).

Qualquer família de ciclos dirigidos define uma circulação. (Poderíamos nos restringir
a ciclos simples, mas isso não afetaria os conceitos.) Se C1 , . . . , Cj é uma família de
ciclos dirigidos e xe é o número desses ciclos que contêm o arco e então x é uma
circulação. Reciprocamente, toda circulação pode ser representada por uma família
de ciclos dirigidos, como mostramos a seguir.

Lema 2.3 (decomposição em ciclos) Para toda circulação x em um grafo dirigido,


existem
P ciclos dirigidos simples C1 , . . . , Cj e números positivos α1 , . . . , αj tais que
Ci 3e αi = xe para cada arco e. Podemos supor que j ≤ m, sendo m o número de
arcos do grafo.
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 25

E SBOÇO DA PROVA : Seja E 0 o suporte de x, isto é, o conjunto dos arcos e tais que
xe 6= 0. Se E 0 é vazio, a conclusão do lema vale com j = 0. Senão, seja D0 o subgrafo
de D induzido por E 0 . Como x+ (v) = x− (v) para cada nó v, o grafo D0 tem um ciclo
dirigido simples, digamos C. (Veja o lema F.1 no apêndice F.) Seja α := mine∈E(C) xe .
Subtraia α de xe para cada arco e de C. Essa operação produz uma nova circulação.
Repita o processo com a nova circulação.

E XEMPLO 2.1: A tabela mostra uma circulação x no grafo da figura.

02 03 04 12 14 24 34 35 45 51
x 0 0 0 2 1 2 0 0 3 3

Esta circulação pode ser decomposta nos ciclos dirigidos (1, 2, 4, 5, 1) e (1, 4, 5, 1). O primeiro ciclo
conduz 2 unidades de fluxo e o segundo conduz 1 unidade.

2.1.2 Fluxo de um nó a outro

Dados dois nós r e s de um grafo dirigido, um fluxo de r a s é qualquer fluxo que


tenha excesso nulo em todos os nós exceto r e s e excesso não-negativo em s. Mais
precisamente, x é um fluxo de r a s se x+− (s) ≥ 0 e

x+− (v) = 0 para todo nó v distinto de r e s.

O excesso de x em s é a intensidade, ou valor, de x. É conveniente ter uma notação


especial para a intensidade do fluxo x:

int(x) := x+− (s).

(É preciso ficar atento para não confundir “int” com “inteiro”!)


Dizemos que um conjunto R de nós separa r de s se r ∈ R e s ∈ / R. Em virtude
do lema 2.1, a intensidade de um fluxo de r a s pode ser medida em qualquer dos
conjuntos que separam r de s:

Lema 2.4 Para qualquer fluxo x de r a s e qualquer conjunto R que separa r de s, tem-
se int(x) = −x+− (R), ou seja, a intensidade de x é igual à diferença x− (R) − x+ (R).

Em particular, a intensidade do fluxo x é igual ao excesso de x em r com sinal trocado,


ou seja, int(x) = −x+− (r).
Qualquer família de caminhos dirigidos de r a s define um fluxo. (Poderíamos nos
restringir a caminhos simples, mas isso não afetaria os conceitos.) Se P1 , . . . , Pk é uma
família de caminhos dirigidos de r a s e xe é o número desses caminhos que contêm o
arco e então x é um fluxo de r a s de intensidade k. Reciprocamente, todo fluxo de r
a s pode ser representado por uma família de caminhos (e ciclos) dirigidos:
26 2.2. O PROBLEMA DO FLUXO MÁXIMO FEOFILOFF

Lema 2.5 (decomposição em caminhos e ciclos) Para todo fluxo x de r a s em um


grafo dirigido, existem ciclos dirigidos simples C1 , . . . , Cj e caminhos dirigidos sim-
ples P1 , . . . , Pk de r a s, além de números positivos α1 , . . . , αj , β1 , . . . , βk , tais que
β1 + · · · + βk = int(x) e P P
Ci 3e α i + Pi 3e βi = xe

para cada arco e. Podemos supor que j + k ≤ m, sendo m o número de número de


arcos do grafo.

E SBOÇO DA PROVA : Seja E 0 o suporte de x. Seja D0 o grafo (V, E 0 ). Graças ao lema 2.1,
se int(x) > 0 então existe um caminho dirigido de r a s em D0 . Seja P esse caminho
e β := mine∈E(P ) xe . Subtraia β de xe para cada e em P . Isso produz um novo fluxo
de r a s. A intensidade do novo fluxo é int(x) − β. Repita o processo até obter um
fluxo de intensidade 0. Esse fluxo será uma circulação, e portanto o lema 2.3 poderá
ser aplicado.

E XEMPLO 2.2: A tabela mostra um fluxo x de 0 a 5 no grafo da figura.

02 03 04 12 14 24 34 35 45 51
x 1 3 2 0 4 1 0 3 7 4

Este fluxo pode ser decomposto em três caminhos dirigidos e um ciclo dirigido: (0, 3, 5), (0, 4, 5),
(0, 2, 4, 5) e (1, 4, 5, 1). Os caminhos conduzem 3, 2 e 1 unidades de fluxo respectivamente. O ciclo
conduz 4 unidades de fluxo.

2.2 O problema do fluxo máximo


Seja D um grafo dirigido e u uma função que leva E(D) em R+ .4 Dizemos que u é uma
função-capacidade5 e que a rede (D, u) é capacitada. O valor que a função-capacidade
atribui a um arco é a capacidade do arco. Portanto, a capacidade ue de cada arco e é
um número real não-negativo.
Dizemos que um fluxo x numa rede capacitada (D, u) respeita as capacidades dos
arcos se x ≤ u, ou seja, se xe ≤ ue para cada arco e.

Problema 2.A (fluxo máximo) Dados nós r e s de uma rede capacitada (D, u), encon-
trar um fluxo de r a s que respeite u e tenha intensidade máxima.

Dizemos que r é o nó inicial da rede e s é o nó final. Podemos incorporar esses nós


à definição da rede e dizer que (D, u, r, s) é uma rede de fluxo. Para simplificar a
discussão do problema, adotamos algumas abreviaturas. Dizemos que um fluxo é
viável se vai de r a s e respeita u. Dizemos também “fluxo viável máximo” no lugar
4
Não haveria prejuízo se disséssemos que u leva E(D) em Q+ .
5
A letra u é a inicial de upper bound.
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 27

de “fluxo viável de intensidade máxima”. Podemos até mesmo dizer “fluxo máximo”,
subentendendo o “viável”.
Toda instância do problema tem solução. Com efeito, toda instância tem um fluxo
viável (o fluxo nulo, por exemplo) e toda instância tem um fluxo máximo (uma vez
que a intensidade de qualquer fluxo não passa da soma das capacidades de todos os
arcos).

2.3 Condições de otimalidade


Seja (D, u) uma rede capacitada. Para qualquer conjunto R de nós de D, a capacidade
do corte ∂ − (R) é a soma das capacidades dos arcos que saem de R. Essa soma é
denotada por u(∂ − (R)). Para simplificar, podemos até escrever u− (R). Portanto,
P
u− (R) := e∈∂ − (R) ue .

É conveniente ter uma notação especial para a capacidade de um corte. Assim, se


C := ∂ − (R) então
cap(C) := u− (R) .

Os cortes mais relevantes numa rede de fluxo (D, u, r, s) são os que separam r de s.
Dizemos que um corte ∂ − (R) separa r de s se r ∈ R e s ∈ / R. Usamos também a
expressão (r, s)-corte para designar um corte que separa r de s.

E XEMPLO 2.3: Seja D o grafo dirigido com nós r v w s descrito abaixo por sua matriz de adjacên-
cias. À direita, uma função-capacidade u.

r v w s rv rw vw vs ws
r − 1 1 − 7 9 4 9 7
v − − 1 1
w − − − 1
s − − − −

Os conjuntos R1 = {r, v}, R2 = {r, w} e R3 = {r, v, w} separam r de s e os correspondentes cortes


têm capacidades 22, 14 e 16 respectivamente.

Segue imediatamente do lema 2.4 que a capacidade de qualquer corte que separa r de s
limita a intensidade de qualquer fluxo viável:

Lema 2.6 (fluxo versus corte) Para qualquer fluxo x de r a s que respeita as capacida-
des e qualquer corte C que separa r de s, vale a desigualdade int(x) ≤ cap(C).

O lema leva ao seguinte critério de maximalidade para fluxos: dado um fluxo viável x,
se int(x) = cap(C) para algum corte C que separa r e s então x é máximo, ou seja, x é
solução do problema 2.A.
O lema também leva ao seguinte critério de minimalidade para cortes: dado um (r, s)-
corte C, se cap(C) = int(x) para algum fluxo viável x então C é mínimo, ou seja, tem
capacidade mínima dentre todos os cortes que separam r de s.
28 2.4. TEOREMA DO FLUXO MÁXIMO E CORTE MÍNIMO FEOFILOFF

2.4 Teorema do fluxo máximo e corte mínimo


Surpreendentemente, a recíproca do critério de maximalidade mencionado depois do
lema 2.6 é verdadeira. A prova desse fato foi publicada (1956) por Ford [For] e Fulker-
son [Ful] e por Kotzig [Kot].

Teorema 2.7 Em qualquer rede de fluxo (D, u, r, s), para qualquer fluxo viável x de
intensidade máxima existe um (r, s)-corte C tal que int(x) = cap(C).

A prova do teorema usa a técnica dos caminhos de aumento que passamos a descrever.
Um caminho (não necessariamente dirigido) é compatível com um fluxo viável x se
(i) é quase-simples; (ii) seus arcos diretos6 não estão cheios de fluxo; e (iii) seus arcos
inversos não estão vazios de fluxo. Em outras palavras, um caminho quase-simples P
é compatível com x se
xe < ue para cada arco direto e de P e
xe > 0 para cada inverso e de P .
Um caminho de aumento (= augmenting path) é qualquer caminho compatível com x
que vai r a s. A largura (= width) de um caminho de aumento P é o maior número ε
tal que xe − ε ≥ 0 para cada arco inverso e de P e xe + ε ≤ ue para cada arco direto e
de P .
Dada a largura ε de um caminho de aumento P , podemos executar a seguinte operação
de envio de ε unidades de fluxo ao longo de P :
para cada arco direto e de P , some ε a xe ;
para cada arco inverso e de P , subtraia ε de xe .
Essa operação produz um novo fluxo que é viável e tem intensidade int(x) + ε. Como ε
é positivo, a intensidade do novo fluxo é maior que a de x. Podemos agora empreender
a prova do teorema 2.7.

P ROVA DO TEOREMA : Seja x um fluxo máximo. Queremos encontrar um corte que


separe r de s e tenha capacidade igual a int(x).
Seja R o conjunto de todos os nós que são término de algum caminho que começa em
r e é compatível com x. Suponha por um instante que s ∈ R e seja P um caminho
compatível com x que começa em r e termina em s. É claro que P é um caminho de
aumento. Seja ε a largura de P . O envio de ε unidades de fluxo ao longo de P produz
um novo fluxo viável que tem intensidade maior que a de x. Mas isso é contraditório,
pois x tem intensidade máxima por hipótese. Concluímos assim que s ∈ / R e portanto
R separa r de s.
A definição de R garante que xe = ue para cada e em ∂ − (R) e xe = 0 para cada e em
∂ + (R). Em outras palavras, todos os arcos que saem de R estão cheios de fluxo, e todos
6
Um arco do caminho é direto se aponta “da esquerda para a direita” e inverso se vai aponta no
sentido contrário.
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 29

os arcos que entram em R estão vazios de fluxo. Portanto,

x− (R) = u− (R) e x+ (R) = 0 .

O lema 2.4 permite dizer então que x− (R) − x+ (R) = u− (R). Portanto, int(x) =
cap(∂ − (R)), como queríamos mostrar.

E XEMPLO 2.4: A tabela abaixo descreve uma fluxo viável x na rede (D, u, r, s) do exemplo 2.3.

rv rw vw vs ws
u 7 9 4 9 7
x 7 5 2 5 7

A sequência de nós (r, w, v, s) define um caminho de aumento. A largura desse caminho é 2. É fácil
calcular o fluxo x0 que resulta do envio de 2 unidades de fluxo ao longo do caminho de aumento.
Feito isso, é fácil calcular um (r, s)-corte mínimo.

A prova do teorema 2.7, combinada com o lema 2.6, produz a seguinte manifestação
da condição de folgas complementares da programação linear (veja a seção C.3):

Corolário 2.8 (folgas complementares) Seja x um fluxo viável e R um conjunto de nós


que separa r de s. O fluxo x é máximo se e somente se xe = ue para cada e em ∂ − (R) e
xe = 0 para cada e em ∂ + (R).

E XEMPLO 2.5: A tabela abaixo descreve uma fluxo viável x na rede (D, u, r, s) do exemplo 2.3.

rv rw vw vs ws
u 7 9 4 9 7
x 7 7 0 7 7

O conjunto R = {r, w} é a margem negativa de um corte de capacidade 14. Temos int(x) =


cap(∂ − (R)). Observe que x− (R) = u− (R) e x+ (R) = 0.

A combinação do teorema 2.7 com o lema 2.6 pode ser resumida no seguinte teorema,
conhecido pelas iniciais MFMC de “Max-Flow Min-Cut”:

Teorema 2.9 (MFMC) Em qualquer rede de fluxo (D, u, r, s), vale a igualdade

max int(x) = min cap(C) ,


x C

sendo maxx tomado sobre todos os fluxos viáveis x e minC tomado sobre todos os cortes
C que separam r de s.
30 2.5. ALGORITMO DE FORD–FULKERSON FEOFILOFF

2.4.1 Fluxos inteiros

Um fluxo x é inteiro se xe ∈ Z+ para todo arco e. Analogamente, uma função-capa-


cidade u é inteira se ue ∈ Z+ para todo e. Surpreendentemente, basta que a função-
capacidade seja inteira para que exista um fluxo máximo inteiro:

Teorema 2.10 (MFMC inteiro) Em qualquer rede de fluxo (D, u, r, s), se a função-ca-
pacidade u é inteira então algum fluxo viável máximo é inteiro.

P ROVA : Refaça a prova do teorema 2.7 começando com o fluxo nulo. A largura ε de
qualquer caminho de aumento será inteira. Portanto, o envio de ε unidades de fluxo
ao longo de um caminho de aumento produzirá um novo fluxo inteiro.

2.5 Algoritmo de Ford–Fulkerson


A prova do teorema 2.7 sugere um algoritmo iterativo para calcular um fluxo máximo e
um corte mínimo. Esse é o algoritmo de Ford–Fulkerson, ou algoritmo dos caminhos
de aumento:

F ORD F ULKERSON (D, u, r, s)


01 x ← 0
02 repita
03 R ← C AMINHOS C OMPATÍVEIS (D, u, r, x)
04 se s ∈
/R
05 então devolva x e R e pare  problema resolvido
06 P ← C AMINHO D E A UMENTO (D, u, r, x)
07 ε1 ← min (ue − xe : e ∈ É(P ))
08 ε2 ← min (xe : e ∈ È(P ))
09 ε ← min (ε1 , ε2 )
10 x ← E NVIA F LUXO (D, x, P, ε)

Na linha 05, ∂ − (R) é um corte de capacidade igual à intensidade do fluxo x. Portanto,


o fluxo é máximo (e o corte é mínimo).
Na linha 03, a rotina C AMINHOS C OMPATÍVEIS devolve o conjunto dos términos de
todos os caminhos compatíveis com x que começam em r. Na linha 06, a rotina
C AMINHO D E A UMENTO produz um caminho de aumento para x (supondo que um
tal caminho existe).
É() Nas linhas 07 e 08, a expressão É(P ) denota o conjunto dos arcos diretos do caminho P
È() e È(P ) denota o conjunto dos arcos inversos de P .
Na linha 10, a rotina E NVIA F LUXO envia ε unidades de fluxo ao longo do caminho P e
devolve o fluxo resultante.
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 31

Número de iterações. Se ue ∈ Q+ para todo arco e (ou seja, se as capacidades são


números racionais) é possível mostrar (veja o exercício 2.36) que a execução do algo-
ritmo termina depois de um número finito de iterações. O número de iterações pode
depender dos valores de u; portanto, o algoritmo é pseudopolinomial.

2.6 Versão Edmonds–Karp do algoritmo


O algoritmo de Ford–Fulkerson não estabelece um critério para escolher um caminho
de aumento quando há mais de um. Com isso, o algoritmo pode vir a executar um nú-
mero muito grande de iterações. Uma ideia natural e intuitiva é usar apenas caminhos
de aumento de comprimento mínimo. Edmonds [Edm] e Karp [Kar] mostraram (1972)
que esse aperfeiçoamento faz com que o algoritmo execute no máximo nm iterações,
sendo n o número de nós e m o número de arcos do grafo.

Teorema 2.11 (Edmonds–Karp) Se cada iteração do algoritmo de Ford–Fulkerson usar


um caminho de aumento de comprimento mínimo, o algoritmo não fará mais que nm
iterações.

E SBOÇO DA PROVA : No início de cada iteração temos um fluxo viável x. Digamos


que um caminho na rede é bom se for um caminho de aumento de comprimento mí-
nimo. Digamos que um arco é bom se pertence a algum caminho bom. Digamos que o
comprimento da rede é o comprimento de um caminho bom.
Se o comprimento da rede não muda de uma iteração para a seguinte, o conjunto dos
arcos bons encolhe, ou seja, torna-se um subconjunto próprio do anterior. Segue daí
que no máximo m iterações consecutivas podem ocorrer enquanto o comprimento da
rede permanecer constante.
Por outro lado, o comprimento da rede nunca diminui de uma iteração para a seguinte.
Como o comprimento da rede não pode aumentar mais que n vezes e há no máximo
m iterações entre dois aumentos consecutivos do comprimento, o número total de
iterações não passa de nm.

Para procurar caminhos de aumento de comprimento mínimo, basta implementar


as rotinas C AMINHOS C OMPATÍVEIS e C AMINHO D E A UMENTO conjuntamente usando
uma adaptação da busca em largura (veja a seção 1.8). Essa adaptação exige atenção
pois a versão original da busca em largura procura caminhos dirigidos enquanto aqui
procuramos por caminhos não necessariamente dirigidos. Podemos usar um grafo
dirigido auxiliar (V (D), E 0 ) definido assim: vw ∈ E 0 se e somente se vw ∈ E(D) e
xvw < uvw ou wv ∈ E(D) e xwv > 0. Os caminhos dirigidos nesse grafo auxiliar
correspondem aos caminhos compatíveis com x no grafo original.
Cada iteração desse algoritmo auxiliar consome tempo O(m). Como o número de
iterações não passa de nm, o algoritmo todo consome

O(nm2 )
32 2.7. PROGRAMAÇÃO LINEAR FEOFILOFF

unidades de tempo. Essa delimitação não depende de u, e portanto podemos dizer que
o algoritmo é fortemente polinomial.

2.7 Programação linear


O problema 2.A do fluxo máximo pode ser formulado muito naturalmente na lingua-
gem da programação linear: dada uma rede de fluxo (D, u, r, s), encontrar um vetor
(xe : e ∈ E) que

maximize x+− (s)


sob as restrições x+− (v) = 0 para cada v em V r {r, s}
(1)
xe ≤ ue para cada e em E
xe ≥ 0 para cada e em E

sendo V := V (D) e E := E(D). Todo fluxo viável na rede (D, u, r, s) é solução viá-
vel desse pl. Reciprocamente, toda solução viável do pl é um fluxo viável na rede.
Portanto, x é um fluxo de intensidade máxima se e somente x é solução ótima do pl.
Convém escrever esse pl em notação matricial. Seja A a matriz de incidências de D e
I a matriz identidade indexada por E × E. Além disso, adote as abreviaturas V 0 :=
V r {r, s}, A0 := A[V 0 , E] e c := A[s, E]. Com essa notação, o pl (1) fica assim:

maximize cx
sob as restrições A0 x = 0
(2)
Ix ≤ u
x ≥ 0

sendo o primeiro “0” o vetor nulo indexado por V 0 e o segundo o vetor nulo indexado
por E.

Programa dual. O dual do pl (2) consiste em encontrar um vetor (yv0 : v ∈ V 0 ) e um


vetor (ze : e ∈ E) que

minimizem y 0 0 + zu
sob as restrições y 0 A0 + zI ≥ c (3)
z ≥ 0.

(Para comprovar a relação de dualidade, observe que sequência de desigualdades cx ≤


(y 0 A0 + zI)x = y 0 (A0 x) + z(Ix) = y 0 0 + zx ≤ y 0 0 + zu, que prova o teorema fraco da
dualidade, usa todas as restrições dos dois pl’s.) Veja o pl (3) escrito por extenso:
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 33
P
minimize (zvw uvw : vw ∈ E)
sujeito a yw0 − yv0 + zvw ≥ 0 para vw em E com v e w em V 0
− yv0 + zvr ≥ 0 para vr em E com v em V 0
yw0 + zrw ≥ 0 para rw em E com w em V 0
0
− yv + zvs ≥ 1 para vs em E com v em V 0 (4)
0
yw + zsw ≥ −1 para sw em E com w em V 0
zrs ≥ 1 se rs ∈ E
zsr ≥ −1 se sr ∈ E
zvw ≥ 0 para vw em E.

Para tornar este pl mais simples, acrescentaremos duas componentes constantes ao


vetor y 0 . Mais precisamente, substituiremos y 0 por um vetor y indexado por V tal que
yr := 1, ys := 0 e yv := yv0 para cada v em V 0 . Com isso, as restrições yw − yv + zvw ≥ 0
podem ser aplicadas a todos os arcos sem exceção e absorvem as restrições “zrs ≥ 1 se
rs ∈ E” e “zsr ≥ −1 se sr ∈ E”. O pl (4) pode então ser escrito assim:
P
minimize (zvw uvw : vw ∈ E)
sujeito a yr = 1
ys = 0 (5)
yw − yv + zvw ≥ 0 para vw em E
zvw ≥ 0 para vw em E.

Para todos os efeitos, este é o dual do pl (1).


O pl (5) está intimamente relacionado com o problema do corte mínimo. De fato, se
∂ − (R) é um corte que separa r de s e y é o vetor característico de R e z é o vetor
característico de ∂ − (R) então (y, z) é uma solução viável do pl. A recíproca vale para
soluções binárias: qualquer solução viável binária (y, z) de (5) é o vetor característico
de um corte que separa r de s.

2.7.1 Outro programa linear

O problema 2.A do fluxo máximo pode também ser formulado como um programa
linear que representa a decomposição de fluxos em caminhos (veja o lema 2.5). Se de-
notarmos por P o conjunto de todos os caminhos dirigidos simples de r a s, o problema
pode ser formulado assim: encontrar um vetor (wP : P ∈ P) que
P
maximize (wP : P ∈ P)
P
sujeito a (wP : e ∈ P ∈ P) ≤ ue para cada e ∈ E (6)
wP ≥ 0 para cada P ∈ P.

O número de variáveis é enorme, pois |P| pode aumentar exponencialmente com o


número de nós. Ainda assim, o pl é conceitualmente interessante. O dual do pl consiste
em encontrar um vetor (ze : e ∈ E) que
34 2.8. POLIEDROS E SEUS VÉRTICES FEOFILOFF

P
minimize (ze ue : e ∈ E)
P
sujeito a (ze : e ∈ P ) ≥ 1 para cada P ∈ P (7)
ze ≥ 0 para cada e ∈ E.
(Em outras palavras, trata-se de atribuir pesos não-negativos z aos arcos de modo que
a soma dos pesos em cada caminho de P seja pelo menos 1.) Para qualquer corte que
separa r de s, o vetor característico z do corte é solução viável de (7).

2.8 Poliedros e seus vértices


Para entender a relação entre os pl’s (1) e (5) e o problema 2.A, é preciso estudar os
poliedros dos pl’s. Quais são as propriedades geométricas desses poliedros? Como
são os vértices (veja a seção B.2 do apêndice B) desses poliedros?

2.8.1 O poliedro dos fluxos

Seja X(D, u, r, s) o poliedro do pl (1), isto é, o conjunto de todos os vetores x que


satisfazem as restrições do pl. É claro que todo vetor de X(D, u, r, s) é um fluxo de
r a s e vice-versa. O poliedro não é vazio e é limitado. Portanto, tem vértices (veja o
lema B.4 do apêndice B).
Se x é um vértice de X(D, u, r, s) então (i) não existe ciclo (dirigido ou não) em D cujos
arcos não estão vazios nem cheios de fluxo e (ii) não existe caminho (dirigido ou não)
de r a s em D cujos arcos não estão vazios nem cheios de fluxo. (Veja o exercício 2.54.)
Em outras palavras, se x é um vértice do poliedro então (i) todo ciclo no suporte de x
tem algum arco cheio de fluxo e (ii) todo caminho de r a s no suporte que x tem algum
arco cheio de fluxo. Reciprocamente, se x é um vetor do poliedro X(D, u, r, s) para o
qual valem (i) e (ii) então x é vértice do poliedro. (Veja o exercício 2.55.)

E XEMPLO 2.6: Considere a rede descrita abaixo por sua matriz de adjacências e sua função-capaci-
dade.
rv rw vw vs ws rv rw vw vs ws
r −1 −1 7 9 4 9 7
v +1 −1 −1
w +1 +1 −1
s +1 +1
A seguir, as restrições do pl (1) escritas por extenso:
xrv − xvw − xvs = 0
xrw + xvw − xws = 0
xrv ≤ 7
xrw ≤ 9
xvw ≤ 4
xvs ≤ 9
xws ≤ 7
xrv ≥ 0
xrw ≥ 0
xvw ≥ 0
xvs ≥ 0
xws ≥ 0
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 35

O poliedro X(D, u, r, s) é limitado pois 0 ≤ x ≤ u para todo x no conjunto. O poliedro não é vazio
pois contém o vetor 0. Os vetores x0 e x00 descritos a seguir também estão no poliedro.

rv rw vw vs ws
0
x 7 7 0 7 7
x00 4 0 4 0 4

O vetor x000 abaixo está em X(D, u, r, s) mas não é vértice pois tanto x000 + d000 quanto x000 − d000
também estão no poliedro. Observe que o suporte de d000 é o ciclo (v, w, s, v). Observe também que
o conjunto de colunas da matriz de incidências que correspondem ao ciclo é l.d. (veja a seção F.7).

rv rw vw vs ws
000
x 5 5 1 4 6
d000 0 0 0.5 −0.5 0.5

O vetor x0000 está em X(D, u, r, s) mas não é vértice porque x0000 + d0000 e x0000 − d0000 estão no poliedro.
Observe que o suporte de d0000 é o caminho (r, w, v, s).

rv rw vw vs ws
0000
x 7 6 1 6 7
d0000 0 0.2 −0.2 0.2 0

Já os vetores x0 e x00 descritos acima são vértices do poliedro.

De acordo com o corolário C.3 no apêndice C, para qualquer vetor de custos c, alguma
solução ótima do pl (1) é um vértice do poliedro X(D, u, r, s).
Qualquer solução ótima do pl (1) é um fluxo máximo de r a s. Portanto (veja a se-
ção C.4), qualquer algoritmo de programação linear — como o Simplex, por exem-
plo — resolve o problema 2.A. Mas é claro que um algoritmo especializado, como o de
Edmonds–Karp, é mais eficiente.

2.8.2 O poliedro dos cortes

Seja Y (D, r, s) o poliedro do pl (5), isto é, o conjunto de todos os pares (y, z) que satis-
fazem as restrições do pl. O poliedro não é vazio e não é limitado, como passamos
a mostrar. Seja y qualquer vetor indexado por V tal que yr = 1 e ys = 0. Faça
zpq := max (0, yp − yq ) para todo arco pq. (Em outras palavras, se yq ≥ yp então zpq := 0 e
se yq < yp então zpq := yp − yq .) Com z assim definido, o par (y, z) pertence ao poliedro.

E XEMPLO 2.7: Considere novamente a rede do exemplo 2.6. Veja as restrições do pl (5) escritas por
extenso:
yr = 1
ys = 0
yv − yr + zrv ≥ 0
yw − yr + zrw ≥ 0
yw − yv + zvw ≥ 0
ys − yv + zvs ≥ 0
ys − yw + zws ≥ 0
zrv ≥ 0
zrw ≥ 0
zvw ≥ 0
zvs ≥ 0
zws ≥ 0
36 2.9. CAPACIDADES INFINITAS FEOFILOFF

Veja a seguir uma amostra de elementos do poliedro Y (D, r, s).

r 1 1 1 1 1
v 0 0 1 0.5 0.5
w 0 1 0 1 0.5
s 0 0 0 0 0
rv 1 1 0 0.5 0.5
rw 1 0 1 0 0.5
vw 0 0 1 0 0
vs 0 0 1 0.5 0.5
ws 0 1 0 1 0.5

Muitos outros vetores de Y (D, r, s) podem ser obtidos a partir destes se observarmos que, para
todo (y, z) em Y (D, r, s) e qualquer z 0 ≥ z, o vetor (y, z 0 ) também está em Y (D, r, s). Com isso, fica
claro que Y (D, r, s) não é limitado.
O poliedro não tem vértices, como passamos a mostrar. Seja (y, z) um elemento de Y (D, r, s) e
tome qualquer nó p diferente de r e de s. Se trocarmos yp por yp + 1 e trocarmos zpq por zpq + 1 para
cada arco pq que sai de p, o vetor modificado estará em Y (D, r, s). Analogamente, se trocarmos yp
por yp − 1 e zqp por zqp + 1 para cada arco qp que entra em p, o vetor resultante estará em Y (D, r, s).
Agora considere um vetor binário (y, z) em Y (D, r, s). Seja R o conjunto de nós cujo vetor caracte-
rístico é y. Então r ∈ R, s ∈
/ R, zpq ≥ 1 para todo arco em ∂ − (R), e zpq ≥ 0 para os demais arcos. Se
(y, z) minimiza zu e u não tem componentes nulas, temos zpq = 1 para todo pq em ∂ − (R) e zpq = 0
para todos os demais arcos. Assim, z é o vetor característico de ∂ − (R).

2.9 Capacidades infinitas


Ocasionalmente, somos levados a considerar redes de fluxo em que alguns arcos têm
capacidade infinita, contrariando a definição de capacidade no início da seção 2.2.
Atribuir capacidade ∞ a um arco e da rede equivale a eliminar a restrição xe ≤ ue .
Mostraremos a seguir como é possível tratar dessa extensão do problema 2.A.
Se alguns arcos de uma rede de fluxo (D, u, r, s) têm capacidade infinita, a correspon-
dente instância do problema 2.A pode ser ilimitada (ou seja, a intensidade do fluxo
pode ser arbitrariamente grande). Isso acontece se e somente se a rede tem um caminho
dirigido de r a s cada um de cujos arcos tem capacidade infinita.
Entretanto, se cada caminho dirigido de r a s tem algum arco de capacidade finita,
podemos substituir as ocorrências de ∞ por um número suficientemente grande e
Pao problema0 2.A. Por 0 exemplo, podemos substituir ∞ por um número
assim voltar
maior que (ue : e ∈ E ), onde E o conjunto de arcos da rede que têm capacidade
finita.

2.10 Exercícios
Seção 2.1
P +
2.1 Se x é um fluxo e R um conjunto de nós, é verdade que (x (v) : v ∈ R) = x+ (R)?
2.2 Complete os detalhes da prova do lema 2.3.
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 37

2.3 Seja x um fluxo de r a s e x0 uma circulação. Mostre que x + x0 é um fluxo de r a s e que int(x + x0 ) =
int(x).

− (t) 6= 0.
2.4 Seja x um fluxo em um grafo dirigido. Seja T o conjunto de todos os nós t para os quais x+
Mostre que se |T | ≤ 2 então x é um fluxo de r a s para algum par (r, s) de nós.
2.5 Prove os lemas 2.4 e 2.5.
2.6 Por que podemos supor que j ≤ m no lema 2.3, sendo m o número de número de arcos do grafo
dirigido? Por que podemos supor que j + k ≤ m no lema 2.5?

Seção 2.2
2.7 Seja x um fluxo máximo numa rede (D, u, r, s). É verdade que x+ (r) e x− (s) são nulos?
2.8 Mostre que toda instância do problema 2.A tem um fluxo máximo.
2.9 ? Calcule um fluxo máximo numa rede de fluxo (D, u, r, s) em que D é uma árvore divergente.
2.10 ? Circulação máxima. Mostre que o problema do fluxo máximo equivale ao seguinte: Dada uma
rede capacitada (D, u, r, s) que tem um arco sr de capacidade muito grande (maior que a soma das
capacidades dos demais arcos), encontrar uma circulação x que respeite u e maximize xsr .
2.11 No problema do fluxo máximo, suponha que um nó v distinto de r e de s tem grau de entrada nulo.
Podemos remover esse nó sem afetar a intensidade de um fluxo máximo? E se v tem grau de saída
nulo? [AMO 6.26]
2.12 Caminhos dirigidos disjuntos. Sejam r e s dois nós de um grafo dirigido. Uma coleção de caminhos
dirigidos de r a s é disjunta nos arcos se cada arco do grafo pertence a no máximo um dos caminhos.
Mostre que o problema de encontrar uma coleção disjunta máxima de caminhos dirigidos simples
de r a s é uma instância do problema 2.A.

Seção 2.3
2.13 ? Prove o lema 2.6.
2.14 Seja (D, u, r, s) uma rede capacitada e α um número positivo. É verdade que todo (r, s)-corte
mínimo continua sendo mínimo se multiplicarmos a capacidade de cada arco por α? É verdade
que todo (r, s)-corte mínimo continua sendo mínimo se somarmos α à capacidade de cada arco?
[AMO 6.34]
2.15 Calcule um corte mínimo numa rede de fluxo (D, u, r, s) em que D é uma árvore divergente.
2.16 ? Submodularidade. Sejam X e Y dois conjuntos de nós numa rede capacitada (D, u). Prove a
seguinte propriedade submodular:

u− (X ∪ Y ) + u− (X ∩ Y ) ≤ u− (X) + u− (Y ).

(Dica: Mostre antes que ∂ − (X ∪ Y ) ∪ ∂ − (X ∩ Y ) ⊆ ∂ − (X) ∪ ∂ − (Y ) e ∂ − (X ∪ Y ) ∩ ∂ − (X ∩ Y ) =


∂ − (X) ∩ ∂ − (Y ).)
2.17 Sejam ∂ − (X) e ∂ − (Y ) dois (r, s)-cortes mínimos numa rede de fluxo (D, u, r, s). Prove que
∂ − (X ∩ Y ) e ∂ − (X ∪ Y ) também são (r, s)-cortes mínimos. (Dica: Veja o exercício 2.16.) [CCPS 3.7]
2.18 Seja D o grafo dirigido definido pela matriz de adjacências abaixo. (Faça uma boa figura). Encontre
uma coleção disjunta máxima de caminhos dirigidos simples de r a s. Faça uma lista de todos os
cortes que separam r de s. [AMO 6.15]
38 2.10. EXERCÍCIOS FEOFILOFF

r t u v w s
r − 1 1 1 − −
t − − 1 − − −
u − − − 1 − 1
v − − − − 1 1
w − − − − − 1
s − − − − − −

Seção 2.4
2.19 Seja ε a largura de um caminho de aumento P para um fluxo viável x numa rede (D, u, r, s). Prove
que o envio de ε unidades de fluxo ao longo de P produz um novo fluxo viável. Prove que a
intensidade do novo fluxo é int(x) + ε.
2.20 Seja x um fluxo viável e P um caminho de aumento de largura máxima. Seja ε a largura de P . Seja
x0 o fluxo resultante do envio de ε unidades de fluxo ao longo de P . Um caminho de aumento para
x0 pode ter largura maior que ε? [CCPS 3.10]
2.21 Prove condições necessárias para que uma rede (D, u, r, s, k) tenha um fluxo viável x de intensidade
≥ k.
2.22 Discuta o seguinte problema: dada uma rede de fluxo (D, u, r, s) e um número inteiro f , encontrar
um fluxo viável que tenha intensidade igual a f .
2.23 Suponha que x é um fluxo viável numa rede de fluxo. Discuta a seguinte afirmação: “para provar
que o fluxo x é máximo basta mostrar que não existe caminho de aumento para x”.
2.24 Curiosidade. Discuta o seguinte problema: dada uma rede de fluxo (D, u, r, s), encontrar um con-
junto R de nós que separe r de s e minimize a diferença u− (R) − u+ (R). [CCPS 3.9]
2.25 Encontre um fluxo máximo na rede de fluxo descrita abaixo por sua matriz de adjacências.

rv rw vw vs ws rv rw vw vs ws
r −1 −1 9 7 4 7 9
v +1 −1 −1
w +1 +1 −1
s +1 +1
2.26 A matriz abaixo dá as capacidades dos arcos de uma rede de fluxo. (Faça uma boa figura). Encontre,
iterativamente, um fluxo viável máximo. Exiba o fluxo no início de cada iteração. Mostre um corte
que separa r de s e tem capacidade mínima. [AMO 6.14]

r a b c d e s
r − 4 3 − − − −
a 4 − − 2 3 − −
b 3 − − 2 − − −
c − 2 2 − − 5 −
d − 3 − − − 4 −
e − − − 5 4 − 8
s − − − − − 8 −

2.27 ? A figura mostra uma rede de fluxo (D, u, r, s). Os rótulos “u, x” representam a função-capacidade
e um fluxo viável. Mostre que x tem intensidade máxima ou encontre um fluxo de intensidade
maior. Mostre um corte de capacidade mínima dentre os que separam r de s. [CCPS fig.3.1]
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 39

2.28 Caminhos dirigidos disjuntos. Considere o problema de encontrar uma coleção disjunta máxima
de caminhos dirigidos simples de r a s num grafo dirigido (veja o exercício 2.12). Mostre que
uma tal coleção máxima tem o mesmo tamanho que um (r, s)-corte com número mínimo de arcos.
[AMO 6.45]
2.29 Fluxo não inteiro. Seja x um fluxo viável máximo numa rede de fluxo com capacidades inteiras.
Sugira um algoritmo que converta x em um fluxo viável x0 que tenha a mesma intensidade que x e
seja inteiro. (Sugestão: Envie fluxo ao longo de ciclos dirigidos.) Qual o consumo de tempo do seu
algoritmo? [AMO 6.40]
2.30 Seja x um fluxo máximo numa rede de fluxo (D, u, r, s). Quais das seguinte afirmações são ver-
dadeiras? A. Se a capacidade de cada arco é um múltiplo de α, então xe é múltiplo de α para
cada arco e. B. Se somarmos α à capacidade de cada arco, estaremos somando um múltiplo de α à
intensidade do fluxo máximo. [AMO 7.9]

Seção 2.5
2.31 Descreva a rotina E NVIA F LUXO em código.
2.32 Aplique o algoritmo de Ford–Fulkerson a uma rede de fluxo (D, u, r, s) em que D é uma árvore
divergente.
2.33 Encontre um fluxo máximo de r a s e um (r, s)-corte mínimo na rede capacitada da figura.
[CCPS 3.2]

2.34 Os rótulos “x (u)” nos arcos representam uma função-capacidade u e um fluxo viável x de S a F .
Mostre que o fluxo x é máximo ou calcule um fluxo máximo.

2.35 Considere a variante do algoritmo de Ford–Fulkerson que usa apenas caminhos de aumento sem
arcos inversos. Essa variante do algoritmo é capaz de encontrar um fluxo máximo?
2.36 ? Capacidades inteiras. Aplique o algoritmo de Ford–Fulkerson a uma rede (D, u, r, s) em que a
função-capacidade u é inteira. Supondo que um fluxo máximo tem intensidade k, mostre que o
algoritmo executa no máximo k iterações. Deduza daí que se u for racional então o número de
iterações é finito.
40 2.10. EXERCÍCIOS FEOFILOFF

Seção 2.6
2.37 Complete a prova do teorema 2.11.
2.38 Escreva, em código, a versão Edmonds–Karp do algoritmo de Ford–Fulkerson.
2.39 Caminho de aumento com número mínimo de arcos inversos. Suponha que algoritmo de Ford–Fulkerson
sempre escolhe um caminho de aumento que tem o menor número possível de arcos inversos.
Prove que o número de aumentações de fluxo (e portanto o número de iterações) será O(m).
Dê um algoritmo que encontre um caminho de aumento desse tipo em O(m) unidade de tempo.
[CCPS 3.15]
2.40 Suponha dado um fluxo máximo em uma rede de fluxo. Mostre como é possível encontrar um
(r, s)-corte mínimo em tempo O(m). Agora suponha dado um (r, s)-corte mínimo. Esse corte pode
ser usado para obter um fluxo máximo rapidamente (ou seja, em tempo menor que o necessário
para resolver o problema sem qualquer informação adicional)? [AMO 6.28]
2.41 Corte mínimo com número mínimo de arcos. Queremos determinar um corte mínimo que tenha o
menor número possível de arcos em uma rede de fluxo (D, u, r, s). Para cada arco vw, seja u0e :=
m ue + 1. Mostre que um corte mínimo na rede (D, u0 , r, s) resolve o problema. [AMO 7.27]
2.42 Capacidades nos nós. Dada uma rede (D, u, r, s), suponha que cada nó v distinto de r e de s tem
uma capacidade não-negativa av que limita a “quantidade” de fluxo que pode passar por v. Como
resolver o problema de determinar um fluxo máximo que respeite as capacidades dos nós e as
capacidades dos arcos? Transforme esse problema em um problema padrão de fluxo máximo (que
só tem capacidades nos arcos). Do ponto de vista da complexidade de pior caso, o problema com
capacidades nos nós é mais difícil que o problema padrão? [AMO 6.25]
2.43 Análise de sensibilidade e arcos vitais. Numa rede (D, u, r, s), um arco a é vital se a redução de ua a 0
causa a maior redução possível na intensidade do fluxo máximo. Prove ou desprove cada uma das
afirmação a seguir: A. Se a é vital então ua é máximo. B. Se x é um fluxo máximo e a é vital então
xa é máximo. C. Se x é um fluxo máximo e a é vital então existe um corte de capacidade mínima tal
que xa ≥ xe para todo arco e no corte. D. Se a é vital então a pertence a algum corte de capacidade
mínima. E. A rede pode ter mais de um arco vital. [AMO 7.7]
2.44 Análise de sensibilidade e arcos dispensáveis. Numa rede (D, u, r, s), um arco a é dispensável se a
redução de ua a 0 causa a menor redução possível na intensidade do fluxo máximo. Prove ou
desprove cada uma das afirmação a seguir: A. Se x é um fluxo máximo e xa = 0 então a é
dispensável. B. Se x é um fluxo máximo e xa é mínimo então a é dispensável. C. Se a pertence
a um corte de capacidade mínima então a não é dispensável. [AMO 7.8]
2.45 Seja D um grafo dirigido completo e (D, u, r, s) uma rede de fluxo. Seja ϕ a intensidade de um
fluxo máximo na rede. Para cada par (i, j) de nós, seja α[i, j] o aumento no valor de ϕ que
obteríamos se uij fosse ∞. A. Mostre que α[i, j] ≤ α[r, j] e α[i, j] ≤ α[i, s]. B. Mostre que
α[i, j] = min (α[r, j], α[i, s]). C. Mostre como α[i, j] pode ser calculado para todo par (i, j) mediante
resolução de O(n) problemas de fluxo máximo. [AMO 7.26]
2.46 Re-otimização. Seja x um fluxo máximo numa rede de fluxo (D, u, r, s). Suponha que um número
k > 0 foi somado à capacidade de um determinado arco e. Mostre como encontrar um novo fluxo
máximo em tempo O(km). Agora suponha que um número k > 0 foi subtraído da capacidade de
um determinado arco e; é possível encontrar um novo fluxo máximo em tempo O(km)? [AMO 6.35]

Seção 2.7
2.47 Discuta as semelhanças e diferenças entre o pl (1) acima e o pl (2) da seção 1.9, que procura um
caminho mínimo.
2.48 Verifique que o pl (3) é o dual o pl (2). Reciprocamente, verifique que (2) é dual de (3).
2.49 Verifique que o pl (4) é idêntico ao pl (3). Verifique que o pl (4) é equivalente ao pl (5).
FEOFILOFF FLUXO MÁXIMO E CORTE MÍNIMO 41

2.50 ? Trocando fluxo por circulação. Suponha dada uma rede (D, u, r, s) em que sr é um arco e usr é muito
grande, maior que u− (r), por exemplo. Mostre que o problema do fluxo máximo (1) equivale ao
problema encontrar uma circulação que maximize xsr . Escreva o pl que represente esse segundo
problema. Escreva o dual do pl.
2.51 Mostre que qualquer corte que separa r de s corresponde a uma solução viável (y, z) do pl (5) e
que o valor zu da solução viável (y, z) é igual à capacidade do corte. Mostre ainda que qualquer
(r, s)-corte mínimo define uma solução ótima do pl (5). (Sugestão: use o teorema 2.7 para obter
uma solução ótima do pl (1).)
2.52 Prove que o pl (7) é o dual do pl (6). Reciprocamente, prove que (6) é dual de (7).

Seção 2.8
2.53 Mostre que o poliedro X(D, u, r, s) é limitado e não é vazio.
2.54 Seja x um vértice do poliedro X(D, u, r, s). Mostre que (i) não existe ciclo cujos arcos não estão
vazios nem cheios e (ii) não existe caminho de r a s cujos arcos não estão vazios nem cheios.
2.55 Seja x um vértice do poliedro X(D, u, r, s). Suponha que (i) não existe ciclo cujos arcos não estão
vazios nem cheios e (ii) não existe caminho de r a s cujos arcos não estão vazios nem cheios. Mostre
que x é vértice do poliedro.
2.56 Seja x um fluxo viável de intensidade máxima numa rede. Mostre um exemplo em que x não é
vértice do poliedro X(D, u, s, t).
2.57 Analise o poliedro X(D, u, r, s) correspondente à rede descrita abaixo por sua matriz de adjacências
e seu vetor de capacidades.
rv rw vw vs ws rv rw vw vs ws
r −1 −1 9 7 4 7 9
v +1 −1 −1
w +1 +1 −1
s +1 +1
2.58 Sejam r e s dois nós de um grafo dirigido D. Seja X o poliedro do pl abaixo. Suponha que x é um
vértice de X. É verdade que x+ (r) = 0?
maximize x+ − (s)
sob as restrições x+
− (v) = 0 para cada v em V r {r, s}
xe ≥ 0 para cada e em E.

Seção 2.9
2.59 Suponha que, ao contrário da definição adotada até aqui, a função-capacidade u pode atribuir ∞ a
alguns arcos. Mostre que uma instância (D, u, r, s) do problema do fluxo máximo não tem solução
se e somente se todos os arcos de algum caminho dirigido de r a s têm capacidade ∞. (Dica:
Enuncie e prove em separado a parte “se” e a parte “somente se”.) [CCPS 3.3]
2.60 Suponha que, ao contrário da definição adotada até aqui, a função-capacidade u pode atribuir ∞
a alguns arcos. Dada uma rede de fluxo (D, u, r, s), suponha que não existe caminho dirigido de
r a s cujos arcos têm capacidade ∞. Seja E 0 é o conjunto de e tais que ue < ∞. Mostre que, do
ponto de vista do problema do fluxoPmáximo, podemos substituir a capacidade de cada arco que
está em E(D) r E 0 pelo número 1 + (ue : e ∈ E 0 ). [AMO 6.23]
2.61 Considere uma instância (D, u, r, s) do problema do fluxo máximo e suponha que, ao contrário da
definição adotada até aqui, a função-capacidade u pode atribuir ∞ a alguns arcos. Quando ue = ∞,
a restrição xe ≤ ue do pl (1) deveria ser ignorada, fazendo desaparecer a componente ze de z no pl
dual (4). Reescreva o pl’s (1) da forma correta. Calcule o pl dual. Escreva as condições de folgas
complementares para o par dual de pl’s.
42 2.10. EXERCÍCIOS FEOFILOFF
Capítulo 3

Aplicações de fluxo máximo e corte


mínimo

O teorema MFMC e o teorema MFMC inteiro — teoremas 2.9 e 2.10 do capítulo 2 —


são ferramentas poderosas e versáteis. Este capítulo usa essas ferramentas para resol-
ver alguns problemas combinatórios. Vários desses problemas são “de viabilidade”,
pois procuram um objeto de um certo tipo num grafo e não envolvem maximização
nem minimização. Para esses problemas, os teoremas MFMC fornecem “certificados
de inviabilidade”: explicações elementares de por quê uma dada instância não tem
solução.
Eis um exemplo simples de problema de viabilidade: dada uma rede de fluxo
(D, u, r, s) e um número k, encontrar um fluxo viável de r a s que tenha intensidade
pelo menos k. O teorema MFMC mostra que uma instância desse problema não tem
solução somente se houver um impedimento óbvio na forma de um corte que separa r
de s e tem capacidade menor que k.
Para simplificar a discussão, vamos relaxar a definição de função-capacidade adotada
na seção 2.2 e permitir que alguns arcos das redes de fluxo tenham capacidade infinita.
Como mostramos na seção 2.9, essa relaxação da definição é inócua desde que a rede
de fluxo não tenha caminhos de capacidade infinita que levam do nó inicial ao nó final.

3.1 Emparelhamentos bipartidos e cobertura por nós


Um emparelhamento1 (= matching) num grafo não-dirigido é um conjunto M de ares-
tas tal que todo nó pertence a no máximo uma das arestas de M .

E XEMPLO 3.1: Suponha dado um conjunto de trabalhadores, um conjunto de postos de trabalho, e


o conjunto de todos os pares (p, q) para os quais o trabalhador p está habilitado a ocupar o posto q
e o posto q está disposto a contratar p. Queremos encontrar um “casamento” de k trabalhadores
com k postos de trabalho. É claro que cada trabalhador deve ocupar apenas um posto e cada posto
deve ser ocupado por apenas um trabalhador. Em que condições o problema tem solução?

1
Na área de biologia molecular, emparelhamentos são chamados alinhamentos.

43
44 3.1. EMPARELHAMENTOS BIPARTIDOS E COBERTURA POR NÓS FEOFILOFF

E XEMPLO 3.2: A figura mostra um emparelhamento com 4 arestas num grafo não-dirigido bipar-
tido. Não existe emparelhamento com 5 arestas ou mais.

Não é fácil procurar por emparelhamentos grandes em grafos arbitrários (trataremos


disso no capítulo 7). Aqui, vamos nos restringir aos grafos bipartidos.

Problema 3.A (emparelhamento bipartido) Dado um grafo não-dirigido bipartido e


um inteiro k, encontrar um emparelhamento com k ou mais arestas.

Se uma dada instância do problema não tem solução, queremos receber uma prova —
um certificado — da inexistência de solução. Para obter um tal certificado, usaremos
o conceito de cobertura. Uma cobertura por nós (= cover) de um grafo não-dirigido é
um conjunto C de nós tal que toda aresta do grafo tem pelo menos uma ponta em C.
Quando não houver confusão, diremos “cobertura” no lugar de “cobertura por nós”.

Lema 3.1 (condição necessária) Num grafo não-dirigido, se existe um emparelha-


mento com k ou mais arestas então toda cobertura tem k ou mais nós.

A validade desse lema é evidente. Segue do lema que uma cobertura pequena é um
certificado de inexistência de um emparelhamento grande. Mais precisamente, uma
cobertura com menos que k nós é um certificado de que o grafo não tem emparelha-
mento com k ou mais arestas. D. Kőnig [Kon] descobriu (1931) que a recíproca do lema
é verdadeira em grafos bipartidos:

Teorema 3.2 (condição suficiente) Num grafo não-dirigido bipartido, se toda cober-
tura tem k ou mais nós então existe um emparelhamento com k ou mais arestas.

E SBOÇO DA PROVA : Começamos por reduzir nosso problema ao problema de fluxo


máximo. Suponha que G é o grafo em questão e seja {P, Q} uma bipartição de G.
Construa uma rede capacitada (D, u) da seguinte maneira. O conjunto de nós do grafo
dirigido D é V (G)∪{r, s}, sendo r e s dois novos nós. Os arcos de D e suas capacidades
são definidos assim:
para cada p em P , há um arco rp com capacidade urp = 1;
para cada q em Q, há um arco qs com capacidade uqs = 1;
para cada aresta pq com p ∈ P e q ∈ Q, há um arco pq com capacidade upq = ∞.
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 45

Seja R um conjunto de nós que separa r de s em D (isto é, r ∈ R e s ∈


/ R) e suponha
que toda cobertura de G tem k ou mais nós. Vamos mostrar que u (R) ≥ k. Para isso,

considere o conjunto
(P r R) ∪ (Q ∩ R) .
Se esse conjunto é uma cobertura de G então nenhuma aresta tem uma ponta em P ∩ R
e outra em Q r R e portanto u− (R) = |P r R| + |Q ∩ R| ≥ k. Se (P r R) ∪ (Q ∩ R) não
é um cobertura de G então alguma aresta de G tem uma ponta em P ∩ R e outra em
Q r R, donde u− (R) = ∞ > k.
Em qualquer caso, u− (R) ≥ k para todo R que separa r de s. O teorema MFMC 2.9
garante então que a rede (D, u) tem um fluxo viável x tal que int(x) ≥ k. De acordo
com o teorema MFMC inteiro 2.10, podemos supor que x é inteiro e portanto binário.
O conjunto M das arestas pq de G tais que xpq = 1 é então é um emparelhamento.
Ademais, |M | = int(x) ≥ k.

É fácil deduzir do lema 3.1 e do teorema 3.2 o seguinte teorema min-max:

Teorema 3.3 (Kőnig) Em qualquer grafo não-dirigido bipartido tem-se maxM |M | =


minC |C|, sendo maxM tomado sobre todos os emparelhamentos M e minC tomado
sobre todas as coberturas C.

3.2 O problema do transporte


Uma rede de transporte é um objeto (D, P, Q, a, b) em que D é um grafo dirigido bipar-
tido, (P, Q) é uma bipartição de D, e a e b são vetores inteiros não-negativos indexados
por P e Q respectivamente (ou seja, a ∈ ZP+ e b ∈ ZQ + ).

Problema 3.B (do transporte) Dada uma rede de transporte (D, P, Q, a, b), encontrar
um vetor inteiro não-negativo (xe : e ∈ E(D)) tal que x− (p) ≤ ap para cada p em P e
x+ (q) = bq para cada q em Q.

(O significado das expressões x− (p) e x+ (q) foi definido na seção 2.1.)

E XEMPLO 3.3: Uma empresa tem um conjunto de fábricas de produzem pneus e um conjunto de
lojas que vendem esses pneus. Cada fábrica p é capaz de produzir no máximo ap pneus por mês
e cada loja q pede bq pneus por mês. Pneus podem ser levados da fábrica p para a loja q apenas se
houver um transportador apropriado ligando p a q. [CCPS fig.3.9]

Queremos saber se um dado conjunto de transportadores pode atender as demandas das lojas
respeitando as capacidades das fábricas.
46 3.2. O PROBLEMA DO TRANSPORTE FEOFILOFF

Diremos que um vetor x é viável se satisfaz as restrições do problema 3.B. Para discutir
as condições de existência de um vetor viável, precisamos da seguinte notação: para
qualquer C ⊆ Q, a vizinhança de C é o conjunto de todos os nós p em P para os quais
existe um arco pq com q em C. A vizinhança de C será denotada por N (C).2
P
Para
P qualquer subconjunto C de Q, seja b(C) a soma (bq : q ∈ C) e a(N (C)) a soma
(ap : p ∈ N (C)). A seguinte condição necessária é evidente:

Lema 3.4 (condição necessária) Se uma rede de transporte (D, P, Q, a, b) tem um vetor
viável então a(N (C)) ≥ b(C) para todo subconjunto C de Q.

Portanto, para provar que não existe vetor viável basta exibir C ⊆ Q tal que a(N (C)) <
b(Q). O seguinte teorema mostra que a condição necessária dada no lema 3.4 é também
suficiente:

Teorema 3.5 (condição suficiente) Em qualquer rede de transporte (D, P, Q, a, b), se


a(N (C)) ≥ b(C) para todo subconjunto C de Q então existe um vetor viável.

P ROVA : A prova é uma redução ao teorema MFMC inteiro 2.10. Construa uma rede de
fluxo (Ď, u, r, s) da seguinte maneira. O conjunto de nós de Ď é P ∪ Q ∪ {r, s}, sendo r
e s dois novos nós. O conjunto de arcos de Ď é definido assim:
para cada arco pq de D com p ∈ P e q ∈ Q, há um arco pq em Ď com upq = ∞;
para cada p em P , há um arco rp em Ď com urp = ap ;
para cada q em Q, há um arco qs em Ď com uqs = bq .
Suponha que a(N (C)) ≥ b(C) para todo subconjunto C de Q no grafo dirigido origi-
nal D; vamos mostrar que todo corte que separa r de s na rede (Ď, u, r, s) tem capaci-
dade pelo menos b(Q).
Seja R um conjunto de nós de Ď que separa r de s. A capacidade do corte ∂ˇ− (R) na
rede (Ď, u) é a soma de três parcelas: as capacidades dos arcos que vão de r a P r R,
as capacidades dos arcos que vão de Q ∩ R a s, e as capacidades dos arcos que vão de
P ∩ R a Q r R. Se algum arco vai de P ∩ R a Q r R então u− (R) = ∞ ≥ b(Q). Se
nenhum arco vai de P ∩ R a Q r R então N (Q r R) ⊆ P r R e portanto

u− (R) = a(P r R) + b(Q ∩ R)


≥ a(N (Q r R)) + b(Q ∩ R)
≥ b(Q r R) + b(Q ∩ R)
= b(Q) .

Assim, u− (R) ≥ b(Q) em ambos os casos. O teorema 2.10 garante agora que existe um
fluxo viável inteiro x̌ tal que int(x̌) ≥ b(Q) na rede (Ď, u, r, s). É claro que x̌rp ≤ ap para
cada p em P e
x̌qs ≤ bq (1)
2
A letra “N ” é a inicial de neighborhood (= vizinhança).
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 47

P P
para cada q em Q. Mas q∈Q x̌qs = int(x̌) ≥ b(Q) = q∈Q bq , e portanto o “≤” em (1)
vale com “=”. Logo, se x é a restrição de x̌ aos arcos de D então x− (p) ≤ ap para cada
p em P e x+ (q) = bq para cada q em Q. Ou seja, x é um vetor viável na rede (D, P, Q,
a, b).

3.3 O problema de Gale


Uma função-demanda em um grafo dirigido D é qualquer função que associa um
número real bv a cada nó v. Um fluxo x em D satisfaz uma função-demanda b se tem
excesso bv em cada nó v, ou seja, se

x+− (v) = bv

para cada nó v. (Assim, se bv < 0 então v é “produtor de fluxo” e se bv > 0 então v é


“consumidor de fluxo”.)

Problema 3.C Dada uma rede capacitada (D, u) e uma função-demanda b, encontrar
um fluxo que respeite as capacidades dos arcos e satisfaça b.

Uma rede (D, u) com função-demanda b pode ser denotada por (D, b, u). O conjunto
de nós de D será denotado por V . Para simplificar o palavreado, diremos que um fluxo
é viável se satisfaz b e respeita u.

E XEMPLO 3.4: Seja D o grafo dirigido com nós p i j q descrito abaixo por sua matriz de adjacências.
À direita da matriz, temos uma função-demanda b. Mais à direita, uma função-capacidade u.

p i j q b pi pj iq ji jq qp
p − 1 1 − +2 u 6 4 3 1 2 3
i − − − 1 −2 x 0 1 2 0 0 3
j − 1 − 1 +1
q 1 − − − −1

Abaixo de u na tabela temos um fluxo viável x na rede (D, b, u).

É fácil verificar que a seguinte condição é necessária para a existência de um fluxo


viável:

Lema 3.6 (condição necessária) Se uma rede (D, b, u) tem um fluxo viável então
b(V ) = 0 e b(X) ≤ u+ (X) para todo subconjunto X de V .

Assim, para tornar evidente que não existe fluxo viável basta mostrar que b(V ) 6= 0 ou
exibir um conjunto X tal que b(X) > u+ (X). A condição necessária descrita no lema é
conhecida como condição de Gale em referência a D. Gale [Gal], que mostrou (1957)
que a condição é também suficiente:
48 3.3. O PROBLEMA DE GALE FEOFILOFF

Teorema 3.7 (Gale) Em qualquer rede (D, b, u), se b(V ) = 0 e b(X) ≤ u+ (X) para
todo subconjunto X de V então existe um fluxo viável. Ademais, se b e u são inteiros,
essa mesma condição garante a existência de um fluxo viável inteiro.

P ROVA : A prova é uma redução ao teorema MFMC inteiro 2.10. Suponha que a rede
(D, b, u) satisfaz as condições do enunciado; vamos mostrar que existe um fluxo viável.
Seja P o conjunto dos nós para os quais b é negativo e Q o conjunto dos nós para os
quais b é positivo ou nulo. Seja (Ď, ǔ) a rede capacitada definida da seguinte maneira.
O conjunto de nós de Ď é V ∪ {r, s}, sendo r e s dois novos nós, e o conjunto de arcos
de Ď é definido assim:
para cada p em P , há um arco rp em Ď com ǔrp := −bp ;
para cada q em Q, há um arco qs em Ď com ǔqs := bq ;
para cada arco vw de D, há um arco vw em Ď com ǔvw := uvw .
Seja R um conjunto que separa r de s em Ď. A capacidade do corte ∂ˇ− (R) na rede
(Ď, ǔ) é a soma de três parcelas: as capacidades dos arcos que vão de r a P r R, as
capacidades dos arcos que vão de Q ∩ R a s, e as capacidades dos arcos que vão de
V ∩ R a V r R. Adote a notação X := V r R e observe que

ǔ− (R) = −b(P r R) + b(Q ∩ R) + u+ (X)


≥ −b(P r R) + b(Q ∩ R) + b(X)
= −b(P r R) + b(Q ∩ R) + b(P r R) + b(Q r R)
= b(Q ∩ R) + b(Q r R)
= b(Q) .

Concluímos assim que todo corte que separa r de s na rede (Ď, ǔ) tem capacidade pelo
menos b(Q). Segue daí, pelo teorema MFMC 2.9, que existe um fluxo viável x̌ na rede
(Ď, ǔ) tal que int(x̌) ≥ b(Q). Como int(x̌) = x̌+ (s) ≤ ǔ+ (s) = b(Q), todos os arcos
que entram em s estão cheios de fluxo e portanto x̌qs = bq para todo q em Q. Como
b(P ) = b(V ) − b(Q) = −b(Q), temos também x̌rp = −bp para todo p em P .
Seja x a restrição de x̌ à rede original (D, u). É claro que x respeita u. Resta mostrar que
x satisfaz b. Para cada q em Q temos x+− (q) = x̌+− (q) + x̌qs = x̌qs = bq . Analogamente,
x+− (p) = −bp para cada p em P . Portanto, x respeita b.
A segunda parte da prova é uma mera aplicação do teorema MFMC inteiro 2.10.

E XEMPLO 3.5: Para a rede (D, b, u) do exemplo 3.4, veja a rede auxiliar (Ď, ǔ) construída na prova
do teorema 3.7 (complete a figura):

r p i j q s r ri rq pi pj iq ji jq qp ps js
r − − 1 − 1 − i ǔ 2 1 6 4 3 1 2 3 2 1
p − − 1 1 − 1 x̌ 2 1 0 1 2 0 0 3 2 1
p q
i − − − − 1 −
j − − 1 − 1 1 j
q − 1 − − − − s
s − − − − − −

A tabela à direita mostra um fluxo viável x̌ de r a s na rede (Ď, ǔ).


FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 49

E XEMPLO 3.6: Seja (D, b, u) a rede definida abaixo (igual à do exemplo 3.4 exceto pelo valor de uqp ).

p i j q b pi pj iq ji jq qp
p − 1 1 − +2 u 6 4 3 1 2 2
i − − − 1 −2
j − 1 − 1 +1
q 1 − − − −1
Essa rede não tem fluxo viável porque o conjunto X := {p, j} não satisfaz a condição b(X) ≤ u+ (X).

Tal como apresentada acima, a condição de Gale é assimétrica. Mas ela equivale à
seguinte condição simétrica: −u− (X) ≤ b(X) ≤ u+ (X) para todo conjunto X de nós.

3.4 O problema de Hoffman


Algumas aplicações exigem que o fluxo em cada arco tenha um certo valor mínimo.
Essas restrições “por baixo” nos arcos podem ser convertidas em demandas nos nós,
transformando a aplicação em uma instância do problema de Gale da seção anterior.
Uma demanda nos arcos de um grafo dirigido é uma função l que associa um número
3
real não-negativo a cada arco do grafo (portanto, l ∈ RE + ). Dizemos que um fluxo x
no grafo satisfaz a demanda l se xe ≥ le para cada arco e.

Problema 3.D (circulação viável) Dada uma rede (D, l, u) em que l é uma demanda
nos arcos e u é uma função-capacidade, encontrar uma circulação que satisfaça l e
respeite u, ou seja, uma circulação x tal que l ≤ x ≤ u.

Para simplificar a conversa, diremos que uma circulação x é viável se l ≤ x ≤ u.

E XEMPLO 3.7: Seja D o grafo dirigido com nós p i j q descrito abaixo por sua matriz de adjacências.
As funções l e u e uma circulação viável x são dados à direita da matriz:
p i j q pi pj iq ji jq qp
p − 1 1 − u 7 5 3 2 3 3
i − − − 1 x 1 2 2 1 1 3
j − 1 − 1 l 1 1 0 1 1 0
q 1 − − −

Uma condição necessária para a existência de uma circulação viável é intuitiva:

Lema 3.8 (condição necessária) Se uma rede (D, l, u) tem uma circulação viável então
l ≤ u e l− (X) ≤ u+ (X) para cada conjunto X de nós.

(O significado das expressões l− (X) e u+ (X) foi definido na seção 2.1.) Assim, para
tornar evidente que não existe circulação viável basta exibir um arco e tal que le > ue
ou exibir um conjunto X de nós tal que l− (X) > u+ (X). A condição necessária dada
no lema 3.8 é conhecida como condição de Hoffman. A. J. Hoffman4 [Hof] mostrou
(1960) que essa condição é suficiente:
3
A letra l é a inicial de lower bound.
4
Não confunda com D.A. Huffman, inventor do código de Huffman.
50 3.4. O PROBLEMA DE HOFFMAN FEOFILOFF

Teorema 3.9 (Hoffman) Para qualquer rede (D, l, u), se l ≤ u e l− (X) ≤ u+ (X) para
todo subconjunto X de V (D) então existe uma circulação viável. Ademais, se l e u são
inteiros, essa mesma condição garante a existência de uma circulação viável inteira.

P ROVA : A prova é uma redução do teorema de Gale 3.7. Suponha que a rede (D, l, u)
satisfaz a condição do teorema. Para mostrar que existe uma circulação viável x, usa-
remos o teorema de Gale com −l−+ no papel da função-demanda e a diferença u − l no
papel da função-capacidade.
Comece por observar que l é um fluxo em D e considere o excesso l−+ (v) de fluxo em
cada nó v. Em virtude do lema 2.1 do capítulo 2,
− l−+ (V ) = 0 . (2)
Agora considere a hipótese l− (X) ≤ u+ (X). Se subtrairmos l+ (X) dos dois lados da
desigualdade teremos
− l−+ (X) ≤ (u − l)+ (X) . (3)

Nossa rede (D, l, u) pode ser vista como uma instância (D, b, ǔ) do problema de Gale
com b e ǔ definidos assim:
b := −l−+ e ǔ := u − l .
O parâmetro b é uma função-demanda. Como l ≤ u, o parâmetro ǔ é uma função-
capacidade. Graças a (2) e (3), a rede (D, b, ǔ) satisfaz a condição de Gale:
b(V ) = 0 e b(X) ≤ ǔ+− (X)
para cada X ⊆ V . O teorema de Gale garante então que a rede (D, b, ǔ) tem um fluxo
x̌ tal que x̌+− = b e x̌ ≤ ǔ. Para retornar à rede original (D, l, u), considere o fluxo
x := x̌ + l (trata-se de um fluxo pois x̌ ≥ 0 e l ≥ 0). É claro que l ≤ x ≤ ǔ + l = u.
Ademais, x é uma circulação pois
x+− (v) = x̌+− (v) + l−+ (v) = bv + l−+ (v) = −l−+ (v) + l−+ (v) = 0
para cada nó v. Em suma, x é uma circulação viável, como queríamos provar.

E XEMPLO 3.8: Veja a rede (D, b, ǔ) construída na prova do teorema 3.9 a partir da rede (D, l, u) do
exemplo 3.7:
b pi pj iq ji jq qp
p +2 ǔ 6 4 3 1 2 3
i −2 x̌ 0 1 2 0 0 3
j +1
q −1
A tabela à direita também mostra um fluxo x̌ que satisfaz b e respeita ǔ. Essa rede (D, b, ǔ) é igual
à rede (D, b, u) do exemplo 3.6.

E XEMPLO 3.9: A rede (D, l, u) a descrita abaixo é igual à rede do exemplo 3.7 exceto por uqp . A
rede não tem circulação viável pois o conjunto X := {p, j} não satisfaz a condição l− (X) ≤ u+ (X).
p i j q pi pj iq ji jq qp
p − 1 1 − l 1 1 0 1 1 0
i − − − 1 u 7 5 3 2 3 2
j − 1 − 1
q 1 − − −
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 51

Vale a seguinte generalização comum dos teoremas de Gale 3.7 e Hoffman 3.9:

Teorema 3.10 Seja D := (V, E) um grafo dirigido, b uma função de V em R, l uma


função de E em R+ , e u uma função de E em R+ ∪ {∞}. A rede (D, b, l, u) tem um
fluxo x tal que x+− = b e l ≤ x ≤ u se e somente se

l≤u e b(X) + l− (X) ≤ u+ (X)

para todo subconjunto X de V . Ademais, se b, l e u são inteiros, a mesma condição


garante a existência de um fluxo x inteiro com as propriedades enunciadas.

3.5 Fluxo mínimo


O problema 2.A do fluxo máximo (veja o capítulo 2) procura um fluxo de intensidade
máxima que respeite as capacidades dos arcos. Se trocarmos “capacidades dos arcos”
por “demandas nos arcos” e “intensidade máxima” por “intensidade mínima” seremos
levados a considerar o seguinte problema:

Problema 3.E Dados nós r e s de um grafo dirigido D, uma função l de E(D) em R+ ,


e um número k ≥ 0, encontrar um fluxo x de r a s tal que

x≥l e int(x) ≤ k .

(Como de hábito, a expressão “fluxo x de r a s” significa que x+− (s) ≥ 0 e x+− (v) = 0 para
cada v diferente de r e de s.) Para simplificar o palavreado, diremos que um fluxo x
numa rede (D, l, r, s) é k-viável se vai de r a s e satisfaz as condições x ≥ l e int(x) ≤ k.
Nosso problema consiste então em encontrar um fluxo k-viável.

E XEMPLO 3.10: Seja D o grafo dirigido com nós p i j q descrito abaixo por uma matriz de
adjacências. O nó inicial é p e o nó final é q. A função l e um fluxo x ≥ l de p a q são dados à
direita da matriz. O fluxo x é 3-viável.

p i j q pi pj iq ji jq
r=p − 1 1 − l 1 1 0 1 1
i − − − 1 x 1 2 2 1 1
j − 1 − 1
s=q − − − −

Para formular condições de existência de um fluxo k-viável, vamos recorrer aos cortes
dirigidos que separam r de s. (Como se sabe, um corte ∂ − (X) é dirigido se ∂ + (X) = ∅.)
É fácil verificar a seguinte condição necessária:

Lema 3.11 (condição necessária) Se uma rede (D, l, r, s) tem um fluxo k-viável então
l− (X) ≤ k para todo corte dirigido ∂ − (X) que separa r de s.
52 3.5. FLUXO MÍNIMO FEOFILOFF

Essa condição necessária é também suficiente se restringirmos a atenção às redes fonte-


sorvedouro. Uma rede (D, l, r, s) é fonte-sorvedouro se

D é um DAG, r é a única fonte de D, e s é o único sorvedouro de D.

Todo arco de uma tal rede pertence a algum caminho dirigido de r a s. Numa rede
fonte-sorvedouro, existe algum fluxo x de r a s tal que x ≥ l. Como não existe caminho
dirigido de s a r, um fluxo x ≥ l não pode ter intensidade arbitrariamente pequena.

Teorema 3.12 (condição suficiente) Dada uma rede fonte-sorvedouro (D, l, r, s) e um


número k ≥ 0, se
l− (X) ≤ k
para todo corte dirigido ∂ − (X) que separa r de s, então a rede tem um fluxo k-viável.
Ademais, se l é inteiro então existe um fluxo k-viável inteiro.

P ROVA : A prova é uma redução ao teorema de Hoffman 3.9. Suponha que a condição
enunciada está satisfeita. Seja E o conjunto de arcos de D. Construa um grafo dirigido
Ď acrescentando um novo arco sr a D e seja Ě o conjunto de arcos de Ď. Seja ˇl a função
de Ě em R+ definida por ˇlsr = 0 e ˇle = le para cada e em E. Seja ǔ a função-capacidade
definida em Ě pelas seguintes propriedades:

ǔsr = k e ǔe = ∞ para cada e em E.

Mostraremos a seguir que a rede (Ď, ˇl, ǔ) satisfaz a condição de Hoffman. É claro que
l ≤ u. Resta mostrar que ˇl− (X) ≤ ǔ+ (X) para todo subconjunto X de V (Ď). Há três
casos a considerar, dependendo dos valores de ∂ − (X) e ∂ + (X) em D:
• Se ∂ + (X) = ∂ − (X) = ∅ em D então ˇl− (X) = 0 ≤ ǔ+ (X) onde quer que o arco sr
esteja em relação a X.
• Se ∂ + (X) 6= ∅ então ˇl− (X) ≤ ǔ+ (X) pois algum arco de D entra em X e portanto
ǔ+ (X) = ∞.
• Suponha agora que ∂ + (X) = ∅ e ∂ − (X) 6= ∅. Seja e um arco de D que sai de X.
Como a rede é fonte-sorvedouro, e pertence a algum caminho dirigido de r a s.
Como o corte ∂ − (X) é dirigido, temos r ∈ X e s ∈ / X, ou seja, X separa r de s.
+ ˇ
Logo l (X) ≤ u (X), e portanto l (X) = l (X) ≤ u+ (X) ≤ ǔ+ (X).
− − −

Como ˇl− (X) ≤ ǔ+ (X) para todo subconjunto X de V (Ď), o teorema de Hoffman 3.9
garante que a rede (Ď, ˇl, ǔ) tem uma circulação viável, digamos x̌. A restrição de x̌ ao
conjunto E de arcos é um fluxo x de r a s em D. Ademais, x ≥ l e int(x) ≤ ǔsr = k. Em
outras palavras, x é um fluxo k-viável.

E XEMPLO 3.11: Para a rede (D, l, r, s) do exemplo 3.10, eis a rede (Ď, ˇl, ǔ) construída na prova do
teorema 3.12:
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 53

p i j q pi pj iq ji jq qp
r=p − 1 1 − ˇl 1 1 0 1 1 0
i − − − 1 ǔ ∞ ∞ ∞ ∞ ∞ 3
j − 1 − 1 x̌ 1 2 2 1 1 3
s=q 1 − − −

(A rede (Ď, ˇl, ǔ) só difere da rede do exemplo 3.7 porque ǔ é diferente.) A última linha da tabela dá
uma circulação x̌ tal que ˇl ≤ x̌ ≤ ǔ.

E XEMPLO 3.12: Para verificar que não existe fluxo 2-viável na rede do exemplo 3.10, tome o con-
junto X := {p, j} e observe que o corte dirigido ∂ − (X) separa r de s e que l− (X) > 2.

É fácil deduzir do lema 3.11 e do teorema 3.12 o seguinte teorema min-max:

Teorema 3.13 (min-flow max-cut) Em toda rede fonte-sorvedouro (D, l, r, s) tem-se

minx int(x) = maxX l− (X) ,

sendo minx tomado sobre todos os fluxos x de r a s tais que x ≥ l e sendo maxX tomado
sobre todos os cortes dirigidos ∂ − (X) que separam r de s. Ademais, se l é inteiro então
a igualdade min-max é satisfeita por um fluxo x que é inteiro.

3.6 Coberturas por caminhos


O teorema 3.13 do fluxo mínimo tem duas consequências interessantes que envolvem
coberturas de grafos dirigidos por caminhos dirigidos.
Uma cobertura dos arcos (por caminhos dirigidos) de um grafo dirigido D é uma
coleção de caminhos dirigidos tal que cada arco de D pertence a pelo menos um dos
caminhos da coleção. Uma cobertura dos arcos é mínima se nenhum outra tem menos
caminhos.

Problema 3.F Encontrar uma cobertura mínima (por caminhos dirigidos) dos arcos de
um grafo.

O objeto dual de uma cobertura dos arcos é um corte dirigido. Um corte dirigido num
grafo é máximo se nenhum outro tem mais arcos.

Problema 3.G Encontrar um corte dirigido máximo em um grafo dirigido.

E XEMPLO 3.13: Seja D o grafo dirigido que tem nós r s t u v w e os arcos indicados na tabela
abaixo. Os caminhos (r, t, u, v), (t, v), (r, u, w) e (s, u, w) constitutem uma cobertura mínima dos
arcos de D. A segunda linha da tabela é o vetor característico de um corte dirigido máximo.

rt ru su tu tv uv uw
0 1 1 1 1 0 0
54 3.6. COBERTURAS POR CAMINHOS FEOFILOFF

É evidente que, em qualquer grafo dirigido, para qualquer cobertura P e qualquer


corte dirigido C, temos |P| ≥ |C|. Se vale a igualdade, a cobertura é mínima e o corte
é máximo. O seguinte teorema mostra que a recíproca dessa afirmação é verdadeira
em DAGs.

Teorema 3.14 Em qualquer DAG, uma cobertura mínima dos arcos (por caminhos di-
rigidos) tem o mesmo tamanho que um corte dirigido máximo.

P ROVA : A prova é uma redução ao teorema 3.13 do fluxo mínimo e corte máximo.
Como já observamos, |P| ≥ |C| para qualquer cobertura P e qualquer corte dirigido C.
Resta mostrar que |P| = |C| para alguma P e algum C.
Seja D o DAG em questão. Construa um grafo dirigido Ď da seguinte maneira. O
conjunto de nós de Ď é V (D) ∪ {r, s}, sendo r e s dois novos nós. Todos os arcos de D
também são arcos de Ď. Além disso, Ď tem um arco rv para cada fonte v de D e um
arco ws para cada sorvedouro w de D. É claro que Ď é um DAG, que r é a única fonte
de Ď, e que s é o único sorvedouro de Ď. Portanto, a rede (Ď, r, s) é fonte-sorvedouro
no sentido da seção 3.5.
Seja l a função-demanda definida sobre os arcos de Ď pelas seguintes propriedades:
le = 1 para cada e em E(D) e lf = 0 para cada f em E(Ď) r E(D). Na rede (Ď, l, r, s),
seja x um fluxo de intensidade mínima dentre aqueles que vão de r a s e satisfazem
x ≥ l. Seja ∂ − (X) um corte dirigido que maximiza l− (X) dentre os cortes dirigidos que
separam r de s. De acordo com o teorema 3.13,

int(x) = l− (X) .

Denote por X−r o conjunto X r {r}. No grafo D, temos |∂ − (X−r)| = l− (X), donde

int(x) = |∂ − (X−r)|.

De acordo com o adendo do teorema 3.13, podemos supor que x é inteiro. Mais que
isso, podemos supor que x é binário. Logo, o fluxo x pode ser decomposto em int(x)
caminhos dirigidos simples em Ď, todos de r a s, conforme o lema 2.5 do capítulo 2.
Digamos que P1 , . . . , Pk são os caminhos da decomposição, com k = int(x). Como
x ≥ l, cada arco de D pertence a algum dos caminhos. Cada Pi induz um caminho
dirigido Qi em D. O conjunto {Q1 , . . . , Qk } de caminhos é uma cobertura dos arcos
de D. Ademais, o número de caminhos é k = |∂ − (X−r)| e ∂ − (X−r) é um corte dirigido
em D.

3.6.1 Teorema de Dilworth

Uma cobertura dos nós5 (= dipath cover) de um grafo dirigido D é uma coleção de
caminhos dirigidos tal que cada nó de D pertence a pelo menos um dos caminhos da
coleção. Uma cobertura dos nós é mínima se nenhuma outra tem menos caminhos.
5
Não confunda com o conceito de cobertura por nós da seção 3.1.
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 55

Problema 3.H Encontrar uma cobertura mínima dos nós de um grafo dirigido.

O dual de uma cobertura dos nós é uma anticadeia. Uma anticadeia (= antichain) é
qualquer conjunto B de nós tal que não existe caminho dirigido com origem e término
em dois nós distintos de B. Uma anticadeia é máxima se nenhuma outra tem mais nós.

Problema 3.I Encontrar uma anticadeia máxima num grafo dirigido.

E XEMPLO 3.14: A primeira figura mostra uma anticadeia em um DAG. (Veja os nós marcados
com 3.) Cada traço na figura representa um arco dirigido “de cima para baixo”. A segunda figura
mostra uma cobertura dos nós do DAG. A anticadeia tem 6 nós e a cobertura tem 6 caminhos.

Em qualquer grafo dirigido, para qualquer cobertura P dos nós e qualquer antica-
deia B, é claro que |P| ≥ |B|. Se vale a igualdade, a cobertura é mínima e a anticadeia
é máxima. R. P. Dilworth [Dil] mostrou (1950) que a recíproca dessa afirmação é ver-
dadeira quando o grafo é um DAG.6

Teorema 3.15 (Dilworth) Em qualquer DAG, uma cobertura mínima dos nós tem o
mesmo tamanho que uma anticadeia máxima.

P ROVA : A prova é uma redução ao teorema 3.13 do fluxo mínimo e corte máximo.
Como já observamos, |P| ≥ |B| para qualquer cobertura P e qualquer anticadeia B.
Resta mostrar que |P| = |B| para alguma P e alguma B.
Seja D o DAG em questão. Construa um grafo dirigido Ď da seguinte maneira. Para
cada nó v de D, o grafo Ď tem dois nós, v1 e v2 ,

ligados por um v1 v2 .

Para cada arco vw de D, o grafo Ď tem um arco v2 w1 . Além disso, Ď tem dois novos
nós, r e s, um arco rv1 para cada fonte v de D, e um arco w2 s para cada sorvedouro w
de D. Os arcos da forma v1 v2 serão chamados especiais; eles representam os nós de D.
A rede (Ď, r, s) é fonte-sorvedouro no sentido da seção 3.5.
Defina uma função-demanda l sobre os arcos de Ď da seguinte maneira: le = 1 se e é
um arco especial e le = 0 em caso contrário. O teorema 3.13, aplicado à rede (Ď, l, r, s),
garante que existe um fluxo x de r a s tal que x ≥ l e existe um corte dirigido ∂ − (X)
que separa r de s tal que
int(x) = l− (X) .
6
Dilworth provou o teorema no contexto de ordens parciais. Aqui, o teorema foi traduzido para
DAGs.
56 3.7. EXERCÍCIOS FEOFILOFF

Seja B o conjunto dos nós de D que X “quebra”, isto é, o conjunto dos nós v de D tais
que X separa v1 de v2 em Ď. Observe que |B| = l− (X) e portanto
int(x) = |B| .
Imagine agora, por um momento, que B não é uma anticadeia. Então existe um cami-
nho dirigido em D que vai de um nó v de B a outro nó w de B. Em Ď, esse caminho
corresponde a um caminho dirigido que vai de v2 a w1 . Portanto, o caminho começa
em V (Ď) r X e termina em X, e assim tem um arco em ∂ + (X). Mas isso é impossível,
pois o corte ∂ − (X) é dirigido. Essa contradição mostra que B é uma anticadeia.
De acordo com o adendo do teorema 3.13, podemos supor que x é inteiro. Mais que
isso, podemos supor que x é binário. Logo, de acordo com o lema 2.5, o fluxo x pode
ser decomposto em int(x) caminhos dirigidos simples em Ď, todos de r a s. Sejam
P1 , . . . , Pk esses caminhos, com k = int(x). É claro que cada arco especial de Ď pertence
a algum dos caminhos. Cada Pi induz um caminho dirigido Qi em D. O conjunto
{Q1 , . . . , Qk } de caminhos é uma cobertura dos nós de D. Ademais, o número de
caminhos é |B|.

3.7 Exercícios
Seção 3.1
3.1 ? Prove o lema 3.1. Note que o lema vale em qualquer grafo não-dirigido, mesmo que não seja
bipartido.
3.2 Mostre que um emparelhamento máximo num grafo não-dirigido pode ser menor que uma co-
bertura mínima. (Um emparelhamento M é máximo se não existe emparelhamento M 0 tal que
|M 0 | > |M |. Uma cobertura C é mínima se não existe cobertura C 0 tal que |C 0 | < |C|.)
3.3 ? Complete os detalhes da prova do teorema 3.2.
3.4 Na prova do teorema 3.2, por que não adotar a função-capacidade u = 1? Por que não definir as
capacidades assim: upq = 1 para cada aresta pq de G, urp = ∞ para cada p em P e uqs = ∞ para
cada q em Q?
3.5 Encontre um emparelhamento máximo e uma cobertura mínima no grafo da figura.

3.6 ? Algoritmo. Mostre como podemos usar o algoritmo de Ford–Fulkerson (veja a seção 2.6) para
resolver o problema 3.A. Mais precisamente, descreva um algoritmo que receba um grafo não-
dirigido G com bipartição {P, Q} e um número k e devolva (a) um emparelhamento M com pelo
menos k arestas ou (b) uma cobertura com menos que k nós.
3.7 Prove o teorema 3.3 a partir do teorema 3.2 e do lema 3.1.
3.8 Emparelhamentos perfeitos. Um emparelhamento é perfeito se incide em cada nó do grafo. Um grafo
não-dirigido é k-regular se todos os seus nós têm grau k. Dado um inteiro k ≥ 1, prove que todo
grafo bipartido k-regular tem um emparelhamento perfeito. Deduza daí que todo grafo bipartido
k-regular tem k emparelhamentos perfeitos disjuntos entre si. [CCPS 3.23]
3.9 Mostre que as conclusões do exercício 3.8 são falsas se “grau k” for trocado por “grau pelo me-
nos k”. [CCPS 3.24]
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 57

3.10 Cobertura por caminhos curtos. Um conjunto X de nós de um grafo não-dirigido é independente se
nenhuma aresta tem ambas as pontas em X. Uma cobertura de um grafo por caminhos curtos é uma
coleção de caminhos de comprimento ≤ 1 tal que todo nó do grafo está em pelo menos um dos
caminhos da coleção. Prove que num grafo não-dirigido bipartido qualquer conjunto independente
máximo tem o mesmo tamanho que uma cobertura mínima por caminhos curtos. (Dica: Use o
teorema de Kőnig.)
3.11 Teorema de Menger dirigido. Num grafo dirigido, dois caminhos dirigidos são internamente disjuntos
se os únicos nós que eles têm em comum são o primeiro e o último. Dados nós r e s de um grafo
dirigido D, um subconjunto S de V (D) r {r, s} isola r de s se não existe caminho dirigido de r a s
em D r S. Prove o seguinte teorema de K. Menger [Men] (1927): o número máximo de caminhos
dirigidos de r a s que são internamente disjuntos é igual ao tamanho de um conjunto de nós que
isola r de s. [CCPS 3.42]
3.12 Teorema de Menger não-dirigido. Enuncie e prove um resultado análogo ao teorema de Menger (veja
o exercício 3.11) para grafos não-dirigidos. [CCPS 3.43]
3.13 Programa linear para emparelhamento. Seja G um grafo não-dirigido em que cada aresta e tem um
custo ce . Queremos encontrar um emparelhamento de custo máximo. Formule o problema como
um pl e calcule o seu dual. Descreva o dual como um problema combinatório sobre G.
3.14 Programa linear para cobertura. Seja G um grafo não-dirigido em que cada nó v tem um peso bv .
Queremos encontrar uma cobertura de peso mínimo. Formule o problema como um pl e calcule o
seu dual. Descreva o dual como um problema combinatório sobre G. [CCPS 3.17]

Seção 3.2
3.15 Mostre que as condições a(P ) ≥ b(Q) e a(N (Q) ≥ b(Q) não são suficientes para a existência de um
vetor viável no problema 3.B.
3.16 ? Prove o lema 3.4.
3.17 Complete os detalhes da prova do teorema 3.5.
3.18 ? Algoritmo. Mostre como podemos usar o algoritmo de Ford–Fulkerson (veja a seção 2.6) para
resolver o problema 3.B. Mais precisamente, descreva um algoritmo que receba uma rede de trans-
porte (D, P, Q, a, b) e devolva (i) uma solução x para a rede ou (ii) um subconjunto C de Q tal que
a(N (C)) < b(C).
3.19 Programa linear. Formule o problema 3.B como um programa linear. Escreva o dual do pl.

Seção 3.3
3.20 ? Prove o lema 3.6.
3.21 ? Versão simétrica da condição de Gale. Mostre que a condição de Gale é equivalente à seguinte:
−u− (X) ≤ b(X) ≤ u+ (X) para todo X ⊆ V .
3.22 Deduza o teorema MFMC 2.9 do teorema de Gale 3.7 e do lema 3.6.
3.23 ? Rede sem capacidades. Seja b uma função-demanda em um grafo dirigido D := (V, E). Mostre que
a rede (D, b) tem um fluxo que satisfaz b se e somente se b(V ) = 0 e b(X) ≤ 0 para todo X ⊆ V tal
que ∂ + (X) = ∅. (Dica: Enuncie e prove em separado a parte “se” e a parte “somente se”.)
3.24 ? Árvore orientada sem capacidades. Seja (T, b) uma rede em que T é uma árvore orientada e b uma
função-demanda. Descreva informalmente um algoritmo que receba T e b e calcule um fluxo em T
que satisfaça b ou decida que um tal fluxo não existe. (Sugestão: faça um algoritmo recursivo que
começa pelas folhas da árvore.)
3.25 Árvore orientada sem capacidades. Seja (T, b) uma rede em que T é uma árvore orientada e b uma
função-demanda. Dê uma condição necessária e suficiente para que (T, b) tenha um fluxo que
58 3.7. EXERCÍCIOS FEOFILOFF

satisfaz b. Estabeleça a relação entre essa condição e a condição de Gale.


3.26 Problema de Gale em árvore orientada. Seja (T, b, u) uma rede capacitada com demandas em que
T é uma árvore orientada. Descreva informalmente um algoritmo que encontre um fluxo viável
em (T, b, u). Dê uma condição necessária e suficiente para que (T, b, u) tenha um fluxo viável.
Estabeleça a relação entre essa condição e a condição geral de Gale.
3.27 Seja r um nó de um grafo dirigido D com n nós. Seja b a função-demanda definida por br = −n + 1
e bv = +1 para cada v 6= r. Dê uma condição necessária e suficiente para que a rede (D, b) tenha
um fluxo que satisfaz b.
3.28 Encontre um fluxo viável na rede (D, b, u) descrita a seguir. Os nós são r a b c d s e as tabelas
definem as funções b e u:

r a b c d s ra rb ac bd cs ds sr
b +3 +2 +2 −1 −3 −3 u 8 7 6 5 7 8 6

3.29 ? Prova direta do teorema de Gale. Prove oP


teorema de Gale sem usar o teorema MFMC 2.9. (Dica: A
discrepância de um fluxo x é o número i∈V |bi − x+ − (i)|. Use caminhos de aumento, como os da
seção 2.4, para diminuir a discrepância de x.)
3.30 Algoritmo. Escreva um algoritmo que receba uma rede (D, b, u) com função-capacidade u e função-
demanda b e devolva (i) um fluxo viável x ou (ii) um subconjunto X de V que viola a condição de
Gale. Seu algoritmo deve invocar o algoritmo de Ford–Fulkerson (veja a seção 2.6).
3.31 ? Programa linear. Formule o problema de Gale como um pl. Maximize a função-objetivo 0x.
Escreva o dual da relaxação linear do pl. Repita com função-objetivo 1x. Repita com “minimize”
no lugar de “maximize”.
3.32 ? Grafo dirigido bipartido. Seja D um grafo dirigido e (P, Q) uma bipartição de V (D). Suponha que
todo arco de D tem ponta inicial em P e ponta final em Q. Considere o problema de encontrar um
fluxo x tal que x− (p) = 1 para cada p em P e x+ (p) = 1 para cada q em Q. Mostre que um tal fluxo
existe se e somente se |X ∩ Q| − |X ∩ P | ≤ |E(P r X, X ∩ Q| e |X ∩ P | − |X ∩ Q| ≤ |E(X ∩ P, Q r X)|
para todo X ⊆ V (D), sendo E(A, B) o conjunto dos arcos que têm uma ponta em A e a outra em B.
3.33 Subgrafo bipartido com prescrição de graus. Seja G um grafo não-dirigido bipartido. Suponha dado
um inteiro não-negativo dv para cada nó v de G. Queremos encontrar E 0 ⊆ E(G) tal que o grau
de cada nó v em no grafo (V (G), E 0 ) seja dv . Descreva um algoritmo para o problema. Dê uma
condição necessária e suficiente para que o problema tenha solução. Discuta o caso particular do
problema em que d é constante. [CCPS 3.18]
3.34 Síntese de grafo dirigido. Sejam α1 , . . . , αn e β1 , . . . , βn números inteiros não-negativos. Queremos
construir um grafo dirigido com conjunto de nós {v1 , . . . , vn } tal que cada nó vi tem grau de saída
αi e grau de entrada βi . Mostre como resolver o problema. [AMO 8.13]
3.35 Grafo dirigido euleriano.7 Dado um grafo dirigido D, encontrar um conjunto de arcos cuja inversão
(isto é, troca de vw por wv) resulte em um grafo dirigido Ď tal que |∂ˇ+ (v)| = |∂ˇ− (v)| para cada nó v.
Dê uma condição necessária e suficiente para que o problema tenha solução. [CCPS 4.5]
3.36 Orientação de grafo não-dirigido. Dado um grafo não-dirigido G e um inteiro não-negativo k, que-
remos transformar cada aresta de G em um arco de tal forma que no grafo dirigido resultante o
grau de saída de cada nó seja no máximo k (isto é, |∂ − (v)| ≤ k para todo nó v). Dê uma condição
necessária e suficiente para que uma instância desse problema tenha solução. Dê um algoritmo
para o problema. [CCPS 3.34]
3.37 Orientação de grafo não-dirigido. Seja G := (V, E) um grafo não-dirigido e a uma função de V em Z+ .
Queremos obter uma orientação D de G tal que o grau de entrada de todo nó v seja av . Mostre que
o problema tem solução se e somente se iG (X) ≤ a(X) ≤ eG (X) para todo X ⊆ V . Aqui, eG (X) é o
número de arestas de G com pelo menos uma ponta em X e iD (X) o número de arestas de G com
ambas as pontas em X. (A letra “i” é a inicial de “internas” e a letra “e” é a inicial de “externas”.)

7
O adjetivo “euleriano” é uma referência a L. Euler [Eul].
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 59

Mostre também que a condição para a existência de solução pode ser formulada assim: a(V ) = |E|
e iG (X) ≤ a(X) para todo X ⊆ V . [CCPS 3.34]
3.38 Torneio viável. Imagine um torneio de tênis com n participantes. Suponha que cada participante
joga exatamente uma partida com cada um dos outros e suponha que não há empates. Seja di
o número de derrotas do tenista i. Dê uma condição necessária e suficiente para que um dado
vetor (d1 , . . . , dn ) represente um torneio. Dê um algoritmo que decida se (d1 , . . . , dn ) representa
um torneio. [CCPS 3.35]
3.39 Problema generalizado do transporte. Temos p fábricas, todas produzindo um mesmo produto, e q
consumidores que usam o produto. Todo mês, a fábrica i é capaz de produzir no máximo ai tone-
ladas e o consumidor j consome exatamente bj toneladas. Podemos levar no máximo uij toneladas
por mês da fábrica i ao consumidor j. É possível satisfazer as demandas dos consumidores?

Seção 3.4
3.40 Mostre que as partes “l ≤ u” e “l− (X) ≤ u+ (X)” da condição de Hoffman são independentes.
3.41 Seja D := (V, E) um grafo dirigido que consiste em um ciclo dirigido simples e nada mais. Sejam l e
u duas funções de E em R+ . Parte 1: Supondo que existe uma circulação x tal que l ≤ x ≤ u, mostre
que max (le : e ∈ E) ≤ min (ue : e ∈ E). Parte 2: Supondo que max (le : e ∈ E) > min (ue : e ∈ E),
mostre que a rede (D, l, u) viola a condição de Hoffman.
3.42 ? Prove o lema 3.8.
3.43 Encontre uma circulação viável na rede (D, l, u) descrita a seguir. Os nós são r a b c d s e a tabela
dá os arcos e as funções l e u:

ra rb ac bd cs ds sr
l 1 2 3 4 2 1 0
u ∞ ∞ ∞ ∞ ∞ ∞ 6
3.44 Encontre uma circulação viável na rede (D, l, u) descrita a seguir. Os nós são r a b c d s e a tabela
dá os arcos e as funções l e u:
ra rc ab dc bs ds sr
l 1 1 1 1 1 1 0
u 9 9 9 9 9 9 8
3.45 Seja (D, l, u) uma rede acíclica em que l 6= 0 e l ≤ u. Deduza da condição de Hoffman que não
existe circulação viável em (D, l, u).
3.46 Seja (D, l, u) uma rede em que l ≤ u. Use a condição de Hoffman para provar a seguinte proposição:
se l+ (X) ≤ u− (X) para todo conjunto X de nós então a rede tem uma circulação viável.
3.47 Um ciclo dirigido num grafo dirigido é euleriano 8 se passa por cada arco e cada nó do grafo. (Por
definição, ciclos não têm arcos repetidos. Portanto, um ciclo euleriano passa exatamente uma vez
por cada arco; mas pode passar mais de uma vez por cada nó. Um ciclo euleriano dirigido é o
trajeto ideal de um caminhão de coleta de lixo.) Mostre que um grafo dirigido D tem um ciclo
dirigido euleriano se e somente se D é conexo e |∂ + (v)| = |∂ − (v)| para cada nó v. [CCPS 4.4]
3.48 Seja (D, l, u) uma rede em que le > 0 e ue = ∞ para cada arco e. Mostre que a rede tem uma
circulação viável se e somente se D é fortemente conexo (ou seja, para cada par (r, s) de nós existe
um caminho dirigido de r a s e um caminho dirigido de s a r). (Dica: Enuncie e prove em separado
a parte “se” e a parte “somente se”.) [AMO 3.53]
3.49 Prove o teorema 3.10, que generaliza os teoremas de Gale e Hoffman.

8
Referência a L. Euler [Eul].
60 3.7. EXERCÍCIOS FEOFILOFF

Seção 3.5
3.50 Mostre que toda rede fonte-sorvedouro (D, l, r, s) tem um fluxo x de r a s (possivelmente de grande
intensidade) tal que x ≥ l.
3.51 É verdade que toda rede dotada de k-fluxo é fonte-sorvedouro?
3.52 Prove o lema 3.11.
3.53 Aponte os detalhes obscuros da prova do teorema 3.12 do fluxo mínimo. Complete esses detalhes.
3.54 Encontre um fluxo 9-viável na rede (D, l, r, s) que tem nós r a b s e as demandas nos arcos dadas
na tabela.
ra as sb br
l 1 1 1 1
3.55 Considere a rede (D, l, r, s) que tem nós r a b c d s e os arcos dados abaixo. Encontre um fluxo
7-viável. Encontre um fluxo 6-viável.

ra rb ac bd cs ds
l 1 2 3 4 2 1
3.56 Considere a rede (D, l, r, s) que tem nós r a b c d s e os arcos dados abaixo. Encontre um fluxo
viável de intensidade ≤ 9.
ra rc ab dc bs ds
l 1 1 1 1 1 1
3.57 Considere a rede (D, l, r, s) com nós r a b s e os arcos e demandas dados na tabela. Existe fluxo
2-viável de r a s? Existe fluxo 1-viável de r a s?

ra ar ab bs sb
l 2 0 1 3 0
3.58 Fluxo mínimo versus corte máximo. Prove o teorema 3.13.
3.59 Programas lineares. Formule os pl’s que representam o problema do fluxo mínimo e o do corte
dirigido máximo. (Veja o exercício 3.58.)

Seção 3.6
3.60 ? Seja D um digrafo e P uma cobertura (por caminhos dirigidos) dos arcos de D. Seja ∂ − (X) um
corte dirigido em D. Prove diretamente que |P| ≥ |∂ − (X)|.
3.61 ? Seja D um digrafo e P uma cobertura (por caminhos dirigidos) dos nós de D. Seja B uma
anticadeia em D. Prove diretamente que |P| ≥ |B|.
3.62 Desenhe uma árvore radicada com 8 ou mais nós. Encontre uma cobertura mínima dos arcos e
um corte dirigido máximo na árvore. Encontre uma cobertura mínima dos nós e uma anticadeia
máxima na árvore.
3.63 Mostre uma anticadeia máxima e um cobertura mínima dos nós por caminhos dirigidos no DAG
da figura. [CCPS fig 2.5]

3.64 ? Complete os detalhes mais obscuros da prova do teorema de Dilworth 3.15.


3.65 Seja P uma cobertura mínima dos nós de um grafo dirigido D por caminhos dirigidos. Podemos
supor que todos os caminhos são simples? Podemos supor que a coleção P é disjunta, ou seja, que
FEOFILOFF APLICAÇÕES DE FLUXO MÁXIMO E CORTE MÍNIMO 61

cada nó de D pertence a apenas um dos caminhos de P?


3.66 Mostre que num grafo dirigido dotado de ciclos dirigidos uma anticadeia máxima pode ser menor
que uma cobertura mínima dos nós por caminhos dirigidos.
3.67 ? Escalonamento de aviões. Uma companhia de aviação quer servir p rotas (= flight legs) com o menor
número possível de aviões. Para isso, ela precisa combinar essas rotas da maneira mais eficiente
possível. O voo da rota i deve começar no horário ai e terminar no horário bi . Um avião precisa de
rij horas para retornar do destino da rota i à origem da rota j. Sugira uma maneira de resolver o
problema. [AMO 6.32, CCPS 3.39]
3.68 Seja C a coleção de todos os caminhos dirigidos em um grafo dirigido D. Seja A a matriz binária
indexada por V (D) × C e definida pela seguinte propriedade: Av,C = 1 se e somente se v está
em C. Use A para formular o programa linear que corresponde ao problema da cobertura mínima
dos nós por caminhos dirigidos. Qual o dual desse programa linear? Qual a relação do dual com
anticadeias máximas?
3.69 ? Seja D um grafo dirigido bipartido com bipartição (P, Q) (portanto, todos os arcos vão de P
para Q). Mostre que um subconjunto B de V (D) é uma anticadeia se e somente se V (D) r B é uma
cobertura por nós no sentido da seção 3.1. Que aparência tem uma cobertura mínima dos nós de D
por caminhos dirigidos?
3.70 Prove a versão min-max do teorema de Kőnig 3.3 a partir do teorema de Dilworth 3.15.
3.71 Prove o teorema de Dilworth 3.15 a partir da versão min-max do teorema de Kőnig 3.3.

Exercícios adicionais
3.72 ? Escalonamento em máquinas paralelas uniformes. Suponha dadas n tarefas (= jobs) T1 , T2 , . . . , Tn e
k processadores idênticos. Cada tarefa Tj precisa ser processada durante pj dias em qualquer dos
processadores. O processamento permite preemption, ou seja, o processamento de Tj num certo
processador pode ser interrompido e depois retomado em outro (ou no mesmo) processador. Em
cada instante, cada processador só pode cuidar de uma tarefa e cada tarefa só pode estar sendo
excutada por um processador. Cada tarefa Tj está disponível para processamento a partir de uma
certa data (= release date) rj e deve estar concluída até uma certa data (= due date) dj . (Suponha que
dj ≥ rj + pj .) Exemplo:
j 1 2 3 4
pj 25 31 50 18
rj 10 50 0 20
dj 30 70 60 50
Formule um problema de fluxo máximo que resolva o escalonamento. (Dica: Coloque o conjunto
{r1 , d1 , r2 , d2 , . . . , rn , dn } de datas em ordem crescente. Seja t1 < t2 < · · · < tm+1 , com m + 1 ≤ 2n,
o conjunto ordenado de datas. Agora, basta decidir que parte do processamento de cada tarefa Tj
será feita durante o intervalo (ti , ti+1 ).) [CCPS 3.41, AMO 6.17]

3.73 Custos menos prêmios. Seja r um nó de um grafo dirigido D. Para cada arco e, seja ce um número
não-negativo que mede o custo de destruir o arco. Se um atacante destrói um conjunto X de arcos,
recebe um prêmio bv para cada nó v que não pode mais ser alcançado por um caminho dirigido a
partir de r. O atacante quer escolher X de modo a minimizar custos menos prêmios. Sugira um
algoritmo. [CCPS 3.44]
62 3.7. EXERCÍCIOS FEOFILOFF
Capítulo 4

Fluxo viável de custo mínimo

Este capítulo generaliza o problema de Gale da seção 3.3 e procura um fluxo que sa-
tisfaça demandas dos nós, respeite capacidades dos arcos, e faça tudo isso ao menor
custo possível. Para resolver o problema, o capítulo usa as duas ferramentas discutidas
nos capítulos anteriores: caminhos dirigidos de custo mínimo (capítulo 1) e fluxos de
intensidade máxima (capítulo 2).
Os ingredientes do problema são os mesmos dos capítulos anteriores: um grafo diri-
gido D := (V, E), uma função-demanda (bv : v ∈ V ) com valores em R, uma função-
capacidade (ue : e ∈ E) com valores em R+ , e uma função-custo (ce : e ∈ E) com
valores em R.1 (Note que u ≥ 0 mas b e c não têm restrição de sinal.)

4.1 O problema
Como nos capítulos anteriores, um fluxo numa rede (D, b, u) é qualquer vetor (xe :
e ∈ E) com valores em R+ . Um fluxo x respeita u se x ≤ u e satisfaz b se

x+− = b .

(A notação x+− foi definida na seção 2.1.) Um fluxo x é viável se satisfaz b e respeita u.
Dada uma função-custo c, o custo de um fluxo x é o número cx.

Problema 4.A (fluxo de custo mínimo) Encontrar um fluxo viável de custo mínimo
numa rede (D, b, u, c).

Em inglês, o problema é conhecido como minimum-cost flow problem. Muitas vezes,


dizemos simplesmente “fluxo de custo mínimo”, deixando o “viável” subentendido.
Dizemos também que um fluxo é ótimo se for viável e tiver custo mínimo.
Uma rede de fluxo com custos é qualquer rede (D, b, u, c) que tenha os parâmetros b,
u, c descritos acima. Uma tal rede é viável se tem um fluxo viável. De acordo com o
1
Poderíamos escrever b ∈ RV , u ∈ RE E
+ e c ∈ R . Seria mais realista trocar todos os “R” por “Q”,
uma vez que computadores digitais não conhecem números irracionais.

63
64 4.2. PROGRAMAÇÃO LINEAR FEOFILOFF

lema 3.6 e o teorema de Gale 3.7 (veja o capítulo 3), a rede é viável se e somente se
b(V ) = 0 e b(X) ≤ u+ (X)
para todo subconjunto X de V . (Como observamos na seção 3.3, essas condições tam-
bém podem ser escritas assim: −u− (X) ≤ b(X) ≤ u+ (X) para todo X ⊆ V .) Toda rede
viável tem um fluxo de custo mínimo pois todo fluxo viável é limitado: xe ≤ u(E) para
todo fluxo viável x e todo arco e.

E XEMPLO 4.1: Seja D o grafo dirigido com nós p v w q descrito abaixo por sua matriz de adja-
cências. A função-demanda b está representada à direita da matriz. Mais à direita, as capacidades
e os custos dos arcos bem como dois diferentes fluxos viáveis, x e x0 . Verifique que cx = 240 e
cx0 = 180. Observe como é fácil conferir a viabilidade e o custo de um fluxo percorrendo as linhas
da tabela.
p v w q b pv pw vw vq wq
p − 1 1 − −2 u 3 3 3 3 3
v − − 1 1 −1 x 0 2 0 1 1
w − − − 1 +1 x0 0 2 1 0 2
q − − − − +2 c −30 +80 +40 +90 −10

4.2 Programação linear


Na linguagem da programação linear, o problema do fluxo de custo mínimo pode ser
formulado assim: encontrar um vetor real (xv : v ∈ V ) que

minimize cx
sujeito a x+− (v) = bv para cada v ∈ V
(1)
xe ≤ ue para cada e ∈ E
xe ≥ 0 para cada e ∈ E.

Esse programa linear pode ser escrito em termos da matriz de incidências A de D:


minimize cx
sujeito a Ax = b
x≤u
x ≥ 0.

O dual desse pl consiste em encontrar vetores reais (yv : v ∈ V ) e (ze : e ∈ E) que


maximizem yb + zu
sujeito a yA + z ≤ c
z≤0
e esse dual pode ser escrito por extenso como segue:
maximizem yb + zu
sujeito a yw − yv + zvw ≤ cvw para cada vw ∈ E (2)
zvw ≤ 0 para cada vw ∈ E.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 65

Para qualquer solução viável x do pl (1) e qualquer solução viável (y, z) do pl (2) temos
então
cx ≥ (yA + z)x = (yA)x + zx = y(Ax) + zx ≥ yb + zu . (3)

Se cx = yb + zu então x é solução ótima de (1) e (y, z) é solução ótima de (2). O teorema


forte da dualidade C.2 garante a recíproca: se os dois pl’s são viáveis então existe x
viável no primal e existe (y, z) viável no dual tais que cx = yb + zu.

Lema 4.1 (folgas complementares) Para qualquer solução viável x do pl (1) e qual-
quer solução viável (y, z) do pl (2), a igualdade cx = yb + zu vale se e somente se
1. xvw = 0 ou yw − yv + zvw = cvw e
2. xvw = uvw ou zvw = 0
para cada arco vw.

P ROVA : Temos cx = yb+zu em (3) se e somente se cx = (yA+z)x e y(Ax)+zx = yb+zu.


A primeira igualdade vale se e somente se xe = 0 ou (yA)e + ze = ce para cada arco e.
(O “ou” não é exclusivo.) A segunda igualdade vale se e somente se zx = zu, e esta
última vale se e somente se ze = 0 ou xe = ue para cada arco e.

4.3 Condições de otimalidade


Obtida uma solução x do problema 4.A, que certificado é possível apresentar para com-
provar a minimalidade de cx? Como o problema 4.A é idêntico ao programa linear (1),
qualquer solução viável (y, z) do pl dual (2) que satisfaça a igualdade yb+zu = cx é um
excelente certificado. Alternativamente, podemos exibir uma solução viável (y, z) que
satisfaz as condições de folgas complementares do lema 4.1. Melhor ainda: podemos
omitir z e exibir apenas um potencial2 y apropriado, como mostra o seguinte teorema.

Teorema 4.2 (condições de otimalidade) Um fluxo viável x numa rede (D, b, u, c) é


ótimo se e somente se existe um potencial y tal que
1. xvw = 0 ou yw − yv ≥ cvw e
2. xvw = uvw ou yw − yv ≤ cvw
para cada arco vw.

P ROVA : Suponha inicialmente que y é um potencial que satisfaz as condições 1 e 2.


Seja z o vetor definido por

zvw := min (0, cvw − yw + yv ) (4)

para cada arco vw. Em outras palavras, se yw − yv ≤ cvw então zvw := 0, senão zvw :=
cvw − yw + yv . Observe que o par (y, z) é solução viável do pl (2). Além disso, para
2
Um potencial é qualquer vetor y indexado pelos nós da rede.
66 4.4. CICLOS DE AUMENTO FEOFILOFF

cada arco vw, temos xvw = 0 ou yw −yv +zvw = cvw bem como xvw = uvw ou zvw = 0.
O lema 4.1 garante agora que cx = yb + zu e portanto x minimiza cx.
Suponha agora que x minimiza cx. De acordo com o teorema forte da dualidade C.2,
existe uma solução viável (y, z) do pl (2) tal que cx = yb+zu. De acordo com o lema 4.1,
temos xvw = 0 ou yw −yv +zvw = cvw bem como xvw = uvw ou zvw = 0 para cada arco vw.
Como yw − yv + zvw ≤ cvw e zvw ≤ 0, as condições 1 e 2 estão satisfeitas.

A desigualdade yw − yv ≤ cvw é familiar: ela caracteriza os arcos relaxados no problema


do caminho de custo mínimo (veja a seção 1.2 do capítulo 1). O número cvw − (yw − yv )
é conhecido como custo reduzido do arco vw. Se adotarmos a notação

c(y)vw := cvw − (yw − yv ),

poderemos apresentar as condições de otimalidade do teorema 4.2 de forma mais me-


morável: para cada arco e,

xe = 0 ou c(y)e ≤ 0 e xe = ue ou c(y)e ≥ 0 . (5)

E XEMPLO 4.2: Considere a rede (D, b, u, c) do exemplo 4.1. Veja novamente a matriz de adjacências
de D e o vetor de demandas b. À direita de b temos um potencial y. Mais à direita, um fluxo viável x
(diferente dos fluxos do exemplo 4.1), o custo c dos arcos, e o custo reduzido c(y) associado a y.

p v w q b y pv pw vw vq wq
p − 1 1 − −2 −10 u 3 3 3 3 3
v − − 1 1 −1 −40 x 2 0 3 0 2
w − − − 1 +1 0 c −30 +80 +40 +90 −10
q − − − − +2 −10 c(y) 0 +70 0 +60 0

O fluxo x e o potencial y satisfazem as condições de otimalidade (5). Portanto, x é um fluxo ótimo e


y é um certificado de otimalidade, conforme o teorema 4.2. (Embora isso seja redundante, podemos
calcular o vetor z definido por (4) e verificar que cx = +40 = yb + zu.)

4.4 Ciclos de aumento


Dado um fluxo viável x numa rede (D, b, u, c), como obter um novo fluxo viável mais
barato? Usaremos um mecanismo análogo ao dos caminhos de aumento do algoritmo
de Ford–Fulkerson (veja a seção 2.5).
Para qualquer ciclo C em D, seja É(C) o conjunto dos arcos diretos de C e È(C) o
conjunto dos arcos inversos. (Um arco é direto se “aponta da esquerda para a direita”;
caso contrário, o arco é inverso.) Um ciclo C é compatível com um fluxo viável x se
xe < ue para cada e em É(C) e xe > 0 para cada e em È(C). A largura de C é o maior
número ε tal que xe + ε ≤ ue para cada e em É(C) e xe − ε ≥ 0 para cada e em È(C).
A operação de enviar ε unidades de fluxo ao longo do ciclo C consiste em somar ε
a xe para cada e em É(C) e subtrair ε de xe para cada e em È(C). Se ε for menor ou
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 67

igual à largura de C, o envio ε unidades de fluxo ao longo de C produz um novo fluxo


viável x0 . O custo de x0 será cx + c(C) ε, sendo

c(C) := c(É(C)) − c(È(C)).

O número c(C) é o custo de C. Se esse custo for negativo e ε for positivo, o fluxo x0 será
mais barato que x. Por isso, qualquer ciclo compatível com x que tenha custo negativo
é chamado ciclo de aumento.3

E XEMPLO 4.3: No exemplo 4.1, o ciclo induzido por (v, w, q, v) é compatível com o fluxo x e tem
largura 1. O custo do ciclo é 40 − 10 − 90 = −60 e portanto o ciclo é de aumento. Se enviarmos
1 unidade de fluxo ao longo desse ciclo teremos o fluxo viável x0 do exemplo 4.1. Observe que
cx0 = cx − 60 × 1 = 240 − 60 = 180.
Ainda no exemplo 4.1, o ciclo (p, v, w, p) é compatível com o fluxo x0 e tem largura 2. O custo do
ciclo é −30 + 40 − 80 = −70 e portanto trata-se de um ciclo de aumento. Se enviarmos 2 unidades
de fluxo ao longo desse ciclo teremos o fluxo viável x00 abaixo. Observe que cx00 = cx0 − 70 × 2 =
180 − 140 = 40.
pv pw vw vq wq
c −30 +80 +40 +90 −10
x00 2 0 3 0 2

O seguinte teorema mostra que ciclos de aumento caracterizam fluxos ótimos:

Teorema 4.3 (dos ciclos de aumento) Um fluxo viável x numa rede (D, b, u, c) é ótimo
se e somente se não existe ciclo de aumento para x.

P ROVA : Considere inicialmente a parte “somente se” do teorema. Suponha que o custo
de x é mínimo. Se existisse um ciclo de aumento, poderíamos usar esse ciclo, como
indicado acima, para obter um novo fluxo viável de custo menor que cx. Portanto, um
tal ciclo não existe.
Agora considere a parte “se” do teorema, ou seja, suponha que não existe ciclo de
aumento para x. Gostaríamos de usar os resultados do capítulo 1, desenvolvidos para
caminhos e ciclos dirigidos, para mostrar que x tem custo mínimo. Para fazer isso,
será preciso construir uma rede auxiliar residual (D0 , c0 ). O grafo dirigido residual D0
é definido da seguinte maneira. O conjunto de nós de D0 é D ∪ {r}, sendo r um novo
nó. Para cada arco vw de D tal que xvw < uvw , há um arco vw de custo c0vw = cvw em D0 .
Para cada arco vw de D tal que xvw > 0, há um

arco wv de custo c0wv = −cvw

em D0 . (Se 0 < xvw < uvw então D0 tem arcos vw e wv.) Finalmente, para cada nó v
de D, o grafo residual D0 tem um arco rv de custo c0rv = 0.
É fácil entender a relação entre D e D0 : todo ciclo C em D que é compatível com x
corresponde a um ciclo dirigido C 0 em D0 , e vice-versa. Ademais, o custo de C em D é
igual ao custo de C 0 em D0 .
3
Quem sabe “ciclo de decremento” seria mais apropriado, já que queremos diminuir o custo do
fluxo.
68 4.4. CICLOS DE AUMENTO FEOFILOFF

Submeta a rede (D0 , c0 ), com nó inicial r, ao algoritmo de Ford dos caminhos dirigidos
de custo mínimo (veja a seção 1.3). Por hipótese, a rede não tem ciclo dirigido de
custo negativo. Portanto, de acordo com o teorema de Ford–Bellman 1.5, o algoritmo
produzirá um potencial viável, ou seja, um potencial y tal que yw − yv ≤ c0vw para cada
arco vw de D0 .
Agora considere as propriedades do potencial y no grafo dirigido original D. Se xvw <
uvw então vw é um arco de D0 e c0vw = cvw , donde yw − yv ≤ cvw , e portanto o custo
reduzido de vw não é negativo:
c(y)vw ≥ 0.
Por outro lado, se xvw > 0 então wv é um arco de D0 e c0wv = −cvw , donde yv − yw ≤ c0wv .
Logo yw − yv ≥ cvw , e portanto
c(y)vw ≤ 0.
Assim, o par (x, y) satisfaz as condições de otimalidade (5). Isso garante que x é ótimo.

E XEMPLO 4.4: Seja D o grafo dirigido descrito abaixo por sua matriz de adjacências. À direita da
matriz, temos as demandas b. Mais à direita, as capacidades u, os custos c, e um fluxo viável x.
O ciclo induzido por (c, b, a, c) é de aumento. Envie 1 unidade de fluxo ao longo do ciclo. O novo
fluxo é ótimo?

a b c d b ab ac ad bc bd cd
a − 1 1 1 −3 u 9 9 9 9 9 9
b − − 1 1 +1 c +20 +20 +20 +10 +10 +10
c − − − 1 +1 x 3 0 0 1 1 0
d − − − − +1

4.4.1 Soluções inteiras

Muitas aplicações precisam de fluxos x que são inteiros e de potenciais y que são intei-
ros. Supreendentemente, tais fluxos e potencias existem desde que os parâmetros da
rede sejam inteiros.

Teorema 4.4 (fluxo inteiro) Seja (D, b, u, c) uma rede que tem um fluxo viável. Se b e u
são inteiros então existe um fluxo ótimo que é inteiro.

E SBOÇO DA PROVA : Dentre os fluxos viáveis inteiros, escolha um fluxo x que mini-
mize cx. Se existisse um ciclo de aumento para x, poderíamos enviar uma quantidade
inteira de fluxo ao longo do ciclo e assim produzir um novo fluxo viável inteiro de
custo menor que cx. Logo, não existe ciclo de aumento. Então a prova do teorema 4.3
mostra que existe um potencial y que satisfaz as condições de otimalidade (5). Logo,
cx ≤ cx0 para todo fluxo viável x0 , inteiro ou não. Portanto, x é ótimo.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 69

Teorema 4.5 (dual inteiro) Seja x um fluxo ótimo numa rede (D, b, u, c). Se c é inteiro
então as condições de otimalidade descritas no teorema 4.2 são satisfeitas por um vetor
y que é inteiro e assim o pl (2) tem uma solução ótima (y, z) que é inteira.

P ROVA : Como mostra a prova do teorema 4.3 e a análise dos algoritmos de caminhos
dirigidos mínimos do capítulo 1, existe um potencial y tal que, para cada v, o número
yv é o custo de um caminho dirigido de custo mínimo de r a v na rede residual (D0 , c0 ).
Como c é inteiro, todos esses custos são inteiros.

4.5 Algoritmo dos ciclos de aumento


O algoritmo abaixo usa ciclos de aumento, como sugerido na seção 4.4, para resolver o
problema 4.A do fluxo de custo mínimo. O algoritmo obtém um primeiro fluxo viável
resolvendo a instância apropriada do problema de Gale (veja a seção 3.3). A partir daí,
cada iteração começa com um fluxo viável x e tenta transformar x num fluxo viável x0
de custo menor que cx.

F LUXO D E C USTO M ÍNIMO (D, b, u, c)


01 x ← G ALE (D, b, u)
02 se x indefinido
03 então pare  rede inviável
04 repita
05 C ← C ICLO A UMENTO (D, u, c, x)
06 se C indefinido
07 então y ← P OTENCIAL (D, u, c, x)
08 devolva x e y e pare  fluxo ótimo
09 ε1 ← min(ue − xe : e ∈ É(C))
10 ε2 ← min(xe : e ∈ È(C))
11 ε ← min(ε1 , ε2 )
12 x ← E NVIA F LUXO (D, x, C, ε)

A rotina G ALE (D, b, u) devolve um fluxo x que satisfaz b e respeita u. Se tal fluxo não
existe, x fica indefinido. Na linha 03, o algoritmo poderia devolver um conjunto de nós
que viola as condições de Gale.
A rotina C ICLO A UMENTO (D, u, c, x) devolve um ciclo de aumento, conforme a prova
do teorema 4.3. A rotina P OTENCIAL (D, u, c, x) recebe um fluxo ótimo x e calcula um
potencial y que satisfaz as condições de otimalidade do teorema 4.2. (Veja o exercí-
cio 4.26.)
A rotina E NVIA F LUXO (D, x, C, ε) atualiza x enviando ε unidades de fluxo ao longo do
ciclo C, conforme discussão no início da seção 4.4.
70 4.6. CAPACIDADES INFINITAS FEOFILOFF

4.5.1 Número de iterações

O algoritmo F LUXO D E C USTO M ÍNIMO é muito útil para redes pequenas, quando pode
ser executado com lápis e papel. Para redes grandes, entretanto, o algoritmo é inefici-
ente pois cada iteração consome muito tempo e o número de iterações pode aumentar
exponencialmente com o número de nós da rede. Isso acontece pelos mesmos moti-
vos que tornam ineficiente o algoritmo de Ford–Fulkerson para o problema do fluxo
máximo (veja a seção 2.5).
Se b, u e c são inteiros e a rede (D, b, u, c) é viável então o número de iterações é
finito. Segue daí que se b, u e c são racionais o número de iterações é finito. (Veja o
exercício 2.36.)

4.6 Capacidades infinitas


Ocasionalmente, somos levados a considerar redes em que alguns arcos têm capaci-
dade infinita. Atribuir capacidade ∞ a um arco e da rede equivale a ignorar a restrição
xe ≤ ue . Essa extensão do conceito de capacidade leva a uma extensão do problema 4.A
do fluxo de custo mínimo. Podemos tratar do problema estendido adaptando o que
sabemos sobre o problema 4.A convencional.
Uma instância do problema estendido do fluxo de custo mínimo pode ser ilimitada
(ou seja, pode admitir fluxos viáveis de custo arbitrariamente pequeno). Isso acontece
se e somente se a rede tem um ciclo dirigido cada um de cujos arcos tem capacidade
infinita:

Teorema 4.6 (rede ilimitada) Seja (D, b, u, c) uma rede viável em que u tem valores em
R+ ∪ {∞}. A rede tem um fluxo ótimo se e somente se não tem um ciclo dirigido de
custo negativo cujos arcos têm capacidade infinita.

P ROVA : Considere inicialmente a parte “somente se” do enunciado. Se existe um ciclo


dirigido de custo negativo cujos arcos têm capacidade infinita, então é claro que não
existe fluxo de custo mínimo.
Considere agora a parte ”se” do enunciado. Suponha que não existe um ciclo dirigido
de custo negativo. Construa um grafo dirigido auxiliar D0 da seguinte maneira. Re-
mova de D todos os arcos de capacidade finita e acrescente um novo nó r e arcos rv
de custo 0 para cada v em V . É claro que D0 não tem ciclo dirigido de custo negativo.
Portanto, de acordo com o teorema de Ford–Bellman 1.5, D0 tem um potencial y 0 que
é viável no sentido da seção 1.2 (ou seja, deixa todos os arcos relaxados). A restrição
y de y 0 a D é tal que yw − yv ≤ cvw para cada arco vw de capacidade infinita. Para
cada arco vw de capacidade infinita, defina zvw := 0. Para cada arco vw de capacidade
finita, defina zvw como em (4). Então (y, z) é solução viável do pl (2). A existência
dessa solução viável mostra, de acordo com (3), que o pl primal (1) não é ilimitado, e
portanto tem uma solução ótima.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 71

Se nenhum ciclo dirigido tem capacidade infinita, podemos substituir as ocorrên-


cias de ∞ por um número suficientemente grande e assim voltar ao problema 4.A
convencional.
P P podemos substituir ∞ por qualquer número maior que
Por exemplo,
(ue : e ∈ E, ue < ∞) + (bv : v ∈ V, bv > 0).

4.7 Algoritmo Simplex


Poderíamos resolver o problema 4.A do fluxo de custo mínimo submetendo o pro-
grama linear (1) ao algoritmo Simplex de programação linear (veja a seção C.4 do
apêndice C). Mas isso é ineficiente, pois o Simplex genérico não leva em conta as
peculiaridades do pl (1).
Para tirar proveito da estrutura especial do pl (1) é preciso desenvolver uma versão es-
pecializada do Simplex. Essa versão, conhecida como Simplex-para-redes (= Network
Simplex), é o algoritmo mais usado na prática para resolver o problema.
Nossa primeira versão do Simplex-para-redes tratará apenas das redes que não têm
restrições de capacidade. Uma rede desse tipo será denotada por (D, b, c), sem o
parâmetro u. O correspondente conjunto de instâncias do problema 4.A do fluxo de
custo mínimo é conhecido como problema do transbordo (= transshipment),4 ou da
baldeação. O problema do transbordo consiste, portanto, em encontrar um fluxo que
satisfaz b e minimiza cx.

4.7.1 Fluxos induzidos por árvores

Os algoritmos Simplex-para-redes e Simplex-para-transbordo trabalham com árvores


no lugar de fluxos. Uma árvore de um grafo dirigido D é uma árvore orientada T
tal que V (T ) = V (D) e E(T ) ⊆ E(D). (Num outro contexto, diríamos que T é uma
árvore geradora de D.) Podemos confundir uma árvore com seu conjunto de arcos:
se E 0 ⊆ E(D) e (V (D), E 0 ) é uma árvore orientada, podemos dizer que E 0 uma árvore
de D.
Para garantir que as redes em estudo têm árvores, restringimos a atenção, daqui em
diante, a grafos dirigidos conexos. Para grafos dirigidos não conexos, o problema do
fluxo de custo mínimo pode ser resolvido separadamente em cada componente conexa.
Uma bipartição (T, L) do conjunto de arcos de uma rede (D, b) é arbórea se T é uma
árvore de D. Uma bipartição arbórea (T, L) é viável se T contém o suporte de algum
fluxo viável (isto é, algum fluxo que satisfaz b). Em outras palavras, (T, L) é viável se
algum fluxo viável deixa vazios todos os arco que pertencem a L. Um arco e é vazio
em relação a um fluxo x se xe = 0.
Um fluxo x é induzido por uma bipartição arbórea (T, L) se x é viável e deixa vazios
todos os arcos de L. Como a palavra “induzido” sugere, existe um só fluxo com essa
propriedade:
4
Não vale a pena discutir as razões históricas do termo transshipment.
72 4.7. ALGORITMO SIMPLEX FEOFILOFF

Lema 4.7 Toda bipartição viável de uma rede (D, b) induz um único fluxo viável.

E SBOÇO DA PROVA : Para cada arco ij de T , xij é igual a b(Xj ), sendo Xj a componente
conexa de T − ij que contém j.

Dizemos que uma bipartição viável (T, L) é degenerada se o fluxo induzido pela bi-
partição deixa vazio algum arco de T .
Podemos nos dar ao luxo de tratar apenas de fluxos que são induzidos por bipartições
arbóreas porque se uma rede tem um fluxo viável então também tem um fluxo indu-
zido (por uma bipartição arbórea). Além disso, se a rede tem um fluxo ótimo então
também tem um fluxo ótimo que é induzido.
A propósito, um fluxo é induzido (por uma bipartição arbórea) se e somente se todo
ciclo do grafo dirigido tem um arco vazio. Isso é assim pois estamos supondo que o
grafo é conexo.

4.7.2 Potenciais induzidos por árvores

Para toda bipartição arbórea (T, L) de uma rede (D, c), existe um potencial y tal que
cvw = yw − yv para cada arco vw de T . Dizemos que um tal potencial é induzido
por (T, L). Um potencial induzido por uma bipartição arbórea é quase único: se y e
y 0 são potenciais induzidos então a diferença yv − yv0 é constante, ou seja, não depende
de v.
Como mostra o seguinte lema, qualquer potencial induzido por uma bipartição ar-
bórea “mede” os custos de caminhos na árvore. O custo de um caminho P numa
rede (D, c) é definido da mesma forma que o custo de um ciclo na seção 4.4: c(P ) :=
c(É(P )) − c(È(P )), sendo É(P ) o conjunto dos arcos diretos de P e È(P ) o conjunto
dos arcos inversos.

Lema 4.8 Se y é um potencial induzido por uma bipartição arbórea (T, L) e r e s são
dois nós quaisquer então ys − yr = c(P ), sendo P o único caminho simples de r a s
em T .

Dada uma bipartição arbórea (T, L) de D e um arco vw em L, o grafo dirigido T + vw


tem um único ciclo no qual vw é um arco direto. (O ciclo tem a forma P + vw, sendo
P o único caminho simples de w a v em T .) Diremos que esse é o ciclo fundamental
de T + vw. O custo desse ciclo fundamental é igual ao custo reduzido cvw − yw + yv
de vw:

Lema 4.9 Se c(y) é o custo reduzido associado a um potencial y induzido por uma
bipartição arbórea (T, L) então c(y)e = 0 para todo arco e de T e c(y)e = c(C) para todo
arco e de L, sendo C o ciclo fundamental de T + e.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 73

4.7.3 Algoritmo Simplex-para-transbordo

Ao receber uma rede de transbordo (D, b, c), o algoritmo T RANSSHIPMENT S IMPLEX


produz uma bipartição arbórea (T, L) e um potencial y tais que

c(y)e = 0 para todo e em T e c(y)e ≥ 0 para todo e em L, (6)

sendo c(y) o custo reduzido associado a y. Assim, de acordo com o teorema 4.2, o fluxo
x induzido por (T, L) é ótimo.

T RANSSHIPMENT S IMPLEX (D, b, c)  D conexo


01 (T, L) ← B IPARTIÇÃO V IÁVEL (D, b)
02 se (T, L) é indefinido
03 então pare  rede inviável
04 repita
05 seja x o fluxo induzido por (T, L)
06 seja y um potencial induzido por (T, L)
07 seja c(y) o custo reduzido associado a y
08 se c(y) ≥ 0
09 então devolva (T, L) e y e pare  fluxo ótimo
10 escolha um arco e tal que c(y)e < 0
11 seja C o ciclo fundamental de T + e
12 ε ← min (xh : h ∈ È(C))
15 escolha h em È(C) tal que xh = ε
16 T ←T +e−h
17 L←L+h−e

A rotina B IPARTIÇÃO V IÁVEL (D, b) produz uma bipartição arbórea viável (T, L). Se
uma tal bipartição não existe, a rede é inviável e (T, L) fica indefinido. A rotina pode
ser implementada da seguinte maneira: calcule um fluxo viável x (veja o problema de
Gale na seção 3.3); em seguida, aplique o algoritmo sugerido no exercício 4.36 para
obter uma bipartição viável.
No fim da linha 07, c(y)e = 0 para todo arco e de T . No fim da linha 08, as condições
de otimalidade (6) estão satisfeitas e portanto temos um fluxo ótimo.
Nas linhas 16–17, o arco e é transferido de L para T e o arco h é transferido de T para L.
No fim da linha 17, (T, L) é uma bipartição viável e o fluxo induzido pela bipartição
deixa o arco h vazio.
Não é eficiente calcular x, y e c(y) diretamente a partir de (T, L), como sugerem as
linhas 05–07. É melhor atualizar essas variáveis a partir de seus valores na iteração
anterior. (No caso de x, por exemplo, basta enviar ε unidades de fluxo ao longo do
ciclo C.) Uma implementação séria do algoritmo faz isso.

E XEMPLO 4.5: Considere a rede de transbordo (D, b, c) descrita a seguir. O grafo dirigido D é dado
por sua matriz de adjacências. A função-demanda b e os custos c dos arcos são dadas nas tabelas.
74 4.7. ALGORITMO SIMPLEX FEOFILOFF

p v w q b pv pw vw vq wq
p − 1 1 − −3 c +10 +30 +10 +10 +10
v − − 1 1 +2
w − − − 1 −1
q − − − − +2

Suponha que a primeira iteração começa a bipartição viável (T, L) cuja árvore T está indicada em
vermelho na tabela abaixo. A tabela também registra o fluxo x e o potencial y induzidos por (T, L),
bem como os custos reduzidos c(y). O custo do fluxo é cx = 70.

pv pw vw vq wq y
x 2 1 0 0 2 p 0
c(y) 0 0 −10 −20 0 v +10
w +30
q +40

O algoritmo escolhe o arco vw e envia 1 unidade de fluxo ao longo do ciclo induzido por (v, w, p, v).
O novo fluxo terá custo cx = 70 − 10 × 1 = 60. O arco vw é transferido de L para T e o arco pw é
transferido de T para L.
A segunda iteração começa com a bipartição arbórea (T, L) indicada abaixo em vermelho. A tabela
dá o fluxo induzido x, o potencial induzido y, e o custo reduzido c(y). O fluxo tem custo cx = 60.

pv pw vw vq wq y
x 3 0 1 0 2 p 0
c(y) 0 +10 0 −10 0 v +10
w +20
q +30

O algoritmo escolhe o arco vq e envia 1 unidade de fluxo ao longo do ciclo (v, q, w, v). O novo fluxo
terá custo cx = 60 − 10 × 1 = 50.
A terceira iteração começa a bipartição arbórea (T, L), o fluxo x, e o potencial y indicados a seguir:

pv pw vw vq wq y
x 3 0 0 1 1 p 0
c(y) 0 0 +10 0 0 v +10
w +10
q +20

Como c(y) ≥ 0, a execução do algoritmo termina. Para detetar eventuais erros de cálculo cometi-
dos durante a execução do algoritmo, convém verificar que cx = yb.

No fim da linha 17, o custo do fluxo induzido por (T, L) é cx+εc(y)e (veja a seção 4.4 e o
lema 4.9). Se ε não for nulo, o novo fluxo será mais barato que o anterior. Se ε for nulo,
o fluxo não se altera, embora a bipartição (T, L) seja modificada. Se isso acontece, a ite-
ração é considerada degenerada. É claro que uma iteração degenerada só acontece se
a bipartição arbórea (T, L) no início da iteração for degenerada. Iterações degeneradas
merecem atenção pois podem levar o algoritmo a ser executado ad æternum.

E XEMPLO 4.6: Considere a rede de transbordo (D, b, c) descrita a seguir. O grafo dirigido D é dado
por sua matriz de adjacências. (Complete a figura.) A função-demanda b e os custos c dos arcos
são dados nas tabelas.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 75

a b c d e f b ab ac be cd ce db df ef
a − 1 1 − − − −4 c +20 +50 +60 +30 +30 +30 +20 +30
b − − − − 1 − 0
c − − − 1 1 − −1 b e
d − 1 − − − 1 0
e − − − − − 1 +1 a f
f − − − − − − +4
c d

A primeira iteração começa com a bipartição arbórea (T, L) indicada abaixo em vermelho. A tabela
dá o fluxo induzido x, o potencial induzido y, e o correspondente custo reduzido c(y). O custo do
fluxo é cx = 560.
ab ac be cd ce db df ef y
x 4 0 5 1 0 1 0 4 a +10
c(y) 0 +90 0 0 −90 0 −100 0 b +30
c −30
d 0
e +90
f +120
O algoritmo escolhe o arco ce e envia 1 unidade de fluxo ao longo do ciclo induzido por (c, e, b, d, c).
Os arcos cd e db ficam vazios. O primeiro sai da árvore mas o segundo continua na árvore. O novo
fluxo tem custo cx = 560 − 90 × 1 = 470.
A segunda iteração começa com os dados a seguir. A bipartição arbórea é degenerada.
ab ac be cd ce db df ef y
x 4 0 4 0 1 0 0 4 a +10
c(y) 0 0 0 +90 0 0 −100 0 b +30
c +60
d 0
e +90
f +120
O algoritmo escolhe o arco df e portanto o ciclo (d, f, e, b, d). Apenas 0 unidades de fluxo podem
ser enviadas ao longo do ciclo. A iteração é degenerada. O fluxo x não se altera mas os arcos df
e db são transferidos entre T e L. A terceira iteração começa com os dados indicados a seguir:
ab ac be cd ce db df ef y
x 4 0 4 0 1 0 0 4 a −90
c(y) 0 0 0 −10 0 +100 0 0 b −70
c −40
d 0
e −10
f +20
O algoritmo escolhe o arco cd e envia 1 unidade de fluxo ao longo do ciclo (c, d, f, e, c). O novo
fluxo tem custo cx = 470 − 10 × 1 = 460. A quarta iteração começa com os seguintes dados:
ab ac be cd ce db df ef y
x 4 0 4 1 0 0 1 3 a −90
c(y) 0 −10 0 0 +10 +100 0 0 b −70
c −30
d 0
e −10
f +20
O algoritmo escolhe o arco ac e envia 3 unidades de fluxo ao longo do ciclo (a, c, d, f, e, b, a). O novo
fluxo tem custo cx = 460 − 10 × 3 = 430. A quinta iteração começa com os seguintes dados:
76 4.7. ALGORITMO SIMPLEX FEOFILOFF

ab ac be cd ce db df ef y
x 1 3 1 4 0 0 4 0 a −80
c(y) 0 0 0 0 0 +90 0 +10 b −60
c −30
d 0
e 0
f +20

Como c(y) ≥ 0, a execução do algoritmo termina.

4.7.4 Número de iterações

Tal como descrito acima, T RANSSHIPMENT S IMPLEX não é um algoritmo pois sua exe-
cução pode ser infinita no pior caso. Mas o pior caso é muito raro na prática.
Cada iteração não-degenerada diminui o custo do fluxo. Como os fluxos são induzidos
por bipartições arbóreas e o número de árvores D é finito, o número de iterações não-
degeneradas também é finito. Já o número de iterações degeneradas pode ser infinito,
pois uma mesma bipartição arbórea degenerada (T, L) pode aparecer no início de duas
(e portanto infinitas) iterações. Para evitar esse desastre, basta que no início de cada
iteração a bipartição arbórea (T, L) seja mais que viável, no sentido que passamos a
definir.
Antes de começar a execução do algoritmo, escolha um nó r (arbitrário mas fixo) para
Pj fazer o papel de raiz. No início de cada iteração, para cada nó j, seja Pj o único caminho
de r a j em T . A bipartição arbórea viável (T, L) é considerada fortemente viável se
o fluxo induzido pela bipartição tem a seguinte propriedade: cada arco vazio de T
“aponta para longe de r”, ou seja, se ij é um arco vazio de T então ij é um arco (direto)
de Pj .
Suponha que (T, L) é fortemente viável no início de uma iteração. Para que a bipartição
(T −e+h, L−h+e) no início da linha 16 do código também seja fortemente viável, é
preciso escolher o arco h na linha 15 do código como passamos a explicar. Seja s o nó
de C que está mais próximo de r em T , isto é, o último nó comum aos caminhos Pv
e Pw . Percorra o ciclo fundamental C a partir de s e escolha para h

o primeiro arco em È(C) que tenha xh = ε. (7)

Com isso, a bipartição (T +e−h, L−h+e) será fortemente viável.


Se (T, L) é fortemente viável no início de todas as iterações, a execução de T RANS -
SHIPMENT S IMPLEX termina depois de um número finito de iterações. Resta apenas
encontrar uma maneira de fazer com que a primeira bipartição arbórea (linha 01 do
código) seja fortemente viável. Isso é um bom exercício.

E XEMPLO 4.7: Considere a rede de transbordo (D, b, c) descrita a seguir. O grafo dirigido D é
dado por sua matriz de adjacências. (Faça uma figura.) Os custos c, o potencial y, e o custos
reduzidos c(y) foram omitidos. Adote o nó r como raiz e suponha que c(y)ij < 0.
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 77

r i j k l p q b rl ij kj lk lp qp iq
r − − − − 1 − − −2 x 2 0 1 2 0 1 1
i − − 1 − − − 1 −1
j − − − − − − − +1
k − − 1 − − − − +1
l − − − 1 − 1 − 0
p − − − − − − − +1
q − − − − − 1 − 0
Execute uma iteração do T RANSSHIPMENT S IMPLEX começando com a bipartição arbórea (T, L)
que tem T = {rl, kj, lk, lp, qp, iq}. Note que (T, L) é fortemente viável. O algoritmo escolhe o arco
ij pois c(y)ij < 0. O ciclo fundamental de T + ij é (i, j, k, l, p, q, i). A largura do ciclo é 1. Qualquer
um dos arcos kj, qp, iq poderia ser removido de T para dar lugar a ij. Para garantir que a nova
bipartição arbórea seja fortemente viável, o algoritmo remove o arco qp.

E XEMPLO 4.8: Considere a rede de transbordo (D, b, c) descrita a seguir. O grafo dirigido D é dado
por sua matriz de adjacências. (Faça uma figura.) A função-demanda b e os custos c dos arcos são
dadas nas tabelas. Adote o nó p como raiz. [CCPS fig.4.10]
p v w q b vp wp vw vq wq
p − − − − +10 c +10 +10 +10 +10 +20
v 1 − 1 1 −10
w 1 − − 1 −10
q − − − − +10
A primeira iteração começa com a bipartição arbórea (T, L) indicada a seguir (os arcos de T estão
destacados em vermelho). A bipartição é degenerada mas fortemente viável. O fluxo induzido tem
custo cx = 30.
vp wp vw vq wq y
x 1 0 0 0 1 p 0
c(y) 0 +10 0 −20 0 v −10
w 0
q +20
O algoritmo escolhe o arco vq. A sequência de nós do correspondente ciclo fundamental, escrita a
partir do nó mais próximo da raiz, é (v, q, w, v). Como ε = 0, a iteração é degenerada. O envio de 0
unidades de fluxo ao longo do ciclo não altera o fluxo mas altera a bipartição arbórea.
A segunda iteração começa com uma bipartição arbórea degenerada mas fortemente viável. O
fluxo induzido tem custo cx = 30.
vp wp vw vq wq y
x 1 0 0 0 1 p 0
c(y) 0 −10 +20 0 0 v −10
w −20
q 0
O algoritmo escolhe o arco wp. O correspondente ciclo fundamental, a partir do nó mais próximo
da raiz, é (p, v, q, w, p). Temos ε = 1 e o arco vp faz o papel de h. O envio de 1 unidade de fluxo ao
longo do ciclo produz um novo fluxo de custo cx = 30 − 10 × 1 = 20.
A terceira iteração começa com uma bipartição arbórea degenerada mas fortemente viável. (Se a
iteração anterior tivesse escolhido h = wq, a bipartição não seria fortemente viável.)
vp wp vw vq wq y
x 0 10 0 10 0 p 0
c(y) +10 0 0 0 0 v 0
w −10
q +10
Como c(y) ≥ 0, a execução do algoritmo termina.
78 4.8. SIMPLEX PARA REDES FEOFILOFF

4.8 Simplex para redes


O algoritmo Simplex-para-redes (= Network Simplex), resolve o problema 4.A do fluxo
de custo mínimo sem impor qualquer restrição sobre as capacidades dos arcos. Esse
algoritmo é uma generalização previsível do algoritmo T RANSSHIPMENT S IMPLEX dis-
cutido na seção anterior. É como se tivéssemos duas cópias do T RANSSHIPMENT -
S IMPLEX trabalhando simultâneamente: uma cópia “normal”, idêntica à discutida na
seção anterior, que cuida da restrição x ≥ 0, e uma cópia “invertida”, que cuida da
restrição x ≤ u.

Como no início do capítulo, um fluxo numa rede (D, b, u) é viável se satisfaz b e res-
peita u. Em relação a um fluxo viável x, diremos que um arco e está vazio se xe = 0 e
está cheio se xe = ue .
Começamos por estender algumas das definições da seção anterior. Como lá, vamos
supor que os grafos dirigidos em estudo são conexos.

4.8.1 Tripartições viáveis

Uma tripartição (T, L, U ) do conjunto de arcos de uma rede (D, b, u) é arbórea se T


é uma árvore de D. Uma tripartição arbórea (T, L, U ) é viável se algum fluxo viável
deixa todos os arcos de L vazios e todos os arcos de U cheios.
O seguinte lema mostra porquê podemos nos dar ao luxo de trocar fluxos viáveis por
tripartições viáveis:

Lema 4.10 Para qualquer tripartição viável (T, L, U ), existe apenas um fluxo viável x
que deixa os arcos de L vazios e os arcos de U cheios.

Dizemos que o único fluxo viável a que se refere o lema é induzido por (T, L, U ). Se
o fluxo induzido deixa algum arco de T vazio ou cheio, dizemos que a tripartição
(T, L, U ) é degenerada.
Como estamos supondo que D é conexo, podemos dizer que um fluxo é induzido por
uma tripartição arbórea se e somente se todo ciclo de D tem um arco vazio ou um arco
cheio (ou ambos).

4.8.2 Ciclos fundamentais e seus custos

Seja (T, L, U ) uma tripartição arbórea do conjunto de arcos de uma rede (D, u). Para
cada e em L, o ciclo fundamental de T + e é o único ciclo em T + e no qual e é um arco
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 79

direto. Para cada e em U , o ciclo fundamental de T + e é o único ciclo em T + e no


qual e é um arco inverso.
Numa rede (D, c), um potencial y é induzido por uma tripartição arbórea (T, L, U ) se
cvw = yw − yv para cada arco vw de T . Esse potencial está intimamente relacionado
com o custo dos ciclos fundamentais:

Lema 4.11 Seja (T, L, U ) uma tripartição arbórea de uma rede (D, b, u, c). Seja y um
potencial induzido pela tripartição e c(y) o custo reduzido associado a y. Para todo e
em T , c(y)e = 0. Para todo e em L, c(y)e = c(C), sendo C o ciclo fundamental de T + e.
Para todo e em U , c(y)e = −c(C), sendo C o ciclo fundamental de T + e.

4.8.3 Algoritmo Simplex-para-redes

Ao receber uma rede (D, b, u, c), o algoritmo Simplex-para-redes produz uma triparti-
ção viável (T, L, U ) e um potencial y que satisfazem as condições de otimalidade:
• c(y)e = 0 para e em T ,
• c(y)e ≥ 0 para e em L,
• c(y)e ≤ 0 para e em U ,
sendo c(y) o custo reduzido associado a y. De acordo com teorema 4.2, o fluxo x
induzido por (T, L, U ) é ótimo.

N ETWORK S IMPLEX (D, b, u, c)  D conexo


01 (T, L, U ) ← T RIPARTIÇÃO V IÁVEL (D, b, u)
02 se (T, L, U ) é indefinida
03 então pare  rede inviável
04 repita
05 seja x o fluxo induzido por (T, L, U )
06 seja y um potencial induzido por (T, L, U )
07 seja c(y) o custo reduzido associado a y
08 se c(y)e ≥ 0 para todo e ∈ L e c(y)e ≤ 0 para todo e ∈ U
09 então devolva (T, L, U ) e y e pare  fluxo ótimo
10 escolha e em L tal que c(y)e < 0 ou e em U tal que c(y)e > 0
11 seja C o ciclo fundamental de T + e
12 ε1 ← min (xh : h ∈ È(C))
13 ε2 ← min (uh − xh : h ∈ É(C))
14 ε ← min (ε1 , ε2 )
15 escolha h em È(C) tal que xh = ε ou h em É(C) tal que uh − xh = ε
16 T ←T +e−h
17 se e ∈ L então L ← L − e senão U ← U − e
18 se h ∈ È(C) então L ← L + h senão U ← U + h

A rotina T RIPARTIÇÃO V IÁVEL (D, b, u) na linha 01 produz uma tripartição viável


(T, L, U ). Se tal tripartição não existe, a rede é inviável. A rotina pode ser imple-
80 4.8. SIMPLEX PARA REDES FEOFILOFF

mentada da seguinte maneira: calcule um fluxo viável; aplique o algoritmo sugerido


no exercício 4.49; finalmente, escolha uma tripartição viável conforme o exercício 4.48.
No fim de cada execução da linha 18, (T, L, U ) é uma tripartição viável.

E XEMPLO 4.9: Considere a rede (D, b, u, c) descrita a seguir. O grafo dirigido D é dado por sua
matriz de adjacências. A função-demanda b e os custos c dos arcos são dadas nas tabelas.

p v w q b pv pw vw vq wq
p − 1 1 − −4 u ∞ ∞ 1 ∞ ∞
v − − 1 1 0 c +10 +20 +8 +20 +20
w − − − 1 +2
q − − − − +2

A primeira iteração começa com a tripartição viável (T, L, U ) indicada abaixo. Os arcos de T estão
indicados em vermelho, os arcos de L estão sublinhados, e U é vazio. Veja na tabela o fluxo x e o
potencial y induzidos pela tripartição.

pv pw vw vq wq y
x 2 2 0 2 0 p 0
c(y) 0 0 −2 0 +10 v +10
w +20
q +30

O algoritmo escolhe o arco vw e envia 1 unidades de fluxo ao longo do ciclo induzido por
(v, w, p, v). O arco vw fica cheio e é transferido de L para U . A tripartição (T, L, U ) não se altera.
O novo fluxo terá custo cx = 100 − 2 × 1 = 98.
A segunda iteração começa com a tripartição arbórea (T, L, U ) indicada abaixo com uma barra
acima dos arcos de U . O fluxo tem custo cx = 98.

pv pw vw vq wq y
x 3 1 1 2 0 p 0
c(y) 0 0 −2 0 +10 v +10
w +20
q +30

Como c(y)e ≥ 0 para todo e em L e c(y)e ≤ 0 para todo e em U , o fluxo x é ótimo e a execução do
algoritmo termina.
Por via dúvidas, convém verificar que cx = yb + zu. (Essa é uma boa maneira de detetar eventuais
erros de cálculo cometido durante a execução do algoritmo.) O vetor ze = min (0, c(y)e ) está
indicado abaixo:
pv pw vw vq wq
z 0 0 −2 0 0
Portanto, cx = 98 = 100 − 2 = yb + zu, como deveria ser.

4.8.4 Número de iterações

Tal como o T RANSSHIPMENT S IMPLEX, o algoritmo N ETWORK S IMPLEX pode executar


um número infinito de iterações (embora esse evento seja muito raro na prática). Para
evitar isso, basta fazer o seguinte: (i) antes de iniciar a execução do algoritmo, escolha
um nó r como raiz; (ii) adote yr = 0 em todas as iterações; (iii) tome providências
para que a tripartição (T, L, U ) seja fortemente viável no início de cada iteração. Uma
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 81

tripartição viável (T, L, U ) é fortemente viável se o fluxo induzido pela tripartição tem
a seguinte propriedade: cada arco ij de T que está vazio “aponta para longe da raiz”
(ou seja, ij é um arco de Pj ), e cada arco ij de T que está cheio “aponta na direção da
raiz” (ou seja, ij é um arco de Pi ).

4.9 Exercícios
Seção 4.1
4.1 Suponha que a é um arco de custo máximo na rede, ou seja, ca := max (ce : e ∈ E). Se x é um fluxo
viável de custo mínimo, é verdade que xa = 0?
4.2 O problema do caminho dirigido de custo mínimo (poblema 1.A no capítulo 1) é um caso particular
do problema 4.A do fluxo de custo mínimo?
4.3 Mostre que o problema do fluxo de intensidade máxima de um nó r a um nó s numa rede capaci-
tada (problema 2.A no capítulo 2) é um caso particular do problema 4.A do fluxo de custo mínimo.
(Dica: acrescente arco sr ao grafo.) [CCPS 4.7]
4.4 ? Seja (D, b, u, c) uma rede viável. Mostre que a rede não é ilimitada, ou seja, tem um fluxo ótimo.
4.5 Um emparelhamento num grafo não-dirigido é perfeito se incide em todos os nós. Considere o
problema de encontrar um emparelhamento perfeito de custo mínimo em um grafo não-dirigido
bipartido. Formule esse problema como um caso particular do problema 4.A. [CCPS 4.2]
4.6 Seja D um grafo dirigido tal que o número |∂ + (v)| + |∂ − (v)| é par para cada nó v. Para cada arco vw,
seja cvw o custo de inverter vw (isto é, trocar vw por wv). Queremos encontrar um conjunto de arcos
de custo mínimo cuja inversão faz com que D tenha um ciclo dirigido euleriano. (Veja exercício
3.35 no capítulo 3.) Formule esse problema como um caso particular do problema 4.A. [CCPS 4.5]
4.7 Atribuição de terminais a concentradores. Uma rede de teleprocessamento tem um grande número
de terminais geograficamente dispersos e uma CPU. É dado um conjunto de concentradores, ins-
talados em certos lugares, sendo cada um ligado à CPU por uma linha de alta capacidade e custo
nulo. Cada terminal precisa ser ligado à CPU e a ligação pode ser direta ou pode passar por um
concentrador. Cada concentrador pode cuidar de até k terminais. Para cada terminal j, o custo de
uma ligação direta com a CPU é dj e o custo de uma ligação com um concentrador i é dij . Queremos
determinar a maneira mais barata de ligar os terminais à CPU. Formule esse problema como um
caso particular do problema 4.A. [AMO 9.7]
4.8 ? Roteamento de cargueiros vazios. Para um certo conjunto V de portos marítimos, temos os seguinte
dados sobre a entrada e saída de carga no decorrer do ano passado: para cada porto v, temos
o número pv de toneladas de carga que entraram no porto e o número qv de toneladas de carga
que saíram do porto. Em cada porto v, a diferença bv := pv − qv é uma medida do suprimento
de cargueiros vazios e −bv é uma medida da demanda por cargueiros vazios. Cada cargueiro
vazio saiu de um porto v em que bv é positivo e foi para um porto w em que bw é negativo. Se a
distância do porto v ao porto w é de cvw milhas, o deslocamento de v a w de um cargueiro vazio
com capacidade para t toneladas representa um desperdício de tcvw toneladas×milha. Queremos
organizar a movimentação de cargueiros vazios de modo a minimizar o desperdício total anual.

Seção 4.2
4.9 Verifique que o pl (2) é dual do pl (1).
4.10 ? Mostre que o pl dual (2) é viável, ou seja, exiba alguma solução viável (y, z) do pl.
4.11 Suponha que b(V ) 6= 0 numa rede (D, b, u, c) de fluxo com custos. Mostre que o pl (1) é inviável
nesse caso. Mostre que o pl dual (2) é ilimitado nesse caso (ou seja, yb + zu não tem máximo).
82 4.9. EXERCÍCIOS FEOFILOFF

4.12 Suponha que b(X) > u+ (X) para algum X ⊆ V . Mostre que pl (1) é inviável nesse caso. Mostre
que o pl dual (2) é ilimitado nesse caso (isto é, yb + zu não tem máximo).
4.13 Enuncie o problema do fluxo viável de custo máximo. Escreva o pl do problema. Escreva o pl dual.
Como poderíamos usar um algoritmo para o problema 4.A para resolver o problema do fluxo viável
de custo máximo?

Seção 4.3
4.14 Mostre que as condições de otimalidade descritas no teorema 4.2 têm a seguinte consequência: se
0 < xvw < uvw então yw − yv = cvw .
4.15 Seja y um potencial arbitrário numa rede D(b, u, c) e c(y) o correspondente custo reduzido. Mostre
que c(y) = c − yA.
4.16 ? Custo versus custo reduzido. Seja x um fluxo que satisfaz b e y é um potencial arbitrário. Seja c(y) o
custo reduzido associado a y. Mostre que c(y)x = cx − yb.

Seção 4.4
4.17 ? Seja x um fluxo viável numa rede (D, b, u, c). Seja ε a largura de um ciclo C compatível com x.
Prove que o envio de ε unidades de fluxo ao longo de C produz um novo fluxo viável. Prove que
o custo do novo fluxo é cx + c(C) ε, sendo c(C) := c(É(C)) − c(È(C)).
4.18 A figura mostra um fluxo viável x numa rede (D, b, u, c). Os três números ao lado de cada arco e
são ce , ue , xe . O custo do fluxo é cx = 25. Encontre um ciclo de aumento. Calcule um fluxo viável
de custo menor que o de x. Parte 2: Exiba um fluxo viável de custo mínimo e um potencial que
prove a otimalidade do fluxo. [CCPS fig.4.1]

4.19 Considere a rede de fluxo (D, b, u, c) da figura. Ao lado de cada nó v vemos a demanda bv . Ao lado
de cada arco e vemos os números ce , ue , xe . Verifique que x é um fluxo viável. Prove que existe um
fluxo viável de custo menor que cx ou prove que x é ótimo. [CCPS 4.8]

4.20 Rede residual. Considere o exemplo 4.1 da seção 4.1. Faça uma figura da rede residual correspon-
dente ao fluxo x. Faça uma figura da rede residual correspondente ao fluxo x0 .
4.21 Caminhos dirigidos disjuntos. Sejam r e s dois nós de um grafo dirigido D. Queremos encontrar uma
coleção de k caminhos dirigidos de r a s, sem arcos em comum, que use o menor número possível
de arcos. Formule esse problema como um caso particular do problema 4.A. Repita o problema
com caminhos dirigidos sem nós em comum exceto r e s. [AMO 11.8]
4.22 Considere o grafo dirigido D definido pela matriz de adjacências abaixo. À direita da matriz, uma
função-demanda b, as capacidades u e custos c dos arcos. (Não confunda o nó b com a função-
custo b.) Encontre um fluxo ótimo x na rede (D, b, u, c). Encontre um potencial y que satisfaça as
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 83

condições de otimalidade do teorema 4.2. Calcule os custos reduzidos c(y). Faça uma tabela de
resultados para que seja fácil comparar x com c(y) e assim conferir a validade das folgas comple-
mentares (5). [AMO 9.22]

a b c d e b ab ae bc be cd ec ed
a − 1 − − 1 −25 u 25 20 10 25 20 20 25
b − − 1 − 1 0 c +7 +6 +4 +5 +1 +2 +2
c − − − 1 − 0
d − − − − − +25
e − − 1 − 1 0
4.23 A figura mostra um potencial y numa rede de fluxo (D, b, u, c). Ao lado de cada nó v vemos os
números bv e yv . Ao lado de cada arco e vemos oas números ce e ue . Encontre um fluxo viável x
que satisfaça as condições de otimalidade do teorema 4.2. [CCPS 4.9]

Seção 4.5
4.24 Escreva em código a rotina E NVIA F LUXO.
4.25 ? Como obter um ciclo de aumento? Suponha que x é um fluxo viável. Mostre informalmente como
calcular um ciclo de aumento. (Sugestão: Veja a prova do teorema 4.3 e a seção 1.5.)
4.26 ? Como obter um potencial ótimo? Suponha que x é uma solução ótima do pl (1). Sugira uma maneira
de calcular um potencial y que satisfaça as condições de otimalidade do teorema 4.2. (Sugestão:
Veja a prova do teorema 4.3 e a seção 1.5.)
4.27 Faça um esboço da implementação das rotinas C ICLO A UMENTO e P OTENCIAL. (Sugestão: Trata-se,
na verdade, de uma só rotina. Veja os exercícios 4.25 e 4.26.)
4.28 A figura mostra uma rede com capacidades (em negrito) e custos (em itálico) nos arcos. Os nós s e t
têm demandas −11 e 11 respectivamente. Os demais nós têm demanda 0. Calcule um fluxo viável
de custo mínimo. Prove que o fluxo é ótimo. [Sch17 4.16i]

Seção 4.6
4.29 Seja (D, b, u, c) uma rede de fluxo que permite arcos de capacidade infinta. Suponha que a rede
tem um fluxo ótimo. Para cada arco de capacidade infinita, queremos adotar uma capacidade
finita
P U tal que qualquer Pfluxo ótimo na nova rede seja ótimo na rede original. Mostre que U :=
(ue : e ∈ E, ue < ∞) + (bv : v ∈ V, bv > 0) tem a propriedade desejada. [CCPS 4.11]
4.30 Redes de transbordo. Considere as instâncias (D, b, u, c) do problema de fluxo de custo mínimo em
que não há restrição de capacidade, ou seja, tais que ue = ∞ para cada arco e. Escreva o programa
linear que descreve essas instâncias. Escreva o pl dual.
84 4.9. EXERCÍCIOS FEOFILOFF

4.31 ? Redes de transbordo. Enuncie a versão apropriada do teorema 4.2 (das condições de otimalidade)
para redes de fluxo que não têm restrições de capacidade (ou seja, redes em que todos os arcos têm
capacidade infinita). Mostre que nessa versão do teorema o vetor y é tal que cx = yb. Mostre que,
para qualquer vetor d cujas componentes são todas iguais, o vetor y+d tem as mesmas propriedades
de y. Explique por que (y + d)b = yb.
4.32 Programas lineares para capacidades infinitas. Escreva as adaptações dos pl’s (1) e (2) que representam
corretamente a extensão do problema 4.A que permite arcos de capacidade infinita. Verifique que
cada pl é dual do outro. Escreva as condições de folgas complementares (tratando em separado os
arcos de capacidade finita e infinita). Mostre que cx = yb + zu se e somente se valem as condições
de folgas complementares.
4.33 Seja r um nó de um grafo dirigido D com n nós. Suponha que br = −n + 1 e bv = +1 para cada
v 6= r. Suponha que não há restrições de capacidade (alternativamente, suponha que ue = ∞ para
cada arco e) e c ≥ 0. Dê um algoritmo para resolver o problema do fluxo de custo mínimo na rede
(D, b, u, c). Como calcular um vetor y que satisfaça as condições de otimalidade do teorema 4.2?

Subseção 4.7.1
4.34 Seja x um fluxo num grafo dirigido conexo D. Suponha que todo ciclo (dirigido ou não) em D tem
um arco vazio. Mostre que x é induzido por alguma bipartição arbórea de E(D).
4.35 ? Prove o lema 4.7. Dê um algoritmo que receba uma bipartição arbórea (T, L) de uma rede (D, b),
decida se a bipartição é viável, e em caso afirmativo calcule o fluxo induzido por (T, L).
4.36 Fluxo viável implica fluxo induzido. Prove a seguinte afirmação: se uma rede (D, b) tem um fluxo
viável então também tem um fluxo viável induzido por alguma bipartição arbórea. Prove a se-
guinte afirmação: se uma rede (D, b, c) tem um fluxo ótimo então também tem um fluxo ótimo que
é induzido por alguma bipartição arbórea.

Subseção 4.7.2
4.37 ? Dê um algoritmo que receba uma bipartição arbórea (T, L) de uma rede (D, c) e calcule um
potencial y induzido pela bipartição.
4.38 ? Prove o lema 4.8 e o lema 4.9.

Subseção 4.7.3
4.39 Resolva a instância do problema do transbordo indicada na figura. Use o algoritmo T RANS -
SHIPMENT S IMPLEX . Os números junto aos nós são as demandas b. Os números nos arcos são os
custos c. Comece com o fluxo x induzido pela bipartição arbórea (T, L) representada pelas linhas
contínuas. [CCPS 4.22]

4.40 Escreva uma implementação da rotina B IPARTIÇÃO V IÁVEL.


4.41 Implementação eficiente. Mostre como representar T de maneira eficiente no algoritmo T RANS -
SHIPMENT S IMPLEX . Mostre como os valores x, y e c(y) podem ser calculados, a cada iteração, a
partir dos valores de x, y e c(y) na iteração anterior (evitando assim que os valores sejam calculadas
diretamente a partir de (T, L)).
FEOFILOFF FLUXO VIÁVEL DE CUSTO MÍNIMO 85

Subseção 4.7.4
4.42 No algoritmo T RANSSHIPMENT S IMPLEX, suponha que (T, L) é fortemente viável no início de uma
iteração em que ε = 0. Mostre que h estará em Pw (e não em Pv ). Mostre que h será o último arco
direto vazio de Pw .
4.43 Bipartição arbórea inicial. Encontre uma maneira de construir a bipartição viável (T, L) na linha 01
de T RANSSHIPMENT S IMPLEX de modo que ela seja fortemente viável.
4.44 Exemplo 6. Analise o exemplo 4.6. Adote o nó d como raiz e verifique que no início de cada iteração
do algoritmo a bipartição arbórea (T, L) é fortemente viável.
4.45 De fortemente viável a fortemente viável. Suponha que (T, L) é fortemente viável e h é escolhido de
acordo com a regra (7). Mostre que no início da linha 16 de T RANSSHIPMENT S IMPLEX a bipartição
arbórea (T +e−h, L+h−e) é fortemente viável.
4.46 O número de iterações é finito. Seja r a raiz de D e defina y na linha 06 de T RANSSHIPMENT S IMPLEX
de modo que yr = 0 (e portanto yv = c(Pv ) para cada P v). Suponha que (T, L) é fortemente viável
no início de uma iteração e seja Y o valor da soma (yv : v ∈ V ) no fim da linha 06.PSuponha que
ε é nulo nessa iteração. Prove que na próxima iteração, no fim da linha 06, a soma (yv : v ∈ V )
será menor que Y . Deduza daí que o número de iterações degeneradas é finito.

Subseção 4.8.1
4.47 Prove o lema 4.10. Dê um algoritmo que receba uma tripartição arbórea (T, L, U ) de uma rede
(D, b, u), decida se a tripartição é viável, e em caso afirmativo calcule o fluxo induzido. Dê condi-
ções necessárias e suficientes para que uma tripartição arbórea (T, L, U ) seja viável.
4.48 Seja x um fluxo viável numa rede (D, b, u). Suponha que todo ciclo (dirigido ou não) em D tem um
arco vazio ou um arco cheio. Mostre que x é induzido por alguma tripartição arbórea.
4.49 Fluxo viável implica fluxo induzido. Prove as seguintes proposições: Se uma rede (D, b, u) tem um
fluxo viável então também tem um fluxo viável que é induzido por uma tripartição arbórea. Se
uma rede (D, b, u, c) tem um fluxo ótimo então também tem um fluxo ótimo que é induzido por
uma tripartição arbórea. (Sugestão: Dê um algoritmo que converta qualquer fluxo viável num
fluxo induzido equivalente.)

Subseção 4.8.2
4.50 ? Prove o lema 4.11.

Subseção 4.8.3
4.51 ? É possível ter h = e na linha 15 do N ETWORK S IMPLEX? Como o algoritmo se comporta nesse
caso?
4.52 Suponha que numa certa iteração do N ETWORK S IMPLEX escolhemos um arco e em U na linha 10.
Seja C o ciclo fundamental de T + e. Prove que c(C) < 0.
4.53 Tripartição arbórea inicial. Eis um truque feio mas efetivo para calcular a tripartição (T, L, U ) inicial
na linha 01 de N ETWORK S IMPLEX. Antes de invocar o algoritmo, acrescente a D um novo nó r e
novos arcos da seguinte maneira: para cada nó v com bv < 0, acrescente um novo arco vr; para
cada v tal que bv ≥ 0, acrescente um novo arco rv. Seja B + o conjunto dos novos arcos do tipo vr
e B − o conjunto dos novos arcos do tipo rv. Cada novo arco deve ter custo M e capacidade ∞.
A constante M deve ser positiva e muito grande. Seja T := B + ∪ B − . Adote fluxo xvr := −bv para
cada vr ∈ B + e fluxo xrv := bv para cada rv ∈ B − . Faça L igual ao conjunto dos arcos originais e
faça U ← ∅. A tripartição (T, L, U ) é fortemente viável se tomarmos r como raiz. Como o custo M
é muito grande, nenhum dos arcos artificiais estará na árvore produzida por N ETWORK S IMPLEX.
86 4.9. EXERCÍCIOS FEOFILOFF
Capítulo 5

Cortes globalmente mínimos

Este capítulo trata do problema de encontrar um corte mínimo em um grafo não-


dirigido. O tamanho de um corte é o número de arestas do corte. Se cada aresta tiver
uma capacidade, o tamanho de um corte é a soma das capacidades de suas arestas.
Um segundo objetivo do capítulo é encontrar uma pequena coleção de cortes que seja
“completa” no seguinte sentido: para cada par de nós, a coleção contém um corte
mínimo dentre os que separam um nó do outro. Uma tal coleção pode ser represen-
tada por uma árvore. Essa representação permite atender rapidamente solicitações do
seguinte tipo: dados dois nós, exiba um corte mínimo que os separa.
Todos os grafos neste capítulo são não-dirigidos. Por isso, diremos simplesmente grafo,
deixando o não-dirigido subentendido.

5.1 Cortes localmente mínimos


Um corte (= cut) em um grafo é qualquer conjunto de arestas que tenha a forma ∂(X)
para algum conjunto X de nós. O conjunto X e o seu complemento X são as duas X
margens do corte. É claro que ∂(X) = ∂(X).
Um conjunto X de nós separa um nó r de um nó s se r ∈ X e s ∈ X. Nas mesmas
condições, X separa s de r. Dizemos também que o corte ∂(X) separa r de s.
Uma função-capacidade para um grafo é qualquer função u que atribui um número
real ue ≥ 0 a cada aresta e do grafo.1 Podemos tratar u como um vetor real não-
negativo indexado pelo conjunto de arestas. Um grafo G é capacitado se for dotado de
uma função-capacidade. Num grafo capacitado (G, u), a capacidade de um corte C é
o número P
u(C) := e∈C ue .
Se X é uma margem do corte C, podemos usar a abreviatura u(X) := u(C).
Dados dois nós r e s de um grafo capacitado (G, u), um corte C é (r, s)-mínimo se C
1
Poderíamos supor que os números ue são racionais, uma vez que computadores digitais desconhe-
cem números irracionais.

87
88 5.1. CORTES LOCALMENTE MÍNIMOS FEOFILOFF

separa r de s e u(C) ≤ u(C 0 ) para todo corte C 0 que separa r de s. Dizemos que cortes
desse tipo são localmente mínimos.

Problema 5.A (corte localmente mínimo) Dada um grafo capacitado (G, u) e dois nós
r e s, encontrar um corte (r, s)-mínimo.

λ() A capacidade de um corte (r, s)-mínimo em (G, u) será denotada por λ(G, u, r, s). É
claro que λ(G, u, s, r) = λ(G, u, r, s).

5.1.1 Solução do problema

Para resolver o problema 5.A, basta adaptar o algoritmo do fluxo máximo e corte
mínimo discutido na seção 2.6 do capítulo 2. A adaptação consiste em trocar cada
aresta de G por dois arcos antiparalelos, atribuir a cada arco a capacidade da aresta,
e submeter o grafo dirigido resultante ao algoritmo. O algoritmo devolverá um corte
∂ − (X) que tem capacidade mínima dentre os que separam r de s no grafo dirigido.
No grafo capacitado original (G, u), o corte ∂(X) é (r, s)-mínimo. Essa adaptação do
algoritmo MFMC será chamada C ORTE L OCALMENTE M ÍNIMO.
A seguinte caracterização de cortes localmente mínimos segue do lema 2.6, do teo-
rema 2.7, e do lema 2.5, todos do capítulo 2:

Lema 5.1 (minimalidade de corte local) Para qualquer par (r, s) de nós de um grafo
capacitado (G, u), um corte ∂(X) que separa r de s é (r, s)-mínimo se e somente se
existem caminhos simplesP P1 , . . . , Pk de r a s e números positivos β1 , . . . , βk tais que
β1 + · · · + βk = u(X) e (βi : Pi 3 e) ≤ ue para cada aresta e de G.

Podemos dizer que cada caminho Pi conduz βi unidades de fluxo de rP a s e o conjunto


de caminhos conduz um fluxo de intensidade u(X). A desigualdade (βi : Pi 3 e) ≤
ue garante que a quantidade total de fluxo na aresta e não passa de ue e portanto o fluxo
respeita u.

E XEMPLO 5.1: Considere o grafo capacitado representado pela matriz de adjacências e capacidades
abaixo. (Complete a figura.) O corte ∂(X), com X := {a, b, d}, separa d de c e tem capacidade 5. Os
caminhos induzidos por (d, c), (d, b, c) e (d, a, b, c), conduzindo 2, 1 e 2 unidades de fluxo respecti-
vamente, satisfazem as condições do lema 5.1. Portanto, o corte ∂(X) é (d, c)-mínimo.

a b c d
a − 6 − 2 a b
b 6 − 3 1
c − 3 − 2 d c
d 2 1 2 −
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 89

5.1.2 Cortes mínimos em árvores

Embora simples, as instâncias do problema 5.A em que G é uma árvore merecem


especial atenção:

Lema 5.2 Para qualquer par (r, s) de nós de uma árvore capacitada (T, u), um corte
(r, s)-mínimo tem a forma {e}, sendo e uma aresta de capacidade mínima no único
caminho simples de r a s em T .

Nas condições do lema, se P é o caminho simples de r a s em T e E(P ) o conjunto das


arestas de P então λ(T, u, r, s) = mine∈E(P ) ue .

5.2 Submodularidade
É importante entender como diferentes cortes interagem. Dados dois cortes ∂(X) e
∂(Y ) de um grafo, é natural considerar os cortes ∂(X ∩ Y ) e ∂(X ∪ Y ). A interação
entre esses cortes obedece a seguinte desigualdade submodular:2

Lema 5.3 (desigualdade submodular) Para quaisquer conjuntos X e Y de nós de um


grafo capacitado (G, u), vale a desigualdade u(X ∩ Y ) + u(X ∪ Y ) ≤ u(X) + u(Y ).

P ROVA : Como u ≥ 0, podemos tratar de cada aresta do grafo em separado e examinar


a contribuição que cada uma dá para cada lado da desigualdade. Uma aresta e que
tem uma ponta em X ∩ Y e outra em X ∩ Y , contribui ue tanto para o lado esquerdo
quanto para o lado direito da desigualdade.

X X
• •
Y
Y
• •

Uma aresta e com uma ponta em X ∩ Y e outra em X ∩ Y contribui ue para o lado


esquerdo e ue para o lado direito. Uma aresta e de X ∩ Y para X ∩ Y contribui ue para
cada lado. Uma aresta e de X ∩ Y para X ∩ Y contribui ue para cada lado. Uma aresta
e de X ∩ Y para X ∩ Y contribui 2ue para cada lado. Finalmente, uma aresta e de X ∩ Y
para X ∩Y contribui 0 para o lado esquerdo e 2ue para o lado direito da desigualdade.

2
A palavra “submodular” foi inspirada na igualdade “modular” |X ∩ Y | + |X ∪ Y | = |X| + |Y | que
vale para qualquer par (X, Y ) de conjuntos.
90 5.3. CORTE GLOBALMENTE MÍNIMO FEOFILOFF

E XEMPLO 5.2: A figura mostra conjuntos X e Y de nós de um grafo capacitado (G, u). Observe a
desigualdade submodular u(X ∩ Y ) + u(X ∪ Y ) = 8 + 5 ≤ 9 + 6 = u(X) + u(Y ).

a b c d
a − 6 − 2
b 6 − 3 1
c − 3 − 2
d 2 1 2 −

A desigualdade submodular permite “descruzar” cortes localmente mínimos. Dados


nós r e s de um grafo capacitado (G, u) e conjuntos X e Y que separam r de s, se os
cortes ∂(X) e ∂(Y ) são (r, s)-mínimos então ∂(X ∩ Y ) e ∂(X ∪ Y ) também são (r, s)-
mínimos. Essa propriedade tem a seguinte generalização:

Lema 5.4 Dados nós r, s, p e q de um grafo capacitado (G, u), seja ∂(X) um corte (r, s)-
mínimo e ∂(Y ) um corte (p, q)-mínimo. Se X ∩ Y separa r de s e X ∪ Y separa p de q
então o corte ∂(X ∩ Y ) é (r, s)-mínimo e o corte ∂(X ∪ Y ) é (p, q)-mínimo.

P ROVA : Como X ∩ Y separa r de s e X ∪ Y separa p de q, temos u(X ∩ Y ) ≥ u(X) e


u(X ∪ Y ) ≥ u(Y ). Assim,

u(X) + u(Y ) ≤ u(X ∩ Y ) + u(X ∪ Y ).

Mas u(X ∩ Y ) + u(X ∪ Y ) ≤ u(X) + u(Y ) graças ao lema 5.3. Portanto, temos “=” no
lugar de cada “≤” e cada “≥”. Em particular, u(X ∩ Y ) = u(X) e u(X ∪ Y ) = u(Y ).
Segue daí que ∂(X ∩ Y ) é (r, s)-mínimo e ∂(X ∪ Y ) é (p, q)-mínimo.

E XEMPLO 5.3: No grafo capacitado da figura, o corte ∂(X) tem capacidade 7 e o corte ∂(Y ) tem ca-
pacidade 6. O corte ∂(X) é (r, s)-mínimo. (Para comprovar a minimalidade, veja os caminhos (r, s),
(r, p, b, s), (r, a, q, b, s) e (r, p, a, q, b, s) que conduzem 2, 2, 2 e 1 unidades de fluxo respectivamente.)
O corte ∂(Y ) é (p, q)-mínimo (verifique a minimalidade).

a p r b q s
a − 1 2 − 3 −
p 1 − 9 2 − −
r 2 9 − − − 2
b − 2 − − 3 8
q 3 − − 3 − 0
s − − 2 8 0 −

O corte ∂(X ∩ Y ) é (r, s)-mínimo e o corte ∂(X ∪ Y ) é (p, q)-mínimo.

5.3 Corte globalmente mínimo


O problema central deste capítulo tem como parâmetros um grafo capacitado (G, u) e
um subconjunto arbitrário K de V (G). Diremos que K é o conjunto de terminais do
grafo.
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 91

Um conjunto X de nós divide o conjunto K de terminais se X separa dois dos nós


de K. Em outras palavras, X divide K se X ∩ K 6= ∅ e X ∩ K 6= ∅. Nessas condições,
dizemos também que o corte ∂(X) divide K.
Dada um grafo capacitado (G, u) e um conjunto K de terminais, um corte C é K-
mínimo se C divide K e u(C) ≤ u(C 0 ) para todo corte C 0 que divide K. Dizemos que
um corte K-mínimo é globalmente mínimo; o advérbio é especialmente apropriado
quando K = V (G).

Problema 5.B (corte globalmente mínimo) Encontrar um corte globalmente mínimo


em um grafo capacitado (G, u) com conjunto K de terminais.

Uma instância do problema tem solução se e somente se |K| ≥ 2. O conjunto de


instâncias em que |K| = 2 é o problema 5.A da seção 5.1.

E XEMPLO 5.4: Seja T uma árvore e considere o grafo capacitado (T, u). Seja K um conjunto com
dois ou mais terminais. Se a é uma aresta de capacidade mínima de T e K = V (T ) então {a} é um
corte globalmente mínimo, conforme o lema 5.2. Se K 6= V (T ), encontrar um corte globalmente
mínimo é um pouco mais trabalhoso.

E XEMPLO 5.5: Seja (O, u) um grafo capacitado em que O consiste em um ciclo simples. Sejam
a1 , a2 , . . . , am as arestas de O em ordem crescente de capacidade. Seja K um conjunto de terminais.
Se K = V (O) então {a1 , a2 } é um corte globalmente mínimo. Se K 6= V (O), encontrar um corte
globalmente mínimo é um pouco mais trabalhoso.

A capacidade de um corte globalmente mínimo em (G, u, K) é denotada por λ(G, u, K). λ()
Se |K| < 2, adotamos a convenção λ(G, u, K) := ∞. É evidente que a λ(G, u, K) au-
menta quando K encolhe, ou seja, λ(G, u, K 0 ) ≥ λ(G, u, K) sempre que K 0 ⊂ K. A pro-
pósito, o número λ(G, 1, V (G)) é conhecido como aresta-conexidade (= edge-connectivity)
de G.
O problema 5.B é uma união de instâncias do problema 5.A, uma instância para cada
par de terminais. Assim,
λ(G, u, K) = min λ(G, u, r, s).
r,s ∈ K

Segue daí que uma instância do problema 5.B com k terminais pode ser resolvida com
k(k − 1)/2 invocações do algoritmo C ORTE L OCALMENTE M ÍNIMO da seção 5.1. Esse
número cresce com o quadrado de k, o que torna o método de solução lento.
Gomory e Hu observaram [GH61] que a interação (discutida na seção 5.2) entre os
muitos cortes localmente mínimos, permite calcular um corte globalmente mínimo
com apenas k−1 invocações do algoritmo C ORTE L OCALMENTE M ÍNIMO. As próximas
seções mostram como fazer isso.

5.4 Algoritmo para corte globalmente mínimo


O algoritmo de Gomory–Hu para o problema 5.B tem por base a seguinte propriedade,
que decorre do lema 5.4:
92 5.4. ALGORITMO PARA CORTE GLOBALMENTE MÍNIMO FEOFILOFF

Lema 5.5 Seja (G, u) um grafo capacitado, K um conjunto de terminais, e (r, s) um par
de elementos de K. Para qualquer corte (r, s)-mínimo ∂(X), se ∂(X) não é K-mínimo
então existe um corte K-mínimo ∂(Z) tal que

Z⊆X ou Z ⊆ X.

P ROVA : Suponha que ∂(X) não é globalmente mínimo e seja ∂(Y ) um corte global-
mente mínimo. É claro que u(Y ) < u(X) e que Y não separa r de s nem s de r. É claro
também que existem terminais p e q tais que ∂(Y ) é (p, q)-mínimo. Vamos mostrar que
existe um corte (p, q)-mínimo ∂(Z) tal que Z ⊆ X ou Z ⊆ X.
Ajuste a notação (intercambiando Y e Y se necessário) de modo que r e s estejam
ambos em Y . Ajuste a notação (intercambiando X e X se necessário) de modo que
p esteja em X. Ajuste a notação (intercambiando p e q se necessário) de modo que p
esteja em Y . Ajuste a notação (intercambiando r e s se necessário) de modo que r esteja
em X.

X X
r• •s
p •
Y
Y
q? • • q?

Caso 1: q ∈ X. Nesse caso, X ∩ Y separa r de s e X ∪ Y separa p de q. Assim, o


lema 5.4 garante que ∂(X ∪ Y ) é um corte (p, q)-mínimo. Tome Z := X ∩ Y e observe
que ∂(Z) = ∂(X ∪ Y ). Logo, ∂(Z) é (p, q)-mínimo e Z ⊆ X.
Caso 2: q ∈ X. Nesse caso, X ∩ Y separa s de r e X ∪ Y separa p de q. Assim, o
lema 5.4 garante que ∂(X ∪ Y ) é um corte (p, q)-mínimo. Tome Z := X ∩ Y e observe
que ∂(Z) = ∂(X ∪ Y ). Logo, ∂(Z) é (p, q)-mínimo e Z ⊆ X.
Em ambos os casos, u(Z) = u(Y ) pois ∂(Z) e ∂(Y ) são (p, q)-mínimos. Como Y é
globalmente mínimo, também Z é globalmente mínimo.

E XEMPLO 5.6: No grafo capacitado da figura, o corte ∂(X) é (r, s)-mínimo mas não globalmente
mínimo. O corte ∂(Y ) é globalmente mínimo. O corte ∂(X ∪ Y ), igual a ∂(X ∪ Y ), também é
globalmente mínimo e tem a propriedade X ∪ Y ⊆ X.

E XEMPLO 5.7: Sejam r e s dois nós de uma árvore capacitada (T, u). Seja e uma aresta de capa-
cidade mínima do único caminho simples de r a s. Se X é o conjunto de nós de uma das duas
componentes conexas de T − e, então ∂(X) é um corte (r, s)-mínimo. (Faça figuras!) A conclusão
do lema 5.5 é óbvia e natural nesse exemplo: se ∂(X) não é globalmente mínimo então existe um
corte globalmente mínimo ∂(Z) tal que Z ⊆ X ou Z ⊆ X.
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 93

E XEMPLO 5.8: Seja (G, u) um grafo capacitado em que G consiste em um ciclo simples. Para
quaisquer dois nós r e s existem exatamente dois caminhos simples de r a s em G. (Faça figu-
ras!) Digamos que os caminhos são P e Q. A capacidade de um corte (r, s)-mínimo é ua + ub ,
sendo a uma aresta de capacidade mínima em P e b uma aresta de capacidade mínima em Q. Faça
ilustrações do lema 5.5 no contexto deste exemplo.

A seguinte consequência do lema 5.5 contém a essência algoritmo de Gomory–Hu:

Teorema 5.6 (Gomory–Hu) Seja (G, u) um grafo capacitado com conjunto K de termi-
nais e (r, s) um par de elementos de K. Para qualquer corte (r, s)-mínimo ∂(X), se
∂(X) não é K-mínimo então (1) todo corte (K ∩ X)-mínimo é K-mínimo ou (2) todo
corte (K ∩ X)-mínimo é K-mínimo.

P ROVA : Seja ∂(X) um corte (r, s)-mínimo e suponha que ∂(X) não é K-mínimo. Então,
graças ao lema 5.5, existe um corte K-mínimo ∂(Z) tal que Z ⊆ X ou Z ⊆ X. É claro
que u(Z) = λ(G, u, K) < u(X) = λ(G, u, r, s).
Caso 1: Z ⊆ X. Ajuste a notação (intercambiando r e s se necessário) de modo que
r ∈ X es ∈ / X. Então s ∈ Z. Como u(Z) < λ(G, u, r, s), temos r ∈ Z e portanto
Z ∩ (K ∩ X) 6= ∅. Como Z ∩ (K ∩ X) = Z ∩ K 6= ∅, concluímos que Z divide K ∩ X.
Logo, u(Z) ≥ λ(G, u, K ∩ X) ≥ λ(G, u, K). Como λ(G, u, K) = u(Z), temos

λ(G, u, K ∩ X) = λ(G, u, K).

Em outras palavras, todo corte (K ∩ X)-mínimo é K-mínimo.


Caso 2: Z ⊆ X. Nesse caso, um argumento análogo ao do caso 1 mostra que todo corte
(K ∩ X)-mínimo é K-mínimo.

5.4.1 O algoritmo

O algoritmo de Gomory–Hu para o problema 5.B decorre do teorema 5.6. Ele recebe
um grafo capacitado (G, u) com conjunto K de terminais e usa o método da divisão e
conquista para calcular um corte K-mínimo.

C ORTE G LOBALMENTE M ÍNIMO (G, u, K)  |K| ≥ 2


1 sejam r e s dois nós de K
2 X ← C ORTE L OCALMENTE M ÍNIMO (G, u, r, s)  veja a seção 5.1
3 se |K ∩ X| ≥ 2
então X 0 ← C ORTE G LOBALMENTE M ÍNIMO G, u, K ∩ X

4
5 se u(X 0 ) < u(X) então X ← X 0
6 se |K ∩ X| ≥ 2
7 então X 00 ← C ORTE G LOBALMENTE M ÍNIMO (G, u, K ∩ X)
8 se u(X 00 ) < u(X) então X ← X 00
9 devolva X
94 5.4. ALGORITMO PARA CORTE GLOBALMENTE MÍNIMO FEOFILOFF

(Note que, para a maior parte dos pares (v, w) de nós de K, o algoritmo não calcula um
corte (v, w)-mínimo. Em particular, o algoritmo calcula um único corte (v, w)-mínimo
com v e w em lados opostos de ∂(X).)

E XEMPLO 5.9: A matriz de adjacências e capacidades abaixo representa um grafo capacitado (G, u).
Adote o conjunto de terminais K = V (G).

a b c d
a − 7 − 5
b 7 − 3 −
c − 3 − 2
d 5 − 2 −

Submeta (G, u, K) ao algoritmo C ORTE G LOBALMENTE M ÍNIMO. Tome r = a e s = b na linha 1 do


algoritmo. No fim da linha 2 temos X = {a, d} e u(X) = 9. No fim da linha 4 temos X 0 = {c},
u(X 0 ) = 5 e ∂(X 0 ) é (K ∩ X)-mínimo. No fim da linha 7 temos X 00 = {d}, u(X 00 ) = 7 e ∂(X 00 ) é
(K ∩ X)-mínimo.
Como u(X 0 ) < u(X 00 ) < u(X), o algoritmo devolve X 0 na linha 9. O corte ∂(X 0 ) é K-mínimo e
λ(G, u, K) = 5.

E XEMPLO 5.10: Seja (G, u) o grafo capacitado da figura (o mesmo do exemplo 5.3) com conjunto
de terminais K := V (G). No fim da linha 2 do algoritmo temos X = {a, p, r}. O corte ∂(X) é
(r, s)-mínimo e tem capacidade u(X) = 7.
No fim da linha 4 temos X 0 = {q}. O corte ∂(X 0 ) é (K ∩ X)-mínimo e tem capacidade u(X 0 ) = 6.
No fim da linha 7 temos X 00 = {b, p, r, s}. O corte ∂(X 00 ) é (K ∩ X)-mínimo e tem capacidade
u(X 00 ) = 6. (O algoritmo poderia, igualmente bem, ter escolhido X 00 = ∂({a}).)

a p r b q s
a − 1 2 − 3 −
p 1 − 9 2 − −
r 2 9 − − − 2
b − 2 − − 3 8
q 3 − − 3 − 0
s − − 2 8 0 −

Como u(X 0 ) = u(X 00 ) < u(X), o algoritmo devolve X 0 . O corte ∂(X 0 ) é K-mínimo. O corte ∂(X 00 )
também é K-mínimo.

5.4.2 Consumo de tempo

Seja k o número de terminais, isto é, k := |K|. Se f (k) é o número máximo de invoca-


ções do algoritmo C ORTE L OCALMENTE M ÍNIMO na linha 2 de C ORTE G LOBALMENTE -
M ÍNIMO então f (1) = 0 e

f (k) = 1 + 0max
00
(f (k 0 ) + f (k 00 ))
k +k =k

para k ≥ 2, sendo max tomado sobre todos os pares (k 0 , k 00 ) de inteiros positivos tais
que k 0 + k 00 = k. A solução dessa recorrência é f (k) = k − 1 para todo k ≥ 1. Em outras
palavras, o algoritmo C ORTE G LOBALMENTE M ÍNIMO faz no máximo

k−1
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 95

cálculos de corte localmente mínimo. Assim, o consumo de tempo de C ORTE G LOBAL -


MENTE M ÍNIMO é O(k F (n, m)), sendo F (n, m) o consumo de C ORTE L OCALMENTE M Í -
NIMO para um grafo com n nós e m arestas. Como k ≤ n e F (n, m) = O(nm2 ), podemos
dizer que o algoritmo consome O(n2 m2 ) unidades de tempo.
Embora execute o subalgoritmo C ORTE L OCALMENTE M ÍNIMO apenas k − 1 vezes, o
algoritmo C ORTE G LOBALMENTE M ÍNIMO é um tanto lento. Outros algoritmos para
o problema 5.B têm o mesmo consumo assintótico mas são mais rápidos porque a
constante escondida sob a notação O() é menor.

5.5 Coleções laminares de cortes localmente mínimos


O algoritmo C ORTE G LOBALMENTE M ÍNIMO da seção anterior calcula uma certa co-
leção de cortes localmente mínimos. O teorema 5.6 sugere que essa coleção poderia
ser laminar (veja definição na seção A.6 do apêndice A). Entretanto, a relação entre o
conjunto X produzido na linha 2 do algoritmo e o conjunto X 0 produzido na linha 4
não é necessariamente laminar, pois X 0 pode dividir X. (O mesmo pode ser dito da
relação entre X e o conjunto X 00 produzido na linha 7 do algoritmo.) Para garantir
a laminaridade da coleção que o algoritmo calcula, é preciso recorrer à operação de
contração.
A contração (= shrinking) de um conjunto X de nós de um grafo G é a operação que
produz um novo grafo em que X é tratado como um nó. Mais precisamente, se V é
o conjunto de nós de G, então o novo grafo G0 tem conjunto de nós (V r X) ∪ {X}
e conjunto de arestas definido da seguinte maneira: para cada aresta vw de G tal que
v ∈ V r X,
• se w ∈ V r X então vw é aresta de G0 e
• se w ∈ X então vX é aresta de G0 .
As arestas de G que têm ambas as pontas em X não estão representadas em G0 . Ade-
mais, G0 não tem arestas “paralelas”: ainda que G tenha arestas vw e vz com v ∈ V r X
e w e z ambos em X, o grafo G0 terá uma só aresta vX.
A definição da função-capacidade u0 no grafo 0 0
PG é previsível: uvw := uvw para cada
0 0
aresta vw de G com v e w em V r X e uvX := (uvw : vw ∈ ∂(X)) para cada aresta vX
de G0 . Observe que u0 (R) = u(R) para qualquer subconjunto R de V r X. De modo
mais geral, u0 (R) = u(R) para qualquer subconjunto R de V (G0 ), desde que o lado
direito dessa igualdade seja tacitamente traduzido para o contexto de G: se R 3 X,
então o “R” na expressão “u(R)” deve ser entendido como (R r {X}) ∪ X.
Suporemos que a operação de contração está encapsulada numa rotina C ONTRAÇÃO
que recebe (G, u, X) e devolve (G0 , u0 ).
O seguinte algoritmo recebe um grafo capacitado (G, u) e um conjunto K de terminais
e devolve uma coleção laminar L de subconjuntos de V (G). Essa coleção é completa
para (G, u, K) no seguinte sentido: para cada par (i, j) de nós de K, existe um e apenas
um L em L tal que o corte ∂(L) é (i, j)-mínimo.
96 5.5. COLEÇÕES LAMINARES DE CORTES LOCALMENTE MÍNIMOS FEOFILOFF

C ORTES M ÍNIMOS (G, u, K)


01 se |K| ≤ 1
02 então devolva ∅ e pare
03 sejam r e s dois nós de K
04 X ← C ORTE L OCALMENTE M ÍNIMO (G, u, r, s)  seção 5.1
05 (G0 , u0 ) ← C ONTRAÇÃO (G, u, X)
06 L0 ← C ORTES M ÍNIMOS G0 , u0 , K ∩ X


07 L0 ← PADRONIZAÇÃO (L0 , X) 
08 (G00 , u00 ) ← C ONTRAÇÃO G, u, X
09 L00 ← C ORTES M ÍNIMOS (G00 , u00 , K ∩ X)
10 L00 ← PADRONIZAÇÃO L00 , X
11 devolva L0 ∪ {X} ∪ L00

No fim da linha 06, podemos supor que L0 é uma coleção laminar e completa para
(G0 , u0 , K ∩ X). Na linha 07, a rotina PADRONIZAÇÃO transforma L0 numa coleção
equivalente cujos elementos são subconjuntos de X. Para obter esse efeito, a rotina
troca por L cada elemento L de L0 tal que L 3 X. Como ∂(L) = ∂(L), a coleção L0
permanece completa. Além disso, a coleção permanece laminar, conforme o lema A.3
do apêndice A. Assim, ao final da linha 07, L0 é uma coleção laminar e completa para
(G, u, K ∩ X) e todos os elementos de L0 são subconjuntos de X.
As linhas 08 a 10 fazem operações análogas com X no lugar de X. Ao final da linha 10,
L00 é uma coleção laminar completa de (G, u, K ∩ X) e todos os elementos de L00 são
subconjuntos de X.
Na linha 11, graças à rotina PADRONIZAÇÃO, a coleção L0 ∪ {X} ∪ L00 é laminar. Ade-
mais, essa coleção é completa para (G, u, K).

E XEMPLO 5.11: A matriz de adjacências e capacidades abaixo representa um grafo capacitado


(G, u) com conjunto de terminais K := V (G).

a b c d
a − 7 − 5
b 7 − 3 −
c − 3 − 2
d 5 − 2 −

Submeta (G, u, K) ao algoritmo C ORTES M ÍNIMOS. Tome r = a e s = b na linha 03 do algoritmo.


No fim da linha 04, temos X = {a, d}.
O grafo G0 tem conjunto de nós {b, c, X}. O corte ∂({b, X}) é (b, c)-mínimo em (G0 , u0 ). No fim da
linha 06, temos L0 = {{b, X}}. No fim da linha 07, temos L0 = {{c}}.
No fim da linha 08, G00 tem conjunto de nós {a, d, X}. No fim da linha 10, temos L00 = {{d}}.
O algoritmo devolve a coleção L := {{d}, {a, d}, {c}}. Está claro que a coleção é laminar. Ela
poderia ser representada pela expressão ((d) a) (c). A seguinte tabela resume o caráter completo
da coleção L:
X ∂(X) é (i, j)-mínimo
{d} (a, d), (b, d)
{a, d} (a, b)
{c} (a, c), (b, c), (c, d)
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 97

E XEMPLO 5.12: A matriz de adjacências e capacidades abaixo representa um grafo capacitado


(G, u). Suponha que o conjunto de terminais é K := V (G).

a b c d e f
a − 1 − − − −
b 1 − 2 − 3 −
c − 2 − − − −
d − − − − 4 −
e − 3 − 4 − 5
f − − − − 5 −

Aplique o algoritmo C ORTES M ÍNIMOS a (G, u, K). Tome r = b e s = e na linha 03 do algoritmo.


Tome X = {d, e, f } na linha 04.
O grafo G0 tem conjunto de nós {a, b, c, X} mas o nó X não é considerado terminal. O corte ∂({a})
é (a, c)-mínimo em (G0 , u0 ). O corte ∂({a, b, X}) é (b, c)-mínimo em (G0 , u0 ). Depois da linha 06,
temos L0 = {{a}, {a, b, X}}. Depois da linha 07, L0 = {{a}, {c}}.
O grafo G00 tem conjunto de nós {d, e, f, X} mas o nó X não é um terminal. Depois da linha 10,
temos L00 = {{d}, {f }}.
A coleção L := L0 ∪ {X} ∪ L00 , igual a {{a}, {c}, {a, b, c}, {d}, {f }}, é laminar. Essa coleção pode
ser representada pela expressão ((a) (c) b) (d) (f ). A seguinte tabela exibe o caráter completo da
coleção:
{a} (a, b), (a, c)
{c} (b, c)
{a, b, c} (a, d), (a, e), (a, f ), (c, d), (c, e), (c, f ), (b, e)(b, d), (b, f )
{d} (d, e), (d, f )
{f } (e, f )

Se o grafo G for pequeno e estiver representado por uma figura numa folha de papel,
o algoritmo C ORTES M ÍNIMOS pode ser executado de maneira “gráfica” e iterativa,
fazendo as contrações implicitamente: basta desenhar uma “bola” em volta do con-
junto X, como num diagrama de Venn, no fim de cada execução da linha 04. No início
de cada iteração teremos uma coleção laminar L de “bolas”. Em cada iteração, escolha
dois terminais r e s que não estejam separados por um elemento de L e encontre um
conjunto X tal que ∂(X) seja (r, s)-mínimo e L∪{X} seja laminar. Feito isso, acrescente
X a L e comece nova iteração.

E XEMPLO 5.13: Seja (G, u) o grafo capacitado da figura. Suponha que todos os nós são terminais.
A tabela à direita da figura mostra os sucessivos valores das variáveis r, s e X do algoritmo C OR -
TES M ÍNIMOS .
(r, s) X u(X)
(e, h) e g j 2
(e, j) j 5
(e, g) e 5
(h, i) h 4
A coleção de todos os valores que X assume é completa e laminar, podendo ser representada pela
expressão (g (j) (e)) (h).
98 5.6. ÁRVORES DE CORTES MÍNIMOS FEOFILOFF

5.6 Árvores de cortes mínimos


Uma coleção laminar completa de cortes de um grafo capacitado pode ser represen-
tada, de maneira muito compacta, por uma árvore capacitada. Para apresentar essa
árvore, vamos nos limitar ao caso em que todos os nós do grafo são terminais.
Uma árvore de cortes mínimos, ou árvore de Gomory–Hu, de um grafo capaci-
tado (G, u) é qualquer árvore T com V (T ) = V (G) dotada da seguinte propriedade:
para cada aresta ij de T , o conjunto de nós de qualquer das duas componentes conexas
de T − ij é margem de um corte (i, j)-mínimo de (G, u). Em geral, E(T ) não tem
qualquer relação com E(G) e portanto T não é um subgrafo de G.
Dada uma árvore de cortes mínimos T de (G, u), é natural atribuir uma capacidade ûij
a cada aresta ij de T da seguinte maneira:

ûij := u(X),

sendo X o conjunto de nós de qualquer uma das duas componentes conexas de T − ij.
(Convém lembrar que u(X) é a capacidade do corte ∂(X) em G.) Segue daí que ûij =
λ(G, u, i, j) para cada aresta ij de T . Podemos sizer que (T, û) é uma árvore capacitada
de cortes mínimos de (G, u).

E XEMPLO 5.14: Seja (T, u) um grafo capacitado em que T é uma árvore. É fácil verificar que T é
uma árvore de cortes mínimos de (T, u).

E XEMPLO 5.15: Seja (O, u) um grafo capacitado em que O consiste em um ciclo simples. Encontre
uma árvore de cortes mínimos de (O, u).

E XEMPLO 5.16: O lado esquerdo da figura mostra um grafo capacitado (G, u). O lado direito
mostra uma árvore de cortes mínimos de (G, u) e a respectiva função-capacidade.

Uma árvore de cortes mínimos descreve todos os cortes localmente mínimos de (G, u),
e não apenas os cortes mínimos que correspondem às arestas da árvore. É o que mostra
o seguinte lema.

Lema 5.7 Se T é uma árvore de cortes mínimos de um grafo capacitado (G, u) e P


é um caminho simples em T que vai de um nó r a um nó s então λ(G, u, r, s) =
minij∈P λ(G, u, i, j).

Assim, uma árvore capacitada de cortes mínimos (T, û) é uma representação compacta
de todos os cortes localmente mínimos de (G, u): para quaisquer dois nós r e s de G,
um corte (r, s)-mínimo de (G, u) tem por margens as duas componentes conexas de
T − ij, sendo ij uma aresta de capacidade mínima no único caminho simples de r a s
em (T, û).
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 99

Em outras palavras, os cortes localmente mínimos de (G, u) são iguais aos cortes local-
mente mínimos de (T, û). De acordo com o lema 5.2, temos λ(G, u, r, s) = λ(T, û, r, s)
para quaisquer dois nós r e s.

Teorema 5.8 (Gomory–Hu) Todo grafo capacitado (G, u) tem uma árvore de cortes
mínimos.

A prova do teorema é um algoritmo que constrói uma árvore de cortes mínimos para
(G, u). O algoritmo pode ser descrito informalmente assim: primeiro, calcule um cole-
ção laminar completa L para (G, u, V (G)); depois, para cada par (i, j) de nós que esteja
separado por um único elemento de L, insira uma aresta ij na árvore.

E XEMPLO 5.17: Seja (G, u) o grafo capacitado representada na primeira das figuras abaixo. A tabela
mostra um coleção laminar completa de conjuntos de nós para o grafo. A última figura mostra a
correspondente árvore de cortes mínimos.

X u(X)
egj 2
j 5
e 5
h 4

E XEMPLO 5.18: A tabela descreve uma coleção laminar completa para o grafo capacitado (G, u)
da figura. A coleção pode ser representada pela expressão (((b) a) c) (e) ((h) x) d. À direita da
tabela temos a matriz de adjacências e capacidades da correspondente árvore de cortes mínimos.
[CCPS 3.71]

a b c d e h x
(r, s) X u(X) a − 8 8 − − − −
(h, e) hx 7 b 8 − − − − − −
(c, b) ab 8 c 8 − − 9 − − −
(a, b) b 8 d − − 9 − 8 − 7
(c, d) abc 9 e − − − 8 − − −
(d, e) e 8 h − − − − − − 8
(h, x) h 8 x − − − 7 − 8 −

A discussão acima tratou do caso em que todos os nós do grafo são terminais. É
possível generalizar o conceito de árvore de cortes mínimos e o teorema 5.8 para tratar
do caso em que nem todos os nós do grafo são terminais.

5.7 Exercícios
Seção 5.1
5.1 ? Seja (O, u) um grafo capacitado em que O consiste em um ciclo simples. Sejam r e s dois nós
de O. Descreva um corte (r, s)-mínimo.
5.2 ? Prove o lema 5.1.
100 5.7. EXERCÍCIOS FEOFILOFF

5.3 ? Considere o grafo capacitado da figura. Para cada par (r, s) de nós, seja M [r, s] a capacidade de
um corte (r, s)-mínimo. Exiba a matriz M . Exiba um corte (b, e)-mínimo e prove a minimalidade
desse corte.

5.4 ? Prove o lema 5.2.

Seção 5.2
5.5 Sejam X e Y dois conjuntos de nós de um grafo capacitado (G, u). Quais são os valores de u(X ∩ Y )
e u(X ∪ Y ) quando X ⊂ Y ? Quais são os valores de u(X ∩ Y ) e u(X ∪ Y ) quando X ∩ Y = ∅?
5.6 ? Considere o grafo capacitado (G, u) da figura. Seja X o conjunto {a, c, e} e Y o conjunto {c, d}.
Calcule u(X), u(Y ), u(X ∩ Y ) e u(X ∪ Y ) e confira a desigualdade submodular.

5.7 ? Prove a seguinte variante da desigualdade submodular: para quaisquer conjuntos X e Y de nós
de um grafo capacitado (G, u) tem-se u(X ∩ Y ) + u(X ∩ Y ) ≤ u(X) + u(Y ).
5.8 ? Sejam r e s dois nós de um grafo capacitado (G, u) e sejam X e Y dois conjuntos de nós que
separam r de s. Suponha que os cortes ∂(X) e ∂(Y ) são (r, s)-mínimos. Mostre que ∂(X ∩ Y ) e
∂(X ∪ Y ) também são (r, s)-mínimos.
5.9 ? Descruzamento de cortes localmente mínimos. Sejam r e s dois nós de um grafo capacitado (G, u) e
∂(X) um corte (r, s)-mínimo. Sejam p e q dois nós de X. Imite a prova do lema 5.4 para mostrar
que existe um corte (p, q)-mínimo ∂(Z) tal que Z ⊆ X.

Seção 5.3
5.10 Prove que λ(G, u, K) = minr,s ∈ K λ(G, u, r, s) em qualquer grafo capacitado (G, u) com conjunto
K de terminais.
5.11 ? Sejam r e s dois nós de um grafo capacitado (G, u). Seja ∂(X) um corte (r, s)-mínimo. Suponha
que X separa dois nós p e q. É verdade que ∂(X) é um corte (p, q)-mínimo?
5.12 ? Árvore. Descreva um algoritmo que resolva qualquer instância (G, u, K) do problema 5.B em que
G é uma árvore.
5.13 ? Ciclo simples. Descreva um algoritmo que resolva as instâncias (G, u, K) do problema 5.B em que
G é conexo e cada um de seus nós tem grau 2.
5.14 Teta. Seja H um grafo que consiste em dois nós, digamos p e q, e três caminhos simples, sem nós
em comum exceto p e q, ligando p a q. Seja u uma função-capacidade para H. Qual a capacidade
de um corte globalmente mínimo em (H, u, V (H))?

Seção 5.4
5.15 ? Ciclo simples. Complete a discussão do exemplo 5.8.
5.16 Mostre que f (k) = k − 1 é a solução da recorrência na análise de consumo de tempo do algoritmo
C ORTE G LOBALMENTE M ÍNIMO.
FEOFILOFF CORTES GLOBALMENTE MÍNIMOS 101

5.17 Reescreva o código do algoritmo C ORTE G LOBALMENTE M ÍNIMO de modo que ele aceite grafos
com apenas um terminal.
5.18 Sejam r, s e t três nós de um grafo capacitado (G, u). Seja B um corte (r, s)-mínimo, seja C um
corte (s, t)-mínimo, e seja D um corte (r, t)-mínimo. Mostre que dois desses cortes têm a mesma
capacidade e o terceiro tem capacidade não menor que a dos outros dois.

Seção 5.5
5.19 Seja (G, u) um grafo capacitado e K um conjunto de terminais do grafo. Para cada par (i, j) de nós
terminais, seja Xij uma margem de um corte (i, j)-mínimo. A coleção de todos os conjuntos Xij
satisfaz a definição de coleção completa?
5.20 Refaça o exemplo 5.13 com outras escolhas de r, s e X ao longo da execução do algoritmo C ORTES -
M ÍNIMOS.
5.21 ? Seja L a coleção laminar completa produzida pelo
S algoritmo C ORTES M ÍNIMOS. Prove que L
tem a seguinte propriedade: o conjunto V (G) r L tem exatamente um nó. Prove a seguinte
S
propriedade mais geral: para cada L em L, se M := {M ∈ L : M ⊆ L} então o conjunto L r M
contém extamente um nó.

Seção 5.6
5.22 ? Prove o lema 5.7.
5.23 É verdade que a definição de árvore de cortes mínimos só faz sentido para grafos capacitados
conexos?
5.24 Seja (G, u) um grafo capacitado. Suponha que todos os nós de G são terminais. Seja (T, û) uma
árvore capacitada tal que V (T ) = V (G) e ûij = λ(G, u, i, j) para cada par (i, j) de nós. É verdade
que T é uma árvore de cortes mínimos de (G, u)?
5.25 Ciclo simples. Seja G o grafo que consiste no ciclo simples (a, b, c, d, e, f, g, h, a). Suponha que as
arestas de e ha têm capacidade 10 e todas as demais têm capacidade maior que 10. (Faça uma
figura.) Verifique que (G − de − ha) + dh é uma árvore de cortes mínimos do grafo capacitado.
(Dica: A árvore é induzida pelo caminho (a, b, c, d, h, g, f, e). Note que a aresta dh da árvore não
pertence a G.)
5.26 Seja G o grafo que consiste no ciclo simples (a, b, c, d, e) e nada mais. Suponha que todas arestas
têm capacidade 1. Desenhe a árvore de cortes mínimos sugerida pela expressão (c) (((e) d) a) b.
Construa uma árvore de cortes mínimos de G diferente da anterior. Construa uma terceira árvore,
diferente das anteriores.
5.27 ? Grafo teta. Seja H um grafo que consiste em dois nós, digamos p e q, e três caminhos simples —
sem nós em comum exceto p e q — ligando p a q. Seja u uma função-capacidade para H. Descreva
uma árvore de cortes mínimos de (H, u).
5.28 Seja (T, û) uma árvore capacitada de cortes mínimos de um grafo capacitado (G, u). Seja ij uma
aresta de T , seja r um nó em uma das componentes conexas de T − ij, e seja s um nó na outra
componente conexa de T − ij. É verdade que um corte (r, s)-mínimo em G tem capacidade ûij ?
5.29 Construa uma árvore de cortes mínimos para o grafo capacitado da figura.

5.30 Construa uma árvore de cortes mínimos para o grafo capacitado da figura.
102 5.7. EXERCÍCIOS FEOFILOFF

5.31 A matriz de adjacências abaixo define um grafo G. (Faça uma figura.) Suponha que todas as arestas
têm capacidade 1. Construa uma árvore de cortes mínimos de G.

a b c d e f g h i
a − 1 1 − − − − − −
b 1 − 1 − − 1 − − −
c 1 1 − − − − − 1 −
d − − − − 1 1 − − −
e − − − 1 − 1 − − 1
f − 1 − 1 1 − − − −
g − − − − − − − 1 1
h − − 1 − − − 1 − 1
i − − − − 1 − 1 1 −

5.32 Tente provar o teorema 5.8. Que dificuldades você encontra?


5.33 Generalize o conceito de árvore de cortes mínimos e o teorema 5.8 para tratar do caso em que nem
todo os nós do grafo são terminais.
5.34 ? Seja G um grafo com a seguinte propriedade: para cada par (r, s) de nós, algum corte com menos
que d arestas separa r de s. Mostre que G tem um nó de grau menor que d. [András Frank,
CCPS 3.72]
Capítulo 6

Emparelhamentos perfeitos

Este capítulo estuda o problema dos emparelhamentos perfeitos em grafos. O pro-


blema tem um papel central no estudo dos emparelhamentos de cardinalidade má-
xima, a ser empreendido no próximo capítulo.
As técnicas desenvolvidas no capítulo 2 para tratar de fluxos são suficientes para estu-
dar emparelhamentos em grafos bipartidos. Mas novas técnicas são necessárias para
estudar o problema em grafos arbitrários.
A solução do problema do emparelhamento perfeito — que começou com
W. Tutte [Tut] em 1947 e culminou com J. Edmonds em 1965 — é um importante marco
no desenvolvimento da otimização combinatória.
Todos os grafos neste capítulo serão não-dirigidos. Por isso, diremos simplesmente
grafo, deixando subentendido o adjetivo não-dirigido.

6.1 Emparelhamentos
Um emparelhamento (= matching) num grafo G é um conjunto M de arestas que incide
no máximo uma vez em cada nó de G. Um emparelhamento M cobre um nó v se v é
ponta de alguma aresta de M . Se M não cobre v, dizemos que v está exposto por M ,
ou que está M -exposto.

E XEMPLO 6.1: As arestas vermelhas constituem um emparelhamento no grafo da figura. O empa-


relhamento deixa 2 nós expostos.

Um emparelhamento M num grafo G é perfeito se cobre todos os todos nós de G, ou


seja, se não deixa nós expostos. Um emparelhamento M é máximo se tem cardinali-
dade máxima, ou seja, se |M | ≥ |M 0 | para qualquer outro emparelhamento M 0 em G.
É claro que todo emparelhamento perfeito é máximo.

103
104 6.2. CAMINHOS ALTERNANTES E O TEOREMA DE BERGE FEOFILOFF

6.2 Caminhos alternantes e o teorema de Berge


Dado um emparelhamento M num grafo G, um caminho alternante é qualquer cami-
nho simples em G cujas arestas estão alternadamente em M e fora de M . Um caminho
alternante é aumentador (= augmenting), ou de aumento, se tiver pelo menos uma
aresta e seus extremos estiverem M -expostos. Para ressaltar o papel de M , podemos
usar as expressões caminho M -alternante e caminho M -aumentador. É claro que não existe
caminho M -aumentador se M for perfeito.

E XEMPLO 6.2: As linhas grossas representam um emparelhamento no grafo. Os quadrados desta-


cam um caminho aumentador.

Um caminho M -aumentador permite transformar M num emparelhamento maior.


Para realizar essa operação, usamos o conceito de diferença simétrica entre dois con-
juntos A e B. Trata-se do conjunto (A r B) ∪ (B r A), igual a (A ∪ B) r (A ∩ B), que
denotamos por A ⊕ B. Se P é um caminho M -aumentador então M ⊕ E(P ) é um
emparelhamento e esse emparelhamento é maior que M .
O conceito de caminho aumentador sugere um algoritmo iterativo para encontrar um
emparelhamento máximo. Essa ideia levanta duas perguntas: (1) como encontrar
um caminho aumentador? e (2) existe caminho M -aumentador sempre que M não
é máximo? Trataremos da primeira pergunta mais adiante. Quanto à segunda, ela foi
respondida por C. Berge [Ber] em 1957:

Teorema 6.1 (de Berge) Um emparelhamento M é máximo se e somente se não existe


caminho M -aumentador.

P ROVA DO TEOREMA : Suponha que P é um caminho M -aumentador. Então M ⊕ E(P )


é um emparelhamento que cobre todos os nós cobertos por M e mais dois. Logo, M
não é máximo.
Suponha agora que um emparelhamento M não é máximo. Então existe um empare-
lhamento maior, digamos N . Cada nó do grafo pertence a no máximo duas arestas do
conjunto M ⊕ N . Portanto, cada componente conexa do subgrafo induzido por M ⊕ N
consiste em um ciclo simples ou um caminho simples. Como |N | > |M |, alguma
componente é um caminho com mais arestas em N que em M . Esse caminho é M -
aumentador.

E XEMPLO 6.3: A primeira figura mostra um emparelhamento M (linhas grossas). A segunda


mostra um emparelhamento N (linhas duplas) no mesmo grafo. A terceira mostra o subgrafo
induzido por M ⊕ N .
FEOFILOFF EMPARELHAMENTOS PERFEITOS 105

Caminhos aumentadores para emparelhamentos são análogos aos caminhos de au-


mento para fluxo máximo da seção 2.4, capítulo 2. Mas algumas diferenças chamam a
atenção: lá os grafos eram dirigidos, enquanto aqui são não-dirigidos; lá podíamos ter
dois ou mais arcos consecutivos do mesmo tipo (direto ou inverso), enquanto aqui as
arestas estão alternadamente no emparelhamento e fora dele. Conforme a seção 2.4,
um fluxo x é máximo se e somente se não existe caminho de aumento para x. Esse fato
é análogo ao teorema 6.1.

6.3 Emparelhamentos perfeitos


O assunto central deste capítulo é o problema de encontrar um emparelhamento per-
feito. Para simplificar, adotaremos a abreviatura “ep” para a expressão “emparelha- ep
mento perfeito” (= perfect matching).

Problema 6.A (do ep) Encontrar um emparelhamento perfeito num grafo.

A seção anterior sugeriu o seguinte algoritmo iterativo para o problema: cada ite-
ração começa com um emparelhamento imperfeito M e procura um caminho M -
aumentador; ao encontrar um caminho aumentador P , troca M por M ⊕E(P ) e começa
nova iteração. Infelizmente, encontrar um caminho aumentador não é fácil. Mas antes
de enfrentar esse desafio, é preciso estudar as instâncias do problema que não têm
solução.

E XEMPLO 6.4: A figura mostra um ep (linhas grossas) num grafo G.

6.4 Condições de existência de solução


Nem toda instância do problema 6.A tem solução. Como provar que um dado grafo
não tem ep? Que condições são necessárias e suficientes para a existência de um ep?
106 6.4. CONDIÇÕES DE EXISTÊNCIA DE SOLUÇÃO FEOFILOFF

É claro que todo grafo dotado de ep tem um número par de nós. Mas essa condição não
é suficiente. Uma condição necessária mais forte envolve o conceito de componente
ímpar. Uma componente ímpar (= odd component) de um grafo H é qualquer compo-
nente conexa de H que tenha um número ímpar de nós. O número de componentes
oc(·) ímpares de H é denotado por oc(H).

Lema 6.2 (das componentes ímpares) Se um grafo G tem um emparelhamento per-


feito então oc(G−A) ≤ |A| para todo subconjunto próprio A de V (G).

A expressão G−A denota o subgrafo de G induzido por V (G) r A. Essa notação será
usada com frequência no que segue.

P ROVA DO LEMA : Seja M um ep e k := oc(G−A). Sejam H1 , . . . , Hk as componentes


ímpares de G−A.

Para cada i, seja Vi := V (Hi ) e Mi := M ∩ E(Hi ). Como |Vi | é ímpar, temos 2|Mi | ≤
|Vi | − 1. Como M é perfeito, algum nó de Hi está ligado a A por uma aresta de M . Por
outro lado, no máximo |A| arestas de M têm alguma ponta em A. Portanto, k ≤ |A|.

A condição necessária estabelecida no lema é também suficiente, como mostra o se-


guinte teorema de W. Tutte [Tut]:

Teorema 6.3 (de Tutte) Para qualquer grafo G, se oc(G−A) ≤ |A| para todo subcon-
junto próprio A de V (G) então G tem um emparelhamento perfeito.

Essa condição para a existência de um ep é conhecida como condição de Tutte. Uma


prova algorítmica do teorema será discutida mais adiante neste capítulo.
O caso especial em que muitas componentes conexas de G−A têm apenas um nó me-
rece atenção. Denotaremos por oc1 (G−A) o número de nós isolados do grafo G−A.
É evidente que todo grafo G dotado de ep satisfaz a condição oc1 (G−A) ≤ |A| para
todo A ⊂ V (G). O teorema de Kőnig 3.3, discutido na seção 3.1, mostra que essa
condição também é suficiente quando G é bipartido:

Corolário 6.4 (do teorema de Kőnig) Para qualquer grafo bipartido G, se oc1 (G−A) ≤
|A| para todo subconjunto próprio A de V (G) então G tem um emparelhamento per-
feito.
FEOFILOFF EMPARELHAMENTOS PERFEITOS 107

6.5 Árvores alternantes e nós coloridos


Podemos tratar agora da solução algorítmica do problema 6.A. Gostaríamos de ter um
algoritmo que receba um grafo e produza um de dois objetos: um ep ou um conjunto
de nós que viole a condição de Tutte dada no teorema 6.3. O segundo objeto serviria
como prova de que o grafo não tem ep.
Cada iteração do algoritmo começa com um emparelhamento imperfeito e procura um
caminho aumentador; se tiver sucesso, começa nova iteração com um emparelhamento
maior; se fracassar, encontra uma violação da condição de Tutte.
Dado um emparelhamento imperfeito M e um nó r exposto por M , a busca por um
caminho M -aumentador com origem r constrói uma árvore T que tem as seguintes
propriedades:
(a) cada nó de T − r é coberto por uma aresta de M ∩ E(T ) e
(b) para cada nó v de T , o caminho simples de r a v em T é M -alternante.
Diremos que uma tal árvore é M -alternante e que r é a raiz da árvore.

E XEMPLO 6.5: A figura mostra uma árvore M -alternate com raiz r. (O resto do grafo não está na
figura.) As linhas mais grossas representam as arestas de M .

Seja T uma árvore M -alternante com raiz r. Para qualquer nó v de T , a distância de


r a v é o comprimento do único caminho de r a v em T . Dizemos que um nó v de
T é branco se a distância de r a v é ímpar, e preto se a distância de r a v é par. Se
denotarmos por A o conjunto dos nós brancos de T e por B o conjunto dos nós pretos, A
então é claro que |B| = |A| + 1. B

Dizemos que a árvore T é frustrada se toda aresta de G com uma ponta preta tem
a outra ponta branca. Árvores frustradas são incompatíveis com emparelhamentos
perfeitos:

Lema 6.5 (da árvore frustrada) Se G tem uma árvore M -alternante frustrada então G
não tem emparelhamento perfeito.

P ROVA : Seja T uma árvore M -alternante frustrada. Seja A o conjunto dos nós brancos
de T e B o conjunto dos nós pretos. Toda aresta de G com uma ponta em B tem a
outra em A. Portanto, cada nó de B constitui uma componente ímpar de G−A. Logo,
oc1 (G−A) ≥ |B| = |A| + 1. De acordo com o lema 6.2, a existência de um tal A mostra
que G não tem ep.

Diremos que um nó w de V (G) r V (T ) é vermelho se estiver M -exposto e verde em


caso contrário. Diremos que uma aresta vw é preto-verde se v é preto e w é verde.
Analogamente, vw é preto-vermelha se v é preto e w é vermelho.
108 6.6. O CASO DOS GRAFOS BIPARTIDOS FEOFILOFF

E XEMPLO 6.6: Veja abaixo a matriz de adjacências de um grafo. (Use o gabarito de posição dos nós
para fazer uma figura.) Tome o emparelhamento M = {ac, gd, f h}. Seja T a árvore M -alternante
com nós a, b, c, d e g e arcos ba, ac, cg e gd. Os nós b, c e d são pretos. Os nós a e g são brancos.
Os nós f e h são verdes e o nó e é vermelho. Não há arestas preto-verdes nem preto-vermelhas.
a b c d e f g h
a − 1 1 1 1 1 − − a
b 1 − − − − − 1 −
c 1 − − − − − 1 −
d 1 − − − − − 1 − b c d e f
e 1 − − − − − − −
f 1 − − − − − − 1 g h
g − 1 1 1 − − − −
h − − − − − 1 − −
A árvore T é frustrada. Observe que oc1 (G−A) = 4 > 2 = |A|, sendo A := {a, g} o conjunto dos
nós brancos.

Dada uma aresta preto-verde vw, seja wz a aresta de M que incide em w. (É claro que z
não está em T .) Podemos acrescentar vw e wz a T e assim estender a árvore. Dada uma
aresta preto-vermelha vw, o caminho simples de r a w em T + vw é M -aumentador e
pode ser usado para produzir um novo emparelhamento, maior que M . Encapsulamos
essas operações em duas rotinas:

A rotina E STENDE Á RVORE recebe G, M , T e uma aresta preto-verde vw, deter-


mina a aresta wz de M que incide em w, e devolve a árvore T + vw + wz.
A rotina A UMENTA E MP recebe G, M , T e uma aresta preto-vermelha vw e de-
volve o emparelhamento M ⊕ E(P ), sendo P o caminho simples de r a w em
T + vw.

Suponha agora que nenhuma dessas operações pode ser executada. Então todas as
arestas de G com uma ponta preta têm a outra ponta branca ou preta. Diremos que
uma aresta de G é preto-branca se tem uma ponta preta e a outra branca e é preto-
preta se ambas as pontas são pretas.
Se não existem arestas preto-pretas então T é frustrada. Se existe uma aresta preto-
preta, digamos vw, então T + vw tem um ciclo simples de comprimento ímpar. Ciclos
simples também são conhecidos como circuitos. Portanto,
T + vw tem um circuito ímpar. (1)
Não é fácil lidar com esses circuitos ímpares. Trataremos disso na seção 6.7. Na pró-
xima seção vamos nos ocupar de grafos que não têm circuitos ímpares.

6.6 O caso dos grafos bipartidos


As ideias da seção anterior são suficientes para resolver o problema 6.A em grafos
bipartidos pois esses grafos não têm circuitos ímpares (veja o lema E.2). O correspon-
dente algoritmo recebe um grafo bipartido G e devolve um ep ou um conjunto A de
nós tal que oc1 (G−A) > |A|.
FEOFILOFF EMPARELHAMENTOS PERFEITOS 109

E MP B IPARTIDO P ERFEITO (G)  G é bipartido


01 seja M um emparelhamento  talvez M ← ∅
02 enquanto emparelhamento M não é perfeito faça
03 seja r um nó M -exposto
04 T ← ({r}, ∅)
05 enquanto existe aresta preto-verde faça
06 seja vw uma aresta preto-verde
07 T ← E STENDE Á RVORE (G, M, T, vw)
08 se não existe aresta preto-vermelha
09 então seja A o conjunto dos nós brancos de T
10 devolva A e pare  G não tem ep
11 seja vw uma aresta preto-vermelha
12 M ← A UMENTA E MP (G, M, T, vw)
13 devolva M e pare  M é perfeito

No início de cada execução do bloco de linhas 03–12, M é um emparelhamento im-


perfeito. No início de cada execução do bloco de linhas 06–07, T é uma árvore M -
alternante com raiz r.
Na linha 09, o grafo não tem arestas preto-verdes nem preto-vermelhas. Também não
tem arestas preto-pretas, uma vez que, para qualquer aresta vw desse tipo, o grafo
T + vw teria um circuito ímpar. Portanto, a árvore T é frustrada. De acordo com o
lema 6.5, G não tem ep.
(Esse algoritmo é essencialmente igual ao que foi descrito, em termos de fluxo máximo,
na prova do teorema 3.2, que é a essência do teorema de Kőnig 3.3.)

E XEMPLO 6.7: Aplique o algoritmo E MP B IPARTIDO P ERFEITO ao grafo G representado pela matriz
de adjacências abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

a b c d e f g h i
a − 1 − − − − − − − a c g i
b 1 − − − − − − − −
c − − − 1 1 1 − − −
d − − 1 − − − − − −
b d e f h
e − − 1 − − − − − −
f − − 1 − − − 1 − −
g − − − − − 1 − 1 −
h − − − − − − 1 − 1
i − − − − − − − 1 −

Examine os nós em ordem alfabética. A execução do algoritmo termina com M := {ab, cd} e com
a árvore M -alternante T que tem raiz e e arestas ec e cd. Os nós e e d são pretos, o nó c é branco,
os nós a e b verdes, e todos os demais nós são vermelhos. Não há arestas preto-verdes, nem preto-
vermelhas, nem preto-pretas, e a árvore T é frustrada. O algoritmo devolve o conjunto A := {c},
que viola a condição de Tutte. (Note que a execução do algoritmo termina antes de examinar o
grafo todo.)
110 6.7. FLORES E CONTRAÇÕES FEOFILOFF

6.7 Flores e contrações


Retomemos a discussão que a seção anterior interrompeu. Seja M um emparelhamento
imperfeito num grafo arbitrário G e T uma árvore M -alternante. Suponha agora que
alguma aresta vw de G é preto-preta. Nesse caso, como já observamos acima, T + vw
tem um circuito ímpar. Diremos que esse circuito é uma flor (= blossom). O algoritmo
que estamos descrevendo para o problema 6.A contrai a flor para revelar caminhos
M -aumentadores que não correspondem a arestas preto-vermelhas de T .

Contração de flores. A contração (= shrinking) de uma flor C é a operação que produz


um novo grafo que tem conjunto de nós (V (G) r V (C)) ∪ {C} e conjunto de arestas
definido da seguinte maneira: para cada aresta vw tal que v ∈ / V (C), se w ∈
/ V (C)
então vw é aresta do novo grafo e se w ∈ V (C) então vC é aresta do novo grafo. (As
eventuais “diagonais” de C não estão representadas no novo grafo.) Esse novo grafo
será denotado por G×C.

E XEMPLO 6.8: A figura mostra uma flor C num grafo G e o grafo G×C que resulta da contração
de C.

A contração da flor C preserva boa parte das estruturas: as arestas de M e T que


não têm ambas as pontas em C constituem um emparelhamento M 0 e uma árvore T 0
em G×C. A árvore T 0 é M 0 -alternante. Do ponto de vista de T 0 , o nó que resulta da
contração de C é preto (pois o caminho em T 0 que vai da raiz até o nó tem comprimento
par), todo nó branco de G−C continua branco, e todo nó preto de G−C continua preto.
Podemos encapsular em uma rotina a operação de contração de uma flor:

A rotina C ONTRAI F LOR recebe G, M , T e uma aresta preto-preta vw, calcula a


flor C de T + vw, e faz G ← G×C, M ← M r E(C) e T ← T ×C.

Depois da execução dessa rotina, M é um emparelhamento em G, T é uma árvore


M -alternante de G e C é um nó preto.

E XEMPLO 6.9: A figura à esquerda mostra uma árvore M -alternante T . As linhas tracejadas repre-
sentam arestas que não pertencem a T . Uma dessas arestas liga um nó branco a um nó vermelho u.
Há um caminho aumentador que começa em r, “desce” pela árvore até w, percorre wv, “volta” pela
árvore até o vizinho de u, e finalmente chega a u. Mas a rotina A UMENTA E MP não vê esse caminho
aumentador pois sua última aresta não é preto-vermelha.
FEOFILOFF EMPARELHAMENTOS PERFEITOS 111

O circuito ímpar C em T + vw é uma flor. A figura à direita representa o grafo G×C. Na nova
árvore alternante, C é um nó preto, a aresta Cu é preto-vermelha e o caminho aumentador de r a u
ficou visível.

Grafo derivado e pseudonós. Uma sequência de contrações de flores transforma o


grafo G em um grafo derivado G0 . O grafo derivado tem dois tipos de nós: os nós
originais e os pseudonós. Um pseudonó de G0 é o resultado da contração de uma flor,
enquanto um nó original de G0 é um nó de G. Os pseudonós são recursivos: uma flor
pode conter pseudonós produzidos por contrações anteriores.
Para cada nó v do grafo derivado G0 , denotamos por S(v) o conjunto de nós de G
“contidos” em v. A definição precisa de S(v) é recursiva: se v é um nó original
S então
S(v) := {v}, e se v é o resultado da contração de uma flor C então S(v) := {S(w) :
w ∈ V (C)}. É claro que todo conjunto S(v) tem cardinalidade ímpar e |S(v)| = 1 se e
somente se v é um nó original. Além disso, a coleção {S(v) : v ∈ V (G0 )} é uma partição
de V (G).
Suponha que M 0 é um emparelhamento em um grafo derivado G0 e T 0 é uma árvore
M 0 -alternante. Todos os pseudonós de G0 estão em T 0 e são pretos e todos os nós
brancos de G0 são originais. (Mas G0 pode também ter nós pretos que são originais.)
Essa observação leva à seguinte generalização do lema 6.5:

Lema 6.6 (da árvore frustrada) Se a árvore T 0 é frustrada então o grafo original G não
tem emparelhamento perfeito.

P ROVA : Seja A o conjunto dos nós brancos de T 0 (esses nós estão à distância ímpar
da raiz em G0 ) e B o conjunto dos nós pretos (esses nós estão à distância par da raiz
em G0 ). Como T 0 é frustrada, toda aresta de G0 com uma ponta em B têm a outra em A.
Portanto, cada nó de B constitui uma componente ímpar de G0 −A. Como todos os
nós de A são originais, faz sentido examinar o grafo G−A. O conjunto de nós de cada
componente ímpar de G−A é igual a S(v) para algum v em B. Logo, oc(G−A) ≥ |B|.
Como |B| = |A| + 1, o conjunto A viola a condição de Tutte (veja o lema 6.2). Portanto
G não tem emparelhamento perfeito.

Expansão. Suponha agora que encontramos um caminho M 0 -aumentador no grafo


derivado G0 . Esse caminho aumentador é usado para calcular um novo emparelha-
mento em G0 . Feito isso, os pseudonós são descontraídos e o novo emparelhamento é
expandido “para dentro” das flores.
Se C é uma flor em G, qualquer emparelhamento M 0 no grafo contraído G×C pode
ser expandido de modo a produzir um emparelhamento M ⊆ M 0 ∪ E(C) em G. Essa
expansão consiste em acrescentar 21 (|V (C)| − 1) arestas de C a M 0 . Com isso, o número
de nós que M deixa expostos em G é igual ao número de nós que M 0 deixava expostos
em G×C.

E XEMPLO 6.10: A figura mostra a flor C e o grafo G×C do exemplo 6.8. Em seguida, mostra um
emparelhamento no grafo G×C e a expansão desse emparelhamento para dentro de C, produzindo
um emparelhamento em G.
112 6.8. ALGORITMO DAS FLORES PARA EMPARELHAMENTO PERFEITO FEOFILOFF

A operação de descontração de flores é aplicada, recursivamente, a todos os pseudonós


do grafo derivado G0 . Isso produz um novo emparelhamento no grafo original G.
Esse novo emparelhamento deixa menos nós expostos que o emparelhamento original.
Podemos encapsular a operação na seguinte

rotina E XPANDE: recebe um grafo derivado G0 e um emparelhamento M 0 em G0 ,


recursivamente descontrai os pseudonós de G0 , e expande o emparelhamento
para dentro das flores. A rotina devolve o emparelhamento resultante no grafo
original G.

6.8 Algoritmo das flores para emparelhamento perfeito


O algoritmo que descrevemos na seção anterior foi descoberto por J. Edmonds [Edm,
Edm65] e ficou conhecido como algoritmo das flores (= blossom algorithm), ou al-
goritmo de Edmonds para emparelhamento perfeito. O algoritmo resolve o pro-
blema 6.A em grafos arbitrários. Veja o código:

E MP P ERFEITO (G)  B LOSSOM algorithm


01 seja M um emparelhamento  talvez M ← ∅
02 enquanto o emparelhamento M não é perfeito faça
03 G0 ← G, M 0 ← M
04 seja r um nó M 0 -exposto de G0
05 T 0 ← ({r}, ∅)
06 enquanto G0 tem aresta preto-verde ou preto-preta
07 seja vw uma aresta preto-verde ou preto-preta
08 se vw é preto-verde
09 então T 0 ← E STENDE Á RVORE (G0 , M 0 , T 0 , vw)
10 senão C ONTRAI F LOR (G0 , M 0 , T 0 , vw)
11 se G0 não tem aresta preto-vermelha
12 então seja A0 o conjunto dos nós brancos de T 0
13 devolva A0 e pare  G não tem ep
14 seja vw uma aresta preto-vermelha
15 M 0 ← A UMENTA E MP (G0 , M 0 , T 0 , vw)
16 M ← E XPANDE (G0 , M 0 )  descontrai todas flores
17 devolva M e pare  M é um ep

No início de cada iteração do bloco de linhas 03–16, M é um emparelhamento no grafo


original G. O objetivo desse bloco é encontrar um caminho M -aumentador e assim
substituir M por um emparelhamento maior. Esse objetivo é atingido linha 16.
FEOFILOFF EMPARELHAMENTOS PERFEITOS 113

No início de cada iteração do bloco de linhas 07–10, temos um emparelhamento M 0


num grafo derivado G0 e uma árvore M 0 -alternante T 0 . Não há pseudonós brancos, ou
seja, todos os nós brancos são originais.
No linha 12, toda aresta de G0 com uma ponta preta tem a outra ponta branca e portanto
T 0 é frustrada. De acordo com o lema 6.6, o conjunto A0 viola a condição de Tutte.

E XEMPLO 6.11: Aplique o algoritmo E MP P ERFEITO ao grafo G definido pela matriz de adjacências
abaixo.
a b c d e f g h i
a − 1 1 − − − − − −
b 1 − − 1 1 − − − −
c 1 − − − 1 − − 1 −
d − 1 − − − 1 1 1 −
e − 1 1 − − − − − −
f − − − 1 − − − 1 −
g − − − 1 − − − − 1
h − − 1 1 − 1 − − 1
i − − − − − − 1 1 −
O emparelhamento inicial M := {bd, ce, f h, gi} é indicado em vermelho na matriz. A primeira
iteração produz a árvore M -alternante T com conjunto de arestas

ab, bd, ac, ce, df, f h, dg, gi.

O conjunto de nós pretos é B := {a, d, e, h, i} e o conjunto de nós brancos é A := {b, c, f, g}. A raiz
de T é a. Não há nós verdes nem vermelhos pois T cobre o grafo todo. Suponha que o algoritmo
escolhe a aresta dh, que liga dois nós pretos e assim forma a flor K := (d, h, f, d).
A contração da flor transforma G no grafo G0 := G×K representado pela matriz à esquerda:

a b c e K g i
a − 1 1 − − − −
b 1 − − 1 1 − − a b c e L
c 1 − − 1 1 − − a − 1 1 − −
e − 1 1 − − − − b 1 − − 1 1
K − 1 1 − − 1 1 c 1 − − 1 1
g − − − − 1 − 1 e − 1 1 − −
i − − − − 1 1 − L − 1 1 − −

A contração também transforma M no emparelhamento M 0 , indicado em vermelho na matriz, e


transforma T na árvore M 0 -alternante T 0 cujas arestas são

ab, bK, ac, ce, Kg, gi.

O conjunto de nós pretos é B 0 := {a, e, K, i} e o conjunto de nós brancos é A0 := {b, c, g}. Em se-
guida, o algoritmo escolhe a aresta Ki, que liga dois nós pretos e assim forma a flor L := (K, g, i, K).
A contração da flor transforma G0 em G00 := G×L (veja a matriz de adjacências acima à direita),
transforma M 0 em M 00 , e transforma T 0 na árvore M 00 -alternante T 00 definida pelas arestas

ab, bL, ac, ce.

O conjunto de nós pretos é B 00 := {a, e, L} e o conjunto de nós brancos é A00 := {b, c}. Todas as
arestas que têm uma ponta preta têm a outra ponta branca. Portanto, T 00 é frustrada e A00 viola as
condições de Tutte em G00 .
O conjunto A00 também viola as condições de Tutte no grafo original G. Com efeito, oc(G−A00 ) =
3 > 2 = |A00 |. As três componentes ímpares de G−A00 têm conjuntos de nós {a}, {e} e {d, h, f, i, g}.
114 6.9. EXERCÍCIOS FEOFILOFF

Veja um resumo do rastreamento da execução do algoritmo a partir do emparelhamento inicial


{bd, ce, f h, gi}:
árvore flor
abd ace df h K := (d h f d)
abK ace Kgi L := (K g i K)
abL ace

Desempenho. O desempenho do algoritmo E MP P ERFEITO pode ser inferido do nú-


mero de execuções das rotinas auxiliares A UMENTA E MP (linha 15), E STENDE Á RVORE
(linha 09), C ONTRAI F LOR (linha 10) e E XPANDE (linha 16). Considere os eventos entre
duas invocações consecutivas de A UMENTA E MP. Cada invocação de C ONTRAI F LOR
diminui |V (G0 )| mas não altera |V (G0 ) r V (T )|. Cada invocação de E STENDE Á RVORE
diminui |V (G0 )rV (T )| mas não altera |V (G0 )|. Portanto, temos no máximo n := |V (G)|
invocações de C ONTRAI F LOR e de E STENDE Á RVORE entre duas invocações consecuti-
vas de A UMENTA E MP.
Como há um total de O(n) invocações de A UMENTA E MP, temos O(n2 ) invocações de
C ONTRAI F LOR e O(n2 ) invocações de E STENDE Á RVORE. O número de invocações de
E XPANDE é O(n).
Estruturas de dados apropriadas permitem implementar o algoritmo E MP P ERFEITO de
modo que o consumo total de tempo seja O(mn log n), onde m é o número de arestas e
n o número de nós do grafo.

6.9 Exercícios
Seção 6.1
6.1 Mostre que todo emparelhamento perfeito em um grafo G tem exatamente 21 |V (G)| arestas.
6.2 Seja V o conjunto de nós de um grafo G. Prove que todo emparelhamento em G tem no máximo
1 1
2 |V | arestas. Ademais, se |V | é ímpar então todo emparelhamento tem no máximo 2 (|V | − 1)
arestas.
6.3 Aplicação. É dado um conjunto de trabalhadores, um conjunto de postos de trabalho, e o conjunto
de todos os pares (t, p) tais que o trabalhador t está habilitado a ocupar o posto p. Encontre um
emparelhamento máximo entre trabalhadores e postos de trabalho.

Seção 6.2
6.4 Enuncie em separado as partes “se” e ”somente se” do teorema de Berge 6.1.
6.5 Seja M ∗ um emparelhamento máximo e M um emparelhamento qualquer em um grafo G. Use
o método de prova do teorema 6.1 para mostrar que G tem pelo menos |M ∗ | − |M | caminhos M -
aumentadores disjuntos (ou seja, sem nós em comum). [CCPS 5.2]
6.6 Seja M um emparelhamento de tamanho 4000 num grafo que tem um emparelhamento de ta-
manho 5000. Use o resultado do exercício 6.5 para mostrar que o grafo tem um caminho M -
aumentador de comprimento no máximo 9. [CCPS 5.3]
FEOFILOFF EMPARELHAMENTOS PERFEITOS 115

6.7 Sejam M1 e M2 dois emparelhamentos em um grafo bipartido G com bipartição (P1 , P2 ). Mostre
que existe um emparelhamento N que cobre todos os nós de P1 cobertos por M1 e todos os nós de
P2 cobertos por M2 . [AMO 12.8]
6.8 Cobertura mínima por arestas. Uma cobertura por arestas de um grafo G é qualquer subconjunto B
de E(G) que incide em cada nó de G (ou seja, cada nó é ponta de alguma aresta de B). (Não
confunda cobertura por arestas com a cobertura por nós da seção 3.1.) Todo emparelhamento
perfeito, por exemplo, é uma cobertura. Mostre como uma cobertura por arestas mínima de um
grafo G sem nós isolados pode ser calculada a partir de um emparelhamento máximo, digamos M ∗ .
Prove que o tamanho de uma cobertura por arestas mínima é |V (G)| − |M ∗ |. [CCPS 5.13]

Seção 6.4
6.9 Seja G um grafo com número ímpar de nós. Mostre que G não satisfaz a condição de Tutte.
6.10 Seja G um grafo dotado de ep. Mostre que oc(G − v) = 1 para todo nó v.
6.11 Enuncie um teorema se-e-somente-se que combine o lema 6.2 e o teorema 6.3.
6.12 Prove o corolário 6.4 a partir do teorema de Kőnig 3.3.
6.13 ? Prove o corolário 6.4 a partir do teorema de Gale 3.7.
6.14 Mostre que toda árvore tem no máximo um ep.
6.15 ? Mostre que uma árvore T tem um ep se e somente se oc(T −v) = 1 para cada nó v. Escreva uma
prova elementar que não use o teorema de Tutte.
6.16 Slither. O jogo Slither é jogado por duas pessoas, digamos Um e Dois, sobre um grafo G. Os
jogadores se alternam: o primeiro a jogar é Um, o segundo é Dois, e assim por diante. Cada jogada
consiste em escolher uma aresta que não tenha sido previamente escolhida de tal modo que, a cada
passo, o conjunto das arestas já escolhidas forme um caminho simples. Perde o jogador que não
conseguir fazer uma jogada. Prove que Um pode forçar uma vitória se G tiver um ep. [CCPS 5.18]
6.17 ? Teorema de Hall. Mostre que, no caso de grafos bipartidos, a condição de Tutte equivale à seguinte:
|N (B)| ≥ |B| para todo B ⊆ P e todo B ⊆ Q, sendo (P, Q) uma bipartição do grafo e N (B) o
conjunto de todos os nós adjacentes a nós de B. (Sua prova não deve usar emparelhamentos.)
[CCPS 3.21]
6.18 Teorema de Petersen. Seja G um grafo tal que grau(v) = 3 para todo nó v e G − e é conexo para cada
aresta e. Use o teorema de Tutte 6.3 para mostrar G tem um ep. (Dica: Mostre que |∂(C)| ≥ 3 para
todo conjunto ímpar C de nós.) [CCPS 5.7]

Seção 6.5
6.19 Seja M um emparelhamento num grafo. Mostre que as folhas de toda árvore M -alternante são
pretas (ou seja, estão a uma distância par da raiz r).
6.20 ? Seja M um emparelhamento num grafo G e T uma árvore M -alternante frustrada em G. É
verdade que toda aresta de G é preto-branca?
6.21 Seja M um emparelhamento e T uma árvore M -alternante. Seja r a raiz de T e vw uma aresta preto-
preta. Mostre que T + vw tem um circuito ímpar. Seja t o nó do circuito que está mais próximo da
raiz r de T e mostre que a distância de r a t em T é par.

Seção 6.6
6.22 Que acontece se o nó r escolhido na linha 03 do algoritmo E MP B IPARTIDO P ERFEITO for isolado
(isto é, se tiver grau 0)?
116 6.9. EXERCÍCIOS FEOFILOFF

6.23 Repita o exemplo 6.7 examinando os nós em alguma ordem diferente da alfabética.
6.24 Na linha 09 de E MP B IPARTIDO P ERFEITO, adote abreviaturas V1 := V (T ), M1 := M ∩ E(T ) e
A1 := A. Mostre que A1 é uma cobertura por nós (veja a seção 3.1) do grafo G[V1 ] e que |M1 | = |A1 |.
Mostre também que nenhuma aresta de G liga V1 r A1 a V (G) r V1 .
6.25 Seja G um grafo bipartido com bipartição (P, Q). Seja M um emparelhamento em G e T uma árvore
M -alternante com raiz em P . Seja A o conjunto dos nós brancos de T e B o conjunto dos nós pretos.
Mostre que A ⊆ Q e B ⊆ P . Suponha agora que T é frustrada e mostre que N (B) ⊆ A, sendo N (B)
o conjunto de todos os vizinhos de nós de B.
6.26 Teorema de Hall. Seja G um grafo bipartido com bipartição (P, Q). Use o algoritmo E MP B IPARTIDO -
P ERFEITO para provar que G tem um emparelhamento de tamanho |P | se e somente se |N (X)| ≥
|X| para todo subconjunto X de P , sendo N (X) o conjunto de todos os nós em Q que são vizinhos
de nós em X. (Sugestão: Se T é uma árvore alternante frustrada e B o conjunto dos nós pretos
de T , então N (B) ⊆ A e |N (B)| ≤ |A| = |B| − 1.) [CCPS 3.21]
6.27 Aplique o algoritmo E MP B IPARTIDO P ERFEITO ao grafo com bipartição (P, Q) representado pela
matriz P × Q abaixo. (Use o gabarito de posição dos nós para fazer uma figura.) Ao procurar por
um nó exposto e ao escolher arestas que cobrem um dado nó, examine os nós em ordem alfabética.
Qual o valor de M no fim da execução do algoritmo? Qual o valor de T ? Quais os nós brancos,
pretos, verdes e vermelhos? O que o agoritmo devolve?

g h i j k l
a 1 − − − − − a b c d e f
b − 1 − − − −
c − 1 1 − − −
d − − − 1 − −
g h i j k l
e − − − 1 − −
f − − − − 1 −
6.28 Aplique o algoritmo E MP B IPARTIDO P ERFEITO ao grafo G com bipartição (P, Q) representado pela
matriz P × Q abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

e f g
a 1 − 1 a b c d
b − 1 1
c 1 1 1
e f g
d − − 1

Seção 6.7
6.29 Seja M um emparelhamento em um grafo G e T uma árvore M -alternante. Seja C uma flor. Mostre
que o caminho simples em T que vai da raiz até o “primeiro” nó de C tem comprimento par.
6.30 No exemplo 6.9, calcule o emparelhamento no grafo G×C propiciado pelo caminho aumentador.
Em seguida, expanda esse emparelhamento para dentro da flor C, como sugerido no exemplo 6.10.
6.31 Mostre que a coleção de flores produzida pelo algoritmo do emparelhamento perfeito é laminar
(veja definição na seção A.6 do apêndice A).

Seção 6.8
6.32 Faça o rastreamento da execução do algoritmo E MP P ERFEITO sobre um grafo que tem apenas um
nó. Repita para um grafo que tem exatamente dois nós e uma aresta. Repita para um grafo que tem
exatamente três nós e duas arestas.
6.33 ? Refaça o exemplo 6.11 escolhendo a aresta hi no lugar de dh na primeira iteração. Refaça o
exemplo 6.11 depois de acrescentar um nó j e uma aresta gj ao grafo.
FEOFILOFF EMPARELHAMENTOS PERFEITOS 117

6.34 Submeta o grafo da figura ao algoritmo E MP P ERFEITO. Comece com um emparelhamento de 7


arestas. Faça o rastreamento da execução do algoritmo. Mostre que o grafo não tem ep. [CCPS 5.14]

6.35 Execute o algoritmo E MP P ERFEITO sobre o grafo da figura. Comece com o emparelhamento de
dez arestas indicado pelas linhas grossas. Faça o rastreamento de duas execuções diferentes: uma
começando com a raiz a e outra começando com a raiz p. [Sch17 5.7i]

6.36 Encontre um emparelhamento perfeito no grafo da figure. Use o algoritmo E MP P ERFEITO come-
çando com o emparelhamento indicado na figura. [Sch17 5.7ii]

6.37 Encontre um emparelhamento perfeito no grafo da figure. Use o algoritmo E MP P ERFEITO come-
çando com o emparelhamento indicado na figura. [Sch17 5.7iii]
118 6.9. EXERCÍCIOS FEOFILOFF
Capítulo 7

Emparelhamentos máximos

Este capítulo discute o problema dos emparelhamentos de cardinalidade máxima em


grafos não-dirigidos. A solução do problema depende do algoritmo para emparelha-
mentos perfeitos discutido no capítulo 6.
Todos os grafos neste capítulo serão não-dirigidos. Por isso, diremos simplesmente
grafo, deixando subentendido o adjetivo não-dirigido.

7.1 O problema
Um emparelhamento (= matching) num grafo é um conjunto M de arestas tal que todo
nó do grafo pertence a no máximo uma das arestas de M . Um emparelhamento M
é máximo se tem cardinalidade máxima, ou seja, se |M | ≥ |M 0 | para qualquer outro
emparelhamento M 0 .

Problema 7.A (do emparelhamento máximo) Encontrar um emparelhamento de car-


dinalidade máxima num grafo.

Convém repetir aqui algumas das definições apresentadas na seção 6.1 do capítulo 6.
Um emparelhamento M cobre um nó v se v é ponta de alguma aresta de M . Se M não
cobre v, dizemos que v está exposto por M , ou M -exposto. Num grafo com conjunto
V de nós, um emparelhamento M deixa exatamente |V | − 2|M | nós expostos. Um
emparelhamento é máximo se e somente se minimiza o número de nós expostos.

E XEMPLO 7.1: A figura mostra um emparelhamento de tamanho 4 (linhas grossas). O emparelha-


mento deixa 2 nós expostos.

E XEMPLO 7.2: Uma companhia de aviação opera aviões que precisam ser tripulados por dois
pilotos. Por algum motivo, nem todo par de pilotos pode voar junto. Queremos encontrar um
conjunto máximo de pares de pilotos compatíveis.

119
120 7.2. COMPONENTES ÍMPARES E O TEOREMA DE TUTTE–BERGE FEOFILOFF

Denota-se por ν(G) a cardinalidade de um emparelhamento máximo no grafo G e por ν()


def() def(G) o número de nós expostos por um emparelhamento máximo. Esse número é
conhecido como deficiência de G. Evidentemente
def(G) = |V | − 2ν(G). (1)

A restrição do problema 7.A a grafos bipartidos já foi resolvida na seção 3.1 do capí-
tulo 3. O capítulo 6 tratou do caso especial do problema 7.A em que o emparelhamento
máximo é perfeito. Este capítulo usa as soluções dos casos especiais para resolver o
problema 7.A em geral.

7.2 Componentes ímpares e o teorema de Tutte–Berge


Dado um emparelhamento máximo M , como podemos certificar sua maximalidade?
Uma cobertura por nós de um grafo é um conjunto de nós que contém pelo menos uma
ponta de cada aresta (veja a seção 3.1 do capítulo 3). É óbvio que |M | ≤ |K| para qual-
quer cobertura K. Portanto, uma cobertura K tal que |K| = |M | é um certificado da
maximalidade de M . Infelizmente, muitos grafos não têm uma cobertura tão pequena.
Uma delimitação superior mais forte usa o conceito de componentes ímpares da se-
ção 6.4 e generaliza as condições de Tutte do lema 6.2:

Lema 7.1 (das componentes ímpares) Para qualquer grafo G com conjunto V de nós,
qualquer emparelhamento M , e qualquer subconjunto próprio A de V , tem-se
|M | ≤ 21 |V | − oc(G−A) + |A| ,


ou seja, |V | − 2|M | ≥ oc(G−A) − |A|.

Como na seção 6.4, oc(G−A) é o número de componentes ímpares do subgrafo de G


induzido por V r A.

P ROVA DO LEMA : Seja k := oc(G−A) e sejam H1 , . . . , Hk as componentes ímpares


de G−A.
Para cada i, seja Vi := V (Hi ), Ei := E(Hi ) e Mi := M ∩ Ei . Como |Vi | é ímpar, temos
2|Mi | ≤ |Vi | − 1. Logo, cada grafo Hi tem um nó v que é “especial” no seguinte sentido:
v está exposto por M ou está ligado a A por alguma aresta de M .

Por outro lado, no máximo |A| arestas de M têm uma ponta em A. Portanto, pelo
menos k−|A| nós “especiais” estão expostos. Em outras palavras, |V |−2|M | ≥ k−|A|.
FEOFILOFF EMPARELHAMENTOS MÁXIMOS 121

Ocasionalmente usaremos a abreviatura kAk := 12 (|V | − oc(G−A) + |A|). Com essa kAk
abreviatura, a conclusão do lema pode ser escrita assim: |M | ≤ kAk.

E XEMPLO 7.3: Para qualquer cobertura K de G vale a desigualdade minA⊂V kAk ≤ |K|. Com
efeito, como
oc(G − K) = |V | − |K|,
temos minA kAk ≤ kKk = 12 (|V | − (|V | − |K|) + |K|) = |K|. Isso mostra que a cota superior
|K| para os emparelhamentos em G é mais fraca que a cota superior kAk dada pelo lema 7.1.

E XEMPLO 7.4: Se G é apenas um circuito de comprimento 2k + 1 então minA⊂V kAk = k. Com


efeito, como G tem um emparelhamento com k arestas, o lema 7.1 garante que k ≤ kAk para todo
A ⊂ V . Por outro lado, minA kAk ≤ k∅k = 12 (|V | − oc(G)) = 12 (2k + 1 − 1) = k.

O lema 7.1 tem a seguinte consequência: para provar que um dado emparelhamento
M é máximo, basta exibir um conjunto A de nós tal que |V | − 2|M | = oc(G−A) − |A|.
Um tal conjunto A serve de certificado de maximalidade do emparelhamento.

E XEMPLO 7.5: Seja G o grafo da figura e A o conjunto dos três nós brancos. Observe que G−A tem
6 componentes conexas: duas têm 1 nó cada, uma tem 2 nós, duas têm 3 nós cada, e uma tem 5 nós.
Portanto, oc(G−A) = 5.

Seja M o emparelhamento com 8 arestas indicado pelas linhas mais grossas e observe que
|V | − 2|M | = 18 − 2 × 8 = 5 − 3 = oc(G−A) − |A|. Portanto, |M | = kAk. Em virtude do lema 7.1,
essas igualdades mostram que o emparelhamento M é máximo. [CCPS fig.5.1]

W. Tutte [Tut] e C. Berge [Ber] mostraram (1947 e 1958) que a delimitação superior dada
pelo lema 7.1 é justa:

Teorema 7.2 (de Tutte-Berge) Todo grafo G = (V, E) tem um emparelhamento M e


um subconjunto próprio A de V tais que
|M | = 21 |V | − oc(G−A) + |A| ,


ou seja, tais que |V | − 2|M | = oc(G−A) − |A|.

A próxima seção mostra uma prova algorítmica do teorema. Uma seção subsequente
dá uma prova não algorítmica. A combinação do teorema 7.2 com o lema 7.1 leva à
seguinte fórmula de Tutte–Berge: em qualquer grafo G = (V, E),
max |M | = min 21 |V | − oc(G−A) + |A| ,

(2)
M A

onde maxM é tomado sobre todos os emparelhamentos M e minA é tomado sobre todos
os subconjuntos próprios A de V .
É fácil ver que o teorema de Tutte 6.3, que dá condições para existência de um empa-
relhamento perfeito, decorre do teorema de Tutte–Berge 7.2. Surpreendentemente, a
recíproca é verdadeira: o teorema de Tutte implica o teorema de Tutte–Berge. Os dois
teoremas são, portanto, equivalentes.
122 7.3. ALGORITMO DO EMPARELHAMENTO MÁXIMO FEOFILOFF

7.3 Algoritmo do emparelhamento máximo


Nosso algoritmo para o problema 7.A tem o caráter de uma colcha de retalhos: dado
um grafo G, o algoritmo constrói um emparelhamento máximo reunindo os empare-
lhamentos que o algoritmo E MP P ERFEITO da seção 6.8, capítulo 6, produz ao tentar
obter emparelhamentos perfeitos em sucessivas “fatias” de G.
Para fazer uma introdução suave ao algoritmo, começamos por examinar a versão
especializada para grafos bipartidos.

7.3.1 Algoritmo para grafos bipartidos

Dado um grafo bipartido G, queremos encontrar um emparelhamento M e uma cober-


tura A dos nós de G tais que
|M | = |A|.
Segundo o lema 3.1 do capítulo 3, um tal emparelhamento é máximo.
O algoritmo será descrito recursivamente. Comece por submeter G ao algoritmo E MP -
B IPARTIDO P ERFEITO da seção 6.6. Suponha inicialmente que a execução do algoritmo
termina na linha 13 e devolve um emparelhamento perfeito M . Seja A um dos lados
de uma bipartição de G. Então A é uma cobertura de G e |M | = |A|, como desejamos.
Esse caso está na base da recursão.
Suponha agora que a execução do algoritmo E MP B IPARTIDO P ERFEITO termina na li-
nha 10 com uma árvore frustrada T (veja a seção 6.5). Seja V1 o conjunto de nós de T ,
seja M1 o emparelhamento M ∩ E(T ), seja A1 o conjunto de nós brancos de T e seja B1
o conjunto de nós pretos de T . Observe que A1 ∪ B1 = V1 , que |B1 | = |A1 | + 1, que
toda aresta de G com uma ponta em B1 tem a outra em A1 e que M1 deixa exatamente
um nó exposto no grafo induzido G[V1 ]. Segue daí que A1 é uma cobertura de G[V1 ]
e que nenhuma aresta de G liga B1 ao conjunto V (G) r V1 . Segue daí também que
oc(G[V1 ]−A1 ) − |A1 | = |B1 | − |A1 | = 1 e que |V1 | − 2|M1 | = 1, donde |M1 | = |A1 |.
Se V1 = V (G) então a recursão terminou, pois o par (M1 , A1 ) tem as propriedades dese-
jadas. Suponha agora que V1 6= V (G). Aplique o algoritmo que estamos descrevendo
ao grafo G − V1 . Isso produzirá um emparelhamento M2 e uma cobertura A2 de G − V1
tais que |M2 | = |A2 |. Logo, M1 ∪ M2 é um emparelhamento em G, A1 ∪ A2 é uma
cobertura de G, e |M1 ∪ M2 | = |A1 ∪ A2 |, como desejamos.

E XEMPLO 7.6: Seja G o grafo bipartido representado na figura. Começamos por submeter G ao
algoritmo E MP B IPARTIDO P ERFEITO. As primeiras quatro iterações encontram o emparelhamento
{bd, ce, ih, jg}.
a b c i j
d 1 1 1 1 1
e 1 1 1 1 1
f − − − 1 1
g − − − 1 1
h − − − 1 1
A quinta iteração constrói uma árvore alternante a partir do nó exposto a. A execução do algoritmo
termina na linha 10 e devolve os conjuntos descritos a seguir. Observe que M1 é um emparelha-
FEOFILOFF EMPARELHAMENTOS MÁXIMOS 123

mento em G[V1 ], A1 é uma cobertura de G[V1 ] e |M1 | = |A1 |.

V1 M1 A1
abcde bd ce de

A segunda execução de E MP B IPARTIDO P ERFEITO processa o grafo G − V1 . O algoritmo constrói


uma árvore alternante a partir do nó exposto f e termina na linha 10 devolvendo os conjuntos
abaixo. Observe que M2 é um emparelhamento em G[V2 ], A2 é uma cobertura de G[V2 ] e |M2 | =
|A2 |.
V2 M2 A2
f g h i j ih jg ij
Como todos os nós de G estão em V1 ∪ V2 , a união M1 ∪ M2 é um emparelhamento em G e A1 ∪ A2
é uma cobertura de G. É claro que |M1 ∪ M2 | = |A1 ∪ A2 |. Portanto, o emparelhamento M1 ∪ M2 é
máximo.

E XEMPLO 7.7: Seja G o grafo bipartido representado pela matriz abaixo. (Use o gabarito de po-
sição dos nós para fazer uma figura.) Submetemos G ao algoritmo E MP B IPARTIDO P ERFEITO. As
primeiras três iterações encontram o emparelhamento {ab, cd}.

a c g i
b 1 − − − a c g i
d − 1 − −
e − 1 − −
f − 1 1 − b d e f h
h − − 1 1

A quarta iteração constrói uma árvore alternante com raiz e. A árvore se revela frustrada e a
execução do algoritmo termina na linha 10 com o seguinte resultado (compare com o exemplo 6.7
do capítulo 6):
V1 M 1 A1
ecd cd c
Agora submeta o grafo G − V1 ao algoritmo E MP B IPARTIDO P ERFEITO. Esta segunda execução do
algoritmo termina na linha 13 e devolve o emparelhamento perfeito M2 := {ab, f g, hi}. Observe
que A2 := {a, g, i} é uma cobertura de G − V1 e |A2 | = |M2 |.
Se juntarmos os resultados das duas execuções de E MP B IPARTIDO P ERFEITO, teremos o emparelha-
mento M1 ∪M2 e a cobertura A1 ∪A2 de G. O emparelhamento é máximo pois |M1 ∪M2 | = |A1 ∪A2 |.

O algoritmo que acabamos de descrever equivale ao algoritmo baseado em fluxo má-


ximo que foi discutido na seção 3.1.

7.3.2 Algoritmo para grafos arbitrários

Podemos descrever agora um algoritmo para o problema 7.A sem restrições. Dado um
grafo arbitrário G = (V, E), o algoritmo deve produzir um emparelhamento M e um
subconjunto A de V tais que

|V | − 2|M | ≤ oc(G−A) − |A|. (3)

De acordo com o lema 7.1, um tal M e máximo e (3) vale com “=” no lugar de “≤”.
O algoritmo será descrito recursivamente. Comece por submeter G ao algoritmo E MP -
P ERFEITO da seção 6.8. Se a execução do algoritmo termina na linha 17 e devolve um
124 7.3. ALGORITMO DO EMPARELHAMENTO MÁXIMO FEOFILOFF

emparelhamento perfeito M , então o par (M, ∅) satisfaz (3). Essa caso está na base da
recursão.
Suponha agora que a execução do algoritmo termina na linha 13. Então temos um grafo
derivado G0 , um emparelhamento M 0 em G0 , e uma árvore M 0 -alternante frustrada T 0
em G0 . Temos também o conjunto A0 de nós brancos de T 0 e o conjunto B 0 de nós
pretos de T 0 . Todos os nós de A0 são originais (veja a seção 6.7), enquanto B 0 pode
conter pseudonós. Como se sabe, |B 0 | = |A0 | + 1 e toda aresta de G0 com uma ponta em
B 0 tem a outra em A0 . Ademais, M 0 deixa exatamente um nó exposto no grafo induzido
G0 [V (T 0 )] e oc(G0 −A0 ) − |A0 | ≥ |B 0 | − |A0 | = 1.
Seja V1 o conjunto de nós do grafo original G que correspondem aos nós de T 0 . (Em
termos da notação usada na seção 6.7, V1 é o união de todos os conjuntos S(v) com v
em V (T 0 ).) Seja A1 um nome alternativo para A0 e observe que nenhuma aresta de
G liga V1 r A1 a V (G) r V1 . Seja M o resultado de E XPANDE (G0 , M 0 ). É claro que M
é um emparelhamento no grafo original G, mas esse emparelhamento pode não ser
máximo pois E MP P ERFEITO pode não ter explorado o grafo todo. Seja M1 o conjunto
das arestas de M que têm ambas as pontas em V1 . Observe que M1 deixa exatamente
um nó exposto no grafo induzido G[V1 ], ou seja, que |V1 | − 2|M1 | = 1. Observe também
que oc(G[V1 ]−A1 ) − |A1 | ≥ oc(G0 −A0 ) − |A0 | ≥ 1.
Se V1 = V (G) então estamos na base da recursão, pois o par (M1 , A1 ) satisfaz (3).
Suponha agora que V1 6= V (G). Submeta o grafo G − V1 ao algoritmo que estamos
descrevendo. Isso produzirá um emparelhamento M2 em G − V1 e um subconjunto A2
de V (G − V1 ) que satisfazem (3) no papel de (M, A). Então o par (M1 ∪ M2 , A1 ∪ A2 )
satisfaz (3), como desejamos.

E XEMPLO 7.8: Seja G o grafo representado pela matriz de adjacências abaixo. (Use o gabarito de
posição dos nós para fazer uma figura.) Usaremos o algoritmo E MP P ERFEITO para encontrar um
emparelhamento máximo em G.

a b c d e f g h
a − 1 − − − − − − a e
b 1 − 1 − 1 1 − −
c − 1 − 1 1 − − − b d
d − − 1 − 1 − − −
e − 1 1 1 − − − − c
f − 1 − − − − 1 −
f h
g − − − − − 1 − 1
h − − − − − − 1 − g

Submeta G ao algoritmo E MP P ERFEITO. O algoritmo produz o emparelhamento M := {bc, de, gh}.


O grafo derivado G0 tem um pseudonó C := {c, d, e}. A execução do algoritmo termina na linha 13
com M 0 := {bC} e com a árvore M 0 -alternante frustrada T 0 que tem raiz a e arestas ab e bC. O
conjunto de nós brancos é A0 := {b} e o conjunto de nós pretos é B 0 := {a, C}. A tabela abaixo
mostra V1 , M1 e A1 . Observe que oc(G[V1 ]−A1 ) − |A1 | = 1 = |V1 | − 2|M1 |.

V1 M1 A1
abcde bc de b

Agora submeta G − V1 ao algoritmo E MP P ERFEITO. O algoritmo produz o emparelhamento M :=


{gh}. O grafo derivado G0 não tem pseudonós é portanto é igual a G. A execução do algoritmo
termina na linha 13. A árvore M -alternante frustrada T 0 tem raiz f e arestas f g e gh. O conjunto de
FEOFILOFF EMPARELHAMENTOS MÁXIMOS 125

nós brancos é A0 := {g} e o conjunto de nós pretos é B 0 := {f, h}. A tabela abaixo mostra V2 , M2
e A2 . Observe que oc(G[V2 ]−A2 ) − |A2 | = 1 = |V2 | − 2|M2 |.

V2 M2 A2
fgh gh g

Temos V1 ∪ V2 = V (G). O emparelhamento M1 ∪ M2 e o conjunto de nós A1 ∪ A2 satisfazem (3).

O algoritmo que acabamos de esboçar é o algoritmo de Edmonds para emparelha-


mento máximo ou algoritmo das flores (= blossom algorithm). Esse algoritmo, acompa-
nhado da competente análise de correção, constitui uma prova do teorema 7.2.

Implementação. Com estruturas de dados apropriadas, é possível implementar o


algoritmo de Edmonds para emparelhamento máximo de modo que seu consumo de
tempo esteja em O(mn log n), onde m o número de arestas e n o número de nós do
grafo. Dada a complexidade da lógica, é de surpreender que uma implementação tão
eficiente seja possível.

7.4 Prova não algorítmica do teorema de Tutte–Berge

É interessante examinar uma prova não algorítmica do teorema de Tutte–Berge 7.2.


A prova depende dos conceitos de caminho alternante e caminho aumentador intro-
duzidos na seção 6.2 do capítulo 6, bem como da operação de contração de circuitos
definida na seção 6.7.
Se C é um circuito de um grafo G, denotamos por G×C o grafo que resulta da contração
de C. O seguinte lema mostra que a contração de um circuito de comprimento ímpar
não aumenta a deficiência def() do grafo:

Lema 7.3 (da contração de circuito ímpar) Se C é um circuito ímpar num grafo G en-
tão def(G×C) ≥ def(G).

P ROVA : Como já observamos na seção 6.7, a contração de um circuito ímpar C tem a


seguinte propriedade: qualquer emparelhamento M 0 no grafo G×C pode ser expan-
dido “para dentro” de C de modo a produzir um emparelhamento M ⊆ M 0 ∪ E(C)
em G tal que |V | − 2|M | = |V 0 | − 2|M 0 |, sendo V := V (G) e V 0 := V (G×C).
Suponha agora que M 0 é um emparelhamento máximo em G×C. Se M é o emparelha-
mento obtido a partir de M 0 como no parágrafo anterior então

def(G) ≤ |V | − 2|M | = |V 0 | − 2|M 0 | = def(G×C),

como queríamos mostrar.

Dizemos que um circuito ímpar C é justo (= tight) se def(G×C) = def(G). É claro que C
é justo se e somente se ν(G×C) = ν(G) e portanto existe um emparelhamento máximo
em G que usa exatamente b 12 |V (C)|c arestas de C.
126 7.4. PROVA NÃO ALGORÍTMICA DO TEOREMA DE TUTTE–BERGE FEOFILOFF

Se todos os circuitos ímpares fossem justos, o problema de encontrar um emparelha-


mento máximo em G poderia ser reduzido ao problema de emparelhamento máximo
no grafo G×C. Infelizmente, nem todo circuito ímpar é justo.

E XEMPLO 7.9: A figura mostra um circuito ímpar que não é justo.

Para lidar com circuitos ímpares que não são justos, precisamos do conceito de nó
essencial. Um nó v de um grafo G é essencial (= essential) se ν(G − v) < ν(G), ou seja,
se todo emparelhamento máximo em G cobre v. É claro que v é essencial se e somente
se
def(G − v) > def(G).

E XEMPLO 7.10: No grafo induzido por um circuito de comprimento par, todos os nós são essenci-
ais. Já no grafo induzido por um circuito ímpar, nenhum nó é essencial.

E XEMPLO 7.11: Na árvore da figura, somente os nós a e b são essenciais.

Lema 7.4 Para qualquer grafo G e qualquer subconjunto próprio A de V (G), se


def(G) ≤ oc(G−A) − |A| então todo nó de A é essencial.

P ROVA : Seja v um nó de A e adote a notação A−v := Ar{v}. Conforme o lema 7.1 (com
G−v no papel de G e A−v no papel de A), temos def(G−v) ≥ oc(G−v)−(A−v))−|A−v|.
Como (G − v) − (A−v) = G−A, temos

def(G−v) ≥ oc(G−A) − (|A| − 1)


≥ oc(G−A) − |A| + 1
≥ def(G) + 1

e portanto v é essencial.

Lema 7.5 (dos nós essenciais adjacentes) Para qualquer aresta vw de um grafo G, se v
e w não são essenciais então vw pertence a algum circuito ímpar justo C; ademais, C é
um nó não-essencial de G×C.
FEOFILOFF EMPARELHAMENTOS MÁXIMOS 127

P ROVA : Seja M1 um emparelhamento máximo que não cobre v e M2 um emparelha-


mento máximo que não cobre w. Note que M1 cobre w e M2 cobre v. Considere o grafo
H induzido por M1 ⊕ M2 . A componente conexa de H que contém v consiste em um
caminho simples P com origem v. Se a última aresta de P estivesse em M2 , teríamos
um caminho M1 -aumentador, o que contradiz a maximalidade de M1 . Se a última
aresta de P estivesse em M1 e o último nó de P fosse diferente de w, então o caminho
(w, v) · P seria M2 -aumentador, o que contradiz a maximalidade de M2 . Portanto, P
termina em w e tem comprimento par. Logo, C := P · (w, v) é um circuito ímpar.
O emparelhamento máximo M1 contém b|V (C)|/2c arestas de C. Logo, C é justo.
Finalmente, M1 r E(C) é um emparelhamento máximo em G×C e não cobre o nó C
de G×C.

Prova do teorema de Tutte–Berge. Agora que os lemas 7.3, 7.4 e 7.5 prepararam o
terreno, podemos provar o teorema de Tutte–Berge 7.2.

P ROVA : Seja G um grafo. O lema 7.1 já mostrou que |V (G)| − 2|M | ≥ oc(G−A) − |A|
para qualquer emparelhamente M e qualquer subconjunto próprio A de V (G). Em
particular, def(G) ≥ oc(G−A) − |A| para qualquer A ⊂ V (G). Resta mostrar que existe
A ⊂ V (G) tal que
def(G) ≤ oc(G−A) − |A|.
A prova é uma indução no número de arestas de G. Se o conjunto de arestas é vazio, a
afirmação vale com A = ∅. Agora suponha que o conjunto de arestas não é vazio e seja
vw uma aresta qualquer. Há dois casos a considerar.
Caso 1: uma das pontas de vw é um nó essencial. Ajuste a notação (intercambinado v e
w se necessário) de modo que v seja o nó essencial e portanto def(G − v) > def(G). Seja
G0 := G − v. Por hipótese de indução, podemos supor que existe A0 ⊂ V (G0 ) tal que
def(G0 ) ≤ oc(G0 − A0 ) − |A0 |. Seja A := A0 ∪ {v} e observe que G − A = G0 − A0 . Logo,
def(G) ≤ def(G−v) − 1
= def(G0 ) − 1
≤ oc(G0 − A0 ) − |A0 | − 1
= oc(G−A) − |A|,
como queríamos mostrar.
Caso 2: v e w não são essenciais. Pelo lema 7.5, v e w pertencem a um circuito ímpar
justo, digamos C. Seja G0 := G×C. Por hipótese de indução, podemos supor que existe
A0 ⊂ V (G0 ) tal que def(G0 ) ≤ oc(G0 − A0 ) − |A0 |. Pelo lema 7.3, def(G0 ) ≥ def(G). Logo,
def(G) ≤ oc(G0 − A0 ) − |A0 |.
Pelo lema 7.5, o nó C de G0 não é essencial. Portanto, o lema 7.4 (com G0 no papel de
G e A0 no papel de A) garante que o nó C não pertence a A0 . Assim, A0 ⊂ V (G). Como
C é ímpar, toda componente ímpar de G0 − A0 corresponde a uma componente ímpar
de G−A0 . Portanto, oc(G0 − A0 ) = oc(G−A0 ) e assim
def(G) ≤ oc(G−A0 ) − |A0 |,
128 7.5. EXERCÍCIOS FEOFILOFF

como queríamos mostrar.

Esta prova do teorema 7.2 não é construtiva pois não temos um algoritmo para decidir
se um dado nó é essencial. Assim, a prova não pode servir de base para um algoritmo
recursivo que calcule um emparelhamento máximo.

7.5 Exercícios
Seção 7.1
7.1 Emparelhamento maximal. Um emparelhamento M em um grafo G é maximal se não existe empare-
lhamento M 0 tal que M 0 ⊃ M . Em outras palavras, M é maximal se não existe aresta e em E(G)rM
tal que M ∪ {e} é um emparelhamento. Mostre que todo emparelhamento maximal é grande. Mais
precisamente, mostre que |M | ≥ 21 ν(G) para todo emparelhamento maximal M .

Seção 7.2
7.2 Seja M um emparelhamento e K uma cobertura em um grafo. Mostre que |M | ≤ |K|. Mostre que
a desigualdade pode ser estrita mesmo que M seja máximo e K seja mínimo.
7.3 Seja M um emparelhamento perfeito em um grafo bipartido G. Escolha uma das pontas de cada
aresta de M . Seja K o conjunto dos nós escolhidos. É verdade que K é uma cobertura por nós
de G?
7.4 Suponha que um grafo G tem um emparelhamento M que deixa no máximo um nó exposto. Mostre
que |M | = k∅k.
7.5 ? Seja M um emparelhamento perfeito num grafo G. Mostre que oc(G−v) = 1 para cada nó v
(e portanto |M | = k{v}k).
7.6 Seja M um emparelhamento num grafo G e A um subconjunto próprio de V (G). Suponha que M
deixa exatamente oc(G−A) − |A| nós expostos. Mostre que |M | = kAk.
7.7 Seja G um grafo e A um subconjunto próprio de V (G). Mostre que o número kAk é inteiro.
7.8 Exiba um emparelhamento com 7 arestas no grafo da figura. Mostre que o emparelhamento é
máximo. [CCPS 5.14]

7.9 Seja G um grafo e A um subconjunto próprio de V (G). Deduza do lema 7.1 que ν(G) ≤ kAk e que
def(G) ≥ oc(G−A) − |A|.
7.10 Deduza do lema 7.1 e do teorema 7.2 que todo grafo G satisfaz a igualdade ν(G) = minA⊂V (G) kAk
e a igualdade def(G) = maxA⊂V (oc(G−A) − |A|).
7.11 Prove a restrição do teorema de Tutte–Berge 7.2 a árvores. (Dica: árvores são bipartidas.)
7.12 ? Prove o teorema de Tutte 6.3 a partir do teorema Tutte–Berge 7.2.
7.13 ? Tutte implica Tutte-Berge. Prove o teorema de Tutte–Berge 7.2 a partir do teorema de Tutte 6.3.
(Dica: Dado um grafo G e um inteiro positivo k ≤ n/2, construa um grafo G0 que tenha a seguinte
propriedade: G0 tem um ep se e somente se G tem um emparelhamento de tamanho k. [CCPS 5.5]
FEOFILOFF EMPARELHAMENTOS MÁXIMOS 129

Subseção 7.3.1
7.14 Seja G o grafo bipartido com bipartição (P, Q) representado pela matriz binária P × Q abaixo. Seja
M o emparelhamento {be, cf, dg}. Use o algoritmo esboçado na subseção 7.3.1 para verificar que
M é máximo e calcular um conjunto A de nós que certifique a maximalidade de M .

a b c d
e 1 1 1 1
f 1 1 1 1
g − − − 1
h − − − 1
7.15 ? Escreva em código o algoritmo que calcula um emparelhamento máximo em um grafo bipartido.
Use como guia o esboço apresentado na subseção 7.3.1.
7.16 ? Deduza o teorema de Kőnig 3.3 do algoritmo que calcula um emparelhamento máximo num
grafo bipartido (veja o exercício 7.15). [CCPS 5.10]

Subseção 7.3.2
7.17 Use, repetidamente, o algoritmo E MP P ERFEITO da seção 6.8 para encontrar um emparelhamento
máximo no grafo da figura. Encontre também um conjunto A de nós que certifique a maximalidade
do emparelhamento. [CCPS 5.14]

7.18 A partir do emparelhamento indicado na figura, encontre um emparelhamento máximo. Encontre


também um conjunto de nós que certifique a maximalidade do emparelhamento. Use o algoritmo
E MP P ERFEITO da seção 6.8 para resolver o problema. (Sugestão: Execute o algoritmo a partir da
raiz a. Depois execute o algoritmo a partir de p. Finalmente, execute o algoritmo a partir de r.)
[Sch17 5.7i]

7.19 Escreva em código o algoritmo de emparelhamento máximo para grafos arbitrários que foi esbo-
çado na subseção 7.3.2. (Sugestão: Comece por escrever uma versão do algoritmo E MP P ERFEITO
que devolva (1) um emparelhamento perfeito M ou (2) um emparelhamento M 0 no grafo deri-
vado G0 , o conjunto de nós de uma árvore M 0 -alternante frustrada, e o conjunto A0 de nós brancos
de T 0 .)

Seção 7.4
7.20 Critique a seguinte proposta de algoritmo para encontrar um emparelhamento máximo: contraia
circuitos ímpares recursivamente até que o grafo não os tenha; encontre um emparelhamento má-
ximo no grafo resultante; expanda o emparelhamento para dentro dos circuitos que foram contraí-
dos.
7.21 Mostre que um nó v de um grafo G é essencial se e somente se def(G − v) > def(G).
7.22 Suponha que um nó v de um grafo G é essencial. Mostre que ν(G − v) = ν(G) − 1 e def(G − v) =
def(G) + 1.
130 7.5. EXERCÍCIOS FEOFILOFF

7.23 Seja G um grafo induzido por um caminho simples. Quais são os nós essenciais de G?
7.24 Seja G um grafo dotado de um ep. Mostre que todos os nós de G são essenciais.
7.25 O lema 7.4 sugere a seguinte pergunta: se A é o conjunto de todos os nós essencias de um grafo,
então ν(G) = 21 (|V | − oc(G−A) + |A|)? Responda a pergunta.
7.26 ? Mostre que a restrição do lema 7.5 (dos nós essenciais) a grafos bipartidos é equivalente ao
teorema de Kőnig 3.3. [CCPS 5.8]
7.27 ? Seja G um grafo conexo sem nós essenciais. Use o lema 7.5 do circuito ímpar justo para mostrar
que ν(G) = b|V |/2c. [CCPS 5.9]
7.28 Mostre que o algoritmo E MP P ERFEITO (veja a seção 6.8) pode contrair circuitos ímpares que não
são justos. Isso pode acontecer durante a construção da última árvore alternante? [CCPS 5.12]
7.29 ? No contexto do caso 2 da prova do teorema de Tutte–Berge, mostre que toda componente ímpar
de G0 − A0 corresponde a uma componente ímpar de G−A0 .
7.30 Partição de Gallai-Edmonds. Dado um grafo G, seja B o conjunto dos nós não-essenciais, C o conjunto
dos vizinhos de B (ou seja, o conjunto dos nós em V (G) r B que têm algum vizinho em B), e D o
conjunto V (G) r (B ∪ C). Prove que
(a) |V | − oc(G−A) + |A| tem valor mínimo quando A := C;
(b) para todo emparelhamento máximo M e todo v em C, existe vw em M tal que w ∈ B;
(c) todo emparelhamento máximo contém um ep de G[D].
A expressão G[D] representa o subgrafo de G induzido por D. [CCPS 5.6]
7.31 Exiba a partição de Gallai-Edmonds (veja o exercício 7.30) do grafo da figura. [CCPS 5.16]

7.32 Slither. O jogo Slither é jogado por duas pessoas, digamos Um e Dois, sobre um grafo G. Os
jogadores se alternam: o primeiro a jogar é Um, o segundo é Dois, e assim por diante. Cada jogada
consiste em escolher uma aresta que não tenha sido previamente escolhida de tal modo que, a cada
passo, o conjunto das arestas já escolhidas forme um caminho simples. Perde o jogador que não
conseguir fazer uma jogada. Prove que Um pode forçar uma vitória se G tiver um ep. [CCPS 5.18]
7.33 Slither. Considere o jogo Slither do exercício 7.32. Suponha que a primeira jogada de Um é uma
aresta uv tal que o nó u não é essencial. Mostre que Dois pode forçar uma vitória. [CCPS 5.19]
7.34 Slither. Considere o jogo Slither do exercício 7.32. Seja (B, C, D) a partição de Gallai-Edmonds
de G (veja o exercício 7.30). Suponha que D não é vazio. Prove que Um pode forçar uma vitória.
[CCPS 5.20]
7.35 Slither. Considere o jogo Slither do exercício 7.32. Seja (B, C, D) a partição de Gallai-Edmonds de G
(veja o exercício 7.30). Suponha que os nós de todas as arestas jogadas até o momento estão em C.
Suponha que o próximo jogador escolhe uma aresta que não tem ponta em C. Prove que o outro
jogador pode forçar uma vitória. [CCPS 5.21]
Capítulo 8

Emparelhamentos perfeitos de custo


mínimo

Agora que sabemos calcular um emparelhamento perfeito num grafo não-dirigido


(veja o capítulo 6), podemos empreender o próximo passo: calcular um emparelha-
mentos perfeito de custo mínimo. Este capítulo resolve o problema em grafos biparti-
dos e faz um esboço da solução no caso geral.
As técnicas desenvolvidas para resolver o problema estão na origem da chamada com-
binatória poliédrica, que se tornou ferramenta essencial no estudo de muitos problemas
de otimização combinatória.
Todos os grafos neste capítulo serão não-dirigidos. Por isso, diremos simplesmente
grafo, deixando subentendido o adjetivo não-dirigido.

8.1 O problema
Seja G um grafo e c uma função que atribui custos às arestas de G. (O custo de uma
aresta pode ser positivo, negativo,
P ou nulo.) Para qualquer conjunto M de arestas,
denotaremos por c(M ) a soma e∈M ce .

Problema 8.A (emparelhamento perfeito mínimo) Dado um grafo G e uma função c


que atribui um custo em R a cada aresta, encontrar um emparelhamento perfeito M
que minimize c(M ).

Usaremos as abreviaturas “ep” e “ep mínimo” para as expressões “emparelhamento ep


perfeito” e “emparelhamento perfeito de custo mínimo” respectivamente. (É razoável
omitir a expressão “de custo” pois “mínimo” não poderia estar se referindo à cardina-
lidade do emparelhamento.)

E XEMPLO 8.1: Considere o grafo definido pela matriz de adjacências abaixo. Os custos dos arcos
são dados na tabela. Há dois ep’s, sendo {ad, bc} o que tem custo mínimo.

131
132 8.2. UM PROGRAMA LINEAR PARA EP MÍNIMO FEOFILOFF

a b c d ac ad bc bd
a − − 1 1 c +60 +70 −10 +10
b − − 1 1
c 1 1 − −
d 1 1 − −

8.2 Um programa linear para ep mínimo


Para de projetar um algoritmo para o problema 8.A, é importante representar o pro-
blema por meio de um programa linear. Se x é o vetor característico de um ep num
grafo G então x(∂(v)) = 1 para cada nó v de G. (Como de hábito, ∂(v) é o conjunto das
arestas que incidem em v.) Portanto, o problema do ep mínimo pode ser representado
pelo seguinte programa linear: encontrar um vetor real (xe : e ∈ E) que

minimize cx
sob as restrições x(∂(v)) = 1 para cada v em V (1)
xe ≥ 0 para cada e em E,

sendo V := V (G) e E := E(G). É claro que toda solução viável inteira (e portanto
binária) do pl representa um ep. Portanto, uma solução ótima x do pl representa uma
solução do problema 8.A desde que x seja inteiro. Entretanto, muitas soluções ótimas
do pl não ser inteiras.1 (Compare com o pl (1) do capítulo 4, que trata de fluxo viável
de custo mínimo em grafos dirigidos. Lá, toda solução não-inteira do pl é solução do
problema do fluxo.)

E XEMPLO 8.2: Seja G um grafo completo com nós a, b e c e o vetor de custos dado na tabela. É claro
que G não tem ep algum. Mas o vetor x é solução ótima do pl (1).

ab bc ca
c +10 +10 +10
x 0.5 0.5 0.5

E XEMPLO 8.3: Seja G um grafo completo com conjunto nós a, b, c e d. A tabela define o vetor c de
custos. Também define soluções viáveis x e x0 do pl (1). As soluções x e x0 são ótimas, mas apenas
x0 representa um ep.
ab bc cd da ac bd
c +10 +20 +10 +20 +10 +10
x 0.4 0 0.4 0 0.6 0.6
x0 1 0 1 0 0 0

E XEMPLO 8.4: Seja G um grafo completo com conjunto nós a, b, c e d. A tabela define o vetor de
custos e soluções viáveis x, x0 , x00 e x000 do pl (1). Observe que cx = 20, cx0 = 19, cx00 = 20 e
cx000 = 30. Apenas x00 e x000 representam ep’s, e nenhum deles é mínimo.

1
Se trocarmos a restrição “xe ≥ 0” por “xe ∈ {0, 1}” (ou, alternativamente, por “xe ∈ Z+ ”), o
programa (1) representará corretamente o problema do ep mínimo, mas deixará de ser linear.
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 133

ab bc cd da ac bd
c +10 +5 +10 +5 +15 +15
x 1/3 1/3 1/3 1/3 1/3 1/3
x0 0.9 0.1 0.9 0.1 0 0
x00 1 0 1 0 0 0
x000 0 0 0 0 1 1

Programa dual. O dual do programa linear (1) consiste em encontrar um vetor real
(yv : v ∈ V ) que
maximize y1
(2)
sujeito a yv + yw ≤ cvw para cada vw em E.
P
A expressão y1 denota a soma v∈V yv . Diremos que um vetor y que satisfaz as restri-
ções (2) é um potencial viável.2 É fácil encontrar um potencial viável: se ce ≥ α para
toda aresta e então o potencial que atribui α/2 a cada nó é viável.
Dado um potencial y, o custo reduzido de uma aresta vw é o número cvw − yv − yw .
O vetor de custos reduzidos será denotado por c(y). Portanto,
c(y)vw := cvw − yv − yw
para cada aresta vw. Observe que c(y) ≥ 0 se e somente se o potencial y é viável.
Como se sabe, uma solução viável x do pl (1) é ótima se e somente se existe um poten-
cial viável y tal que cx = y1. E essa igualdade vale se e somente se as folgas de x e y
são complementares, isto é, se e somente se
xe = 0 ou c(y)e = 0 (3)
para todo e em E.

E XEMPLO 8.5: Considere o grafo completo com nós a, b, c, d. As tabelas definem um vetor de
custos c, um potencial viável y, o vetor c(y) de custos reduzidos, e soluções viáveis x e x0 do pl (1).
ab bc cd da ac bd y
c +40 +75 +75 +40 +90 +90 a +10
c(y) 0 0 0 0 35 30 b +30
x 1 0 1 0 0 0 c +45
x0 0.5 0.5 0.5 0.5 0 0 d +30
As soluções viáveis x e y têm folgas complementares. Portanto, x é solução ótima do pl (1). Como
x é binário, representa um ep mínimo.
As folgas das soluções viáveis x0 e y também são complementares e portanto x0 é solução ótima do
pl (1). Mas x0 não representa um ep.

Como veremos na próxima seção, o programa linear dual (2) e o conceito de potencial
viável têm um papel importante no projeto de um algoritmo para o problema 8.A, pelo
menos quando o problema é restrito a grafos bipartidos.
2
Não confunda com o conceito de potencial viável associado ao problema do caminho de custo
mínimo na seção 1.2. Ao contrário daquele, este potencial deixa de ser viável se somarmos um mesmo
número a cada componente yv .
134 8.3. ALGORITMO PARA EP MÍNIMO EM GRAFO BIPARTIDO FEOFILOFF

8.3 Algoritmo para ep mínimo em grafo bipartido


Seja (G, c) uma instância do problema 8.A e considere a correspondente instância do
pl (1). Seja y um potencial viável e c(y) o correspondente custo reduzido. Dizemos que
uma aresta e de G está justa se c(y)e = 0. O conjunto das arestas justas será denotado
E(y) por E(y) e às vezes denominado “conjunto justo”.

A seguinte observação é o ponto de partida do projeto de um algoritmo para o pro-


blema 8.A. Dado um potencial viavel y e um ep M em G, se

M ⊆ E(y) (4)

então as folgas de y e do vetor característico de M são complementares, ou seja, satisfa-


zem (3), e portanto M é um ep mínimo. Assim, para encontrar um ep mínimo em (G, c),
basta encontrar um potencial viável y e um ep no subgrafo gerador justo (V (G), E(y)).
Se G for bipartido, um tal par (y, M ) existe. (Para uma prova não algorítmica desse
fato, veja o teorema de Birkhoff 9.2 no capítulo 9.)

Preliminares. A procura por um ep no grafo (V (G), E(y)) pode ser executada pelo
algoritmo E MP B IPARTIDO P ERFEITO da seção 6.6. Por isso, convém recordar alguns dos
conceitos introduzidos na seção 6.5.
Suponha que M é um emparelhamento num grafo G e T é uma árvore M -alternante
com raiz r. Um nó v de T é branco se a distância de r a v em T é ímpar, e preto se essa
distância é par. A árvore T é frustrada se toda aresta de G com uma ponta preta tem a
outra ponta branca. O lema 6.5 mostra que se T é frustrada então G não tem um ep.
Os nós de G que não pertencem a T têm cores: um nó w é vermelho se estiver M -
exposto e verde em caso contrário. Uma aresta é preto-vermelha se uma de suas pontas
é preta e a outra é vermelha. Arestas preto-verde, preto-branca e preto-preta são definidas
analogamente. Se G é bipartido então não tem circuitos ímpares e portanto não tem
arestas preto-pretas, conforme (1) na seção 6.5.

O algoritmo húngaro. O algoritmo que resolve o problema 8.A restrito a grafos bi-
partidos foi proposto por H. Kuhn [Kuh] (1955) e J. Munkers [Mun] (1957) e ficou
conhecido como algoritmo húngaro. O algoritmo recebe um grafo bipartido G e um
vetor c de custos e devolve um ep de custo mínimo ou informa que G não tem ep
algum.
O algoritmo é iterativo. Numa descrição grosseira e imprecisa, poderíamos dizer que
cada iteração começa com um potencial viável y e usa o algoritmo E MP B IPARTIDO -
P ERFEITO para procurar um ep no grafo justo G(y) := (V (G), E(y)). Se um tal ep for
encontrado, o problema está resolvido graças a (4). Senão, y é ajustado e uma nova
iteração começa com o novo potencial viável.
Numa descrição mais precisa, cada iteração começa com um potencial viável y e um
emparelhamento M ⊆ E(y). (Na primeira iteração, y é um potencial viável arbitrário.)
Se M é um ep, o problema está resolvido. Suponha agora que M não é um ep. Então
um código análogo ao de E MP B IPARTIDO P ERFEITO é usado para calcular uma árvore
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 135

M -alternante T em G(y). Se T levar a um caminho aumentador, começamos uma nova


iteração com um emparelhamento maior. Caso contrário, T é frustrada em G(y). Nesse
caso, a árvore frustrada é usada como guia para ajustar o potencial viável y.
O ajuste de y é feito da seguinte maneira. Seja F o conjunto das arestas preto-verdes
de G e F 0 o conjunto das arestas preto-vermelhas de G. (É claro que F ∪ F 0 é disjunto
de E(y).) Se F ∪ F 0 é vazio então toda aresta de G com uma ponta preta tem a outra
branca, donde T é frustrada em G, e assim G não tem ep algum. Suponha agora que
F ∪ F 0 não é vazio. Seja ε o menor custo reduzido dentre as arestas de F ∪ F 0 , isto é,
ε := min (c(y)vw : vw ∈ F ∪ F 0 ). Um novo potencial é calculado da seguinte maneira:
para cada nó v de T ,
• adicione ε a yv se v é preto e
• subtraia ε de yv se v é branco.
O novo potencial é viável (veja o exercício 8.13 abaixo). Uma nova iteração começa
com esse novo potencial. O novo conjunto justo pode não ser um superconjunto do
anterior, mas contém M e E(T ). Ademais, o novo conjunto justo contém alguma aresta
de F ∪ F 0 , uma vez que ε > 0. Uma nova iteração começa com o novo valor de y e com
o emparelhamento M da iteraçao anterior.
Como se vê, o algoritmo avança ajustando, simultaneamente, o potencial viável y e o
emparelhamento M . Esse tipo de algoritmo é conhecido como primal-dual e aparece
frequentemente em otimização combinatória.

E XEMPLO 8.6: A figura mostra um grafo G com custos nas arestas. A primeira coluna da tabela
define um potencial viável y. O conjunto de arestas justas é E(y) = {ra, ab, rd, df, gh}. O algoritmo
húngaro começa com o emparelhamento M := {ab, df, gh} representado pelas linhas grossas da
figura. [CCPS fig.5.12]
A primeira iteração do algoritmo procura um ep no subgrafo justo (V, E(y)). Para isso, constrói a
árvore M -alternante T com raiz r e arestas ra, ab, rd e df (linha sólidas da figura). Os nós r, b e f
são pretos e os nós a e d são brancos. Os nós g e h são verdes e o nó i é vermelho. Não há arestas
preto-verdes nem preto-vermelhas no subgrafo justo. A árvore T é frustrada no subgrafo justo e
portanto o subgrafo não tem ep.

y ra ab rd df bg f g gh f i hi
r +1 c(y) 0 0 0 0 2 1 0 2 1
a +1
b +2
d +3
f +1
g +2
h +3
i +2

Em G, o conjunto das arestas preto-verdes e preto-vermelhas é F ∪ F 0 := {bg, f g, f i}. O menor


custo reduzido nesse conjunto é ε := 1. Um novo potencial é calculado somando ε ao potencial de
cada nó preto e subtraindo ε do potencial de cada nó branco. Esse segundo potencial é viável. A
aresta f g fica justa e portanto pertence ao novo E(y).
136 8.3. ALGORITMO PARA EP MÍNIMO EM GRAFO BIPARTIDO FEOFILOFF

y ra ab rd df bg f g gh f i hi
r +2 c(y) 0 0 0 0 1 0 0 1 1
a 0
b +3
d +2
f +2
g +2
h +3
i +2

Na segunda iteração, a árvore T continua crescendo no novo subgrafo justo. As arestas f g e gh são
acrescentadas a T . Essa árvore é frustrada (no subgrafo justo) e portanto o subgrafo não tem ep.
Em G, o conjunto das arestas preto-verdes e preto-vermelhas é F ∪ F 0 := {f i, hi}. O menor custo
reduzido nesse conjunto é ε := 1. Um novo potencial viável é calculado somando ε ao potencial de
cada nó preto e subtraindo ε do potencial de cada nó branco. As arestas f i e hi tornam-se justas.

y ra ab rd df bg f g gh f i hi
r +3 c(y) 0 0 0 0 1 0 0 0 0
a −1
b +4
d +1
f +3
g +1
h +4
i +2

Na terceira iteração, a árvore T continua crescendo no (novo) subgrafo justo. A aresta hi é acres-
centada a T . O caminho (r, d, f, g, h, i) em T é aumentador. Depois que esse caminho aumentador
for processado teremos um ep no subgrafo justo (V, E(y)). Esse ep é mínimo em G.
Veja o rastreamento da execução do algoritmo. Cada linha da tabela descreve os valores das variá-
veis ao longo de uma iteração:

y
r a b d f g h i E(y) M ⊆ E(y) T F ∪ F0 ε
1 1 2 3 1 2 3 2 ra ab rd df gh ab df gh rab rdf bg f g f i 1
2 0 3 2 2 2 3 2 mais f g ab df gh mais f gh hi f i hi 1
3 −1 4 1 3 1 4 2 mais f i hi ab rd f g hi

Segue o código do algoritmo húngaro:

H ÚNGARO (G, c)  G é bipartido


01 seja y um potencial viável
02 seja M ⊆ E(y) um emparelhamento em G  talvez M ← ∅
03 enquanto o emparelhamento M não é perfeito faça
04 seja r um nó M -exposto
05 T ← ({r}, ∅)
06 repita
07 enquanto existe aresta preto-verde em E(y) faça
08 seja vw uma aresta preto-verde em E(y)
09 T ← E STENDE Á RVORE (G, M, T, vw)
10 se não existe aresta preto-vermelha em E(y)  T é frustrada
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 137

11 então seja F o conjunto das arestas preto-verdes de G


12 seja F 0 o conjunto das arestas preto-vermelhas de G
13 se F ∪ F 0 = ∅
14 então seja A o conjunto dos nós brancos de T
15 devolva A e pare  G não tem ep
16 ε ← min (cvw − yv − yw : vw ∈ F ∪ F 0 )
17 yv ← yv + ε para cada v preto
18 yv ← yv − ε para cada v branco
19 senão seja vw uma aresta preto-vermelha em E(y)
20 M ← A UMENTA E MP (G, M, T, vw)
21 interrompa o “repita”  break
22 devolva M e y e pare

Exceto pelas linhas 11 a 13 e 16 a 18, o código é essencialmente igual ao do algoritmo


E MP B IPARTIDO P ERFEITO da seção 6.6.
O processo iterativo externo, que ocupa as linhas 03 a 21, procura um ep no conjunto
justo E(y). No início de cada iteração desse processo temos um potencial viável y e um
emparelhamento M ⊆ E(y).
O processo iterativo interno, que ocupa as linhas 06 a 21, recebe um emparelhamento
imperfeito M e procura um caminho M -aumentador no subgrafo justo. No início
de cada iteração desse processo, temos não só um potencial viável y e um empa-
relhamento imperfeito M ⊆ E(y), como também uma árvore M -alternante T com
E(T ) ⊆ E(y). O algoritmo pode alterar y durante a iteração, mas as propriedades
M ⊆ E(y) e E(T ) ⊆ E(y) são preservadas e pelo menos uma nova aresta torna-se
justa.
Na linha 15, temos oc1 (G−A) > |A|. A existência de um tal A prova que G não tem ep,
conforme o lema 6.2.

E XEMPLO 8.7: Considere o grafo bipartido definido pela matriz de adjacências abaixo. À direita
da matriz temos os custos dos arcos.

a b c d ac ad bc bd
a − − 1 1 c 90 40 75 95
b − − 1 1
c 1 1 − −
d 1 1 − −

Comece a execução do algoritmo H ÚNGARO com o potencial viável y dado abaixo. Esse potencial
determina o custo reduzido c(y) e o subgrafo justo G(y) cuja matriz aparece abaixo. A tabela dá o
vetor característico x do emparelhamento M escolhido na linha 02 do algoritmo.

y ac ad bc bd a b c d
a 20 c(y) 0 5 5 80 a − − 1 −
b 0 x 1 0 0 0 b − − − −
c 70 c 1 − − −
d 15 d − − − −

A primeira iteração chega à linha 11 com T = ({b}, ∅). Nas linhas 11 a 18, calcula ε = 5 e altera y,
tornando justa a aresta bc. Veja os novos valores das variáveis:
138 8.4. UM PROGRAMA LINEAR MAIS PODEROSO FEOFILOFF

y ac ad bc bd a b c d
a 20 c(y) 0 5 0 75 a − − 1 −
b 5 x 1 0 0 0 b − − 1 −
c 70 c 1 1 − −
d 15 d − − − −

A segunda iteração acrescenta as arestas bc e ca à arvore T . Em seguida, calcula ε = 5 e altera y,


tornando justa a aresta ad. Veja os novos valores das variáveis:

y ac ad bc bd a b c d
a 25 c(y) 0 0 0 70 a − − 1 1
b 10 x 1 0 0 0 b − − 1 −
c 65 c 1 1 − −
d 15 d 1 − − −

A terceira iteração encontra o caminho aumentador (b, c, a, d) no subgrafo justo. Isso leva ao novo
emparelhamento indicado abaixo. O novo emparelhamento é perfeito e todas as arestas estão
justas. De acordo com (4), o ep é mínimo em G.

ac ad bc bd
c(y) 0 0 0 70
x 0 1 1 0

Veja um resumo do rastreamento da execução do algoritmo. Cada linha da tabela descreve os


valores das variáveis ao longo de uma iteração:

y
a b c d E(y) M ⊆ E(y) T F ∪ F0 ε
20 0 70 15 ac ac b bc bd 5
20 5 70 15 ac bc ac bca bd ad 5
25 10 65 15 ac bc ad bc ad

Desempenho. No pior caso, o algoritmo H ÚNGARO consome tempo O(mn2 ), sendo


m o número de arestas e n o número de nós do grafo. O termo “m” é consequência
do processo iterativo externo, que acrescenta pelo menos uma aresta a G(y) a cada
iteração. O termo “n2 ” representa o consumo de tempo de E MP B IPARTIDO P ERFEITO.

8.4 Um programa linear mais poderoso


O programa linear (1) representa mal o problema 8.A, a menos que o grafo seja bi-
partido. Tipicamente, o custo c(M ) de um ep mínimo M é estritamente maior que
o custo cx de uma solução ótima x do pl, e a correspodente solução x não é inteira.
Precisamos de um pl mais “poderoso”, com restrições lineares que “cortem fora” as
soluções não-inteiras do pl (1). A ideia de acrescentar restrições lineares a um pl para
eliminar soluções fracionárias indesejadas é muito efetiva e mostrou-se útil em muitos
problemas de otimização combinatória.
Dizemos que um corte ∂(S) num grafo G tem margem ímpar se |S| é ímpar. (A pari-
dade de |∂(S)| é irrelevante.) Denotaremos por S o conjunto de todos os subconjuntos
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 139

S de V (G) tais que |S| é ímpar. Se S ∈ S e x é o vetor característico de um ep então é


claro que
x(∂(S)) ≥ 1. (5)
Portanto, podemos acrescentar essas desigualdades ao pl (1). O resultado é o se-
guinte pl:
minimize cx
sujeito a x(∂(v)) = 1 para cada v em V
(6)
x(∂(S)) ≥ 1 para cada S em S
xe ≥ 0 para cada e em E.

As restrições “x(∂(S)) ≥ 1” são conhecidas como desigualdades florais (= blossom


inequalities). O número de desigualdades florais é enorme pois o conjunto S é enorme.
É bem verdade que algumas dessas desigualdades são obviamente redundates. Em
primeiro lugar, se |S| = 1 então a restrição x(∂(S)) ≥ 1 está subentendida em x(∂(v)) =
1. O mesmo acontece se |S| = 1, sendo S = V r S. Em segundo lugar, se |S| e |S|
são ímpares então as restrições x(∂(S)) ≥ 1 e x(∂(S)) ≥ 1 são idênticas e portanto uma
pode ser eliminada. Mas a eliminação dessas redundâncias óbvias não leva a uma
redução significativa do número de desigualdades florais.
Em cada instância específica do pl (6), a grande maioria das desigualdades florais se
revela redundante por razões que não são óbvias. A dificuldade está em saber quais
desigualdades florais poderiam ser ignoradas.

Programa dual. O pl dual de (6) tem uma variável yv para cada nó v e uma variável
YS para cada S em S e consiste em encontrar um par (y, Y ) que
maximize y1 + Y 1
(7)
P
sujeito a yv + yw + (YS : S ∈ Svw ) ≤ cvw para cada vw em E
YS ≥ 0 para cada S em S,
P P
sendo y1 = v∈V yv , Y 1 = S∈S YS e Svw := {S ∈ S : ∂(S) 3 vw}. Dado um par
(y, Y ), o custo reduzido de qualquer aresta vw é o número c(y,Y )vw definido assim:
P
c(y,Y )vw := cvw − yv − yw − (YS : S ∈ Svw ).
Portanto, (y, Y ) é viável em (7) se e somente se c(y,Y )e ≥ 0 para cada e em E e YS ≥ 0
para cada S em S.

Folgas complementares. Para qualquer solução viável x do pl (6) e qualquer solução


viável (y, Y ) do pl (7), temos cx = y1 + Y 1 se e somente se valem as seguintes folgas
complementares: para cada e em E,
xe = 0 ou c(y,Y )e = 0
e, para cada S em S,
x(S) = 1 ou YS = 0.
140 8.4. UM PROGRAMA LINEAR MAIS PODEROSO FEOFILOFF

Dada uma solução viável (y, Y ) do pl dual (7), as condições de folgas complementares
têm a seguinte consequência: se M é um ep tal que

M ⊆ E(y,Y ) e |M ∩ S| = 1 para cada S em S tal que YS > 0

então M é um ep mínimo.

Laminaridade. Em geral, numa solução ótima (y, Y ) de (7), a maior parte das com-
ponentes de Y é nula. Ademais, os conjuntos S para os quais YS > 0 formam uma
coleção laminar (veja definição na seção A.6 do apêndice A) e portanto há menos que
2|V | deles.

E XEMPLO 8.8: Para a instância do problema 8.A descrita a seguir, uma solução ótima do pl (1) não
define um ep. [CCPS fig.5.13]

a b c d e f
a − 1 1 − − 1
b 1 − 1 − 1 −
c 1 1 − 1 − −
d − − 1 − 1 1
e − 1 − 1 − 1
f 1 − − 1 1 −

Considere então os pl’s (6) e (7). Uma solução viável x do pl (6) e uma solução viável (y, Y ) do
pl dual (7) estão indicadas abaixo, juntamente com o custo reduzido c(y,Y ). O vetor dual Y tem
uma única componente não nula: YS > 0 apenas quando S = {a, b, c}. (São nulas, por exemplo, as
componentes de Y que correspondem aos conjuntos {a, d, f }, {a, c, f } e {a, c, d}.)

ab bc ca de ef f d be cd af y Y
c 1 2 3 4 5 6 7 8 9 a 1 abc 5
x 1 0 0 0 1 0 0 1 0 b 0
c(y,Y ) 0 0 0 1 0 2 0 0 0 c 2
d 1
e 2
f 3

Com um pouco de paciência, verificamos que os valores c(y,Y ) na tabela estão corretos e são não-
negativos. Tomando M := {e : xe = 1}, constatamos que M é um ep e M ⊆ E(y,Y ). Além disso,
|M ∩ ∂(S)| = 1. Portanto, x e (y, Y ) têm folgas complementares. Logo, M é um ep mínimo. Por
curiosidade, verificamos ainda que cx = 14 = y1 + Y 1.
Veja outro potencial (y, Y ) que tem folgas complementares com as de x:

ab bc ca de ef f d be cd af y Y
c 1 2 3 4 5 6 7 8 9 a 1 abc 3.5
x 1 0 0 0 1 0 0 1 0 b 0
c(y,Y ) 0 0 0 0 0 0 2 0 1 c 2
d 2.5
e 1.5
f 3.5
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 141

8.5 Algoritmo para ep mínimo em grafo arbitrário


J. Edmonds [Edm] usou (1965) os pl’s (6) e (7) como ponto de partida para obter um
algoritmo que resolve o problema 8.A do ep mínimo. O algoritmo de Edmonds é
conhecido como algoritmo das flores para ep mínimo (= blossom algorithm for mini-
mum perfect matching). O ponto de partida é o código do algoritmo E MP P ERFEITO da
seção 6.8. As flores produzidas por E MP P ERFEITO correspondem, grosso modo, aos
conjuntos ímpares S que têm YS 6= 0.
A discussão do algoritmo foge ao escopo destas notas. Vou me limitar a exibir o código,
sem maiores explicações.

B LOSSOM (G, c)
01 seja y uma solução viável do pl (2)
02 seja M ⊆ E(y) um emparelhamento em G  talvez M ← ∅
03 enquanto o emparelhamento M não é perfeito faça
04 G0 ← G, c0 ← c, M 0 ← M  G0 é o grafo derivado
05 seja r um nó M 0 -exposto de G0
06 T 0 ← ({r}, ∅)
07 repita  as pontas de cada aresta são tomadas em G0
08 enquanto existe aresta preto-verde ou preto-preta em E(y)
09 seja vw uma aresta preto-verde ou preto-preta
10 se vw é preto-verde
11 então T 0 ← E STENDE Á RVORE (G0 , M 0 , T 0 , vw)
12 senão C ONTRAI F LOR (G0 , M 0 , T 0 , vw, c0 )
13 se existe pseudonó branco v tal que yv = 0
14 então expanda v e atualize M 0 , T 0 e c0
15 se não existe aresta preto-vermelha em E(y)
16 então seja A0 o conjunto dos nós brancos de T 0
17 se A0 tem pseudonós
18 então y ← A JUSTE (G0 , c0 , M 0 , T 0 , y)
19 senão devolva A0 e pare  G não tem ep
20 seja vw uma aresta preto-vermelha em E(y)
21 M 0 ← A UMENTA E MP (G0 , M 0 , T 0 , vw)
22 estenda M 0 a um ep M em G
23 devolva M e pare  M é um ep

Esse algoritmo pode ser implementado de modo a consumir O(n2 m) unidades de


tempo.
142 8.6. EXERCÍCIOS FEOFILOFF

8.6 Exercícios
Seção 8.1
8.1 Uma loja de aluguel de pranchas de surf quer alugar n pranchas para n surfistas. As pranchas têm
comprimentos l1 ≤ · · · ≤ ln e os surfistas têm alturas h1 ≤ · · · ≤ hn . Idealmente, o comprimento de
uma prancha deve ser igual à altura do surfista. Digamos que um emparelhamento entre pranchas
a surfistas é ótima se minimiza a soma das diferenças, em valor absoluto, entre a altura do surfista
e o comprimento de sua prancha. Formule essa questão como um problema de ep mínimo. Mostre
que o emparelhamento {l1 h1 , . . . , ln hn } é ótimo. (Dica: Mostre que se l ≤ l0 e h ≤ h0 então |l − h| +
|l0 − h0 | ≤ |l − h0 | + |l0 − h|. Depois, faça a diferença simétrica entre dois ep’s.)
8.2 Suponha dado um grafo com custos nas arestas. Se multiplicarmos o custo de cada aresta por 100,
é verdade que todo ep mínimo continua sendo mínimo? Se somarmos 200 ao custo de cada aresta,
é verdade que todo ep mínimo continua sendo mínimo?
8.3 ? Circuitos alternantes. Seja M um ep em um grafo com custos c nas arestas. O peso de qualquer
circuito alternante C é o número c(E(C) r M ) − c(E(C) ∩ M ). (Um circuito é um ciclo simples. É
claro que circuitos alternantes têm comprimento par.) Prove que M é um ep mínimo se e somente
se o grafo não tem circuitos alternantes de peso negativo. (Dica: considere diferenças simétricas.)
[CCPS 5.35]

Seção 8.2
8.4 Por que o pl (1) não tem a restrição “xe ≤ 1 para cada e ∈ E”?
8.5 Mostre que todo ep corresponde a uma solução viável inteira do pl (1). Mostre que toda solução
viável inteira do pl (1) corresponde a um ep.
8.6 ? Escreva explicitamente os pl’s (1) e (2) para o grafo definidos pelas tabelas abaixo.

a b c d ab bc ca cd
a − 1 1 − c +10 +20 +30 +40
b 1 − 1 −
c 1 1 − 1
d − − 1 −
8.7 Mostre que o pl (2) é o dual do pl (1). Prove que a condição de folgas complementares (3) está
correta.
8.8 Exiba uma instância inviável do pl (1) e uma instância inviável do pl (2).
8.9 Seja G um grafo completo com n nós. Suponha que toda aresta tem custo −10. Exiba um ep de
custo mínimo. Exiba uma solução ótima x do pl (1) e uma solução ótima y do pl (2).
8.10 ? Seja G um grafo bipartido e suponha que o custo de cada aresta vw é bv + bw , sendo b uma
atribuição de números reais aos nós de G. Descreva um bom algoritmo para calcular um ep mínimo
nesse caso. Em seguida, descreva um algoritmo particularmente rápido para o caso em que G é
bipartido completo. [AMO 12.22b]

Seção 8.3
8.11 O que há de errado na seguinte afirmação? “Todo grafo bipartido com custos nas arestas tem um
ep cujo custo é igual ao valor ótimo do pl (1).”
8.12 ? Suponha que o grafo G tem bipartição (P, Q). Para calcular um potencial viável na linha 01 do
algoritmo H ÚNGARO, comece por fazer yp := 0 para todo p em P . Desenvolva essa ideia.
FEOFILOFF EMPARELHAMENTOS PERFEITOS DE CUSTO MÍNIMO 143

8.13 ? Mostre que o novo potencial calculado pelo algoritmo H ÚNGARO nas linhas 11 a 18 é viável. Em
seguida, mostre que o conjunto justo para o novo potencial inclui M e E(T ).
8.14 Seja G o grafo bipartido completo com bipartição ({a, b}, {c, d}). O vetor c de custos é dado abaixo.
Calcule um ep mínimo em (G, c). Comece com o potencial y e o emparelhamento M = {ac}. Antes,
verifique que o potencial y é viável.

ac ad bc bd y
c 10 50 30 30 a 0
b 2
c 1
d 4
8.15 Calcule um ep mínimo no grafo bipartido completo com bipartição ({a, b, c}, {d, e, f }) que tem os
custos indicados abaixo. Procure escolher o potencial inicial y de modo que o subgrafo justo G(y)
tenha muitas arestas.
ad ae af bd be bf cd ce cf
c 20 10 50 40 30 30 50 40 20

Seção 8.4
8.16 Faça uma lista de todos os conjuntos ímpares de nós do grafo abaixo. Escreva cada conjunto ímpar
ao lado do seu complemento (que também é ímpar). Para cada conjunto ímpar S, escreva a lista
dos elementos de ∂(S).

8.17 Seja M um ep em um grafo G. Seja S um corte de margem ímpar. Mostre que M ∩ S não é vazio.
8.18 No pl (6), é suficiente restringir as desigualdades florais aos circuitos ímpares? Ou seja, é suficiente
supor que S é a conjunto de todos os cortes ∂(S) tais que S é o conjuntos de nós de algum circuito
ímpar?
8.19 Mostre que o pl (7) é o dual do pl (6). Verifique que as condições de folgas complementares dadas
no texto acima.
8.20 Suponha que G é um grafo com número ímpar de nós (e portanto não tem ep). Mostre que o
correspondente pl (6) é inviável e o pl (7) é ilimitado. Repita o exercício supondo que G tem duas
componentes conexas, cada uma com número ímpar de nós.
8.21 ? Escreva explicitamente as desigualdades florais do exemplo 8.8.
8.22 Desigualdades florais redundantes. As desigualdades florais que são obviamente redundantes podem
ser eliminadas da seguinte maneira. Escolha um nó qualquer r como referência e seja S 0 o conjunto
de todos os subconjuntos S de V r {r} tais que |S| é ímpar e |S| ≥ 3. Desenvolva essa ideia e corrija
suas imperfeições.
8.23 ? Truque prático. Pode ser interessante submeter o pl (6) a um software de programação linear.
Como S é muito grande, o seguinte truque prático pode ser útil: use apenas uma pequena parte
S 0 de S contendo os conjuntos S mais “promissores”; se isso não produzir o vetor característico de
um ep, acrescente a S 0 mais alguns elementos de S que pareçam promissores e repita o processo.
8.24 ? Encontre um ep mínimo no grafo da figura. Encontre também soluções ótimas dos pl’s (6) e (7).
(Dica: Veja o exercício 8.23.) [CCPS 5.27]
144 8.6. EXERCÍCIOS FEOFILOFF

8.25 Suponha que (y, Y ) é uma solução viável do pl (7). Para cada S em S e cada v ∈ S, faça yv ← yv +YS ;
depois, para cada S, faça YS ← 0. Essa operação preserva viabilidade de (y, Y )?

Seção 8.5
8.26 ? Use o algoritmo B LOSSOM para mostrar que um grafo G tem um ep se e somente se o pl (6) é
viável. (Sugestão: Se G não tem ep, mostre que o pl dual (7) é ilimitado.) [CCPS 5.28]
Capítulo 9

Poliedro dos emparelhamentos


perfeitos

Este capítulo estuda o casco convexo (veja o apêndice D) dos emparelhamentos perfei-
tos de um grafo e o correspondente poliedro (veja o apêndice B).
Todos os grafos neste capítulo são não-dirigidos. Por isso, diremos apenas grafo,
deixando subentendido o adjetivo não-dirigido. Usaremos a abreviatura “ep” para a
expressão “emparelhamento perfeito”.

9.1 O poliedro dos ep’s fracionários


Considere o programa linear (1) do capitulo 8, que representa o problema 8.A do ep
mínimo num grafo G. O pl consiste em encontrar um vetor real (xe : e ∈ E) que

minimize cx
sob as restrições x(∂(v)) = 1 para cada v em V (1)
xe ≥ 0 para cada e em E,

sendo V := V (G) e E := E(G). O conjunto de todas as soluções viáveis do pl é


conhecido como poliedro dos ep’s fracionários (= fractional perfect matching polyhedron)
de G e denotado por FPM (G). FPM (·)

É óbvio que o vetor característico de todo ep de G está em FPM (G). Mas em geral o
poliedro representa mal o conjunto de ep’s de G. Em primeiro lugar, FPM (G) pode
não ser vazio mesmo que G não tenha ep algum, como no caso de um grafo completo
com 3 nós, por exemplo. Em segundo lugar, se G tem um ep, o vetor característico x
de um ep mínimo pode não minimizar cx em FPM (G).

E XEMPLO 9.1: A figura define um grafo G com custos c nas arestas. A tabela mostra vetores x e
x0 do poliedro FPM (G). Também mostra uma solução viável y do dual (veja (2) no capítulo 8) do
pl (1).

145
146 9.1. O POLIEDRO DOS EP’S FRACIONÁRIOS FEOFILOFF

ab bc ca de ef f d be y
c 10 10 10 10 10 10 20 a 5
x 0.5 0.5 0.5 0.5 0.5 0.5 0 b 5
x0 0 0 1 0 0 1 1 c 5
d 5
e 5
f 5
O vetor x é solução ótima do pl (1) (as folgas de x e y são complementares) mas não representa
um ep. O vetor x0 representa um ep mínimo em G mas não é solução ótima do pl (observe que
cx0 > cx).

Grafos bipartidos. Se G é bipartido, o poliedro FPM (G) representa muito bem o


conjunto dos ep’s de G. Nesse caso, (1) FPM (G) é vazio se e somente se G não tem
ep’s e (2) os vértices (veja a seção B.2 do apêndice B) de FPM (G) são os ep’s de G. É o
que mostraremos a seguir.
O poliedro FPM (G) é limitado, pois 0 ≤ x ≤ 1 para cada x no poliedro. Segue daí, de
acordo com o lema B.4, que FPM (G) tem vértices, a menos que seja vazio. Os vértices
são caracterizados pelo seguinte lema:

Lema 9.1 Para todo grafo bipartido G, um vetor x de FPM (G) é vértice se e somente
se x é binário.

E SBOÇO DA PROVA : Adote as abreviaturas V := V (G) e E := E(G). Seja x um vetor


binário de FPM (G) e d um vetor em RE tal que x + d e x − d estão FPM (G). Para toda
aresta e tal que xe = 0 temos necessariamente de = 0. Analogamente, temos de = 0
para toda aresta e tal que xe = 1. Portanto, d = 0. Isso mostra que x é um vértice.
Agora suponha que um vetor x de FPM (G) não é binário. Seja E 0 o conjunto das arestas
e tais que 0 < xe < 1. Nenhum nó de G tem grau 1 no subgrafo (V, E 0 ). Portanto
(veja o lema E.1 no apêndice E), o subgrafo (V, E 0 ) tem um circuito, digamos C =
(v0 , e1 , v1 , e2 , . . . , ek , v0 ). Como G é bipartido, k é par. Seja ε um número positivo tal que
xei + ε ≤ 1 para cada i ímpar e e xei − ε ≥ 0 para cada i par. Seja d o vetor indexado
por E tal que dei := +ε para cada i ímpar, dei := −ε para cada i par, e de := 0 para toda
aresta e que não pertence a C. Então d não é nolo e tanto x + d quanto x − d pertencem
a FPM (G). A existência de um tal d mostra que x não é vértice.

O lema 9.1 leva ao seguinte teorema de G. Birkhoff [Bir] (1946):

Teorema 9.2 (Birkhoff) Para todo grafo bipartido, se o pl (1) é viável então tem uma
solução ótima que é binária.

P ROVA : Suponha que o pl (1) é viável, ou seja, que o poliedro FPM (G) não é vazio.
Como o poliedro é limitado, o corolário C.3 no apêndice C garante que, qualquer que
seja c, alguma solução ótima x do pl é vértice do poliedro. Pelo lema 9.1, x é binário.
FEOFILOFF POLIEDRO DOS EMPARELHAMENTOS PERFEITOS 147

Podemos resumir assim o estudo do poliedro FPM (G): se G é um grafo bipartido


então FPM (G) é o casco convexo dos ep’s de G (veja o teorema D.3 do apêndice D).
Em particular, FPM (G) é um politopo.

9.2 Vértices meio-binários


Como vimos acima, os vértices do poliedro FPM (G) não são, em geral, binários. Curi-
osamente, os vértices são quase binários, como mostraremos a seguir.
Diremos que um vetor x é meio-binário (= half-integer) se xe ∈ {0, 0.5, 1} para todo
e em E(G). Para qualquer vetor x e qualquer número real λ, seja Eλ (x) o conjunto
{e ∈ E(G) : xe = λ}.

Teorema 9.3 Para qualquer grafo G, um vetor x de FPM (G) é vértice se e somente se
x é meio-binário e cada componente conexa do grafo induzido G[E0.5 (x)] é um circuito
ímpar.

P ROVA DO “ SE ”: Seja x um vetor meio-binário em FPM (G) tal que cada componente
conexa do grafo induzido G[E0.5 (x)] é um circuito ímpar. Para mostrar que x é um
vértice de FPM (G), seja d um vetor em RE tal que x+d e x−d estão ambos em FPM (G).
É fácil verificar que de = 0 para toda aresta e em E0 (x) e toda aresta e em E1 (x).
A análise das arestas em E0.5 (x) é mais delicada. Seja (v0 , e1 , v1 , . . . , ek , v0 ) um circuito
ímpar cujas arestas estão todas em E0.5 (x). Suponha que de1 > 0. Como x(∂(v1 )) = 1
e x é meio-binário, temos necessariamente de2 = −de1 . Se continuarmos esse raciocício
ao longo do circuito, veremos que de1 < 0, uma vez que k é ímpar. Essa contradição
mostra que de = 0 para todo e em E0.5 (x). Concluímos assim que d = 0. Isso mostra
que x é um vértice de FPM (G).
P ROVA DO “ SOMENTE E ”: Construa um grafo G0 da seguinte maneira. Para cada nó v
de G, o grafo G0 tem dois nós, v 0 e v 00 . Para cada aresta e = vw de G, o grafo G0 tem
duas arestas: e0 := v 0 w00 e e00 := v 00 w0 . É claro que G0 é bipartido.
Seja x̄ um vértice de FPM (G). Conforme o corolário C.4 do apêndice C, existe um
vetor c de custos tal que x̄ é a única solução ótima do programa linear max{cx : x ∈
FPM (G)}. Seja c0 o vetor definido por c0e0 := c0e00 := ce para cada aresta e de G. Todos os
vértices de FPM (G0 ) são binários de acordo com o lema 9.1. Conforme o corolário C.3,
existe um vértice x0∗ de FPM (G0 ) que maximiza c0 x0 para x0 em FPM (G0 ). Seja x∗ o
vetor de FPM (G) definido por x∗e := 12 (x0∗ 0∗
e0 + xe00 ) para cada aresta e de G. É claro que x

é meio-binário. Ademais, x∗ maximiza cx para x em FPM (G). Logo, x̄ = x∗ e portanto


x̄ é meio-binário.
A prova tem um último passo. Se x é um vetor meio-binário em FPM (G) então é claro
que as componentes de G[E0.5 (x)] são circuitos. Se x é vértice, o mesmo argumento
usado na prova do lema 9.1 mostra que não podemos ter circuitos pares.
148 9.3. O POLIEDRO DOS EP’S FEOFILOFF

9.3 O poliedro dos ep’s


Considere o programa linear (6) do capitulo 8, que representa o problema 8.A do ep
mínimo num grafo G. O pl consiste em encontrar um vetor real (xe : e ∈ E) que

minimize cx
sujeito a x(∂(v)) = 1 para cada v em V
(2)
x(∂(S)) ≥ 1 para cada S em S
xe ≥ 0 para cada e em E,

sendo V := V (G), E := E(G) e S o conjunto de todos os subconjuntos ímpares de V .


O conjunto de todas as soluções viáveis desse pl é conhecido como poliedro dos ep’s
PM (·) (= perfect matching polyhedron) de G e denotado por PM (G). Esse poliedro é limitado
pois é subconjunto do poliedro limitado FPM (G) discutido nas seções anteriores.

E XEMPLO 9.2: Seja G grafo definido abaixo por sua matriz de adjacências. O grafo tem exatamente
três ep’s. As três primeiras linhas da tabela à direita representam os ep’s. Cada uma das demais
linhas representa um vetor de PM (G).

a b c d e f ad ae bd be bf ce cf
a − − − 1 1 − 1 0 0 1 0 0 1
b − − − 1 1 1 0 1 1 0 0 0 1
c − − − − 1 1 1 0 0 0 1 1 0
d 1 1 − − − − 0.3 0.7 0.7 0.2 0.1 0.1 0.9
e 1 1 1 − − − 0.15 0.85 0.85 0.1 0.05 0.05 0.95
f − 1 1 − − − 0.12 0.88 0.88 0.12 0.0 0.0 1.0

O poliedro PM (G) representa muito bem o conjunto dos ep’s de G. De fato, (1) PM (G)
é vazio se e somente se G não tem ep’s e (2) os vértices de PM (G) são os ep’s de G.
Essas afirmações decorrem do seguinte teorema de J. Edmonds [Edm] (1965):

Teorema 9.4 (Edmonds) Um grafo G tem um emparelhamento perfeito se e somente


se o pl (2) é viável. Ademais, se o pl (2) é viável então tem uma solução ótima que é
binária.

A prova do teorema não é fácil e será omitida. O teorema justifica o algoritmo B LOS -
SOM mencionado no seção 8.5.

Podemos resumir assim o estudo do poliedro dos ep’s: para qualquer grafo G, o poli-
edro PM (G) é o casco convexo dos ep’s de G (veja o teorema D.3 do apêndice D). Em
particular, PM (G) é um politopo.

9.4 Exercícios
Seção 9.1
9.1 ? Complete os detalhes da prova do lema 9.1.
FEOFILOFF POLIEDRO DOS EMPARELHAMENTOS PERFEITOS 149

9.2 ? Teorema de Birkhoff versus fluxo de custo mínimo. Prove o teorema de Birkhoff 9.2 a partir do teo-
rema 4.4 do fluxo viável de custo mínimo (veja a seção 4.4).
9.3 ? Mostre que o enunciado do teorema de Birkhoff 9.2 também vale para alguns grafos não biparti-
dos. Isto é, mostre que existe um grafo não bipartido tal que, para todo vetor c com valores em R,
o valor ótimo do pl (1) é igual ao custo de um ep mínimo. [CCPS 5.23]
9.4 ? Suponha que um grafo bipartido G não satisfaz as condições de Tutte 6.3 do capítulo 6. Mostre
que o pl (1) não tem solução viável.

Seção 9.2
9.5 Mostre que FPM (G) não é vazio se e somente se existe um conjunto de arestas e circuitos ímpares
tal que todo nó de G pertence a exatamente um dos circuitos ou a exatamente uma das arestas, mas
não ambos. [CCPS 5.22]
9.6 Um conjunto emparelhável (= matchable set) em um grafo G é o conjunto dos nós cobertos por algum
emparelhamento de G. Seja S o conjunto de vetores característicos de conjuntos emparelháveis de
um grafo bipartido G := (V, E) com bipartição (P, Q). Considere as condições

x(C) − x(N (C)) ≤ 0 para todo C ⊆ P


x(P ) − x(Q) = 0
xv ≥ 0 para todo v ∈ V
xv ≤ 1 para todo v ∈ V ,

onde N (C) é o conjunto de todos os nós em Q que são vizinhos de nós em C. Prove que se x ∈ cc(S)
então x safisfaz essas condições. [CCPS 6.5]
9.7 Dado um grafo G := (V, E) e um vetor y em RE , considere as seguintes condições:

y(∂(v)) = xv para todo v ∈ V


ye ≥ 0 para todo e ∈ E.

No exercício 9.6, prove que x ∈ cc(S) se e somente se x ≤ 1 e existe y que satisfaz as condições
acima. [CCPS 6.6]
150 9.4. EXERCÍCIOS FEOFILOFF
Apêndice A

Conjuntos, vetores e matrizes

Este apêndice estabelece algumas convenções de notação e terminologia a respeito de números,


vetores, e matrizes. Também introduz o conceito de coleção laminar de conjuntos.

A.1 Números
Dizemos que um número r é positivo se r > 0 e negativo se r < 0. Portanto, a expressão
“estritamente positivo” tem o mesmo significado que “positivo” e “estritamente negativo” tem
o mesmo significado que “negativo”. Um número r é não-negativo se r ≥ 0 e não-positivo se
r ≤ 0.
Um número natural é qualquer elemento do conjunto N := {0, 1, 2, 3, 4, . . .}. Um número N
inteiro é qualquer elemento do conjunto Z := {. . . , −4, −3, −2, −1, 0, 1, 2, 3, 4, . . .}. O conjunto Z
dos inteiros não-negativos é denotado por Z+ . Portanto, Z+ = N. Z+
Um número racional é qualquer número da forma p/q, sendo p e q números inteiros e q 6= 0.
O conjunto dos números racionais é denotado por Q e o conjunto dos racionais não-negativos Q
por Q+ . Q+

O conjunto de todos os números racionais e todos os irracionais (como 2, π, lg 3, etc.) cons-
titui o conjunto dos números reais e é denotado por R. O conjunto dos reais não-negativos é R
denotado por R+ . Os números conhecidos como reais no mundo da computação — números R+
do tipo float e double — são todos racionais.
É claro que N ⊂ Z ⊂ Q ⊂ R. Computadores digitais conhecem apenas um subconjunto finito
de Q; em particular, desconhecem os números irracionais.
Para qualquer número real x, denotamos por bxc o único inteiro i tal que i ≤ x < i + 1.
Analogamente, denotamos por dxe o único inteiro j tal que j − 1 < x ≤ j.

151
152 A.2. VETORES FEOFILOFF

A.2 Vetores
Um vetor 1 indexado por um conjunto finito M é o mesmo que uma função que leva M em
algum conjunto de números. Um vetor x indexado por M pode ser indicado por

(xi : i ∈ M ).

Um vetor real indexado por M é uma função que leva M em R. Da mesma forma, um ve-
tor racional indexado por M é uma função que leva M em Q. O conjunto de tais funções é
QM tradicionalmente denotado por
QM .
Um vetor é não-negativo se todos as suas componentes são não-negativas. Um vetor é inteiro
se todos as suas componentes pertencem a Z. Um vetor é binário, ou booleano, se todas as
suas componentes pertencem a {0, 1}.
Se x é um vetor indexado por um conjunto M e K é um subconjunto de M , denotamos por xK
ou por x[K] a restrição de x a K. É claro que x[M ] = x.
O vetor característico de um subconjunto K de M é o vetor binário x indexado por M tal que
xi = 1 se i ∈ K e xi = 0 se i ∈ M r K. Reciprocamente, todo vetor binário x indexado por M
representa o subconjunto {i : xi = 1} de M .
O suporte de um vetor x é o conjunto de todos os índices j tais que x[j] 6= 0.

A.3 Matrizes
Considere o produto cartesiano M × N de dois conjuntos finitos M e N . Uma matriz indexada
por M × N é um função que leva M × N em algum conjunto de números. Uma matriz A
indexada por M × N pode ser indicada por (Ai,j : i ∈ M, j ∈ N ) ou por (A[i, j] : i ∈ M, j ∈ N ).
Uma matriz é real se todos as suas componentes pertencem a R. Uma matriz é racional se
todos as suas componentes pertencem a Q e inteira se todos as suas componentes pertencem
a Z. Uma matriz é binária, ou booleana, se todas as suas componentes pertencem a {0, 1}.
Se A é uma matriz indexada por M × N e i é um elemento de M , a linha i de A é o vetor
(Ai,j : j ∈ N ). Esse vetor pode ser denotado por Ai,N ou por A[i, N ].
Se j é um elemento de N , a coluna j de A é o vetor (Ai,j : i ∈ M ). Esse vetor pode ser denotado
por AM,j ou por A[M, j].
Podemos usar o símbolo “∗” para indicar o conjunto de todas as linhas e o conjunto de todas
[i, ∗] as colunas. Assim, A[i, ∗] := A[i, N ] e A[∗, j] := A[M, j].
[∗, j] A transposta de uma matriz A indexada por M ×N é a matriz B indexada por N ×M e definida
pela seguinte propriedade: B[j, i] = A[i, j] para cada j em N e cada i em M . A transposta de A
é denotada por AT .
Para qualquer conjunto finito N , a matriz identidade indexada por N × N é a matriz binária I
definida pelas seguintes propriedades: para cada (i, j) em N × N , se i = j então I[i, j] = 1 e se
i 6= j então I[i, j] = 0.
1
Não existem “vetores-linha” nem “vetores-coluna”. Um vetor é apenas um vetor, sem adjetivos.
Além disso, não é uma boa ideia supor que o conjunto de índices é necessariamente {1, 2, . . . , n} ou
{0, 1, 2, . . . , n − 1}.
FEOFILOFF CONJUNTOS, VETORES E MATRIZES 153

Para qualquer conjunto finito N , uma permutação dos elementos de N é uma sequência em
que cada elemento do conjunto aparece uma e uma só vez. Uma permutação de N é o mesmo
que uma bijeção, digamos p, de N em N . A matriz de permutação correspondente a p é a
matriz binária P indexada por N × N e definida pelas seguintes propriedades: para cada (j, i)
em N × N , se j = p(i) então P [j, i] = 1 e se j 6= p(i) então P [j, i] = 0.
Essa definição pode ser generalizada como segue. Para quaisquer conjuntos finitos M e N de
mesma cardinalidade e qualquer bijeção q de M em N , a matriz de bijeção correspondente a q
é a matriz binária Q indexada por N × M e definida pelas seguintes propriedades: para cada
(j, i) em N × M , se j = q(i) então Q[j, i] = 1 e se j 6= q(i) então Q[j, i] = 0.

A.4 Produtos
Para quaisquer vetores c e x indexados por um mesmo conjunto M , denotamos por c x a soma cx
de todos os números da forma ci xi com i em M : 2
P
cx := i∈M ci xi .
P
Esta soma também pode ser escrita assim: (ci xi : i ∈ M ). Se M = {1, 2, 3, 4}, por exemplo,
então cx = c1 x1 + c2 x2 + c3 x3 + c4 x4 .
Para qualquer matriz A indexada por M × N e qualquer vetor x indexado por N , denotamos
por Ax a soma de vetores P Ax
j∈N A[∗, j]x[j] .

Para qualquer vetor y indexado por M , denotamos por yA a soma de vetores3 yA


P
i∈M y[i]A[i, ∗] .

O produto de um vetor por uma matriz não é comutativo: yA não é o mesmo que Ay (em geral,
um deles nem faz sentido).
Para qualquer vetor c indexado por um conjunto M e qualquer subconjunto K de M , denota-
mos por c(K) a soma de todos os ck com k em K: 4 c(K)
P
c(K) := k∈K ck .
P
Essa soma também pode ser escrita assim: (ck : k ∈ K). Se x é o vetor característico do
subconjunto K de M então c(K) = cx.

E XEMPLO A.1: A figura mostra três objetos: à esquerda, na vertical, um vetor y indexado por
1, . . . , 4; à direita, uma matriz A com linhas indexadas por 1, . . . , 4 e colunas indexadas por 1, . . . , 5;
abaixo da matriz, um vetor x indexado por 1, . . . , 5.

−2 11 12 13 14 15
1 21 22 23 24 25
0 31 32 33 34 35
2 41 42 43 44 45
1 0 0 −1 0

2
Muita gente escreve “cT x” no lugar do meu “cx”. Mas a transposição de um vetor não faz sentido,
uma vez que não existem “vetores-linha” nem “vetores-coluna”.
3
Muita gente escreve “AT y” no lugar do meu “yA”.
4
No jargão de linguagens de programação, essa notação é um overload do símbolo c.
154 A.5. ÁLGEBRA LINEAR FEOFILOFF

Veja o produto yA, à esquerda, e o produto Ax, à direita:

−3
−3
81 82 83 84 85
−3
−3

A.5 Álgebra linear


Ao longo desta seção, suporemos M e N são dois conjuntos finitos e A é uma matriz real5
indexada por M × N .
Um conjunto de linhas de A é essencialmente o mesmo que uma submatriz da forma A[K, ∗],
com K ⊆ M . Um conjunto de colunas de A é essencialmente o mesmo que uma submatriz da
forma A[∗, L], com L ⊆ N .
Uma combinação linear das colunas de A é qualquer vetor da forma Ax, sendo x um vetor
real indexado por N . Uma combinação linear das linhas de A é qualquer vetor da forma yA,
sendo y um vetor real indexado por M .
O conjunto das colunas de A é linearmente dependente se existe um vetor real x indexado por
N tal que x 6= 0 mas Ax = 0. Em outras palavras, o conjunto das colunas de A é linearmente
dependente se alguma coluna de A pode ser escrita como combinação linear das demais. O
conjunto das colunas de A é linearmente independente se não for linearmente dependente, ou
seja, se a matriz A não tem colunas redundantes.
Definições análogas valem para as linhas de A. O conjunto das linhas de A é linearmente
dependente se existe um vetor real y indexado por M tal que y 6= 0 mas yA = 0. O conjunto
das linhas de A é linearmente independente se não for linearmente dependente.
Usamos as expressões l.d. e l.i. como abreviaturas de “linearmente dependente” e “linearmente
independente” respectivamente.
Adotamos a seguinte terminologia simplificada: um subconjunto K de M é l.i. se o conjunto
das colunas da matriz A[K, ∗] é l.i.. Um conjunto l.i. K é maximal se não for subconjunto
próprio de outro conjunto l.i..

Lema A.1 Todos os subconjuntos l.i. maximais de M têm o mesmo tamanho.

O posto de linhas (= row rank) de A é o tamanho de qualquer subconjunto l.i. maximal de M .


Definição análoga vale para subconjuntos de N e para o conceito de posto de colunas (= column
rank) de A.

Lema A.2 O posto de linhas de A é igual ao posto de colunas de A.

O posto (= rank) de A é, indiferentemente, o posto de linhas ou o posto de colunas de A.


5
Poderíamos nos restringir às matrizes racionais, uma vez que computadores digitais desconhecem
números irracionais.
FEOFILOFF CONJUNTOS, VETORES E MATRIZES 155

A.6 Coleções laminares de conjuntos


Seja L uma coleção6 de subconjuntos de um conjunto finito V . Dizemos que L é laminar se,
para cada par (X, Y ) de elementos de L, temos

X ∩Y =∅ ou X ⊆ Y ou X⊇Y . (1)

Uma coleção laminar de subconjuntos de V tem no máximo 2|V | elementos e portanto é muito
menor que a coleção de todos os subconjuntos de V .

E XEMPLO A.2: A coleção {{a, b, c, d}, {a, b}, {c}, {e, f }, {f }} é laminar. Ela pode ser representada,
de maneira muito compacta, pela expressão ((a b) (c) d) (e (f )), em que cada elemento do “uni-
verso” {a, b, c, d, e, f } aparece no máximo uma vez.

O complemento de um subconjunto L de V é o conjunto L := V r L. É claro que uma coleção X


é laminar se e somente se X ∩ Y = ∅ ou X ∩ Y = ∅ ou X ∩ Y = ∅ para cada par (X, Y ) de
elementos da coleção. A laminaridade de uma coleção tem uma relação interessante com a
operação de complementação:

Lema A.3 Seja L uma coleção de subconjuntos de um conjunto finito V e r um elemento de V .


Seja L0 a coleção {L ∈ L : L 3 r} e L00 a coleção {L : L ∈ L0 }. Se L é laminar então (L r L0 ) ∪ L00
é laminar.

P ROVA : Sejam X e Y dois elementos de L. Por hipótese, X ∩ Y = ∅ ou X ⊆ Y ou X ⊇ Y .


Temos três casos a considerar:
Caso 1: X ∈ L0 e Y ∈ L0 . Então X ∩ Y 6= ∅ e portanto X ⊆ Y ou X ⊇ Y . Se X ⊆ Y então
X ⊇ Y . Se X ⊇ Y então X ⊆ Y .
Caso 2: X ∈ L0 mas Y 6∈ L0 . Nesse caso, X 6⊆ Y e portanto X ∩ Y = ∅ ou X ⊇ Y . Se X ∩ Y = ∅
então X ⊇ Y . Se X ⊇ Y então X ∩ Y = ∅.
Caso 3: X 6∈ L0 e Y ∈ L0 . Esse caso é análogo ao caso 2 e portanto Y ⊇ X ou Y ∩ X = ∅.
Em resumo, para quaisquer dois elementos L e M de (L r L0 ) ∪ L00 , temos L ∩ M = ∅ ou L ⊆ M
ou L ⊇ M . Portanto, a coleção é laminar.

A.7 Exercícios
Seção A.4
A.1 Seja A uma matriz em RM ×N e x um vetor em RN . Mostre que A[i, ∗]x = (Ax)[i] qualquer que seja
i em M .
6
A palavra “coleção” é sinônima de “conjunto”. Usaremos “coleção” para designar um conjunto de
conjuntos.
156 A.7. EXERCÍCIOS FEOFILOFF

Seção A.5
A.2 Mostre dois subconjuntos l.i. maximais do conjunto de linhas da matriz abaixo.

0 0 0 0
1 0 0 0
0 1 0 0
0 0 1 0
1 1 0 0
1 0 1 0
0 1 1 0
1 1 1 0
A.3 Prove o lema A.1.
A.4 Prove o lema A.2.
A.5 Veja a série de vídeos Essence of Linear Algebra em www.3blue1brown.com/.

Seção A.6
A.6 Seja M uma coleção de subconjuntos de um conjunto finito V . Mostre que M não é laminar se e
somente se existe um par (X, Y ) de elementos de M tal que X ∩ Y 6= ∅ e X 6⊆ Y e X ⊇
6 Y.
A.7 Seja V o conjunto {a, b, c, d}. Faça um diagrama de Venn de uma coleção laminar de subconjuntos
de V que tenha o maior número possível de elementos.
A.8 ? Cardinalidade de coleções laminares. Seja V um conjunto com n elementos e L um coleção laminar
de subconjuntos de V . Mostre que |L| ≤ 2n. Parte 2: Suponha que L não contém o conjunto vazio e
nenhum de seus elementos é uma mera união de outros elementos. Mostre que |L| ≤ n − 1.
Apêndice B

Poliedros

Embora pertençam ao mundo discreto, problemas de otimização combinatória têm aspectos


contínuos e geométricos que é importante explorar.

B.1 O que é um poliedro?


Um poliedro é qualquer conjunto da forma {x : Ax ≤ b} em que x e b são vetores e A é uma
matriz. Mais precisamente, dado um conjunto finito E, um poliedro (= polyhedron) no espaço
RE é o conjunto de todos os vetores reais indexados por E que satisfazem as restrições

Ax ≤ b , (1)

sendo b um vetor real indexado por algum conjunto V e A uma matriz real indexada por V ×E.1
(Em geral, o mesmo poliedro pode ser representado por muitos pares (A, b) diferentes.) Os
exemplos abaixo mostram que essa definição é suficientemente flexível para acomodar restri-
ções aparentemente diferentes das especificadas em (1).

E XEMPLO B.1: Considere a matriz A e o vetor b representados abaixo, com o vetor b na vertical à
direita da matriz A.
11 12 13 14 15 16
21 22 23 24 25 26
31 32 33 34 35 36
41 42 43 44 45 46
O poliedro {x : Ax ≤ b} é o conjunto de todos os vetores (x1 , x2 , x3 , x4 , x5 ) que satisfazem o sistema
de desigualdades:

11x1 + 12x2 + 13x3 + 14x4 + 15x5 ≤ 16


21x1 + 22x2 + 23x3 + 24x4 + 25x5 ≤ 26
31x1 + 32x2 + 33x3 + 34x4 + 35x5 ≤ 36
41x1 + 42x2 + 43x3 + 44x4 + 45x5 ≤ 46

E XEMPLO B.2: O conjunto de todos os vetores (x1 , x2 ) que satisfazem o sistema de desigualdades
abaixo é um poliedro. (Todos os coeficientes são inteiros, mas isso é irrelevante.)

1
Poderíamos nos restringir aos vetores e matrizes racionais, uma vez que computadores digitais
desconhecem números irracionais.

157
158 B.2. VÉRTICES DE POLIEDROS FEOFILOFF

1x1 + 3x2 ≤ 18
1x1 + 0x2 ≤ 6
1x1 − 2x2 ≤ 2
−1x1 − 1x2 ≤ −5
−2x1 + 1x2 ≤ −1

E XEMPLO B.3: As figuras abaixo sugerem dois poliedros em RE com E = {1, 2, 3}.

E XEMPLO B.4: Seja P o conjunto de todos os vetores (x1 , x2 , x3 ) que satisfazem o sistema de de-
sigualdades abaixo e à esquerda. Esse sistema é equivalente ao que está no centro. O sistema no
centro tem a forma especificada na definição (1). Portanto, P é um poliedro. Em notação matricial,
o poliedro é definido por Ax ≤ b, sendo A e b a matriz e o vetor à direita.
x1 ≥ 1 −x1 ≤ −1 −1 0 0 −1
x2 ≥ 2 −x2 ≤ −2 0 −1 0 −2
x1 + x2 ≤ 5 x1 + x2 ≤ 5 1 1 0 5
x1 + 2x2 ≥ 0 −x1 − 2x2 ≤ 0 −1 −2 0 0
x1 + x2 + x3 ≤ 9 x1 + x2 + x3 ≤ 9 1 1 1 9
x3 = 3 x3 ≤ 3 0 0 1 3
−x3 ≤ −3 0 0 −1 −3
As restrições que definem um poliedro não precisam ser independentes entre si. Nesse exemplo, a
quarta e a quinta desigualdades do sistema à esquerda são redundantes: o poliedro não se altera se
essas desigualdades forem apagadas.

E XEMPLO B.5: Seja A uma matriz indexada por V × E e c um vetor indexado por E. O conjunto
de todos os vetores y que satisfazem as restrições yA ≤ c é igual ao conjunto {y : AT y ≤ c}, onde
AT a matriz transposta de A. Como o último conjunto tem a forma especificada na definição (1),
{y : yA ≤ c} é um poliedro.

B.2 Vértices de poliedros


Os vetores mais interessantes de um poliedro estão da “fronteira”, ou “casca”, do poliedro.
Esses vetores satisfazem de maneira “justa” (isto é, com “=” no lugar de “≤”) uma ou mais das
restrições que definem o poliedro. Dentre esses vetores, os mais relevantes são os “bicos”, que
definiremos de uma maneira geometricamente natural.
Um vetor x de um poliedro P := {x : Ax ≤ b} no espaço RE é extremo se não existe vetor
d 6= 0 tal que x + d e x − d estão ambos em P . Os vetores extremos de um poliedro também
são conhecidos como vértices.
O conceito de vértice não está restrito a poliedros. Ele se aplica também a qualquer subconjunto
convexo (veja o capítulo D) de RE .

E XEMPLO B.6: Considere o conjunto de todos os vetores (x1 , x2 ) que satisfazem as desigualdades a
seguir. (Faça uma figura.)
FEOFILOFF POLIEDROS 159

x1 + x2 ≤ 2
−x1 + x2 ≤ 0
O vetor (+1, +1) é um vértice nesse conjunto.

E XEMPLO B.7: Considere o conjunto de todos os vetores (x1 , x2 ) que satisfazem as restrições a
seguir.
x1 + x2 ≤ 3
x1 − x2 ≥ 0
x2 ≥ 0
Os vértices desse conjunto são (0, 0), ( 23 , 23 ) e (3, 0). (Faça uma figura.)

E XEMPLO B.8: Para a matriz A e o vetor b definidos abaixo, considere o poliedro {x : Ax ≤ b}.

1 2 4 8
A 1 2 5 b 9
1 2 6 10
x 3 2 0
d 1 −1 0

O vetor x e os vetores x + d e x − d estão no poliedro. Portanto, x não é vértice do poliedro.

E XEMPLO B.9: Nem todo poliedro tem vértices. Considere o poliedro P := {x : Ax ≤ b}, com A e b
dados a seguir. (Faça uma figura.)

A +1 +1 b 2
d +1 −1

Para qualquer x em P , tanto x + d quanto x − d estão em P .

E XEMPLO B.10: Seja P o poliedro definido pelas desigualdades Ax ≤ b. Seja x̂ um vetor de P tal
que Ax̂ = b. Suponha que x̂ não é vértice de P . Então existe um vetor não nulo d tal que A(x̂+d) ≤ b
e A(x̂ − d) ≤ b. Segue daí que
Ad = 0
e portanto o conjunto das colunas de A é linearmente dependente (veja a seção A.5).

Lema B.1 (caracterização dos vértices) Seja A uma matriz indexada por V × E e b um vetor
indexado por V . Seja x um vetor do poliedro P := {x : Ax ≤ b} e I(x) o conjunto de todos os
índices i em V tais que
A[i, ∗]x = b[i].
O vetor x é vértice de P se e somente se o conjunto das colunas da matriz A[I(x), ∗] é linear-
mente independente.

P ROVA DO “ SE ”: Suponha que x não é vértice do poliedro. Então existe um vetor não nulo d
tal que Ax + Ad ≤ b e Ax − Ad ≤ b. Para cada i em I(x), temos

b[i] + A[i, ∗]d ≤ b[i] e b[i] − A[i, ∗]d ≤ b[i],

uma vez que A[i, ∗]x = b[i]. Portanto, A[i, ∗]d = 0 para cada i. Logo, o conjunto das colunas de
A é l.d.. Em particular, o conjunto das colunas de A[I(x), ∗] é l.d..
160 B.2. VÉRTICES DE POLIEDROS FEOFILOFF

P ROVA DO “ SOMENTE SE ”: Suponha que o conjunto das colunas de A[I(x), ∗] é l.d.. Então
existe um vetor não nulo d indexado por E tal que A[I(x), ∗]d = 0. Logo,

A[I(x), ∗](x ± d) ≤ b[I(x)].

Por outro lado, A[h, ∗]x < b[h] para cada h em V r I(x). Logo, para algum número positivo ε
suficientemente pequeno temos

A[V r I(x), ∗](x ± εd) ≤ b[V r I(x)].

Em suma, A(x ± εd) ≤ b e portanto x não é vértice de P .

O lema poderia ser enunciado assim: x é vértice do poliedro se e somente se o posto da matriz
A[I(x), E] é |E|. Em outras palavras, x é vértice se e somente se o posto de colunas da matriz
A[I(x), E] é “pleno”, e assim x é a única solução do sistema de equações A[I(x), E]x = b[I(x)].

E XEMPLO B.11: O lado esquerdo da figura abaixo mostra uma matriz A, um vetor b (à direita da
matriz), e um vetor x̂ (abaixo da matriz). Seja I(x̂) o conjunto das 6 primeiras linhas de A. Então
A[i, ∗]x̂ = b[i] se e somente se i ∈ I(x̂). Observe que o conjunto das colunas de A[I(x̂), ∗] é l.i..
(Portanto, o conjunto das colunas de A também é l.i..) O vetor x̂ é vértice do poliedro Ax ≤ b.

1 0 0 0 2 1 0 0 0 3
0 1 0 0 3 0 1 0 0 4
0 0 1 0 4 0 0 1 0 5
0 0 0 1 5 0 0 0 1 6
1 1 0 0 5 3 1 0 0 9
3 3 3 3 42 3 1 0 1 14
0 0 2 0 10 3 1 1 0 13
0 0 0 4 30 3 1 1 1 18
2 3 4 5 2 3 4 5

Agora considere os objetos A, b e x̂ do lado direito da figura. Seja I(x̂) o conjunto das 4 últimas
linhas de A. Então A[i, ∗]x̂ = b[i] se e somente se i ∈ I(x̂). Embora o conjunto das colunas de A seja
l.i., o conjunto das colunas de A[I(x̂), ∗] é l.d.. Portanto, o vetor x̂ não é vértice do poliedro Ax ≤ b.

E XEMPLO B.12: Considere novamente o poliedro P do exemplo B.4. Veja abaixo, mais uma vez,
o sistema de desigualdades que define P . O subsistema formado pela primeira, segunda e sexta
desigualdades (veja a segunda coluna da figura) é satisfeito com igualdade pelo vetor (1, 2, 3) e por
nenhum outro. Esse vetor pertence a P e portanto é um vértice de P .

x1 ≥ 1 x1 = 1 x1 = 1
x2 ≥ 2 x2 = 2
x1 + x2 ≤ 5 x1 + x2 = 5
x1 + 2x2 ≥ 0
x1 + x2 + x3 ≤ 9
x3 = 3 x3 = 3 x3 = 3
O subsistema formado pela primeira, terceira e sexta desigualdades (veja a terceira coluna da
figura) é satisfeito com igualdade apenas por (1, 4, 3). Esse vetor pertence a P e portanto é um
vértice de P . Analogamente, o subsistema formado pela segunda, terceira e sexta desigualdades
define o vértice (3, 2, 3). Esses são os três únicos vértices de P .
Agora veja alguns subsistemas que não definem vértices. O subsistema formado pela primeira,
quarta, e sexta desigualdades é satisfeito com igualdade apenas pelo vetor (1, − 21 , 3), mas esse vetor
não pertence a P . O subsistema formado pela primeira, segunda, terceira e sexta desigualdades
não é satisfeito com igualdade por nenhum vetor. O subsistema formado pela primeira e segunda
desigualdades é satisfeito com igualdade por mais de um vetor.
FEOFILOFF POLIEDROS 161

Corolário B.2 O poliedro {x : Ax ≤ b} tem um vértice se e somente se A tem posto igual ao


número de colunas.

Corolário B.3 O número de vértices do poliedro {x : Ax ≤ b} é finito.

B.3 Poliedros limitados


Um poliedro P é limitado (= bounded) se existem vetores l e u em RE tais que l ≤ x ≤ u
para todo x em P . Em termos informais, um poliedro é limitado se “cabe” em um cubo. Um
poliedro é ilimitado (= unbounded) se não for limitado.

E XEMPLO B.13: Considere o conjunto de todos os vetores (x1 , x2 ) que satisfazem as desigualdades
abaixo. (Faça uma figura.) Esse poliedro é ilimitado.

x1 − x2 ≤ 4
x1 − x2 ≥ 2

E XEMPLO B.14: Considere novamente o poliedro do exemplo B.4. Trata-se do conjunto de todos os
vetores (x1 , x2 , x3 ) que satisfazem o sistema de desigualdades abaixo. Esse poliedro é limitado pois
0 ≤ xi ≤ 5 para todo i. (Verifique!)

x1 ≥ 1
x2 ≥ 2
x1 + x2 ≤ 5
x1 + 2x2 ≥ 0
x1 + x2 + x3 ≤ 9
x3 = 3

Lema B.4 Todo poliedro limitado não vazio tem pelo menos um vértice.

E SBOÇO DA PROVA : Seja {x : Ax ≤ b} um poliedro limitado e x um vetor do poliedro. Seja I(x)


o conjunto dos índices i tais que A[i, ∗]x = b[i]. Se x não é vértice, então existe um vetor não
nulo d tal que x + d e x − d estão no poliedro. Seja ε o maior número positivo tal que x + εd está
no poliedro. Um tal ε está bem definido pois o poliedro é limitado. Seja x0 o vetor x + εd. O
conjunto de índices i para os quais A[i, ∗]x0 = b[i] é um superconjunto próprio de I(x). Repita o
processo com x0 no papel de x. Depois de um número finito de iterações, teremos um vértice.

A recíproca do lema não é verdadeira: muitos poliedros ilimitados têm vértices. Por exemplo,
o vetor 0 é vértice do poliedro definido pelas desigualdades x ≥ 0.

B.3.1 Poliedros inteiros


Um poliedro limitado é inteiro (= integral) se todos os seus vértices forem vetores inteiros.
Poliedros limitados inteiros têm especial importância em otimização combinatória.
162 B.4. EXERCÍCIOS FEOFILOFF

B.4 Exercícios
Seção B.1
B.1 Mostre que o conjunto de todos os vetores x que satisfazem as restrições Ax ≥ b é um poliedro.
B.2 Mostre que o conjunto de todos os vetores x que satisfazem as restrições Ax = b é um poliedro.
B.3 Mostre que o conjunto de todos os vetores x que satisfazem as restrições Ax ≤ b e x ≥ 0 é um
poliedro.

Seção B.2
B.4 Complete os detalhes da prova do lema B.1.
B.5 Prove o corolário B.2.
B.6 Prove o corolário B.3.
B.7 ? Seja Q o poliedro {y : yA ≤ c}, onde A é uma matriz indexada por V × E e c um vetor indexado
por E. Seja y um vetor de Q e considere o conjunto de índices J(y) = {j ∈ E : yA[∗, j] = c[j]}.
Mostre que y é vértice de Q se e somente se o conjunto das linhas da matriz A[∗, J(y)] é l.i..
B.8 ? Seja P o poliedro {x : Ax ≤ b e x ≥ 0}, onde A é uma matriz indexada por V × E e b um
vetor indexado por V . Seja x um vetor de P e considere os conjuntos de índices I(x) = {i ∈ V :
A[i, ∗]x = b[i]} e J(x) = {j ∈ E : x[j] = 0}. Mostre que x é vértice de P se e somente se o conjunto
das colunas da matriz A[I(x), E r J(x)] é l.i..
B.9 ? Seja P o poliedro {x : Ax = b e x ≥ 0}, onde A é uma matriz indexada por V × E e b um vetor
indexado por V . Seja x um vetor de P e considere o conjunto de índices J(x) = {j ∈ E : x[j] = 0}.
Mostre que x é vértice de P se e somente se o conjunto das colunas da matriz A[V, E r J(x)] é l.i..

Seção B.3
B.10 Prove o lema B.4.
B.11 Seja P um poliedro não necessariamente limitado. Suponha que x ≥ 0 para todo x em P . Mostre
que P tem um vértice. [CCPS 6.3]
Apêndice C

Programação linear

Formular problemas de otimização combinatória como programas lineares é muito útil e re-
velador. Este apêndice faz uma rápida revisão dos conceitos e da terminologia básica da
programação linear.

C.1 Programas lineares


O problema de programação linear consiste em encontrar um vetor de um dado poliedro que
maximize uma dada função linear. Mais especificamente, o problema de programação linear
consiste no seguinte: Dados conjuntos finitos V e E, uma matriz A indexada por V × E, e
vetores b e c indexados por V e E respectivamente, encontrar um vetor x que

maximize cx
(1)
sob as restrições Ax ≤ b .

A expressão “maximize cx” deve ser entendida assim: procuramos x tal que cx ≥ cx0 para todo
x0 que satisfaça as restrições Ax0 ≤ b. Cada desigualdade A[v, ∗] x ≤ b[v] é uma restrição do
problema. O número cx é o valor de x. O máximo de cx é o valor ótimo do problema.
É usual supor que a matriz A e os vetores b e c são reais, mas poderíamos nos restringir
às matrizes e vetores racionais, uma vez que computadores digitais desconhecem números
irracionais.

E XEMPLO C.1: Considere a matriz A e os vetores b e c representados abaixo, com b na vertical à


direita da matriz e c na horizontal abaixo da matriz:
11 12 13 14 15 16
21 22 23 24 25 26
31 32 33 34 35 36
41 42 43 44 45 46
51 52 53 54 55

O problema de maximizar cx sujeito às restrições Ax ≤ b pode ser escrito explicitamente assim:


encontrar números x1 , x2 , x3 , x4 , x5 que maximizem o valor da combinação linear

51x1 + 52x2 + 53x3 + 54x4 + 55x5

163
164 C.1. PROGRAMAS LINEARES FEOFILOFF

enquanto satisfazem as restrições lineares

11x1 + 12x2 + 13x3 + 14x4 + 15x5 ≤ 16


21x1 + 22x2 + 23x3 + 24x4 + 25x5 ≤ 26
31x1 + 32x2 + 33x3 + 34x4 + 35x5 ≤ 36
41x1 + 42x2 + 43x3 + 44x4 + 45x5 ≤ 46 .

(Todos os coeficientes nesse exemplo são inteiros positivos, mas isso é mero acidente.)

O problema de programação linear é muitas vezes chamado de programa linear (= linear pro-
pl gram). Usamos a expressão “pl” como abreviatura de “programa linear”.
O pl dado na definição (1) pode ser escrito assim: encontrar um vetor x indexado por E que
P
maximize c[e] x[e]
P e∈E
sujeito a e∈E A[v, e] x[e] ≤ b[v] para todo v em V .

De acordo com a definição (1), um programa linear é um problema de maximização. Mas a


definição é suficientemente flexível para incluir problemas de minimização: basta trocar “c”
por “−c”.

E XEMPLO C.2: Considere o problema de minimizar cx sob as restrições Ax ≤ b. Esse problema


equivale a maximizar −cx sob as mesmas restrições. O segundo problema satisfaz a definição (1)
de programa linear.

E XEMPLO C.3: Considere o problema de maximizar cx sob as restrições Ax ≥ b. Esse problema


equivale a maximizar cx sob as restrições −Ax ≤ −b, que satisfaz a definição (1).

E XEMPLO C.4: Considere o problema de encontrar um vetor y que maximize yb sob as restrições
yA ≤ c. Esse problema pode ser reescrito assim: maximize by sujeito a AT y ≤ c. Assim, o problema
dado satisfaz a definição (1) de pl.

E XEMPLO C.5: Considere o problema de maximizar cx sujeito a Ax ≤ b e x ≥ 0. Isso equivale a


maximizar cx sob as restrições Ax ≤ b e −Ix ≤ 0, sendo I a matriz identidade com linhas e colunas
indexadas pelo conjunto de índices de x. Esse segundo problema tem a forma da definição (1)
de pl: basta tomar a justaposição apropriada das matrizes A e −I e dos vetores b e 0. Podemos
dizer, então, que o problema original é um pl.

C.1.1 Soluções de programas lineares


Considere o pl (1) e seja P o poliedro {x : Ax ≤ b}. Uma solução viável (= feasible solution) do
pl é qualquer vetor de P . Uma solução ótima do pl é qualquer vetor x de P para o qual cx é
máximo.1
O pl pode não ter solução ótima porque P é vazio ou porque cx não tem máximo (ou seja,
porque o máximo é infinito). Se P é vazio, dizemos que o pl é inviável (= infeasible). Caso
1
Essa terminologia tradicional é um tanto ilógica. Como a definição do pl inclui a maximização
de cx, o “ótima” da expressão “solução ótima” é redundante. Além disso, uma “solução viável” não é,
a rigor, uma solução do pl pois não maximiza cx.
FEOFILOFF PROGRAMAÇÃO LINEAR 165

contrário, dizemos que o pl é viável (= feasible). Se P não é vazio mas cx não tem máximo,
dizemos que o pl é ilimitado (= unbounded).
Suponha agora que o pl (1) não é inviável nem ilimitado. Então, como veremos adiante, o pl
tem uma solução ótima.

E XEMPLO C.6: Considere os dois pl’s abaixo. O primeiro é inviável e o segundo é ilimitado.

maximize x1 + x2 maximize x2
sob as restrições x1 + x2 ≤ 2 sob as restrições x1 + x2 ≤ 3
x1 + x2 ≥ 3 x1 + x2 ≥ 2

C.2 Dualidade em programação linear


Há uma fundamental relação dualidade entre programas lineares. Considere, por exemplo, o
programa linear

maximize cx
(2)
sujeito a Ax ≤ b .

O dual desse pl consiste em encontrar um vetor y que

minimize yb
sujeito a yA = c e (3)
y ≥ 0.

A relação básica entre os pl’s (2) e (3) é conhecida como teorema fraco da dualidade. Ela dá
uma delimitação superior para a expressão que queremos maximizar e, ao mesmo tempo, uma
delimitação inferior para a expressão que queremos minimizar:

Lema C.1 (teorema fraco da dualidade) Para qualquer solução viável x do programa pri-
mal (2) e qualquer solução viável y do programa dual (3) tem-se cx ≤ yb.

P ROVA : A prova da desigualdade decorre da associatividade do produto entre matrizes e


vetores:
cx = (yA)x = y(Ax) ≤ yb . (4)
(Note que a prova usa todas as restrições dos dois pl’s.)

O lema tem a seguinte consequência: se cx = yb então x é solução ótima do pl primal e y é


solução ótima do pl dual. Portanto, para mostrar que uma solução viável x do primal é ótima,
basta exibir uma solução viável y do dual tal que cx = yb. A recíproca dessa observação é
garantida pelo teorema forte da dualidade:

Teorema C.2 (von Neumann) Se os programas lineares (2) e (3) são viáveis então existe uma
solução viável x do primeiro e uma solução viável y do segundo tais que cx = yb. Se um dos
programas lineares é inviável então o outro é inviável ou ilimitado.
166 C.3. FOLGAS COMPLEMENTARES FEOFILOFF

A prova do teorema é algorítmica: o algoritmo Simplex (veja a seção C.4 abaixo) recebe A, b e c,
decide se os dois pl’s são viáveis e, em caso afirmativo, devolve x e y tais que cx = yb.

Corolário C.3 Se o poliedro {x : Ax ≤ b} do programa linear (2) não é vazio nem ilimitado
então o programa tem uma solução ótima que é vértice do poliedro.

Corolário C.4 Se v é um vértice do poliedro {x : Ax ≤ b} então existe um vetor c tal que v é a


única solução do programa linear (2).

E XEMPLO C.7: Considere o seguinte par dual de pl’s. Verifique que ambos são inviáveis.

maximize 2x1 + x2 minimize − 4y1 + 2y2


sujeito a − x1 + x2 ≤ 4 sujeito a − y1 + y2 ≥ 2
x1 − x2 ≤ 2 y1 − y2 ≥ 1
x ≥ 0 y ≥ 0

E XEMPLO C.8: Considere o seguinte par dual de pl’s. Verifique que o primeiro é inviável e o
segundo é ilimitado.

maximize 2x1 + x2 minimize − 4y1 + 2y2


sujeito a − x1 − x2 ≤ −4 sujeito a − y1 + y2 ≥ 2
x1 + x2 ≤ 2 y1 + y2 ≥ 1
x ≥ 0 y ≥ 0

E XEMPLO C.9: Considere o seguinte par dual de pl’s. Verifique que o primeiro é ilimitado e o
segundo é inviável.

maximize 2x1 + x2 minimize 4y1 + 2y2


sujeito a x1 − x2 ≤ 4 sujeito a y1 + y2 ≥ 2
x1 − x2 ≤ 2 −y1 − y2 ≥ 1
x ≥ 0 y ≥ 0

E XEMPLO C.10: Considere o seguinte par dual de pl’s. Verifique que ambos são viáveis. (Mostre
uma solução ótima de cada um.)

maximize 2x1 + x2 minimize 4y1 + 2y2


sujeito a x1 + x2 ≤ 4 sujeito a y1 + y2 ≥ 2
x1 − x2 ≤ 2 y1 − y2 ≥ 1
x ≥ 0 y ≥ 0

C.3 Folgas complementares


Seja A uma matriz indexada por V × E, b um vetor indexado por V , e c um vetor indexado
por E. Seja x uma solução viável do pl (2) e y uma solução viável do pl (3). Para cada
índice i em V , dizemos que x é justo em i se (Ax)[i] = b[i] e folgado em i se (Ax)[i] < b[i].
Analogamente, y é justo em i se y[i] = 0 e folgado em i se y[i] > 0. (Nesse par dual de pl’s, as
folgas envolvem apenas os índices das linhas de A. Em outros pl’s, as folgas podem envolver
também os índices das colunas.)
FEOFILOFF PROGRAMAÇÃO LINEAR 167

Se x é justo sempre que y é folgado (ou, equivalentemente, y é justo sempre que x é folgado),
dizemos que as folgas de x e y são complementares (= complementary slackness). No caso dos
pl’s (2) e (3), as folgas de x e y são complementares se, para cada índice i,

(Ax)[i] = b[i] ou y[i] = 0 . (5)

(O “ou” não é exclusivo, pois podemos ter (Ax)[i] = b[i] e y[i] = 0 para alguns valores de i.)
O seguinte lema é consequência imediata de (4):

Lema C.5 (das folgas complmentares) Para qualquer x viável no pl (2) e qualquer y viável no
pl (3), a igualdade cx = yb vale se e somente se as folgas de x e y são complementares.

C.4 Algoritmos para programas lineares


Existem vários algoritmos para o problema de programação linear. Qualquer algoritmo para o
problema de maximizar cx sob as restrições Ax ≤ b recebe uma matriz racional A, um vetor
racional b, e um vetor racional c e devolve
(a) um vetor racional x que é solução ótima do problema ou
(b) a informação de que o problema é inviável ou
(c) a informação de que o problema é ilimitado.
Ademais, se o poliedro {x : Ax ≤ b} tiver algum vértice então, no caso (a), o vetor x é um
vértice.
O algoritmo de programação linear mais célebre é o Simplex. (Veja o livro de Chvátal [Chv83].)
Um algoritmo mais complexo é o do elipsóide (= ellipsoid algorithm). Outro, também complexo,
é o algoritmo do ponto interior (= interior point method).
Os dois últimos algoritmos são polinomiais: consomem tempo limitado por um polinômio em
n e m, sendo m o número de linhas e n o número de colunas de A. O Simplex não é polinomial,
mas é muito usado na prática porque as instâncias que consomem tempo excessivo são raras.

C.5 Lema de Farkas


Considere, mais uma vez, o programa linear (2). Como tornar evidente que uma dada instância
do pl é inviável? Um vetor de inviabilidade para o pl (2) é qualquer vetor y 0 indexado por V
tal que
y 0 A = 0 e y 0 ≥ 0 e y 0 b < 0. (6)
Um tal vetor é um certificado (computacionalmente verificável) da inviabilidade do pl:

Lema C.6 Se existe um vetor de inviabilidade para o pl (2) então o pl é inviável.

P ROVA : Seja y 0 um vetor de inviabilidade. Se existisse um vetor x tal que Ax ≤ b teríamos

0 = (y 0 A)x = y 0 (Ax) ≤ y 0 b < 0.

A contradição 0 < 0 mostra que um tal vetor x não existe.


168 C.6. PROGRAMAÇÃO INTEIRA FEOFILOFF

A recíproca desse lema é conhecida como lema de Farkas [Far] e decorre do teorema forte da
dualidade C.2:

Lema C.7 (Farkas) Se o programa linear (2) é inviável então existe um vetor de inviabilidade
para (2).

Resultados análogos valem para o pl dual. Um vetor de inviabilidade para o pl (3) é qualquer
vetor x0 indexado por E tal que
Ax0 ≤ 0 e cx0 > 0. (7)
Um tal vetor é um certificado da inviabilidade do pl (3) por razões análogas à do lema C.6. Vale
também a versão apropriada do lema de Farkas C.7.

C.6 Programação inteira


Dada uma matriz real A, um vetor real b, e um vetor real c, o problema de programação inteira
consiste em encontrar um vetor inteiro z que

maximize cz
(8)
sob as restrições Az ≤ b .

Muitos problemas de otimização combinatória são naturalmente representados por programas


lineares inteiros. A restrição de integralidade torna o problema muito difícil. Não se conhecem
algoritmos polinomiais para o problema. O problema é NP-difícil.
A relaxação linear de um programa inteiro é o pl que se obtém quando a restrição de integra-
lidade é removida.

C.7 Exercícios
Seção C.1
C.1 Seja A a matriz representada abaixo, b o vetor representado à direita de A e c o vetor representado
abaixo de A. Escreva por extenso o seguinte pl: minimize cx sujeito às restrições Ax ≤ b.

−1 0 +1 −1 0 +2
0 −1 0 0 0 −2
+1 +1 0 0 −1 0
0 0 −1 +1 +1 0
1 1 1 1 1
C.2 Considere o problema de maximizar cx sob as restrições Ax = b. Mostre que esse problema satisfaz
a definição (1) de programa linear.
C.3 Considere o pl que consiste em maximizar cx sujeito a Ax ≤ b, sendo A é uma matriz indexada por
V × E, b um vetor indexado por V e c um vetor indexado por E. Suponha que s é uma solução
ótima do pl e s[V r J] = 0, sendo J um subconjunto de E. Mostre que s[J] é solução ótima do pl

maximize c[J]x sujeito a A[V, J]x ≤ b .


FEOFILOFF PROGRAMAÇÃO LINEAR 169

Seção C.2
C.4 Considere o problema de encontrar x que maximize cx sob as restrições Ax = b e x ≥ 0. Enuncie o
pl dual. Verifique o teorema fraco da dualidade para esse par de pl’s. Enuncie o teorema forte da
dualidade para esse par de pl’s.
C.5 Considere o problema de encontrar x que maximize x1 + 2x2 + 3x3 sob as restrições x1 ≥ 0, x2 ≥ 0,
x3 ≥ 0,
x1 + x2 + x3 = −10 e
x1 + 4x3 = −20 .
Qual o dual desse pl? O dual é viável? inviável? ilimitado?
C.6 Considere o seguinte pl: encontrar x que maximize cx sob as restrições Ax ≤ b e x ≥ 0. Mostre que
o dual desse pl pede um vetor y que minimize yb sob as restrições yA ≥ c e y ≥ 0.
C.7 Prove o corolário C.3.
C.8 Prove o corolário C.4.
C.9 Sejam L, M , N , O, P , Q conjuntos finitos disjuntos entre si. Sejam A, B, C, D, E, F , G, H, K
matrizes reais indexadas por
L × O, L × P, L × Q,
M × O, M × P, M × Q,
N × O, N × P, N × Q,
respectivamente. Sejam a, b, c vetores reais indexados por L, M e N , respectivamente. Sejam d, e,
f vetores reais indexados por O, P e Q, respectivamente. Seja X o conjunto de todos os vetores
reais (x, y, z) que satisfazem as restrições abaixo à esquerda e Y o conjunto de todos os vetores reais
(u, v, w) que satisfazem as restrições abaixo à direita.

Ax + By + Cz ≤ a uA + vD + wG ≥ d
Dx + Ey + F z = b uB + vE + wH = e
Gx + Hy + Kz ≥ c uC + vF + wK ≤ f
x≥0 u≥0
z≤0 w≤0

Suponha que X 6= ∅ e Y 6= ∅ e prove que max {dx + ey + f z : (x, y, z) ∈ X} = min {ua + vb + wc :


(u, v, w) ∈ Y }. [CCPS A.8]

Seção C.3
C.10 ? Dados números não-negativos a1 , a2 , . . . , am e b1 , b2 , . . . , bm , suponha que a1 b1 + a2 b2 + · · ·
+ am bm = 0. É verdade que a1 = · · · = am = 0 ou b1 = · · · = bm = 0? Mostre que, para
cada i, ai = 0 ou bi = 0.
C.11 ? Folgas complementares. Sejam a, b e c vetores indexados por um conjunto E. Suponha que a ≥ 0 e
b ≤ c. Prove que ab = ac se e somente se, para cada e em E, tem-se ae = 0 ou be = ce .
C.12 Prove o lema C.5. (Veja a prova do lema fraco da dualidade C.1 e o exercício C.10).
C.13 Considere o seguinte pl: minimizar cx sob as restrições Ax = b e x ≥ 0. Enuncie as condições de
folgas complementares.
C.14 Considere o seguinte pl: maximizar cx sob as restrições Ax = b e x ≥ 0. Enuncie o pl dual. Enuncie
as condições de folgas complementares para o par de pl’s.
C.15 Considere o seguinte pl: maximizar cx sujeito às restrições Ax ≤ b e x ≥ 0. Enuncie o pl dual. Prove
o teorema fraco da dualidade para esse par de pl’s. Enuncie as condições de folgas complementares.
Enuncie o teorema forte da dualidade.
170 C.7. EXERCÍCIOS FEOFILOFF

C.16 Considere o problema de encontrar x que maximize cx sob as restrições Ax = b e x ≥ 0. Considere


também o dual desse pl. Suponha que x é uma solução viável do primeiro pl e y é uma solução
viável do segundo. O que significam as expressões “x é justo em j” e “y é justo em j”? Enuncie as
condições de folgas complementares para o par dual de pl’s. Prove que, para qualquer x viável no
primeiro pl e qualquer y viável no segundo, temos cx = yb se e somente se as folgas de x e y são
complementares.

Seção C.5
C.17 Mostre que um vetor de inviabilidade para o pl (2) poderia ter sido definido pelas condições
y 0 A = 0, y 0 ≤ 0 e y 0 b > 0.
C.18 ? Qual a definição apropriada de vetor de inviabilidade para o seguinte pl: encontrar um vetor x
que minimize cx sob as restrições Ax = b, 1x = 1 e x ≥ 0? (Aqui, o segundo “1” é o número 1
e o primeiro “1” representa um vetor cujos elementos são todos iguais a 1 e cujos índices são os
mesmos de x.)
C.19 Mostre vetores de inviabilidade para os exemplos C.7 a C.9.
C.20 Considere o problema de encontrar x ≥ 0 que maximize x1 + 2x2 + 3x3 sob as restrições abaixo.
Mostre que o pl é inviável e calcule um vetor de inviabilidade.

x1 + x2 + x3 = −10
x1 + 4x3 = −20

C.21 Suponha dado um vetor de inviabilidade para o pl (2). Mostre que o pl dual (3) é inviável ou
ilimitado.
C.22 Suponha dado um vetor de inviabilidade para o pl (3). Mostre que o pl dual (2) é inviável ou
ilimitado.
C.23 Deduza o lema de Farkas C.7 do teorema forte da dualidade C.2.
Apêndice D

Politopos

Um politopo é o conjunto de todas as combinações convexas de um conjunto finito de vetores.


Este apêndice faz um resumo da relação entre o conceito de politopo e o conceito de poliedro
do apêndice B.

D.1 Cascos convexos


Seja E um conjunto finito e S um conjunto finito de vetores indexados por E. Em outras
palavras, S um subconjunto finito do espaço RE . Uma combinação convexa dos elementos
de S é qualquer vetor da forma P
s∈S λs s ,
P
sendo λs números em R+ tais que s∈S λs = 1. Os números λs são os coeficientes da com-
binação convexa. O casco convexo (= convex hull) de S é o conjunto de todas as combinações
convexas dos elementos de S e será denotado por

cc(S).

E XEMPLO D.1: Todas as combinações convexas de 2 pontos no plano pertencem ao segmento de


reta que liga os dois pontos. (Como de hábito, um ponto no plano representa o vetor que vai da
origem do sistema de coordenadas ao ponto em questão.) As combinações convexas de 3 pontos
no plano pertencem ao triângulo que liga os três pontos. A figura abaixo mostra um conjunto S de
11 pontos no plano e o casco convexo cc(S). [CCPS fig.6.1]

Um politopo (= polytope) é o casco convexo de um conjunto finito de vetores. Em outras


palavras, um politopo é qualquer conjunto da forma cc(S), onde S é um subconjunto finito
de RE . (Em geral, muitos conjuntos S diferentes representam o mesmo politopo.)

171
172 D.2. HIPERPLANOS SEPARADORES FEOFILOFF

Um subconjunto C de RE é convexo se a combinação convexa de quaisquer dois de seus


elementos está em C. Todo politopo é um conjunto convexo. Todo poliedro também é um
conjunto convexo.
Para qualquer conjunto finito S com dois ou mais vetores, o conjunto cc(S) é muito maior
que S. Apesar disso, minimizar uma função linear sobre cc(S) produz o mesmo resultado que
minimizar sobre S:

Lema D.1 Para qualquer subconjunto finito S de RE e qualquer vetor c em RE , tem-se


max (cs : s ∈ S) = max (cx : x ∈ cc(S)).

P ROVA : É claro que max (cs : s ∈ S) ≤ max (cx : x ∈ cc(S)) uma vez que S ⊆ cc(S). Resta
mostrar a desigualdade contrária. Suponha, por exemplo, que S = {s, s0 } e ajuste a notação de
modo que cs ≤ cs0 . Todo elemento de cc(S) tem a forma λs + λ0 s0 , sendo λ e λ0 números reais
no intervalo fechado [0, 1] tais que λ + λ0 = 1. Portanto

c(λs + λ0 s0 ) = λcs + (1 − λ)cs0 = λ(cs − cs0 ) + cs0 ≤ cs0 .

Uma generalização desse argumento mostra que max (cx : x ∈ cc(S)) ≤ max (cs : s ∈ S) para
qualquer S.

D.2 Hiperplanos separadores


Para qualquer subconjunto finito S de RE , é fácil provar que um dado vetor v está em cc(S):
basta exibir os coeficientes de uma combinação convexa dos elementos de S que produz v.
A questão complementar é mais difícil: como provar que v não está em cc(S)? Podemos fazer
isso exibindo um hiperplano que separa v de cc(S).

Lema D.2 (da separação) Para qualquer subconjunto finito S de RE e qualquer vetor v em RE ,
se v ∈
/ cc(S) então existe um vetor h e um número l tais que h v > l e h x ≤ l para todo x
em cc(S).

P ROVA : Seja M uma matriz cujas linhas são os elementos de S. Em outras palavras, M é a
matriz indexada por S × E tal que M [s, E] = s para cada s em S. Toda combinação convexa
das linhas de M tem a forma gM , sendo g é um vetor indexado por S tal que

g≥0 e g1 = 1 .

(Aqui, o primeiro “1” representa


P o vetor constante indexado por S cujos elementos são todos
iguais a 1. Portanto, g1 = s∈S gs . Essa convenção evita o incômodo de definir um símbolo
especial para o vetor constante.)
Seja v um vetor em RE e suponha que v não pertence a cc(S). Então o programa linear

minimize g0
sob as restrições gM = v
(1)
g1 = 1
g≥0
FEOFILOFF POLITOPOS 173

é inviável. Este pl tem essencialmente a mesma forma que o pl (3) do apêndice C. Para tornar
isso mais evidente, vamos introduzir um pouco de notação adicional. Seja e0 algum índice que
não pertence a E; seja E 0 = E ∪ {e0 }; seja M 0 a matriz indexada por S × E 0 e definida pelas
propriedades M 0 [S, E] = M e M 0 [S, e0 ] = 1; e seja v 0 o vetor indexado por E 0 e definido pelas
propriedades v 0 [E] = v e v 0 [e0 ] = 1. O pl

minimize g0
sob as restrições gM 0 = v 0 (2)
g≥0

é equivalente ao pl (1) e portanto inviável. Assim, a versão apropriada do lema de Farkas C.7
no apêndice C garante que existe um vetor de inviabilidade para (2). (Veja o exercício C.18 no
apêndice C.) Trata-se de um vetor h0 tal que

M 0 h0 ≤ 0 e v 0 h0 > 0.

Se denotarmos por h o vetor h0 [E] e por l o número −h0 [e0 ], teremos sh − l ≤ 0 e vh − l > 0 para
cada linha s de M . Em outras palavras,

sh ≤ l e vh > l.

Isso vale não só para


P os elementosPde S como também para todo elemento x de cc(S). De fato,
x em tem a forma s∈S λs s, com s∈S λs = 1 e λs ≥ 0, e portanto
P  P P
xh = s∈S λs s h = s∈S λs sh ≤ s∈S λs l = l.

Resumindo: v h > l e x h ≤ l para todo x em cc(S).

A conclusão desse lema pode ser verbalizada assim: o hiperplano hs = l separa v do casco
convexo de S.

D.3 Politopos versus poliedros limitados


A intuição sugere que todo politopo tem a forma {x : Ax ≤ b} para alguma matriz A e algum
vetor b. A intuição também sugere que todo poliedro limitado tem a forma cc(S) para algum
conjunto finito S de vetores. O seguinte par de teoremas de Minkowski e Weyl confirma essa
intuição.

Teorema D.3 Todo poliedro limitado é um politopo.

E SBOÇO DA PROVA : Seja P o poliedro definido por uma matriz A e um vetor b, isto é, P = {x :
Ax ≤ b}. Suponha que P é limitado. Se P é vazio então P = cc(∅). Suponha agora que P não
é vazio e seja S o conjunto dos vértices de P . De acordo com o lema B.4 no apêndice B, S não é
vazio. De acordo com o corolário B.3, S é finito.
Para todo x em cc(S), temos Ax ≤ b. Reciprocamente, de acordo com o lema da separação D.2,
todo vetor x que satisfaz as restrições Ax ≤ b está em cc(S). Portanto P = cc(S).
174 D.4. EXERCÍCIOS FEOFILOFF

Teorema D.4 Todo politopo é um poliedro limitado.

E SBOÇO DA PROVA : Seja S um subconjunto finito de RE e considere o politopo T = cc(S).


Com o auxílio do lema da separação D.2, é possível mostrar que existe uma matriz A e um
vetor b tais que T = {x : Ax ≤ b}.

Poliedros limitados e politopos correspondem a duas maneiras diferentes de descrever um


conjunto de vetores. A primeira permite decidir facilmente se um dado vetor pertence ao con-
junto (mas é inadequada para exibir um vetor do conjunto), enquanto a segunda permite exibir
facilmente um vetor do conjunto (mas é inadequada para decidir se um dado vetor pertence
ao conjunto). Essas duas maneiras de descrever um conjunto de vetores estão intimamente
relacionadas com o fenômeno da dualidade em programação linear (veja a seção C.2) e servem
de fundamento para os métodos geométricos em combinatória.

E XEMPLO D.2: O conjunto de todos os vetores (x1 , x2 ) que satisfazem o sistema de desigualda-
des abaixo é um poliedro limitado. A figura mostra o poliedro e a combinação convexa dos seus
vértices. [CCPS fig.6.2]

1x1 + 3x2 ≤ 18
1x1 + 0x2 ≤ 6
1x1 − 2x2 ≤ 2
−1x1 − 1x2 ≤ −5
−2x1 + 1x2 ≤ −1

D.4 Exercícios
Seção D.1
D.1 ? Vértices versus combinações convexas. Seja Q um subconjunto convexo de RE . Mostre que um vetor
v é vértice de Q se e somente se v não é combinação convexa de dois vetores em Q r {v}.
D.2 ? Vértices de cascos convexos. Seja S um subconjunto finito de RE . Mostre que todo vértice de cc(S)
é um elemento de S. A recíproca é verdadeira?
D.3 ? Mostre que todo politopo é um conjunto convexo.
D.4 ? Mostre que todo poliedro é um conjunto convexo.
D.5 Complete a prova do lema D.1.
D.6 Mostre que o lema D.1 vale com “min” no lugar de “max”.

Seção D.3
D.7 Prove os teoremas D.3 e D.4.
Apêndice E

Grafos não-dirigidos

Muitos problemas de otimização combinatória são formuladas sobre grafos. Este apêndice faz
uma rápida revisão dos conceitos e da terminologia da teoria dos grafos não-dirigidos.
Um grafo não-dirigido é um tipo especial de grafo dirigido. Assim, poderíamos nos contentar
com o resumo sobre grafos dirigidos que faremos no apêndice F. Mas é mais prático tratar dos
grafos não-dirigidos em separado.

E.1 Grafos e suas arestas


Um grafo não-dirigido (= undirected graph) é um par (V, E) de conjuntos em que V é um
conjunto finito não vazio e E é um conjunto de pares não-ordenados de elementos de V . Os
elementos de V são chamados nós e os elementos de E são chamados arestas (= edges).1 Se E é
o conjunto de todos os pares não-ordenados de elementos de V , dizemos que o grafo (V, E) é
completo.
Uma aresta {v, w} pode ser denotada simplesmente por vw ou por wv. Os nós v e w são as
pontas da aresta. Dizemos que uma tal aresta incide em v e em w. Dizemos também que a
aresta vw liga v e w. (É claro que não há arestas “paralelas”, ou seja, duas arestas distintas que
ligam o mesmo par de nós.) Dizemos também que os nós v e w são vizinhos. O grau (= degree)
de um nó v é o número de arestas que têm ponta v.
Se dermos um nome — como G, por exemplo — a um grafo, o conjunto de nós do grafo será
denotado por V (G) e o conjunto de arestas por E(G).
O número de nós de um grafo é denotado por n e o número de arestas por m. Portanto, se G é
o grafo em discussão então n := |V (G)| e m := |E(G)|. É claro que m ≤ 21 n(n − 1) < 12 n2 .
Um subgrafo de um grafo G é qualquer grafo G0 tal que V (G0 ) ⊆ V (G) e E(G0 ) ⊆ E(G). Se
V (G0 ) = V (G), dizemos que G0 é um subgrafo gerador (= spanning subgraph) de G. Dado um
subconjunto V 0 de V (G), se E 0 é o conjunto de todas as arestas de G que têm ambas as pontas
em V 0 , dizemos que o subgrafo (V 0 , E 0 ) é induzido por V 0 . Esse grafo é denotado por G[V 0 ].
Dado um subconjunto E 0 de E(G), se V 0 é o conjunto de todas as pontas de arestas de E 0 ,
dizemos que o subgrafo (V 0 , E 0 ) é induzido por E 0 .
1
As letras “V ” e “E” são as iniciais de vertex e edge, respectivamente. (Quem sabe deveríamos escre-
ver “N ” e “A” em lugar de “V ” e “E”.) A palavra vértice será aplicada apenas a vértices de poliedros.

175
176 E.2. CAMINHOS E CICLOS FEOFILOFF

Para qualquer nó v de G, denotamos por G − v o subgrafo induzido por V (G) r {v}. Para
qualquer aresta e, denotamos por G − e o subgrafo que tem conjunto de nós V (G) e conjunto
de arestas E(G) r {e}.
Para qualquer par (v, w) de nós, denotamos por G + vw o grafo que tem conjunto de nós V (G)
e conjunto de arestas E(G) ∪ {vw}.
Um grafo G é bipartido se existe uma bipartição,2 digamos {P, Q}, de V (G) tal que toda aresta
tem uma ponta em P e outra em Q. Se todo par pq com p ∈ P e q ∈ Q é uma aresta, dizemos
que o grafo é bipartido completo.

E.2 Caminhos e ciclos


Um caminho (= path) num grafo não-dirigido é qualquer sequência alternante (v0 , e1 , v1 , e2 , . . . ,
ep , vp ) de nós e arestas tal que, para cada k, o nó vk−1 é uma das pontas da aresta ek e vk é a
outra ponta. O nó v0 é a origem do caminho e vp é o término. Dizemos que o caminho vai de v0
a vp . O comprimento do caminho é p, ou seja, o número de termos do caminho que são arestas.
O conjunto de nós de um caminho P é denotado por V (P ) e o conjunto de arestas por E(P ).
Um caminho P 0 é subcaminho de um caminho P se pode ser obtido mediante a remoção
de termos de P . (Por exemplo, (u, a, v, b, w, e, z) é um subcaminho de (u, a, v, b, w, c, x, d, v, b,
w, e, z).) Um caminho P 0 é segmento de um caminho P se pode ser obtido mediante a remoção
de termos do início e/ou do fim de P . (Por exemplo, (x, d, v, b, w, e, z) é um segmento de
(u, a, v, b, w, c, x, d, v, b, w, e, z).)
Um caminho (v0 , e1 , v1 , e2 , . . . , ep , vp ) é quase-simples (= edge-simple) se não tem arestas repeti-
das, isto é, se as arestas e1 , e2 , . . . , ep são diferentes entre si. Se P é um caminho quase-simples
então o comprimento de P é igual a |E(P )|.
Um caminho é simples se não tem nós repetidos (e portanto também não tem arestas repetidas).
Se P é um caminho com origem r e término s então algum subcaminho de P é um caminho
simples de r a s.
Dados caminhos (v0 , e1 , . . . , vp ) e (w0 , f1 , . . . , wq ), se o término do primeiro é igual à origem
do segundo, então os dois caminhos podem ser concatenados. O resultado da concatenação
é o caminho (v0 , e1 , . . . , vp , f1 , . . . , wq ). A concatenação de dois caminhos P e Q é denotada
por P · Q.

Conexão. Um grafo não-dirigido é conexo se, para cada par (r, s) de seus nós, existe um
caminho de r a s (e portanto também um caminho de s a r). A distância de r a s é o mínimo
dos comprimentos de todos os caminhos de r a s.
Uma componente conexa de um grafo não-dirigido G é um subgrafo não-dirigido conexo
maximal3 de G.
2
Uma bipartição de um conjunto S é um par {P, Q} de subconjuntos de S tal que P ∪ Q = S e
P ∩ Q = ∅. A expressão “P é uma das partições” está errada; diga “P é um dos blocos da partição”.
3
Dada uma coleção P de conjuntos, um elemento X de P é maximal se nenhum superconjunto
próprio de X pertence a P. Em outras palavras, X é maximal se não existe Y em P tal que Y ⊃ X.
A propósito, um elemento X de P é máximo se não existe Y em P tal que |Y | > |X|.
FEOFILOFF GRAFOS NÃO-DIRIGIDOS 177

Ciclos. Um ciclo (= cycle) é um caminho quase-simples (v0 , e1 , v1 , . . . , ep , vp ) em que vp = v0


e p ≥ 3. Um ciclo é simples se não tem nós repetidos exceto o último (que coincide com o
primeiro). Ciclos simples também são chamados circuitos (= circuits).

Lema E.1 (folclore) Se todos os nós de um grafo não-dirigido têm grau maior que 1 então o
grafo tem um ciclo.

Lema E.2 (folclore) Um grafo não-dirigido é bipartido se e somente se não tem ciclos de com-
primento ímpar.

E.3 Florestas e árvores


Uma floresta (= forest) é um grafo não-dirigido sem ciclos. Uma árvore (= tree) é uma floresta
conexa.
Uma folha de uma floresta é qualquer nó de grau 1.
Para quaisquer dois nós r e s de uma árvore, existe um e um só caminho simples de r a s. Para
toda aresta e de uma árvore T , o grafo não-dirigido T − e é uma floresta com exatamente duas
componentes conexas.

Lema E.3 Toda floresta com uma ou mais arestas tem pelo menos duas folhas.

E.4 Cortes
Dado um grafo não-dirigido (V, E) e um subconjunto R de V , denotamos por R o conjunto R
V r R. O conjunto de todas as arestas que têm uma ponta em R e outra em R é denotado por ∂

∂(R) .

É claro que ∂(R) = ∂(R). É claro também que ∂(∅) = ∂(V ) = ∅.


Se v é um nó, usamos a abreviatura ∂(v) para ∂({v}). Um nó v é isolado se ∂(v) = ∅. O número
|∂(v)| é o grau de v. É claro que |∂(v)| ≤ n − 1. É claro também que
P
v∈V (G) |∂(v)| = m/2.

Um corte (= cut) em um grafo não-dirigido (V, E) é o conjunto de todos os arestas que têm uma
ponta em um conjunto de nós e a outra ponta fora do conjunto. Em outras palavras, um corte
é qualquer conjunto da forma ∂(R), com R ⊆ V . O conjunto R é uma margem do corte.

E.5 Álgebra linear


A matriz de adjacências de um grafo não-dirigido tem linhas e colunas indexadas pelos nós.
A componente da matriz na posição (v, w) vale 1 se vw é uma aresta e vale 0 em caso contrário.
É claro que a matriz é simétrica.
178 E.6. EXERCÍCIOS FEOFILOFF

A matriz de incidências do grafo G tem linhas indexadas por V (G) e colunas indexadas
por E(G). A coluna que corresponde a um aresta vw tem um 1 nas posições v e w e tem 0
nas demais posições. Portanto, a linha v da matriz tem um 1 nas colunas correspondentes às
arestas que têm ponta v e tem 0 nas demais colunas.

E XEMPLO E.1: O grafo não-dirigido que tem nós u v w z e arestas uw vw zu uz zw tem a seguinte
matriz de incidências (com “−” representando “0”):

uw vw zu uz zw
u 1 − 1 1 −
v − 1 − − −
w 1 1 − − 1
z − − 1 1 1

Lema E.4 (circuitos e dependência linear) Seja A a matriz de incidências de um grafo não-
dirigido (V, E). Se o conjunto das colunas de A é linearmente dependente então G tem um
circuito.

Lema E.5 (circuitos e dependência linear em grafos bipartidos) Seja A a matriz de incidên-
cias de um grafo não-dirigido bipartido (V, E). Se G tem um circuito então o conjunto das
colunas de A é linearmente dependente.

Esse lema pode ser informalmente resumido assim: num grafo bipartido, um conjunto de
arestas linearmente independentes é o mesmo que uma floresta. Em grafos não-dirigidos
arbitrários, um lema análogo vale se as combinações lineares forem feitas em GF (2), ou seja, se
os coeficientes forem binários e a aritmética for binária (0 + 0 = 0, 0 + 1 = 1 + 0 = 1, 1 + 1 = 1,
0 · 0 = 0 · 1 = 0, 1 · 0 = 0 e 1 · 1 = 1).

E.6 Exercícios
Seção E.3
E.1 ? Prove o lema E.1.
E.2 Prove o lema E.2.
E.3 Prove o lema E.3.

Seção E.5
E.4 Prove o lema E.4.
E.5 Prove o lema E.5.
E.6 Mostre que o enunciado do lema E.5 é falso se retirarmos o adjetivo bipartido.
E.7 ? Florestas e independência linear em grafos bipartidos. Seja A a matriz de incidências de um grafo não-
dirigido bipartido (V, E) e F um subconjunto de E. Mostre que o conjunto das colunas da matriz
A[V, F ] é linearmente independente se e somente se o grafo (V, F ) é uma floresta.
Apêndice F

Grafos dirigidos

Muitos problemas de otimização combinatória são formuladas sobre grafos. Este apêndice faz
uma rápida revisão dos conceitos e da terminologia da teoria dos grafos dirigidos.

F.1 Grafos dirigidos e seus arcos


Um grafo dirigido (= directed graph) é um par (V, E) de conjuntos em que V é um conjunto
finito não vazio e E um conjunto de pares ordenados de elementos de V . (Alguns livros dizem
digrafo (= digraph) no lugar de grafo dirigido.) Os elementos de V são chamados nós e os
elementos de E são chamados arcos (= arcs).1 Se E é um conjunto de todos os pares ordenados
de elementos de V , dizemos que o grafo (V, E) é completo.
Podemos dar um nome — como D, por exemplo — a um grafo dirigido. Nesse caso, o conjunto
de nós do grafo é denotado por V (D) e o conjunto de arcos por E(D).
Um arco (v, w) pode ser denotado simplesmente por vw. O nó v é a ponta inicial (= tail) e o
nó w é a ponta final (= head) do arco. Dizemos que um tal arco sai de v e entra em w. A ponta
inicial de um arco também pode ser chamada ponta negativa e a ponta final pode ser chamada
ponta positiva.2 Se vw é um arco, dizemos que w é vizinho direto de v e v é vizinho inverso
de w.
As pontas inicial e final de cada arco são distintas, e portanto grafos dirigidos não têm “laços”
(= loops). Além disso, grafos dirigidos não têm “arcos paralelos”, pois dois arcos diferentes não
podem ter a mesma ponta inicial e a mesma ponta final. Dois arcos vw e v 0 w0 são antiparalelos
se v 0 = w e w0 = v.
O grau de entrada (= indegree) de um nó v é o número de arcos que têm ponta final v. O grau
de saída (= outdegree) de v é o número de arcos que têm ponta inicial v. Uma fonte (= source) é
qualquer nó que tenha grau de entrada nulo. Um sorvedouro (= sink) é qualquer nó que tenha
grau de saída nulo.
O número de nós de um grafo dirigido é denotado por n e o número de arcos por m. Portanto, n
se D é o grafo em discussão então n := |V (D)| e m := |E(D)|. É claro que m ≤ n(n − 1) < n2 . m
1
As letras “V ” e “E” são as iniciais de vertex e edge, respectivamente. (Quem sabe deveríamos escre-
ver “N ” e “A” em lugar de “V ” e “E”.) A palavra vértice será aplicada apenas a vértices de poliedros.
2
Outros livros adotam a convenção de circuitos elétricos e dizem que a ponta inicial é “positiva” e a
ponta final é “negativa”.

179
180 F.2. CAMINHOS E CICLOS FEOFILOFF

Um subgrafo de um grafo dirigido D é qualquer grafo dirigido D0 tal que V (D0 ) ⊆ V (D) e
E(D0 ) ⊆ E(D). Se V (D0 ) = V (D), dizemos que D0 é um subgrafo gerador (= spanning). Dado
um subconjunto V 0 de V (D), se E 0 é o conjunto de todos os arcos de D que têm ambas as pontas
em V 0 , dizemos que o subgrafo (V 0 , E 0 ) é induzido por V 0 . Esse grafo é denotado por G[V 0 ].
Dado um subconjunto E 0 de E(D), se V 0 é o conjunto de todos os nós de D que são ponta de
arco de E 0 , dizemos que subgrafo (V 0 , E 0 ) é induzido por E 0 .
Para qualquer nó v de D, denotamos por D − v o subgrafo induzido por V (D) r {v}. Para
qualquer arco e, denotamos por D − e o subgrafo que tem conjunto de nós V (D) e conjunto de
arcos E(D) r {e}.
Para qualquer par (v, w) de nós, denotamos por D + vw o grafo dirigido que tem conjunto de
nós V (D) e conjunto de arcos E(D) ∪ {vw}.
Um grafo dirigido D é bipartido se existe uma bipartição, digamos {P, Q}, de V (D) tal que
todo arco tem ponta inicial em P e ponta final em Q.
O grafo não-dirigido subjacente a (= underlying) um grafo dirigido D é o grafo não-dirigido G
tal que V (G) = V (D) e vw ∈ E(G) se e somente se vw ∈ E(D) ou wv ∈ E(D). Em termos
informais, G é o grafo não-dirigido que se obtém quando ignoramos as orientações de todos os
arcos de D.
Uma orientação (= orientation) de um grafo não-dirigido G é qualquer grafo dirigido D que
satisfaz as seguintes condições: V (D) = V (G) e, para cada aresta vw de G, um e apenas um
dos pares ordenado vw e wv é arco de D. Em termos informais, D é o grafo dirigido que se
obtém quando adotamos uma das duas possíveis orientações de cada aresta de G. É claro que
orientações de grafos não-dirigidos não têm arcos antiparalelos.

F.2 Caminhos e ciclos


Um caminho (= path) num grafo dirigido é qualquer sequência alternante (v0 , e1 , v1 , e2 , . . . ,
ep , vp ) de nós e arcos tal que, para cada k, o arco ek tem ponta inicial vk−1 e ponta final vk ou
tem ponta final vk−1 e ponta inicial vk . Se ek = vk−1 vk , o arco ek é direto; se ek = vk vk−1 ,
o arco ek é inverso. Em termos informais, arcos diretos “apontam da esquerda para a direita”,
enquanto arcos inversos “apontam da direita para a esquerda”.
O nó v0 é a origem do caminho e o nó vp é o término. Dizemos que o caminho vai de v0
a vp . O comprimento do caminho é p, ou seja, o número de termos do caminho que são arcos.
O conjunto de nós de um caminho P é denotado por V (P ) e o conjunto de arcos por E(P ).
Um caminho P 0 é subcaminho de um caminho P se pode ser obtido mediante a remoção
de termos de P . (Por exemplo, (u, a, v, b, w, e, z) é um subcaminho de (u, a, v, b, w, c, x, d, v, b,
w, e, z).) Um caminho P 0 é segmento de um caminho P se pode ser obtido mediante a remoção
de termos do início e/ou do fim de P . (Por exemplo, (x, d, v, b, w, e, z) é um segmento de
(u, a, v, b, w, c, x, d, v, b, w, e, z).)
Um caminho (v0 , e1 , v1 , e2 , . . . , ep , vp ) é quase-simples (= edge-simple) se não tem arcos repe-
tidos, isto é, se os arcos e1 , e2 , . . . , ep são diferentes entre si. (Nada impede, entretanto, que
o caminho tenha um arco antiparalelo a outro.) Se P é um caminho quase-simples então o
comprimento de P é igual a |E(P )|.
Um caminho é simples se não tem nós repetidos (e portanto também não tem arcos repetidos).
Se P é um caminho com origem r e término s então algum subcaminho de P é um caminho
FEOFILOFF GRAFOS DIRIGIDOS 181

simples de r a s.
Dados caminhos (v0 , e1 , . . . , vp ) e (w0 , f1 , . . . , wq ), se o término do primeiro é igual à origem
do segundo, então os dois caminhos podem ser concatenados. O resultado da concatenação
é o caminho (v0 , e1 , . . . , vp , f1 , . . . , wq ). A concatenação de dois caminhos P e Q é denotada
por P · Q.

Caminhos dirigidos. Um caminho é dirigido (= dipath) se todos os seus arcos são diretos
(ou seja, se todos os seus arcos “apontam da esquerda para a direita”).
Dizemos que um nó v de um grafo dirigido está ao alcance de um nó r se existe um caminho
dirigido de r a v.

Conexão. Um grafo dirigido é conexo se o grafo não-dirigido subjacente for conexo. Em


outras palavras, um grafo dirigido é conexo se, para cada par (r, s) de seus nós, existe um
caminho (não necessariamente dirigido) de r a s (e portanto também um caminho de s a r).
Uma componente conexa de um grafo dirigido D é um subgrafo conexo maximal de D.
Um grafo dirigido é fortemente conexo se, para cada par (r, s) de seus nós, existe um caminho
dirigido de r a s e um caminho dirigido de s a r.

Ciclos. Um ciclo (= cycle) é um caminho quase-simples (v0 , e1 , v1 , . . . , ep , vp ) em que vp = v0


e p ≥ 2. Um ciclo é simples se não tem nós repetidos exceto o último (que coincide com
o primeiro). Um ciclo é dirigido se todos os seus arcos são diretos (ou seja, apontam “da
esquerda para a direita”).

Lema F.1 (folclore) Se todos os nós de um grafo dirigido têm grau de entrada e grau de saída
não nulos então o grafo tem um ciclo dirigido simples.

F.3 DAGs
Um grafo dirigido é acíclico se não tem ciclos dirigidos. Grafos dirigidos acíclicos também são
conhecidos pela abreviatura DAG de directed acyclic graph. Todos os caminhos dirigidos de um
DAG são simples.

Lema F.2 (folclore) Um grafo dirigido é acíclico se e somente se tem uma permutação topoló-
gica.

Uma permutação v1 , v2 , . . . , vn do conjunto dos nós de um grafo dirigido é topológica se i < j


para cada arco vi vj , isto é, se todos os arcos apontam “da esquerda para a direita” na permuta-
ção.

Lema F.3 (folclore) Em qualquer DAG, todo arco pertence a um caminho dirigido que começa
em uma fonte e termina em um sorvedouro.
182 F.4. FLORESTAS E ÁRVORES FEOFILOFF

F.4 Florestas e árvores


Uma floresta orientada (= oriented forest) é um grafo dirigido sem ciclos (em particular, sem
ciclos dirigidos). Em outras palavras, uma floresta orientada é uma orientação de uma floresta
(veja a seção E.2). Toda floresta orientada é um DAG. O grafo não-dirigido subjacente a uma
floresta orientada é uma floresta.
Uma árvore orientada (= oriented tree) é uma floresta orientada conexa. Em outras palavras,
uma árvore orientada é uma orientação de uma árvore. Para quaisquer dois nós r e s de uma
árvore orientada, existe um e um só caminho simples de r a s. Para todo arco e de uma árvore
orientada T , o grafo dirigido T −e é uma floresta orientada com exatamente duas componentes
conexas.
Uma floresta radicada (= rooted forest) é uma floresta orientada cada um de cujos nós tem grau
de entrada 0 ou 1. Os nós com grau de entrada 0 são as raízes da floresta radicada. Toda floresta
radicada tem pelo menos uma raiz. Todo nó v de uma floresta radicada é término de um único
caminho dirigido simples que começa numa raiz.
Uma folha de uma floresta radicada é um nó que tem grau de entrada 1 e grau de saída 0.
Uma árvore radicada (= rooted tree) é uma floresta radicada que tem uma só raiz. Árvores
radicadas também são conhecidas como arborescências e como árvores divergentes.

E XEMPLO F.1: A primeira figura representa uma árvore radicada. A segunda representa uma
árvore orientada.

E XEMPLO F.2: Seja T uma árvore radicada. Para cada arco e de T , seja Xe o conjunto de nós da
componente conexa de T − e que contém a ponta final de e. (Em outras palavras, Xe é o conjunto
de todos os nós de T que estão ao alcance da ponta final de e.) A coleção {Xe : e ∈ E(T )} é laminar
(veja a seção A.6 do apêndice A).

F.5 Cortes
R Dado um grafo dirigido (V, E) e um subconjunto R de V , denotamos por R o conjunto V r R.
Dizemos que um arco vw entra em R se v ∈ R e w ∈ R. Dizemos que vw sai de R se v ∈ R e
∂ − w ∈ R. O conjunto de todos os arcos que saem de R é denotado por

∂ − (R) .

∂ + Analogamente, ∂ + (R) é o conjunto de todos os arcos que entram em R.3 É claro que ∂ − (R) =
∂ + (R). É claro também que ∂ − (∅) = ∂ − (V ) = ∂ + (∅) = ∂ + (V ) = ∅.
3
Para justificar os superscritos “−” e “+”, você pode imaginar que os nós são contas bancárias e os
arcos representam movimentação de dinheiro. Assim, tudo que sai de uma conta é subtraído do saldo e
tudo que entra é somado.
FEOFILOFF GRAFOS DIRIGIDOS 183

Se v é um nó, usamos as abreviaturas ∂ − (v) e ∂ + (v) para ∂ − ({v}) e ∂ + ({v}) respectivamente.


O número |∂ − (v)| é o grau de saída de v e o número |∂ + (v)| é o grau de entrada de v. É claro
que |∂ − (v)| ≤ n − 1 e |∂ + (v)| ≤ n − 1. É claro também que
P −
P
v∈V |∂ (v)| = v∈V |∂ (v)| = m.
+

Um corte (= cut) em um grafo dirigido (V, E) é o conjunto de todos os arcos que saem de
algum conjunto de nós. Em outras palavras, um corte é qualquer conjunto da forma ∂ − (R),
com R ⊆ V . (Pode parecer que um corte deveria ser definido como ∂ − (R) ∪ ∂ + (R), mas a
definição que adotamos é mais útil.) O conjunto R é a margem negativa do corte ∂ − (R) e R é
a margem positiva.
Um corte ∂ − (R) é dirigido (= directed) se ∂ + (R) = ∅.

F.6 Redes
Uma rede (= network) é um grafo dirigido juntamente com uma ou mais funções que atribuem
números aos arcos e/ou aos nós do grafo. O conceito é propositalmente vago. Às vezes, a
especificação de uma rede também inclui um ou dois nós “especiais” do grafo.
Por exemplo, se D é um grafo dirigido e c é uma função de E(D) em R, podemos dizer que
(D, c) é uma rede. Da mesma forma, se b é uma função de V (D) em R, podemos dizer que
(D, b, c) é uma rede.

F.7 Álgebra linear


A matriz de adjacências de um grafo dirigido tem linhas e colunas indexadas pelos nós. A com-
ponente da matriz na posição (v, w) vale 1 se vw é um arco e vale 0 em caso contrário.
A matriz de incidências tem linhas indexadas pelos nós e colunas indexadas pelos arcos. A co-
luna que corresponde a um arco vw tem um −1 na linha v e um +1 na linha w, sendo o resto
da coluna igual a 0.4 Portanto, a linha v da matriz tem um −1 na coluna correspondente a cada
arco que sai de v, um +1 na coluna correspondente a cada arco que entra em v, e 0 nas demais
colunas.

E XEMPLO F.3: Seja D o grafo dirigido com nós u v w z e arcos uw vw zu uz zw . A matriz


de adjacências de D está representada à esquerda (com “−” representando “0”) e a matriz de
incidências de D está representada no meio:

u v w z uw vw zu uz zw
u − − 1 1 u −1 0 +1 −1 0
v − − 1 − v 0 −1 0 0 0
w − − − − w +1 +1 0 0 +1
z 1 − 1 − z 0 0 −1 +1 −1

E XEMPLO F.4: Veja à esquerda a matriz de adjacências de uma árvore orientada com nós a b c d e f .

4
Alguns livos adotam a convenção contrária: +1 na linha v e −1 na linha w.
184 F.8. EXERCÍCIOS FEOFILOFF

À direita, uma árvore radicada com o mesmo conjunto de nós e raiz c. (Faça figuras.)

a b c d e f a b c d e f
a − − − − − − a − − − − − −
b − − 1 − − − b − − − − − −
c 1 − − 1 − − c 1 1 − 1 − −
d − − − − 1 − d − − − − 1 1
e − − − − − − e − − − − − −
f − − − 1 − − f − − − − − −

Lema F.4 (ciclos e dependência linear) Seja A a matriz de incidências de um grafo dirigido D.
O conjunto das colunas de A é linearmente dependente se e somente se D tem um ciclo (não
necessariamente dirigido).

P ROVA DO “ SOMENTE SE ”: Suponha que o conjunto das colunas de A é l.d.. Seja x um vetor
real não nulo tal que Ax = 0. Seja F o conjunto {e ∈ E(D) : xe 6= 0} e considere o grafo
induzido D[F ]. Seja G o grafo não-dirigido subjacente a D[F ]. Como Ax = 0, nenhuma linha
da matriz A[∗, F ] tem exatamente um elemento não nulo. Portanto, nenhum nó de G tem
grau 1. De acordo com o lema E.1, G tem um ciclo. Logo, D[F ] tem um ciclo e portanto D tem
um ciclo.
P ROVA DO “ SE ”: Suponha que D tem um ciclo, digamos (v0 , e1 , v1 , . . . , ep , vp ). Defina o vetor x
da seguinte maneira: para cada índice i, se ei é um arco direto do ciclo então xei = +1, se ei é
um arco inverso então xei = −1, e se e não pertence ao ciclo então xe = 0. Observe que Ax = 0.
Isso mostra que o conjunto das colunas de A é l.d..

E XEMPLO F.5: A figura mostra a matriz de incidências de um grafo dirigido que consiste em um
ciclo simples e nada mais.
e1 e2 e3 e4 e5
v0 −1 0 0 0 −1
v1 +1 −1 0 0 0
v2 0 +1 +1 0 0
v3 0 0 −1 +1 0
v4 0 0 0 −1 +1

Corolário F.5 (florestas e independência linear) Seja A a matriz de incidências de um grafo


dirigido D. O conjunto das colunas de A é linearmente independente se e somente se D é uma
floresta orientada (não necessariamente radicada).

F.8 Exercícios
F.1 Prove o lema F.1.
F.2 Mostre que todo grafo dirigido sem ciclos de comprimento ímpar é uma orientação de um grafo
não-dirigido bipartido. Mostre que nenhuma orientação de um grafo não-dirigido bipartido tem
ciclos de comprimento ímpar.
F.3 Prove o lema F.2.
F.4 Prove o lema F.3.
FEOFILOFF GRAFOS DIRIGIDOS 185

F.5 Árvores radicadas e coleções laminares. No exemplo F.2, mostre que a coleção {Xe : e ∈ E(T )} é
laminar.
F.6 Seja L uma coleção laminar de subconjuntos de um conjunto V . Mostre que L pode ser representada
por uma floresta radicada. (Dica: Cada elemento X de L é um nó da floresta e, para cada elemento
maximal X 0 de {L ∈ L : L ⊆ X}, a floresta tem um arco (X, X 0 ).)
F.7 Mostre que toda floresta orientada é uma orientação de um grafo não-dirigido bipartido.
P +
F.8 Seja
P v−um nó de um grafo dirigido. Mostre que (|∂ (v)| : v ∈ V ) = m. Mostre também que
(|∂ (v)| : v ∈ V ) = m.
F.9 ? Seja ∂ − (R) um corte dirigido em um grafo dirigido D. Mostre que não existe caminho dirigido
em D que começa em R e termina em R.
F.10 ? Seja A a matriz de incidências de um grafo dirigido D com k componentes conexas. Prove que o
posto de A (veja a seção A.5 do apêndice A) é igual |V (D)| − k.
F.11 Prove o lema F.4.
F.12 ? Vértices de poliedros versus ciclos. Seja A a matriz de incidências de um grafo dirigido e b um vetor
real indexado por V . Considere o poliedro (veja o apêndice B) {x : Ax = b e x ≥ 0}. Seja x um vetor
do poliedro e suponha que o grafo tem um ciclo (não necessariamente dirigido). cujos arcos estão
no suporte (veja a seção A.2) de x. Prove que x não é vértice do poliedro.
186 F.8. EXERCÍCIOS FEOFILOFF
Apêndice G

Problemas, algoritmos, tempo

Este apêndice faz uma rápida revisão dos conceitos de problema, instância, algoritmo, e con-
sumo de tempo. Veja mais informações no sítio www.ime.usp.br/~pf/analise_de_algoritmos/.

G.1 Problemas e instâncias


Todo problema computacional tem parâmetros. Quando especificamos os valores desses parâ-
metros, temos uma instância, ou exemplo, do problema.
Um algoritmo1 para um problema deve receber os valores dos parâmetros e devolver uma so-
lução da correspondente instância ou informar que a instância não tem solução. (Essa exigência
sobre o comportamento do algoritmo é deveras pesada, pois obriga o algoritmo a tratar não só
das instâncias que aparecem em aplicações práticas como também aquelas que nem parecem
“razoáveis”.)
Considere, por exemplo, o seguinte problema: Dados números inteiros a, b e c, encontrar
um número inteiro x tal que ax2 + bx + c = 0. Os parâmetros desse problema são a, b e c.
A tarefa de encontrar um número inteiro x tal que 10x2 + 20x + 30 = 0 é uma instância do
problema. Qualquer algoritmo para o problema deve receber os valores de a, b e c e devolver
uma solução x ou informar que a correspondente instância não tem solução.

G.2 Consumo de tempo de algoritmos


Para estimar o consumo de tempo de um algoritmo, precisamos adotar um modelo de compu-
tação. Adotaremos um modelo em que o consumo de tempo de cada operação aritmética entre
dois números consome apenas O(1) unidades de tempo, ou seja, não depende do tamanho dos
números.2
Suponha que um algoritmo A recebe um grafo G e um vetor c que atribui um número real
1
Nosso conceito de algoritmo é bem mais amplo que aquele difundido pela imprensa. Lá a ideia
de algoritmo está restrita aos “algoritmos de recomendação” das mídias sociais, que são baseados em
aprendizado de máquina e redes neurais.
2
Para problemas que precisam lidar com números muito grandes é mais apropriado supor que a
operação a + b, por exemplo, consome O(log a + log b) unidades de tempo.

187
188 G.3. COMPARAÇÃO ASSINTÓTICA DE FUNÇÕES FEOFILOFF

a cada elemento de E(G). A delimitação superior do consumo de tempo de A depende, em


geral, não só das cardinalidades n e m de V (G) e E(G) como também do “tamanho” de c, que
podemos representar pelo número ω := max (|ce | : e ∈ E(G)).
Dizemos que A é pseudopolinomial se consome O(np mq ω) unidades de tempo para algum p
em Z+ e algum q em Z+ .
Dizemos que A é polinomial se consome O(np mq log ω) unidades de tempo. (Note que log ω
é, essencialmente, o número de dígitos decimais de ω.)
Dizemos que A é fortemente polinomial se consome O(np mq ) unidades de tempo para algum
p em Z+ e algum q em Z+ . O consumo de tempo não depende de c nesse caso.

G.3 Comparação assintótica de funções


Suponha que T e f são funções reais de uma variável inteira n. Dizemos que T é O(f ) se existe
uma constante k e um número n0 tais que 0 ≤ T (n) ≤ k f (n) para todo n ≥ n0 . Assim, a
expressão “T é O(f )” tem o sabor de “T ≤ f ”.
Dizemos que T é Ω(f ) se existe uma constante k e um número n0 tais que 0 ≤ k f (n) ≤ T (n)
para todo n ≥ n0 . Assim, a expressão “T é Ω(f )” tem o sabor de “T ≥ f ”.
Dizemos que T é Θ(f ) se T é O(f ) e Ω(f ). Portanto, a expressão “T é Θ(f )” tem o sabor de
“T = f ”.

G.4 Exercícios
G.1 Escreva um algoritmo que resolva o seguinte problema: dados números inteiros a, b e c, encontrar
um número inteiro x tal que ax2 + bx + c = 0.
G.2 Escreva um algoritmo que resolva o seguinte problema: dado um grafo não-dirigido G, encontrar
uma bipartição de G (veja o apêndice E).
Bibliografia

[AMO93] R.K. Ahuja, T.L. Magnanti, and J.B. Orlin. Network Flows: Theory, Algorithms and
Applications. Prentice Hall, 1993.

[Bel] Richard E. Bellman. Wikipedia: https://en.wikipedia.org/wiki/Richard_E.


_Bellman.

[Ber] Claude Berge. Wikipedia: https://en.wikipedia.org/wiki/Claude_Berge.

[Bir] Garrett Birkhoff. Wikipedia: https://en.wikipedia.org/wiki/Garrett_Birkhoff.

[BM08] J.A. Bondy and U.S.R. Murty. Graph Theory. Graduate Texts in Mathematics 244.
Springer, 2008.

[CCPS98] W.J. Cook, W.H. Cunningham, W.R. Pulleyblank, and A. Schrijver. Combinatorial
Optimization. John Wiley, 1998.

[Chv83] V. Chvátal. Linear Programming. W.H. Freeman, 1983.

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

[Dij] Edsger W. Dijkstra. Wikipedia: https://en.wikipedia.org/wiki/Edsger_W._Dijkstra.

[Dil] Robert P. Dilworth. Wikipedia: https://en.wikipedia.org/wiki/Robert_P._Dilworth.

[Edm] Jack Edmonds. Wikipedia: https://en.wikipedia.org/wiki/Jack_Edmonds.

[Edm65] J. Edmonds. Paths, trees, and flowers. Canadian Journal of Mathematics, 17:449–467,
1965.

[Eul] Leonhard Euler. Wikipedia: https://en.wikipedia.org/wiki/Leonhard_Euler.

[Far] Gyula Farkas (natural scientist). Wikipedia: https://en.wikipedia.org/wiki/Gyula_


Farkas_(natural_scientist).

[For] L. R. Ford Jr. Wikipedia: https://en.wikipedia.org/wiki/L._R._Ford_Jr.

[Ful] D. R. Fulkerson. Wikipedia: https://en.wikipedia.org/wiki/D._R._Fulkerson.

[Gal] David Gale. Wikipedia: https://en.wikipedia.org/wiki/David_Gale.

[GH61] R.E. Gomory and T.C. Hu. Multi-terminal network flows. Journal of the Society for
Industrial and Applied Mathematics, 9:551–570, 1961.

[GLS88] M. Grötschel, L. Lovász, and A. Schrijver. Geometric Algorithms and Combinatorial


Optimization. Springer, first edition, 1988.

189
190 BIBLIOGRAFIA FEOFILOFF

[Hof] Alan J. Hoffman. Wikipedia: https://en.wikipedia.org/wiki/Alan_J._Hoffman.

[Kar] Richard M. Karp. Wikipedia: https://en.wikipedia.org/wiki/Richard_M._Karp.

[Kon] Dénes Kőnig. Wikipedia: https://en.wikipedia.org/wiki/D%C3%A9nes_K%C5%


91nig.

[Kot] Anton Kotzig. Wikipedia: https://en.wikipedia.org/wiki/Anton_Kotzig.

[Kuh] Harold W. Kuhn. Wikipedia: https://en.wikipedia.org/wiki/Harold_W._Kuhn.

[Men] Karl Menger. Wikipedia: https://en.wikipedia.org/wiki/Karl_Menger.

[Mun] James Munkres. Wikipedia: https://en.wikipedia.org/wiki/James_Munkres.

[Sch03] A. Schrijver. Combinatorial Optimization: Polyhedra and Efficiency. Springer, 2003.

[Sch17] A. Schrijver. A course in combinatorial optimization. https://homepages.cwi.nl/


~lex/files/dict.pdf, March 2017.

[Tut] W.T. Tutte. Wikipedia: https://en.wikipedia.org/wiki/W._T._Tutte.


Índice Remissivo

?, i de Dijkstra, 10
dxe, 151 de Edmonds, 112, 125, 141
bxc, 151 de Ford, 4
[∗, j], 152 de Ford–Bellman, 8
[i, ∗], 152 de Ford–Bellman para DAGs, 9
cT x, 153 de Ford–Fulkerson, 30
AT y, 153 de programação linear, 167
E(·), 175, 176, 179 do caminho de aumento, 30
G − v, 176 do caminho dirigido mínimo, 4, 8
G − e, 176 do ciclo de aumento, 69
G + vw, 176 do corte globalmente mínimo, 93, 95
D − v, 180 do elipsóide, 167
D − e, 180 do emparelhamento
D + vw, 180 bipartido máximo, 129
P · Q, 176, 181 máximo, 125, 129
R, 155, 177, 182 perfeito, 112
∂(·), 177 do fluxo
∂ + (·), 182 de custo mínimo, 69
∂ − (·), 182 máximo, 30
x+ (·), 13, 23 do ponto interior, 167
x− (·), 23 húngaro, 134
x+− (·), 23 polinomial, 188
u+ (·), 27 Simplex, 166, 167
u− (·), 27 de transbordo, 73
l+ (·), 49 para redes, 71, 79
l− (·), 49 AMO, i
λ(·), 88, 91 anticadeia, 55
G[·], 175, 180 antichain, 55
G×C, 110 ao alcance, 181
ν(·), 120 arbórea, 71, 78
⊕, 104 arborescência, 182
kAk, 121 arc, 179
O(·), 188 arco, 179
Ω(·), 188 antiparalelo, 179
Θ(·), 188 cheio de fluxo, 28
direto (de caminho), 180
acíclico, 9 inverso (de caminho), 180
acúmulo de fluxo, 23 justo, 3
alcance, 181 paralelo, 179
algoritmo, 187 que entra, 179
das flores, 112, 125 que sai, 179
de busca em largura, 11

191
192 ÍNDICE REMISSIVO FEOFILOFF

relaxado, 3 quase-simples, 176, 180


tenso, 3 simples, 176, 180
vazio de fluxo, 29 vai de r a s, 180
aresta, 175 caminhos
incide em nó, 175 internamente disjuntos, 57
paralela, 175 cap(·), 27
que liga, 175 capacidade
aresta-conexidade, 91 de arco, 26
árvore, 177, 182 de corte, 27
alternante, 107 infinita, 36, 70
de cortes mínimos, 98 inteira, 30
de Gomory–Hu, 98 casco convexo, 171
de grafo dirigido, 71 CCPS, i
degenerada, 78 cc(·), 171
divergente, 182 ciclo, 177, 181
frustrada, 107 de aumento, 67
orientada, 182 dirigido, 181
radicada, 182 negativo, 2
assintótica, 188 euleriano, 59
augmenting path, 28, 104 fundamental, 72, 78, 79
ímpar, 177
b, 63 simples, 177, 181
Bellman, 8 circuito, 177
Berge, 121 alternante, 142
bipartição, 176, 180 circulação, 24
bipartição arbórea, 71 de Hoffman, 49
degenerada, 72 circulation, 24
fortemente viável, 76 CLRS, i
bipartido, 176, 180 cobertura, 44, 120
Birkhoff, 146 de arcos
blossom, 110 por caminhos dirigidos, 53
algorithm, 125 de nós
minimum perfect matching, 141 por caminhos dirigidos, 54
perfect matching, 112 por arestas, 115
inequalities, 139 por caminhos, 55
BM08, i por nós, 44, 120
booleano, 152 coleção, 155
bounded, 161 disjunta, 37
busca em largura, 11 laminar, 95, 116, 140, 155
c, 1, 63 coluna de matriz, 152
c(y), 66, 133 combinação
c(y,Y ), 139 convexa, 171
caminho, 176, 180 linear, 163
alternante, 104 das colunas, 154
aumentador, 104 das linhas, 154
compatível com fluxo, 28 complementary slackness, 167
de aumento, 28 complexidade de algoritmos, 187
de r a s, 176 componente
dirigido, 181 conexa, 176, 181
mínimo, 1 ímpar, 106, 120
FEOFILOFF ÍNDICE REMISSIVO 193

comprimento de caminho, 176, 180 ∂ + (·), 182


concatenação de caminhos, 176, 181 DAG, 181
condição def(·), 120
de Gale, 47 deficiência, 120
de Hoffman, 49 degree, 175
de Tutte, 106 demandas
condição de otimalidade nos arcos, 49
de caminho mínimo, 3, 4 nos nós, 47
de emparelhamento, 121 desigualdade
de fluxo máximo, 28 das flores, 139
de fluxo mínimo, 65 floral, 139
conexidade, 91 submodular, 37, 89
conjunto triangular, 3
de colunas de matriz, 154 dicut, 183
de linhas de matriz, 154 diferença simétrica, 104
maximal, 128 digrafo, 179
máximo, 56, 103, 119 digraph, 179
mínimo, 56 Dijkstra, 10
conservação de fluxo, 24 Dilworth, 55
contração, 95, 110 dipath, 181
convex hull, 171 dipath cover, 54
convexo, 172 directed acyclic graph, 9, 181
casco, 171 directed cut, 183
combinação, 171 distância, 8, 176
conjunto, 172 divide and conquer, 93
corte, 87, 177, 183 divisão e conquista, 93
de capacidade mínima, 27 dualidade
de margem ímpar, 138 programação linear, 165
dirigido, 51, 183 teorema forte, 165
máximo, 53 teorema fraco, 12, 165
divide um conjunto, 91
globalmente mínimo, 91 E(·), 175
ímpar, 138 É, 30
mínimo, 27, 87 È, 30
separa dois nós, 27, 87 edge, 175, 179
cover, 44 edge cover, 115
custo edge-simple path, 176, 180
de arco, 1 Edmonds, 31, 112, 130, 141
de caminho, 72 ellipsoid algorithm, 167
de caminho dirigido, 1 emparelhamento, 43, 103, 119
de fluxo, 63 maximal, 128
positivo, 10 máximo, 103, 119
reduzido, 66, 133, 139 perfeito, 81, 103
unitário, 11 mínimo, 131
cut, 87, 177, 183 ep, 105, 131
directed, 183 escalonamento
cycle, 177, 181 de aviões, 61
de máquinas paralelas, 61
∂(·), 177 excesso de fluxo, 23
∂ − (·), 182
Farkas, 168
194 ÍNDICE REMISSIVO FEOFILOFF

feasible dirigido, 179


linear program, 165 acíclico, 9, 181
potential, 3 bipartido, 180
solution, 164 completo, 179
tree, 71 conexo, 181
fila, 11 fortemente conexo, 181
flor, 110 induzido, 175, 180
floresta, 177 não-dirigido, 175
orientada, 182 completo, 175
radicada, 182 conexo, 176
fluxo, 23 residual, 67
de custo mínimo, 63 subjacente, 180
de r a s, 25 grau, 175
induzido de entrada, 179
por uma bipartição, 71 de saída, 179
por uma tripartição, 78
inteiro, 30 Hall, 115, 116
máximo, 27 hiperplano, 172
ótimo, 63 Hoffman, 50
respeita capacidade, 26, 63 Hu, 91, 98
satisfaz demanda, 47, 49, 63
ilimitado, 161, 165
vazio, 71
incide, 175
viável, 26, 63
indegree, 179
de custo mínimo, 63
infeasible
folgas complementares, 167
linear program, 164
folha, 177, 182
instância, 187
fonte, 179
int(·), 25
Ford, 4, 28
integer, 161
forest, 177, 182
integral, 161
oriented, 182
intensidade de fluxo, 25
fortemente
interior point method, 167
conexo, 181
inviável, 164
polinomial, 188
isola, 57
FPM (·), 145
isolado, 177
Fulkerson, 28
iteração degenerada, 74
função, 152
-capacidade, 26, 87 jobs, 61
-custo, 1 justo, 3
-predecessor, 5
inteira, 152 Karp, 31
Kőnig, 45
Gale, 48 Kotzig, 28
Gallai, 130 Kuhn, 134
GLS, i
Gomory, 91, 98 l− (·), 49
grafo l+ (·), 49
bipartido, 176 λ(·), 88, 91
bipartido completo, 176 laminar, 95, 116, 140, 155
capacitado, 87 largura
derivado, 111 de caminho de aumento, 28
FEOFILOFF ÍNDICE REMISSIVO 195

l.d., 154 Network Simplex, 71, 78


lema Algorithm, 79
das folgas complementares, 167 nó, 175, 179
de Farkas, 168 essencial, 126
do descruzamento, 90 exposto, 103, 119
l.i., 154 final, 26
linear program, 164 inicial, 1, 26
linearmente isolado, 177
dependente, 154 node-cover, 44
independente, 154 notação assintótica, 188
maximal, 154 número
linha de matriz, 152 inteiro, 151
natural, 151
m, 175, 179 racional, 151
margem, 177 real, 151
de corte, 87, 183
negativa, 183 O(·), 188
positiva, 183 oc(·), 106
matching, 43, 103, 119 odd component, 106, 120
matriz, 152 orientação
binária, 152 de um grafo, 180
booleana, 152 orientation, 180
de adjacências, 177, 183 oriented
de bijeção, 153 forest, 182
de incidências, 178, 183 tree, 182
de permutação, 153 origem de caminho, 176, 180
identidade, 152 outdegree, 179
indexada por, 152 overload, 153
inteira, 152
racional, 152 parâmetros
real, 152 de problema, 187
transposta, 152 partição, 176, 180
maximal, 176 de Gallai-Edmonds, 130
conjunto, 128 path, 176, 180
máximo, 103, 119, 176 perfect matching, 103
conjunto, 56 fractional, 145
Menger, 57 polytope, 145
MFMC, 29 perfect matching polytope, 148
mínimo permutação, 153
conjunto, 56 topológica, 181
minimum-cost flow, 63 pl, 164
Munkers, 134 PM (·), 148
pm, 105, 131
N, 151 poliedro, 157
n, 175, 179 dos ep’s, 148
N (·), 46 dos ep’s fracionários, 145
ν(·), 120 inteiro, 161
não-negativo, 151 polinomial, 188
não-positivo, 151 fortemente, 188
negativo, 151 pseudo-, 188
network, 1, 183 politopo, 171
196 ÍNDICE REMISSIVO FEOFILOFF

polyhedron, 157 Q+ , 151


polytope, 171 QM , 152
ponta, 175 quase-simples, 176, 180
final, 179
inicial, 179 R, 151
negativa, 179 R+ , 151
positiva, 179 raiz de floresta radicada, 182
positivo, 151 rede, 1, 183
potencial, 3, 133 capacitada, 26
viável, 3, 133 de fluxo, 26
predecessor, 5 de fluxo com custos, 63
problema residual, 67
da baldeação, 71 viável, 63
da cobertura relaxação
por caminhos, 53, 55 de arco, 5
de Gale, 47 linear, 168
de Hoffman, 49 relaxado, 3
de programação respeita capacidade, 26
linear, 163 rooted
de transbordo, 71 forest, 182
de viabilidade, 43 tree, 182
do caminho dirigido mínimo, 1
saldo de fluxo, 23
do corte globalmente mínimo, 91
satisfaz demanda, 47
do corte localmente mínimo, 88
Sch03, i
do emparelhamento
Sch17, i
bipartido máximo, 44
segmento de caminho, 176, 180
máximo, 119
separa dois nós, 25, 87
perfeito, 105
seqüencia de varredura, 7
do fluxo
shrinking, 95, 110
de custo mínimo, 63
Simplex, 166, 167
máximo, 26
para redes, 71, 78
mínimo, 51
sink, 179
do transporte, 45
slither, 115, 130
produto
solução
matriz por vetor, 153
ótima, 164
vetor por matriz, 153
viável, 164
vetor por vetor, 153
sorvedouro, 179
programa linear, 163
source, 179
dual, 165
spanning subgraph, 175, 180
ilimitado, 165
strongly feasible tree, 76
inviável, 164
subcaminho, 176, 180
viável, 165
subgrafo, 175
programação
dirigido, 180
inteira, 168
gerador, 175, 180
linear, 163
induzido, 175, 180
propriedade submodular, 37, 89
submodularidade, 37, 89
pseudonó, 111
suporte de vetor, 152
pseudopolinomial, 188
tenso, 3
Q, 151
teorema
FEOFILOFF ÍNDICE REMISSIVO 197

da dualidade, 165 graph, 180


de Berge, 104 undirected
de Birkhoff, 146 graph, 175
de Edmonds, 148
de Edmonds–Karp, 31 V (·), 175, 179
de Ford–Bellman, 8 valor
de Gale, 48 de fluxo, 25
de Gomory–Hu, 99 ótimo de pl, 163
de Hall, 115, 116 varredura, 7
de Hoffman, 50 vazio de fluxo, 71
de Kőnig, 45 vertex, 158
de Menger, 57 vértice, 175, 179
de Tutte, 106 de poliedro, 158
de Tutte–Berge, 121 inteiro, 161
de von Neumann, 165 vetor, 152
do fluxo binário, 152
mínimo, 52 booleano, 152
ótimo inteiro, 68 característico, 152
dos emparelhamentos perfeitos, 148 de inviabilidade, 167
fracionários, 147 de predecessores, 5
forte da dualidade, 165 extremo, 158
fraco da dualidade, 12, 165 indexado por, 152
MFMC inteiro, 152
inteiro, 30 não-negativo, 152
MFMC, 29 racional, 152
min-flow max cut, 53 real, 152
min-max viável
do caminho dirigido, 11 fluxo, 26
do fluxo, 29 solução, 165
teoria dos grafos, 179 vizinhança, 46
terminais de grafo, 90 vizinho, 175
término de caminho, 176, 180 direto, 179
topológica (permutação), 181 inverso, 179
torneio, 59
x+ (·), 13, 23
transbordo, 71
x− (·), 23
transposta, 152
x+
− (·), 23
transshipment, 71
tree, 177, 182 Z, 151
oriented, 182 Z+ , 151
tripartição
arbórea, 78
viável, 78
Tutte, 121

u, 63
u− (·), 27
u+ (·), 27
unbounded, 161
linear program, 165
underlying

Você também pode gostar