Algoritmos para Grafos  |  Índice

O problema do fluxo máximo

O problema do fluxo máximo é uma poderosa ferramenta de modelagem, capaz de representar uma grande variedade de outros problemas.  As aplicações mais óbvias incluem o fluxo de um líquido através de uma rede de tubos, o fluxo de mercadorias do produtor ao consumidor, o casamento de desempregados com empregos, etc.  O problema do emparelhamento bipartido máximo é um caso particular.

Este capítulo é uma introdução ao problema do fluxo máximo.  Ela estabelece a terminologia técnica e em seguida enuncia o problema.  Um algoritmo para o problema será discutido em capítulos subsequentes.

Sumário:

iou-graph-10-nodes-and-20-edges.png

Fluxo

Suponha dada uma tabela  f  que associa um número positivo com cada arco de um grafo.  O número que f associa com um arco v-w será denotado por fvw e chamado fluxo no arco v-w.

Para qualquer vértice v do grafo, o  fluxo que entra em v  (= inflow)  é a soma dos fluxos nos arcos que entram em v.  O fluxo que sai de v  (= outflow) é a soma dos fluxos nos arcos que saem de v.  O saldo de fluxo (= net flow) em v é a diferença

outflow(v) − inflow(v)

entre o fluxo que sai de v e o fluxo que entra em v.  (Não confunda essa diferença com  inflow(v) − outflow(v).)  O saldo de fluxo é estritamente positivo se o fluxo que sai é maior que o fluxo que entra.

O enunciado do problema que estudaremos a seguir especifica dois vértices do grafo:  um vértice inicial e um vértice final. Esses dois vértices serão denotados por  s  e  t  respectivamente.  Os vértices escolhidos para fazer o papel de st não precisam ter quaisquer propriedades especiais (ainda que, muitas vezes, s seja uma fonte e t um sorvedouro).

Agora podemos definir o conceito de fluxo.  (É estranho definir a expressão fluxo no arco antes de definir fluxo, mas essa foi a melhor maneira que encontrei de apresentar os conceitos.)  Um  fluxo (= flow)  num grafo com vértice inicial s e vértice final t é uma tabela f que atribui números positivos (não necessariamente inteiros) aos arcos do grafo de tal modo que

(Para dar ênfase ao papel dos vértices inicial e final, podemos usar a expressão fluxo de st.)  É fácil mostrar a seguinte propriedade do fluxo:  o saldo de f em t é igual ao saldo de f em s com sinal trocado.

intensidade  (= flow value) de um fluxo f é o saldo de f no vértice inicial s.  Em muitos exemplos, o fluxo que entra em s é nulo e o fluxo que sai de t é nulo. Quando isso acontece, a intensidade do fluxo é igual ao fluxo que sai de s e portanto também igual ao fluxo que entra em t(Pode parecer atraente exigir, na definição do conceito de fluxo, que seja nulo o fluxo que entra no vértice inicial. Mas é mais fácil trabalhar sem essa exigência.)

Como representar um fluxo?  Se o grafo é representado por listas de adjacência, poderíamos acrescentar um campo aos nós que representam os arcos.  Se o grafo é representado por uma matriz de adjacências, podemos usar uma matriz f[][] definida da maneira óbvia:  se v-w é um arco, então f[v][w] é o fluxo no arco;  senão, f[v][w] é 0.

Exemplo A.  A tabela a seguir define um fluxo num grafo-ciclo. O vértice inicial é 0 e o vértice final é 2.  O fluxo tem intensidade 40.

0-1 1-2 2-0
 50  50  10

Eis outro fluxo de intensidade 40 no mesmo grafo:

0-1 1-2 2-0
 40  40   0
Sedgewick-part5-java/flow-fig-22-6-a.png

Exemplo B.  A tabela a seguir define um fluxo no grafo da figura ao lado. O vértice inicial é 0 e o vértice final é 5.  O fluxo tem intensidade 50.

0-1 0-2 1-3 1-4 2-3 2-4 3-5 4-5 
 30  20  19  11   5  15  24  26 

Esse fluxo pode também ser representado pela seguinte matriz:

- 30 20  -  -  -
-  -  - 19 11  -
-  -  -  5 15  -
-  -  -  -  - 24
-  -  -  -  - 26
-  -  -  -  -  -

Exercícios 1

  1. Seja f um fluxo num grafo com vértice inicial s e vértice final t.  Prove que o saldo de f em t é igual ao saldo de f em s com sinal trocado.
  2. A tabela abaixo define um fluxo?  Qual o vértice inicial e o final?
    0-1 0-2 1-2 1-3 2-3 
     15  11   5  10  16 
    
  3. Prove a propriedade dos saldos enunciada acima.
  4. A tabela abaixo define um fluxo no grafo?  Se sua resposta for afirmativa, qual o vértice inicial e o final?  Qual a intensidade do fluxo?
    0-1 0-4 1-5 2-0 2-3 2-4 4-3 5-0 5-2 
     10  20  50  10  10  10  30  20  30  
    
  5. A tabela abaixo define um fluxo no grafo?  Em caso afirmativo, qual o vértice inicial e o final do grafo?  Qual a intensidade do fluxo?
    0-1 0-4 1-5 2-0 2-3 2-4 4-3 5-0 5-2 
      0  30  30  10  10   0  30  10  20   
    
  6. Verifica fluxo.  Escreva uma função GRAPHcheckFlow() que verifique se um suposto fluxo é de fato um fluxo. A função deve receber um grafo G, um vértice inicial s, um vértice final t, e um suposto fluxo representado por uma matriz f[][].  Se f[][] for de fato um fluxo, a função deve devolver sua intensidade.  A função também deve verificar se o saldo no vértice final é o negativo do saldo no vértice inicial!  [Sedgewick faz uma observação engraçada: Despite our confidence as mathematicians in Property 22.1, our paranoia as programmers dictates that we also check that the flow out of the source is equal to the flow into the sink.]
  7. Fluxo em arcos antiparalelos.  Seja f um fluxo num grafo com vértice inicial e vértice final. Mostre que existe um fluxo  g  ≤  f  (ou seja, gvwfvw e para cada arco v-w) tal que
    1. a intensidade de g é igual à intensidade de f e
    2. para cada par v-w, w-v de arcos antiparalelos, um de gvw e gwv é nulo.
  8. Fluxo em grafo não-dirigido.  Seja f um fluxo num grafo não-dirigido com vértice inicial e vértice final. Mostre que podemos supor, sem perda de generalidade, que um de fvw e fwv é nulo para cada aresta v-w do grafo.

Fluxo versus coleção de caminhos

Todo fluxo por ser visto como uma macarronada, ou seja, uma coleção de caminhos, todos com origem no vértice inicial e término no vértice final do grafo. Embora o conceito seja intuitivo, sua definição exata é um tanto longa e enfadonha, como veremos a seguir.

Uma coleção P0, P1, … , Pm de caminhos, juntamente com uma correspondente coleção ε0, ε1, … , εm de números inteiros positivos, representa um fluxo f se

  1. cada Pi é simples, começa no vértice inicial, e termina no final do grafo,
  2. a soma ε0 + ε1 + … + εm é igual à intensidade de f,
  3. se Pi 0 , … , Pi k são os caminhos que passam por um arco v-w então εi 0 + … + εi kfvw .

Diremos que εi é a quantidade de fluxo que o caminho Pi conduz.  (Note que, em geral, os caminhos têm vértices e arcos em comum.)

coelho-2011/flow-decomposition-aula23-2.png

Exemplo C.  Considere o fluxo indicado abaixo. A primeira linha da tabela dá os arcos do grafo. A segunda dá o fluxo em cada arco. O vértice inicial é 0 e o final é 1. A intensidade do fluxo é 6.

0-2 0-3 0-4 2-1 2-4 3-4 3-5 4-1 4-5 5-1
  2   4   0   0   2   4   0   3   3   3

A seguir, uma coleção de três caminhos que representa o fluxo. Cada caminho conduz a quantidade de fluxo indicada na segunda coluna da tabela

0-2-4-1      2
0-3-4-1      1
0-3-4-5-1    3

Exercícios 2

  1. Fluxo binário.  Seja G um grafo com vértice inicial s e vértice final t.  Seja f um fluxo tal que fvw vale 0 ou 1 em cada arco v-w.  Mostre que f é essencialmente igual a uma coleção de caminhos simples de st sem arcos em comum (ou seja, cada arco do grafo pertence a no máximo um dos caminhos da coleção).
  2. ★ Escreva uma função que receba um fluxo f[][] num grafo que tem vértice inicial e vértice final e imprima uma macarronada (ou seja, uma coleção de caminhos) que represente o fluxo. Sua função deve imprimir também a quantidade de fluxo que cada caminho conduz.  (Sugestão: descreva o algoritmo em português antes de começar a programar.)
  3. Decomposição em caminhos e ciclos.  Seja f um fluxo de s a t num grafo G.  Considere uma coleção de caminhos que representa f.  Mostre que o fluxo f em alguns arcos de G pode ser maior que a soma das quantidades de fluxo conduzidas pelos caminhos. Mostre que esse sobra pode ser representada por uma coleção de ciclos.
  4. Sejam s e t os vértices inicial e final de um grafo. Imagine uma coleção de caminhos simples de st e um inteiro positivo ε(C) associado com cada caminho C. Escreva um algoritmo que receba essas informações e calcule um fluxo de s a t que seja a soma dos caminhos da coleção. A intensidade do fluxo deve ser igual a  C ε(C).

O problema do fluxo máximo

Uma grafo capacitado é um grafo com números positivos associados aos arcos.  O número associado a um arco é conhecido como capacidade do arco.  A capacidade de um arco v-w será denotada por cvw .  Suporemos que todas as capacidades são inteiras.

(Um grafo capacitado é, portanto, o caso especial de grafo com custos nos arcos em que os custos são todos positivos e a palavra capacidade é usada no lugar de custo.)  Um grafo capacitado com vértice inicial e vértice final é às vezes chamado rede (= network).

Suponha que f é um fluxo num grafo capacitado com vértice inicial e vértice final.  Dizemos que f respeita as capacidades se   fvw  ≤  cvw  para cada arco v-w, sendo fvw o fluxo no arco v-w e cvw a capacidade do arco.

Feita essa definição, podemos enunciar o problema central deste capítulo (e dos capítulos seguintes):

Problema do fluxo máximo (= maximum flow problem):   Dado um grafo capacitado com vértice inicial e vértice final, encontrar um fluxo de intensidade máxima dentre os que respeitam as capacidades dos arcos.

Usaremos frequentemente a expressão fluxo máximo como abreviatura de fluxo de intensidade máxima ou até de fluxo de intensidade máxima dentre os que respeitam as capacidades dos arcos.

O problema do emparelhamento máximo num grafo não-dirigido bipartido é, essencialmente, um caso especial do problema do fluxo máximo (com todas as capacidades iguais a 1).

Sedgewick-part5-java/flow-fig-22-6-a.png

Sedgewick-part5-java/capacitated-network-prog-22-2.png

Exemplo D.  A tabela abaixo especifica um grafo capacitado (a segunda linha da tabela dá as capacidades dos arcos). Suponha que o vértice inicial é 0 e o vértice final é 5.

0-1 0-2 1-3 1-4 2-3 2-4 3-5 4-5 
  2   3   3   1   1   1   2   3  

Veja um fluxo que respeita as capacidades e tem intensidade 3:

0-1 0-2 1-3 1-4 2-3 2-4 3-5 4-5 
  2   1   2   0   0   1   2   1 

Veja outro fluxo que respeita as capacidades e tem intensidade 4:

0-1 0-2 1-3 1-4 2-3 2-4 3-5 4-5 
  2   2   1   1   1   1   2   2  

Existe um fluxo que respeita as capacidades e tem intensidade maior que 4?

Exercícios 3

  1. Explique, em sua próprias palavras, o que é o problema do fluxo máximo.
  2. Quais são os dados do problema do fluxo máximo?
  3. Mostre como reduzir uma instância arbitrária do problema do fluxo máximo ao caso especial em que s é a única fonte do grafo e t é o único sorvedouro.
  4. Considere o grafo capacitado com as capacidades definidas pela tabela abaixo. Adote 0 como vértice inicial e 3 como vértice final. Encontre um fluxo máximo.
    0-1 0-2 1-2 1-3 2-3 
     12  15  20  19  11 
    
  5. [Sedgewick 22.1]  Encontre dois fluxos máximos no grafo capacitado abaixo (veja figura ao lado) supondo que o vértice inicial é 0 e vértice final é 5.
    0-1 0-2 0-3 1-2 1-3 1-4 2-4 2-5 3-4 3-5 4-5 
     20  30  20  10  10  10  10  20  20  30  20   
    
  6. [Sedgewick 22.15]  Encontre todos os fluxos máximos no grafo capacitado abaixo supondo que o vértice inicial é 0 e o vértice final é 5.
    0-1 0-2 0-3 1-3 1-4 2-1 2-5 3-4 3-5 4-2 4-5 
      2   3   2   1   1   1   2   2   3   1   2  
    
  7. Verificação do respeito à capacidade.  Escreva uma função que receba um grafo capacitado com capacidades c[][], vértice inicial s, vértice final t, e um fluxo f[][] e verifique se f[][] respeita as capacidades. Também calcule a intensidade do fluxo.
  8. [Sedgewick 22.2] Cota superior da intensidade.  Suponha que um grafo capacitado tem V vértices e A arcos. Suponha ainda que as capacidades são números inteiros menores que uma constante M. Dê uma cota superior simples e grosseira para a intensidade de um fluxo que respeita as capacidades. (A cota não depende de quais sejam os vértices inicial e final.)
  9. Certo ou errado?  Se f é um fluxo máximo então não existe ciclo no qual todo arco conduz fluxo estritamente positivo.
  10. Certo ou errado?  Existe um fluxo máximo f tal que, para todo ciclo, f é nulo em algum arco do ciclo.
  11. Certo ou errado?  Se as capacidades forem distintas duas a duas, o fluxo máximo é único.
  12. [Sedgewick 22.3] Fluxo em quase-árvore radicada.  Seja G um grafo capacitado com vértice inicial s e vértice final t. Suponha que o grafo G − t é uma árvore radicada com raiz s.  Descreva um algoritmo para calcular um fluxo máximo que respeite as capacidades.
  13. Fluxo em dags.  Mostre que a restrição do problema do fluxo máximo a dags não torna o problema mais fácil.
  14. Emparelhamento bipartido.  Mostre que problema do emparelhamento máximo num grafo não-dirigido bipartido é, essencialmente, um caso especial do problema do fluxo máximo.