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

O teorema MFMC (teoremas 2.9) e sua versão inteira (teorema 2.10), ambos no capítulo 2, são ferramentas poderosas e versáteis. Este capítulo usa essas ferramentas para resolver 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. Essa generalização é inócua desde que a rede de fluxo não tenha caminhos de capacidade infinita que levam do nó inicial ao nó final.

(Consulte o índice remissivo e os apêndices para conferir as definições de termos técnicos.)

3.1 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 v. Um fluxo x em D satisfaz uma função-demanda b se tem excesso bv em cada v, ou seja, se x+(v)=bv para cada v.  Assim, se bv<0 então v é produtor de fluxo e se bv>0 então v é consumidor de fluxo. [Essa interpretação pode desagradar alguns leitores, mas ela é inevitável em face de nossa convenção sobre qual das pontas de um arco é positiva e qual é negativa.]

Problema 3.A (de Gale) 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). Ademais, denotaremos por V o conjunto de nós de D. Para simplificar o palavreado, diremos que um fluxo é viável se satisfaz b e respeita u.

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

pijq bp11 +2i1 2j11 +1q1 1pipjiqjijqqpu643123x012003
figs/xournalpp/my-romboid-3.png
Abaixo de u na tabela temos um fluxo viável x na rede (D,b,u).

O seguinte lema dá uma condição necessária óbvia para a existência de um fluxo viável:

Lema 3.1 (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. ■

(Como de hábito, b(X) denota a soma (bv:vX).)  Assim, para tornar evidente que não existe fluxo viável basta mostrar que b(V)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, que mostrou (1957) que a condição é também suficiente:

Teorema 3.2 (Gale) Em qualquer rede (D,b,u), se  b(V)=0 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.

Prova: A prova é uma redução ao teorema MFMC inteiro (teorema 2.10).  [Essa redução é a principal lição desta seção 3.1.]  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 (Dˇ,uˇ) a rede capacitada definida da seguinte maneira. O conjunto de nós de Dˇ é V{r,s}, sendo r e s dois novos nós, e o conjunto de arcos de Dˇ é definido assim:

Seja R um conjunto que separa r de s em Dˇ. A capacidade do corte (R) na rede (Dˇ,uˇ) é a soma de três parcelas: as capacidades dos arcos que vão de r a PR, as capacidades dos arcos que vão de QR a s, e as capacidades dos arcos que vão de VR a VR. Adote a notação R:=VR e observe que uˇ(R) = b(PR)+b(QR)+u+(R)  b(PR)+b(QR)+b(R) = b(PR)+b(QR)+b(PR)+b(QR) = b(QR)+b(QR) = b(Q). Concluímos assim que todo corte que separa r de s na rede (Dˇ,uˇ) tem capacidade pelo menos b(Q). Segue daí, pelo teorema MFMC (teorema 2.9), que existe um fluxo viável xˇ na rede (Dˇ,uˇ,r,s) tal que int(xˇ)=b(Q). Como int(xˇ)= xˇ+(s) uˇ+(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(V)=0 e portanto b(P)=b(Q), temos também xˇrp=bp para todo p em P.

Seja x a restrição de xˇ aos arcos da 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, que trata de fluxo inteiro, é uma mera aplicação do teorema MFMC inteiro (teorema 2.10). ■

Exemplo 3.2: Para a rede (D,b,u) do exemplo 3.1, veja a rede auxiliar (Dˇ,uˇ,r,s) construída na prova do teorema 3.2 (complete a figura). A segunda tabela mostra um fluxo viável xˇ de r a s na rede (Dˇ,uˇ,r,s).

rpijqsr11p111i1j111q1s rirqpipjiqjijqqppsjsuˇ2164312321xˇ2101200321 ripqjs

Exemplo 3.3: Seja (D,b,u) a rede definida a seguir. (Ela é igual à rede do exemplo 3.1 exceto pelo valor de uqp.)

pijqbp11+2i12j11+1q11pipjiqjijqqpu643122

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.

Problemas de transporte

As instâncias do problema 3.A em que o grafo D é bipartido e ue= para todo arco e (ou seja, não há restrições de capacidade) aparecem em muitas aplicações. Essas instâncias podem ser apresentadas em termos de redes de transporte. Uma rede de transporte é um objeto (D,P,Q,a) em que D é um grafo dirigido bipartido, (P,Q) é uma bipartição de D, e a é um vetor não-negativo indexado por PQ.

Problema 3.A0 Dada uma rede de transporte (D,P,Q,a), encontrar um fluxo (xe:eE(D)) tal que  x(p)=ap  para cada p em Px+(q)=aq  para cada q em Q.

Exemplo 3.4: É dado um conjunto de fábricas que produzem um certo fertilizante agrícola. É dado um conjunto de consumidores que usam esse fertilizante. Cada fábrica p produz exatamente ap toneladas do fertilizante por mês e cada consumidor q consome exatamente aq toneladas do fertilizante por mês. Uma quantidade arbitrária do fertilizante pode ser levada de uma fábrica p até um consumidor q desde que exista um canal de transporte pq ligando p a q.  Queremos saber se um dado conjunto de canais de transporte é capaz de levar toda a produção das fábricas até os consumidores.

O problema 3.A0 é um caso especial do problema 3.A, como mostraremos a seguir. Dada uma rede de transporte (D,P,Q,a), considere a rede (D,b,u) em que b e u são definidas assim: bp=ap para cada p em P, bq=aq para cada q em Q, e upq= para cada arco pq de D. Como D é bipartido, temos x+(p)=x(p) para todo p em P e x+(q)=x+(q) para todo q em Q. Assim, toda solução da instância (D,b,u) do problema 3.A é solução da instância (D,P,Q,a) do problema 3.A0 e vice-versa.

Para formular o lema 3.1 e o teorema 3.2 na linguagem do problema 3.A0, usamos a seguinte notação. Para qualquer subconjunto Y de Q, denotamos por N(Y) o conjunto de todos os nós p de P para os quais existe um arco pq com q em Y. Podemos dizer que N(Y) é a vizinhança de Y.  [A letra N é a inicial da palavra neigh­bor­hood.]

Corolário 3.3 Uma instância (D,P,Q,a) do problema 3.A0 tem solução se e somente se  a(P)=a(Q) a(N(Y))a(Y)  para todo subconjunto Y de Q. Ademais, se a é inteiro então essas condições garantem a existência de uma solução inteira do problema.

Esboço da prova: A parte somente se é óbvia. Agora considere a parte se. Suponha que a rede (D,P,Q,a) satisfaz as condições e seja (D,b,u) a correspondente instância do problema 3.A, conforme definição acima. É claro que b(V)=b(P)+b(Q)=a(P)+a(Q)=0. Mostraremos a seguir que b(X)u+(X) para todo subconjunto X de V(D). Há dois casos a considerar. Se +(X) então u+(X)= e portanto b(X)u+(X). Por outro lado, se +(X)= então u+(X)=0 e N(QX)PX. Segue daí que a(PX) a(N(QX) a(QX), donde b(X)= b(PX)+b(QX)= a(PX)+a(QX) a(QX)+a(QX)=0, e assim b(X)u+(X). Concluímos que em ambos os casos temos b(X)u+(X). Segue do teorema de Gale (teorema 3.2) que existe um fluxo x que satisfaz b. Um tal x é solução do problema 3.A0. ■

A seguinte generalização do problema 3.A0 é conhecida como problema do transporte e serve de modelo para vários problemas práticos:

Problema 3.B (do transporte) Dada uma rede de transporte (D,P,Q,a), encontrar um fluxo (xe:eE(D)) tal que  x(p)ap para cada p em Px+(q)=aq  para cada q em Q.

Exemplo 3.5: 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 vende aq 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. Em que condições um dado conjunto de transportadores é capaz de suprir as lojas? [CCPS fig.3.9]

figs/ccps/transportation-fig-3dot9a.png

Para obter a generalização apropriada do corolário 3.3 basta eliminar a condição a(P)=a(Q):

Teorema 3.4 (do transporte) Uma instância (D,P,Q,a) do problema 3.B tem solução se e somente se  a(N(Y))a(Y)  para todo subconjunto Y de Q. Ademais, se a é inteiro então essa condição garante a existência de uma solução inteira do problema.

A prova do teorema é um bom exercício.

Exercícios 3.1

  1. ★ Prove o lema 3.1. (Dica: Veja o lema 2.1.)
  2. 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 XV.
  3. Deduza o teorema MFMC (teorema 2.9) do teorema de Gale (teorema 3.2) e do lema 3.1.
  4. Preencha os detalhes da prova do teorema 3.2. Em particular, prove que a condição b(V) é independente da condição b(X)u+(X) para todo X.
  5. Prova direta do teorema de Gale. Prove o teorema de Gale sem usar o teorema MFMC (teoremas 2.9).  (Dica: A discrepância de um fluxo x é o número iV|bix+(i)|. Use caminhos de aumento, como os da seção 2.4, para diminuir a discrepância de x.)
  6. 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 a versão Edmonds–Karp do algoritmo de Ford–Fulkerson.
  7. Encontre um fluxo viável na rede (D,b,u) descrita a seguir. Os nós são  r a b c d s  (não confunda o nó b com a função-demanda b) e as tabelas definem as funções b e u:
    rabcdsb+3+2+2133 rarbacbdcsdssru8765786
  8. Algoritmo para árvore orientada sem capacidades. Seja (T,b) uma rede em que T é uma árvore orientada e b uma função-demanda. Escreva 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.)
  9. Condições para á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 satisfaz b. Estabeleça a relação entre essa condição e a condição de Gale.
  10. Problema de Gale em árvore orientada. Seja (T,b,u) uma rede capacitada com demandas em que T é uma árvore orientada. Escreva 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.
  11. 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 vr. Dê uma condição necessária e suficiente para que a rede (D,b) tenha um fluxo que satisfaz b.
  12. Rede sem capacidades. Seja b uma função-demanda em um grafo dirigido D. 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 XV tal que +(X)=. (Dica: Enuncie e prove em separado a parte se e a parte somente se.)
  13. Prove o teorema 3.4.
  14. Subgrafo bipartido com prescrição de graus. Seja G um grafo não-dirigido bipartido. Suponha dado um inteiro não-negativo av para cada v de G. Queremos encontrar EE(G) tal que o grau de cada nó v no grafo (V(G),E) seja av. 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 a é constante. [CCPS 3.18]
  15. Grafo dirigido euleriano. (O adjetivo euleriano é uma referência a Leonhard Euler.)  Dado um grafo dirigido D, encontrar um conjunto de arcos cuja inversão (isto é, troca de vw por wv) resulte em um grafo dirigido Dˇ tal que |+(v)|=|(v)| para cada v. Dê uma condição necessária e suficiente para que o problema tenha solução. [CCPS 4.5]
  16. Orientação de grafo não-dirigido. Dado um grafo não-dirigido G e um inteiro não-negativo k, queremos 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 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]
  17. 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]
  18. 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.2 O problema de Hoffman

Algumas aplicações exigem que o fluxo em cada arco do grafo tenha um certo valor mínimo. Essas restrições por baixo nos arcos podem ser convertidas em demandas nos nós, tranformando assim 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 real não-negativo a cada arco do grafo; portanto, lR+E.  [A letra l é a inicial de lower bound.]  Dizemos que um fluxo x no grafo satisfaz a demanda l se xele para cada arco e.

Problema 3.C (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 lxu.

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

Exemplo 3.6: 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:

pijqp11i1j11q1pipjiqjijqqpu753233x122113l110110
figs/xournalpp/my-romboid-3.png

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

Lema 3.5 (condição necessária) Se uma rede (D,l,u) tem uma circulação viável então lul(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.5 é conhecida como condição de Hoffman em referência a A. J. Hoffman (não confunda com D.A. Huffman, inventor do código de Huffman), que mostrou (1960) que essa condição é suficiente:

Teorema 3.6 (Hoffman) Para qualquer rede (D,l,u), se  lu 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.

Prova: A prova é uma redução do teorema de Gale (teorema 3.2). Suponha que a rede (D,l,u) satisfaz a condição do teorema. Para mostrar que existe uma circulação viável x, usaremos o teorema de Gale com l+ no papel da função-demanda e a diferença ul 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 v. Em virtude do lema 2.1 do capítulo 2, (1)l+(V)=0.

Agora considere a hipótese l(X)u+(X). Se subtrairmos l+(X) dos dois lados da desigualdade teremos (2)l+(X)(ul)+(X).

Nossa rede (D,l,u) pode ser vista como uma instância (D,b,uˇ) do problema de Gale com b e uˇ definidos assim: b:=l+euˇ:=ul.

O parâmetro b é uma função-demanda. Como lu, o parâmetro uˇ é uma função-capacidade. Graças a (1) e (2), a rede (D,b,uˇ) satisfaz a condição de Gale: b(V)=0eb(X)uˇ+(X) para cada XV. O teorema 3.2 garante então que a rede (D,b,uˇ) tem um fluxo xˇ tal que  xˇ+=b xˇuˇ.  Para retornar à rede original (D,l,u), considere o fluxo x:=xˇ+l (trata-se de um fluxo pois xˇ0 e l0). É claro que l x uˇ+l=u. Ademais, x é uma circulação pois x+(v) = xˇ+(v)+l+(v) = bv+l+(v) = l+(v)+l+(v) = 0

para cada v. Em suma, x é uma circulação viável, como queríamos provar. ■

Exemplo 3.7: Veja a rede (D,b,uˇ) construída na prova do teorema 3.6 a partir da rede (D,l,u) do exemplo 3.6:

bp+2i2j+1q1pipjiqjijqqpuˇ643123xˇ012003
figs/xournalpp/my-romboid-3.png
A tabela acima mostra um fluxo xˇ que satisfaz b e respeita uˇ. Essa rede (D,b,uˇ) é igual à rede (D,b,u) do exemplo 3.3.

Exemplo 3.8: A rede (D,l,u) descrita abaixo é igual à rede do exemplo 3.6 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).

pijqp11i1j11q1pipjiqjijqqpl110110u753232
figs/xournalpp/my-romboid-3.png

Vale a seguinte generalização comum dos teoremas de Gale (teorema 3.2) e de Hoffman (teorema 3.6):

Teorema 3.7 Seja D 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 lxu  se e somente se lueb(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. ■

Exercícios 3.2

  1. Mostre que as partes lu e l(X)u+(X) da condição de Hoffman são independentes.
  2. 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 lxu, mostre que max(le:eE) min(ue:eE).  Parte 2: Supondo que max(le:eE)> min(ue:eE), mostre que a rede (D,l,u) viola a condição de Hoffman.
  3. ★ Prove o lema 3.5.
  4. 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:
    rarbacbdcsdssrl1234210u6
  5. 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:
    rarcabdcbsdssrl1111110u9999998
  6. Seja (D,l,u) uma rede acíclica em que l0 e lu. Deduza da condição de Hoffman que não existe circulação viável em (D,l,u).
  7. Seja (D,l,u) uma rede em que lu. 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.
  8. Trajeto de caminhão de coleta de lixo. Um ciclo dirigido num grafo dirigido é euleriano, se passa por cada arco e cada nó do grafo.  (É claro que um ciclo euleriano passa apenas uma vez por cada arco; mas pode passar mais de uma vez por cada nó.) [O adjetivo euleriano é uma referência a Leonhard Euler.]  Mostre que um grafo dirigido D tem um ciclo dirigido euleriano se e somente se D é conexo e |+(v)|=|(v)| para cada v. [CCPS 4.4]
  9. 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. (Dica: Enuncie e prove em separado a parte se e a parte somente se.) [AMO 3.53]
  10. Prove o teorema 3.7, que generaliza os teoremas de Gale e Hoffman.

3.3 Fluxo mínimo

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

Problema 3.D (fluxo mínimo) Dados dois nós r e s de um grafo dirigido D, uma função l de E(D) em R+, e um número k0, encontrar um fluxo x de r a s tal que xleint(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 xl e int(x)k. Nosso problema consiste então em encontrar um fluxo k-viável.

Exemplo 3.9: 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 (ou seja, p faz o papel de r e q faz o papel de s.)  A função l e um fluxo xl de p a q são dados à direita da matriz. O fluxo x é 3-viável.

pijqr=p11i1j11s=qpipjiqjijql11011x12211
figs/xournalpp/my-romboid-9.png

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.8 (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. ■

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

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

Teorema 3.9 (condição suficiente) Dada uma rede fonte-sorvedouro (D,l,r,s) e um número k0, 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.

Prova: A prova é uma redução ao teorema de Hoffman (teorema 3.6). Suponha que a condição enunciada está satisfeita. Seja E o conjunto de arcos de D. Construa um grafo dirigido Dˇ acrescentando um novo arco sr a D e seja Eˇ o conjunto de arcos de Dˇ. Seja lˇ a função de Eˇ em R+ definida por lˇsr=0 e lˇe=le para cada e em E. Seja uˇ a função-capacidade definida em Eˇ pelas seguintes propriedades: uˇsr=keuˇe=para cada e em E É claro que lu. Para provar que rede (Dˇ,lˇ,uˇ) satisfaz a condição de Hoffman resta mostrar que lˇ(X)uˇ+(X) para todo subconjunto X de V(Dˇ). Há três casos a considerar, dependendo dos valores de (X) e +(X) em D:

  1. Se +(X)=(X)= em D então lˇ(X)=0uˇ+(X) onde quer que o arco sr esteja em relação a X.
  2. Se +(X) então lˇ(X)uˇ+(X) pois algum arco de D entra em X e portanto uˇ+(X)=.
  3. Suponha agora que +(X)= e (X). 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 rX e sX, ou seja, X separa r de s. Logo l(X)u+(X), e portanto lˇ(X)= l(X) u+(X)uˇ+(X).

Como lˇ(X)uˇ+(X) para todo subconjunto X de V(Dˇ), o teorema 3.6 garante que a rede (Dˇ,lˇ,uˇ) 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, xl e int(x) uˇsr=k. Em outras palavras, x é um fluxo k-viável. ■

Exemplo 3.10: Para a rede (D,l,r,s) do exemplo 3.9, eis a rede (Dˇ,lˇ,uˇ) construída na prova do teorema 3.9:

pijqr=p11i1j11s=q1pipjiqjijqqplˇ110110uˇ3xˇ122113
figs/xournalpp/my-romboid-3.png

(A rede (Dˇ,lˇ,uˇ) só difere da rede do exemplo 3.6 porque uˇ é diferente.) A última linha da tabela dá uma circulação xˇ tal que lˇ xˇuˇ.

Exemplo 3.11: Para verificar que não existe fluxo 2-viável na rede do exemplo 3.9, tome o conjunto 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.8 e do teorema 3.9 o seguinte teorema min-max:

Teorema 3.10 (min-flow max-cut) Em toda rede fonte-sorvedouro (D,l,r,s) tem-se minxint(x)=maxXl(X), sendo minx tomado sobre todos os fluxos x de r a s tais que xl 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.

Exercícios 3.3

  1. Mostre que toda rede fonte-sorvedouro (D,l,r,s) tem um fluxo x de r a s (possivelmente de grande intensidade) tal que xl.
  2. É verdade que toda rede dotada de k-fluxo é fonte-sorvedouro?
  3. Prove o lema 3.8.
  4. Aponte os detalhes obscuros da prova do teorema 3.9 do fluxo mínimo. Clarifique esses detalhes.
  5. 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.
    raassbbrl1111
  6. 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.
    rarbacbdcsdsl123421
  7. 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.
    rarcabdcbsdsl111111
  8. 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?
    raarabbssbl20130
  9. Fluxo mínimo versus corte máximo. Prove o teorema 3.10.
  10. Programas lineares. Formule os programas lineares que representam o problema do fluxo mínimo e o do corte dirigido máximo. (Veja o exercício Fluxo mínimo versus corte máximo acima.)

3.4 Coberturas por caminhos

O teorema do fluxo mínimo (teorema 3.10) 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 é um 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.E (cobertura por caminhos) Encontrar uma cobertura mínima 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.F (corte dirigido máximo) Encontrar um corte dirigido máximo em um grafo dirigido.

Exemplo 3.12: 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.

rtrusututvuvuw0111100
figs/xournalpp/my-romboid-12.png

Em qualquer grafo dirigido, se P é uma cobertura e C é um corte dirigido então é evidente que |P||C|. Se vale a igualdade, a cobertura P é mínima e o corte C é máximo. O seguinte teorema mostra que a recíproca dessa afirmação é verdadeira em DAGs.

Teorema 3.11 Em qualquer DAG, uma cobertura mínima dos arcos (por caminhos dirigidos) tem o mesmo tamanho que um corte dirigido máximo. ■

Prova: A prova é uma redução ao teorema do fluxo mínimo e corte máximo (teorema 3.10). 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 Dˇ da seguinte maneira. O conjunto de nós de Dˇ é V(D){r,s}, sendo r e s dois novos nós. Todos os arcos de D também são arcos de Dˇ. Além disso, Dˇ tem um arco rv para cada fonte v de D e um arco ws para cada sorvedouro w de D. É claro que Dˇ é um DAG, que r é a única fonte de Dˇ, e que s é o único sorvedouro de Dˇ. Portanto, a rede (Dˇ,r,s) é fonte-sorvedouro no sentido da seção 3.3.

Seja l a função-demanda definida sobre os arcos de Dˇ pelas seguintes propriedades: le=1 para cada e em E(D) e lf=0 para cada f em E(Dˇ)E(D). Na rede (Dˇ,l,r,s), seja x um fluxo de intensidade mínima dentre aqueles que vão de r a s e satisfazem xl. Seja (X) um corte dirigido que maximiza l(X) dentre os cortes dirigidos que separam r de s. De acordo com o teorema 3.10, int(x)=l(X). Denote por Xr o conjunto X{r}. No grafo D, temos |(Xr)|=l(X), donde int(x)=|(Xr)|. De acordo com o adendo do teorema 3.10, 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 Dˇ, 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 xl, 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=|(Xr)| e (Xr) é um corte dirigido em D. ■

Teorema de Dilworth

Uma cobertura dos nós (= dipaths 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. (Não confunda esse conceito com a cobertura por nós da seção 6.4.)  Uma cobertura dos nós é mínima se nenhuma outra tem menos caminhos.

Problema 3.G (da cobertura dos nós por caminhos) 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 nós distintos de B. Uma anticadeia é máxima se nenhuma outra tem mais nós.

Problema 3.H (da anticadeia máxima) Encontrar uma anticadeia máxima num grafo dirigido.

Exemplo 3.13: A primeira figura mostra uma anticadeia em um DAG. (Veja os nós marcados com ✓.) 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.

figs/others/dilworth-kaveh-pitt-edu-x.png

Em qualquer grafo dirigido, para qualquer cobertura P dos nós e qualquer anticadeia B, é claro que |P||B|. Se vale a igualdade, a cobertura é mínima e a anticadeia é máxima. R. P. Dilworth mostrou (1950) que a recíproca dessa afirmação é verdadeira quando o grafo é um DAG[Dilworth provou o teorema no contexto de ordens parciais. Aqui, o teorema foi traduzido para DAGs.]

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

Prova: A prova é uma redução ao teorema do fluxo mínimo e corte máximo (teorema 3.10). 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 Dˇ da seguinte maneira. Para cada nó v de D, o grafo Dˇ tem dois nós, v1 e v2, ligados por um arco v1v2. Para cada arco vw de D, o grafo Dˇ tem um arco v2w1. Além disso, Dˇ tem dois novos nós, r e s, um arco rv1 para cada fonte v de D, e um arco w2s para cada sorvedouro w de D. Os arcos da forma v1v2 serão chamados especiais; eles representam os nós de D. A rede (Dˇ,r,s) é fonte-sorvedouro no sentido da seção 3.3.

Defina uma função-demanda l sobre os arcos de Dˇ da seguinte maneira: le=1 se e é um arco especial e le=0 em caso contrário. O teorema 3.10 aplicado à rede (Dˇ,l,r,s) garante que existe um fluxo x de r a s tal que xl e existe um corte dirigido (X) que separa r de s tal que int(x)=l(X). 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 Dˇ. 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 caminho dirigido em D que vai de um nó v de B a outro nó w de B. Em Dˇ, esse caminho corresponde a um caminho dirigido que vai de v2 a w1. Portanto, o caminho começa em V(Dˇ)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.10, 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 Dˇ, todos de r a s. Sejam P1,,Pk esses caminhos, com k=int(x). É claro que cada arco especial 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 nós de D.  Ademais, o número de caminhos é |B|. ■

Exercícios 3.4

  1. ★ Seja D um grafo dirigido e P uma cobertura (por caminhos dirigidos) dos arcos de D. Seja (X) um corte dirigido em D. Dê uma prova elementar da desigualdade |P||(X)|, ou seja, prove a desigualdade diretamente.
  2. ★ Seja D um grafo dirigido e P uma cobertura (por caminhos dirigidos) dos nós de D. Seja B uma anticadeia em D. Dê uma prova elementar da desigualdade |P||B|, ou seja, prove a desigualdade diretamente.
  3. 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.
  4. Mostre uma anticadeia máxima e um cobertura mínima dos nós por caminhos dirigidos no DAG da figura. [CCPS fig 2.5]
  5. ★ Complete os detalhes mais obscuros da prova do teorema de Dilworth (teorema 3.12).
  6. 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 cada nó de D pertence a apenas um dos caminhos de P?
  7. 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.
  8. 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]
  9. 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 entre o dual e anticadeias máximas?
  10. ★ Seja D um grafo dirigido bipartido com bipartição (P,Q). Mostre que um subconjunto B de V(D) é uma anticadeia se e somente se V(D)B é uma cobertura por nós (no sentido da seção 6.4). Que aparência tem uma cobertura mínima dos nós de D por caminhos dirigidos?
  11. Prove o teorema de Kőnig (teorema 6.4) a partir do teorema de Dilworth (teorema 3.12).
  12. Prove o teorema de Dilworth (teorema 3.12) a partir do teorema de Kőnig (teorema 6.4).

Mais exercícios

  1. 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 pre­emp­tion, 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 djrj+pj.) Exemplo:
    j1234pj25315018rj1050020dj30706050

    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 o conjunto ordenado de datas, com m+12n. 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]

  2. 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]