Algoritmos para Grafos | Índice
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.
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 s e t 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 s a t
.)
É fácil mostrar a seguinte propriedade do fluxo:
o saldo de f em t é igual
ao saldo de f em s com sinal trocado.
A 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
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 - - - - - -
0-1 0-2 1-2 1-3 2-3 15 11 5 10 16
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
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
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.]
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
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.)
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
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.)
sobrapode ser representada por uma coleção de ciclos.
somados caminhos da coleção. A intensidade do fluxo deve ser igual a ∑C ε(C).
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).
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?
0-1 0-2 1-2 1-3 2-3 12 15 20 19 11
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
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