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 otimização combinatória. O correspondente teorema Max-flow Min-cut é uma poderosa ferramenta com muitas aplicações.

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

2.1 Fluxo

Um fluxo em um grafo dirigido $D$ é qualquer função de $E(D)$ em $\Rplus$. Em outras palavras, um fluxo é uma função que atribui um número real não-negativo a cada arco de $D$.  [Poderíamos nos restringir aos números racionais, uma vez que computadores digitais não conhecem números irracionais.]

Se $x$ é um fluxo e $R$ é um conjunto de nós do grafo, denotamos por  $x(\cutin(R))$  a soma dos valores de $x$ nos arcos de $\cutin(R)$, ou seja, nos arcos que entram em $R$.  Convém simplificar essa expressão e escrever apenas $\xin(R)$. Portanto, \[\textstyle \xin(R) := \sum \left( x_{uv} : uv \in \cutin(R) \right)\text{.} \]

Analogamente, denotamos por $\xout(R)$ a soma dos valores de $x$ nos arcos que saem de $R$: \[\textstyle \xout(R) := \sum \left( x_{vw} : vw \in \cutout(R) \right)\text{.} \]

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

É claro que $\xout(R) = \xin(\compl{R})$, sendo $\compl{R} := \text{}$ $V(D)\setm 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 $\xinout(R)$: \[ \xinout(R) := \xin(R) \ - \ \xout(R)\:\text{.} \]

Se $R=\conj{v}$, escrevemos simplesmente $\xinout(v)$, $\xin(v)$ e $\xout(v)$.

Lema 2.1 (soma de excessos) Para qualquer fluxo $x$ em um grafo dirigido $D$ e qualquer subconjunto $R$ de $V(D)$, a soma dos excessos nos nós de $R$ é igual ao excesso em $R$: \[\textstyle \sum_{v\in R}\, \xinout(v) = \xinout(R)\,\text{.} \]

Prova: Para mostrar que $\sum_{v\in R} \xin(v) - \sum_{v\in R} \xout(v) = \text{}$ $\xin(R)-\xout(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 $x_{ij}$ para a primeira somatória e $x_{ij}$ para a 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 $\compl{R}$.

Um arco que entra em $R$ contribui apenas para a primeira somatória do lado esquerdo e para o primeiro termo do lado direito. Analogamente, um arco que sai de $R$ contribui apenas para a segunda somatória do lado esquerdo e o segundo termo do lado direito. Resumindo: cada arco com uma ponta em $R$ e outra em $\compl{R}$ dá a mesma contribuição para os dois lados da igualdade. ■

Circulação

Uma circulação (= circulation) em uma grafo dirigido é qualquer fluxo que tenha excesso nulo em cada nó. Mais precisamente, uma circulação é qualquer fluxo $x$ tal que \[ \xinout(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 igualdade $\xout(R) = \xin(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 $C_1,\ldots,C_j$ é uma família de ciclos dirigidos e $x_e$ é 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 ciclos dirigidos simples $C_1,\ldots,C_j$, com $j \leq m$, e números positivos $\alpha_1, \ldots, \alpha_j$ tais que $\sum_{C_i \ni e} \alpha_i = x_e$ para cada arco $e$.

Esboço da prova: Seja $E'$ o suporte de $x$, isto é, o conjunto dos arcos $e$ tais que $x_e\neq 0$. Se $E'$ é vazio, a conclusão do lema vale com $j=0$. Senão, seja $D'$ o subgrafo de $D$ induzido por $E'$. Como $\xin(v) = \xout(v) \neq 0$ para cada nó $v$, o grafo $D'$ tem um ciclo dirigido simples, digamos $C$. Seja $\alpha := \min_{e\in E(C)} x_e$ e subtraia $\alpha$ de $x_e$ para cada arco $e$ de $C$. Essa operação produz uma nova circulação. Repita o processo com a nova circulação. ■

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

\[ \begin{array}[t]{l@{\quad}*{10}{c}} & 02& 03& 04& 12& 14& 24& 34& 35& 45& 51 \\[0.0ex] x & 0& 0& 0& 2& 1& 2& 0& 0& 3& 3 \end{array} \]
figs/mine/diwheel6-k.png

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.

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  $\xinout(s)\geq 0$  e \[ \xinout(v) = 0 \]

para todo nó $v$ distinto de $r$ e de $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$: \[ \intens(x) := \xinout(s)\text{.} \] (É preciso ficar atento para não confundir $\intens$ com inteiro!)

Dizemos que um conjunto $R$ de nós separa $r$ de $s$ se $r\in R$ e $s\notin 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 $\intens(x) = - \xinout(R)$, ou seja, a intensidade de $x$ é igual à diferença $\xout(R) - \xin(R)$. ■

Em particular, a intensidade do fluxo $x$ é igual ao excesso de $x$ em $r$ com sinal trocado, ou seja, $\intens(x) = - \xinout(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 $P_1,\ldots,P_k$ é uma família de caminhos dirigidos de $r$ a $s$ e $x_e$ é 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:

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 $C_1,\ldots,C_j$ e caminhos dirigidos simples $P_1,\ldots, P_k$ de $r$ a $s$, com $j+k \leq m$, e existem números positivos $\alpha_1,\ldots,\alpha_j,$ $\beta_1,\ldots,\beta_k$, tais que $\beta_1+\cdots+\beta_k = \text{}$ $\intens(x)$  e \[\textstyle \sum_{C_i \ni e} \alpha_i + \sum_{P_i \ni e} \beta_i = x_e \] para cada arco $e$.

Esboço da prova: Seja $E'$ o suporte de $x$. Seja $D'$ o grafo $(V,E')$. Graças ao lema 2.1, se $\intens(x) > 0$ então existe um caminho dirigido de $r$ a $s$ em $D'$. Seja $P$ esse caminho e $\beta := \min_{e\in E(P)} x_e$. Subtraia $\beta$ de $x_e$ para cada $e$ em $P$. Isso produz um novo fluxo de $r$ a $s$. A intensidade do novo fluxo é $\intens(x)-\beta$. 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. ■

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

\[ \begin{array}[t]{l@{\quad}*{10}{c}} & 02& 03& 04& 12& 14& 24& 34& 35& 45& 51 \\[0.0ex] x & 1& 3& 2& 0& 4& 1& 0& 3& 7& 4 \end{array} \]
figs/mine/diwheel6-k.png

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.

Exercícios 2.1

  1. Se $x$ é um fluxo e $R$ um conjunto de nós, é verdade que $\sum ( \xin(v) : v\in R ) = \xin(R)$?
  2. Complete os detalhes da prova do lema 2.3.
  3. Seja $x$ um fluxo de $r$ a $s$ e $x'$ uma circulação. Mostre que $x+x'$ é um fluxo de $r$ a $s$ e que $\intens(x+x') = \intens(x)$.
  4. Seja $x$ um fluxo em um grafo dirigido. Seja $T$ o conjunto de todos os nós $t$ para os quais $\xinout(t) \neq 0$. Mostre que se $|T|\leq 2$ então $x$ é um fluxo de $r$ a $s$ para algum par $(r,s)$ de nós.
  5. Prove os lemas 2.42.5.
  6. Por que podemos supor que $j\leq 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\leq m$ no lema 2.5?

2.2 O problema do fluxo máximo

Seja $D$ um grafo dirigido e $u$ uma função que leva $E(D)$ em $\Rplus$.  [A letra $u$ é a inicial de upper bound. Não haveria prejuízo se disséssemos que $u$ leva $E(D)$ em $\Qplus$.]  Dizemos que $u$ é uma função-capacidade 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 $u_e$ 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 \leq u$, ou seja, se $x_{e} \leq u_{e}$ para cada arco $e$.

Problema 2.A (fluxo máximo) Dados nós $r$ e $s$ de uma rede capacitada $(D,u)$, encontrar 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 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).

Exercícios 2.2

  1. Seja $x$ um fluxo máximo numa rede $(D,u,r,s)$. É verdade que $\xin(r)$ e $\xout(s)$ são nulos?
  2. Mostre que toda instância do problema 2.A tem um fluxo máximo.
  3. ★ Calcule um fluxo máximo numa rede de fluxo $(D,u,r,s)$ em que $D$ é uma árvore divergente.
  4. 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 $x_{sr}$.
  5. 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]
  6. 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$ equivale a uma instância do problema 2.A.

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 $\cutout(R)$ é a soma das capacidades dos arcos que saem de $R$. Essa soma é denotada por $u(\cutout(R))$. Para simplificar, podemos até escrever $\uout(R)$. Portanto, \[\textstyle \uout(R) := \sum_{e\in \cutout(R)} u_e\,\text{.} \] É conveniente ter uma notação especial para a capacidade de um corte. Assim, se $C:=\cutout(R)$ então \[ \capac(C) := \uout(R)\,\text{.} \]

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

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

\[ \begin{array}[t]{l@{\quad}cccc} & r & v & w & s \\[0.5ex] r & - & 1 & 1 & - \\ v & - & - & 1 & 1 \\ w & - & - & - & 1 \\ s & - & - & - & - \end{array} \hspace{6ex} \begin{array}[t]{cccccc} rv & rw & vw & vs & ws \\[0.5ex] 7 & 9 & 4 & 9 & 7 \end{array} \]
figs/sch17/fig-4dot3-x.png

Os conjuntos $R_1=\conj{r,v}$, $R_2=\conj{r,w}$ e $R_3=\conj{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 todo fluxo viável:

Lema 2.6 (fluxo versus corte) Para qualquer fluxo $x$ de $r$ a $s$ que respeita as capacidades  e  qualquer corte $C$ que separa $r$ de $s$, vale a desigualdade $\intens(x) \leq \capac(C)$. ■

O lema leva ao seguinte critério de maximalidade para fluxos: dado um fluxo viável $x$, se $\intens(x) = \capac(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 $\capac(C) = \intens(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$.

Exercícios 2.3

  1. ★ Prove o lema 2.6.
  2. Seja $(D,u,r,s)$ uma rede capacitada e $\alpha$ um número positivo. É verdade que todo $(r,s)$-corte mínimo continua sendo mínimo se multiplicarmos a capacidade de cada arco por $\alpha$?  É verdade que todo $(r,s)$-corte mínimo continua sendo mínimo se somarmos $\alpha$ à capacidade de cada arco? [AMO 6.34]
  3. Calcule um corte mínimo numa rede de fluxo $(D,u,r,s)$ em que $D$ é uma árvore divergente.
  4. Submodularidade. Sejam $X$ e $Y$ dois conjuntos de nós numa rede capacitada $(D,u)$. Prove a seguinte propriedade submodular:  $\uout(X\cup Y) + \uout(X\cap Y) \leq \text{}$ $\uout(X) + \uout(Y)$.  (Dica: Mostre antes que $\cutout(X\cup Y) \cup \cutout(X\cap Y) \subseteq \text{}$ $\cutout(X) \cup \cutout(Y)$ e $\cutout(X\cup Y) \cap \cutout(X\cap Y) = \text{}$ $\cutout(X) \cap \cutout(Y)$.)
  5. Sejam $\cutout(X)$ e $\cutout(Y)$ dois $(r,s)$-cortes mínimos numa rede de fluxo $(D,u,r,s)$. Prove que $\cutout(X\cap Y)$ e $\cutout(X\cup Y)$ também são $(r,s)$-cortes mínimos. (Dica: Veja o exercício Submodularidade acima.)  [CCPS 3.7]
  6. 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]
    \[ \begin{array}{lcccccc} & r & t & u & v & w & s\\[0.5ex] r & - & 1 & 1 & 1 & - & -\\ t & - & - & 1 & - & - & -\\ u & - & - & - & 1 & - & 1\\ v & - & - & - & - & 1 & 1\\ w & - & - & - & - & - & 1\\ s & - & - & - & - & - & - \end{array} \]

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

Surpreendentemente, a recíproca do critério de maximalidade enunciado depois do lema 2.6 é verdadeira. A prova desse fato foi publicada (1956) por Ford e Fulkerson e por Kotzig:

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 $\intens(x) = \capac(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 diretos 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

$x_{e} \lt u_e\ph{0}$  para cada arco direto $e$ de $P$  e
$x_{e} > 0\ph{u_e}$  para cada inverso $e$ de $P$.

Um caminho de aumento (= augmenting path) é qualquer caminho compatível com $x$ que vai $r$ a $s$.largura (= width) de um caminho de aumento $P$ é o maior número $\epsilon$ tal que $x_e - \epsilon \geq 0$ para cada arco inverso $e$ de $P$  e  $x_e + \epsilon \leq u_{e}$ para cada arco direto $e$ de $P$. Dada a largura $\epsilon$ de um caminho de aumento $P$, podemos executar a seguinte operação de envio de $\epsilon$ unidades de fluxo ao longo de $P$:

para cada arco direto $e$ de $P$, some $\epsilon$ a $x_e$;
para cada arco inverso $e$ de $P$, subtraia $\epsilon$ de $x_e$.

Essa operação produz um novo fluxo que é viável e tem intensidade $\intens(x) + \epsilon$. Como $\epsilon$ é positivo, a intensidade do novo fluxo é maior que a de $x$.

Prova do teorema 2.7: Seja $x$ um fluxo máximo. Queremos encontrar um corte que separe $r$ de $s$ e tenha capacidade igual a $\intens(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\in 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 $\epsilon$ a largura de $P$. O envio de $\epsilon$ 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 \notin R$ e portanto $R$ separa $r$ de $s$.

A definição de $R$ garante que $x_{e} = u_{e}$ para cada $e$ em $\cutout(R)$ e $x_{e} = 0$ para cada $e$ em $\cutin(R)$. Em outras palavras, todos os arcos que saem de $R$ estão cheios de fluxo, e todos os arcos que entram em $R$ estão vazios de fluxo. Portanto, \[ \xout(R) = \uout(R) \quad\mbox{e}\quad \xin(R) = 0\,\text{.} \] O lema 2.4 permite dizer então que $\xout(R) - \xin(R)$ $\text{} = \uout(R)$. Assim, $\intens(x) = \text{}$ $\capac(\cutout(R))$, como queríamos mostrar. ■

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

\[ \begin{array}{l@{\quad\enspace}ccccc} & rv& rw& vw& vs& ws \\[0.3ex] u & 7& 9& 4& 9& 7 \\ x & 7& 5& 2& 5& 7 \end{array} \]

A sequência de nós $\seq{r,w,v,s}$ define um caminho de aumento. A largura desse caminho é $2$. É fácil calcular o fluxo $x'$ 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:

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 $x_e = u_e$ para cada $e$ em $\cutout(R)$ e $x_e = 0$ para cada $e$ em $\cutin(R)$. ■

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

\[ \begin{array}[t]{l@{\quad\enspace}cccccc} & rv & rw & vw & vs & ws \\[0.3ex] u & 7 & 9 & 4 & 9 & 7 \\ x & 7 & 7 & 0 & 7 & 7 \end{array} \]

O conjunto $R=\conj{r,w}$ é a margem negativa de um corte de capacidade $14$. Temos $\intens(x) = \capac(\cutout(R))$. Observe que $\xout(R)=\uout(R)$ e $\xin(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_x \, \intens(x) \ = \ \min_C \, \capac(C)\,\text{,} \] sendo $\max_x$ tomado sobre todos os fluxos viáveis $x$ e $\min_C$ tomado sobre todos os cortes $C$ que separam $r$ de $s$. ■

Fluxos inteiros

Um fluxo $x$ é inteiro se $x_e \in \Zplus$ para todo arco $e$. Analogamente, uma função-ca­pa­ci­da­de $u$ é inteira se $u_e \in \Zplus$ para todo $e$. Surpreendentemente, basta que a função-ca­pa­ci­da­de 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­pa­ci­dade $u$ é inteira então algum fluxo viável máximo é inteiro.

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

Exercícios 2.4

  1. Seja $\epsilon$ 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 $\epsilon$ unidades de fluxo ao longo de $P$ produz um novo fluxo viável. Prove que a intensidade do novo fluxo é $\intens(x) + \epsilon$.
  2. Seja $x$ um fluxo viável e $P$ um caminho de aumento de largura máxima. Seja $\epsilon$ a largura de $P$. Seja $x'$ o fluxo resultante do envio de $\epsilon$ unidades de fluxo ao longo de $P$. Um caminho de aumento para $x'$ pode ter largura maior que $\epsilon$? [CCPS 3.10]
  3. Prove condições necessárias para que uma rede $(D,u,r,s,k)$ tenha um fluxo viável $x$ de intensidade $\geq k$.
  4. Discuta o seguinte problema: dada uma rede de fluxo $(D,u,r,s)$ e um número inteiro $k$, encontrar um fluxo viável que tenha intensidade igual a $k$.
  5. 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$.
  6. Curiosidade. Discuta o seguinte problema: dada uma rede de fluxo $(D,u,r,s)$, encontrar um conjunto $R$ de nós que separe $r$ de $s$ e minimize a diferença $\uout(R)-\uin(R)$. [CCPS 3.9]
  7. Encontre um fluxo máximo na rede de fluxo descrita a seguir por sua matriz de adjacências e vetor de capacidades.
    \[ \begin{array}[t]{l@{\quad}ccccc} & rv & rw & vw & vs & ws \\[0.5ex] r & -1 & -1 & & & \\ v & +1 & & -1 & -1 & \\ w & & +1 & +1 & & -1 \\ s & & & & +1 & +1 \end{array} \qquad \begin{array}[t]{cccccc} rv & rw & vw & vs & ws \\[0.5ex] 9 & 7 & 4 & 7 & 9 \end{array} \]
  8. 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]
    \[ \begin{array}{lccccccc} & 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 & - \end{array} \]
  9. ★ 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]
  10. 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 Caminhos dirigidos disjuntos acima). 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]
  11. 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 $x'$ 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]
  12. Seja $x$ um fluxo máximo numa rede de fluxo $(D,u,r,s)$. Quais das seguinte afirmações são verdadeiras?  A. Se a capacidade de cada arco é um múltiplo de $\alpha$, então $x_{e}$ é múltiplo de $\alpha$ para cada arco $e$.  B. Se somarmos $\alpha$ à capacidade de cada arco, estaremos somando um múltiplo de $\alpha$ à intensidade do fluxo máximo. [AMO 7.9]

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:

Ford­Fulkerson $(D, \ u, \ r, \ s)$
01 . $x\larr 0$
02 . repita
03 .ooo $R\larr \text{}$ Caminhos­Com­patí­veis $(D,u,r,x)$
04 .ooo se $s\notin R$
05 .oooooo então devolva $x$ e $R$ e pare  $\rhd$ solução
06 .ooo $P \larr \text{}$ Caminho­De­Aumento $(D,u,r,x)$
07 .ooo $\epsilon_1 \larr \min\,(u_{e}-x_{e} : e\in \Eforward(P))$
08 .ooo $\epsilon_2 \larr \min\,(x_{e} : e\in \Ereverse(P))$
09 .ooo $\epsilon \larr \min\,(\epsilon_1,\epsilon_2)$
10 .ooo $x \larr \text{}$ Envia­Fluxo $(D,x,P,\epsilon)$

Na linha 05, $\cutout(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 Caminhos­Com­patí­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 Caminho­De­Aumento produz um caminho de aumento para $x$ (supondo que um tal caminho existe).

Nas linhas 07 e 08, a expressão $\Eforward(P)$ denota o conjunto dos arcos diretos do caminho $P$ e $\Ereverse(P)$ denota o conjunto dos arcos inversos de $P$.

Na linha 10, a rotina Envia­Fluxo envia $\epsilon$ unidades de fluxo ao longo do caminho $P$ e devolve o fluxo resultante.

Número de iterações. Se $u_e\in \Qplus$ para todo arco $e$ (ou seja, se as capacidades são números racionais) é possível mostrar que a execução do algoritmo 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 é apenas pseudo­polinomial.

Exercícios 2.5

  1. Descreva a rotina Envia­Fluxo em código.
  2. Aplique o algoritmo de Ford–Fulkerson a uma rede de fluxo $(D,u,r,s)$ em que $D$ é uma árvore divergente.
  3. Encontre um fluxo máximo de $r$ a $s$ e um $(r,s)$-corte mínimo na rede capacitada da figura. [CCPS 3.2]
  4. 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.
  5. 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?
  6. Capacidades inteiras. Aplique o algoritmo de Ford–Fulkerson a uma rede $(D,u,r,s)$ em que a função-ca­pa­ci­dade $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.

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 e Karp 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 $n m$ iterações.

Esboç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$. ■

Consumo de tempo. Para procurar caminhos de aumento de comprimento mínimo, basta implementar as rotinas Caminhos­Com­patí­veis e Caminho­De­Aumento conjuntamente usando uma adaptação da busca em largura. 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')$ definido assim: $vw \in E'$ se e somente se  $vw\in E(D)$ e $x_{vw} \lt u_{vw}$  ou  $wv\in E(D)$ e $x_{wv} > 0$. Os caminhos dirigidos nesse grafo auxiliar correspondem aos caminhos compatíveis com $x$ no grafo original.

Cada iteração desse algoritmo auxiliar consome $\Oh(m)$ unidades de tempo. Como o número de iterações não passa de $nm$, o algoritmo todo consome \[ \Oh(n m^2) \] unidades de tempo. Essa delimitação não depende de $u$, e portanto podemos dizer que o algoritmo é fortemente polinomial.

Exercícios 2.6

  1. Complete a prova do teorema 2.11.
  2. Escreva, em código, a versão Edmonds–Karp do algoritmo de Ford–Fulkerson.
  3. Caminho de aumento com número mínimo de arcos inversos. Suponha que, em cada iteração, o algoritmo de Ford–Fulkerson 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á $\Oh(m)$. Dê um algoritmo que encontre um caminho de aumento desse tipo em $\Oh(m)$ unidade de tempo. [CCPS 3.15]
  4. Suponha dado um fluxo máximo em uma rede de fluxo. Mostre como é possível encontrar um $(r,s)$-corte mínimo em tempo $\Oh(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]
  5. 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 $u'_{e} := m u_{e}+1$. Mostre que um corte mínimo na rede $(D,u',r,s)$ resolve o problema. [AMO 7.27]
  6. 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 $a_v$ 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]
  7. Análise de sensibilidade e arcos vitais. Numa rede $(D,u,r,s)$, um arco $a$ é vital se a redução de $u_{a}$ 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 $u_{a}$ é máximo.  B. Se $x$ é um fluxo máximo e $a$ é vital então $x_{a}$ é máximo.  C. Se $x$ é um fluxo máximo e $a$ é vital então existe um corte de capacidade mínima tal que $x_{a}\geq x_{e}$ 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]
  8. Análise de sensibilidade e arcos dispensáveis. Numa rede $(D,u,r,s)$, um arco $a$ é dispensável se a redução de $u_{a}$ 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 $x_{a}=0$ então $a$ é dispensável. B. Se $x$ é um fluxo máximo e $x_{a}$ é 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]
  9. Seja $D$ um grafo dirigido completo e $(D,u,r,s)$ uma rede de fluxo. Seja $\varphi$ a intensidade de um fluxo máximo na rede. Para cada par $(i,j)$ de nós, seja $\alpha[i,j]$ o aumento no valor de $\varphi$ que obteríamos se $u_{ij}$ fosse $\infty$.  A. Mostre que $\alpha[i,j]\leq \alpha[r,j]$ e $\alpha[i,j]\leq \alpha[i,s]$. B. Mostre que $\alpha[i,j] = \text{}$ $\min\left(\alpha[r,j],\alpha[i,s]\right)$. C. Mostre como $\alpha[i,j]$ pode ser calculado para todo par $(i,j)$ mediante resolução de $\Oh(n)$ problemas de fluxo máximo. [AMO 7.26]
  10. 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 $\Oh(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 $\Oh(km)$? [AMO 6.35]

2.7 Programação linear

O problema 2.A do fluxo máximo pode ser formulado muito naturalmente na linguagem da programação linear: dada uma rede de fluxo $(D,u,r,s)$, encontrar um vetor $(x_e : e\in E)$ que \begin{equation}\label{lp:max-flow-1} \begin{split} \text{maximize} \enspace \xinout(s) & \\ \text{sob as restrições} \enspace \xinout(v) & \ = \ 0 \enspace \text{para $v$ em $V\setm \conj{r,s}$}\\ x_e & \ \leq \ u_e \enspace \text{para $e$ em $E$}\\ x_e & \ \geq \ 0 \enspace \text{para $e$ em $E$} \end{split} \end{equation}

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 o pl \eqref{lp:max-flow-1} em notação matricial. Seja $A$ a matriz de incidências de $D$ e $\Id$ a matriz identidade indexada por $E\times E$. Além disso, adote as abreviaturas $V' := V\setm \conj{r,s}$, $A' := A[V',E]$ e $c := A[s,E]$. Com essa notação, o pl \eqref{lp:max-flow-1} fica assim: \begin{equation}\label{lp:max-flow-1-matrix} \begin{split} \text{maximize} \quad cx & \\ \text{sob as restrições} \quad A' x & \ = \ 0\\ \Id x & \ \leq \ u\\ x & \ \geq \ 0 \end{split} \end{equation}

sendo o primeiro $0$ o vetor nulo indexado por $V'$ e o segundo $0$ o vetor nulo indexado por $E$.

Programa dual.dual do pl \eqref{lp:max-flow-1-matrix} consiste em encontrar um vetor $(y'_v : v\in V')$ e um vetor $(z_e : e \in E)$ que \begin{equation}\label{lp:min-cut-1-matrix} \begin{split} \text{minimizem} \quad y'0+zu & \\ \text{sob as restrições} \quad y'A' + z\Id & \ \geq \ c\\ z & \ \geq \ 0\,\text{.} \end{split} \end{equation}

(Para comprovar a relação de dualidade, considere a sequência de desigualdades $cx \leq (y'A' + z \Id) x = \text{}$ $y' (A' x) + z (\Id x) = \text{}$ $y' 0 + zx \leq \text{}$ $y' 0 + zu$ que prova o teorema fraco da dualidade e observe que essa sequência usa todas as restrições dos dois pl's.)  Veja o pl \eqref{lp:min-cut-1-matrix} escrito por extenso: \begin{equation}\label{lp:min-cut-1} \begin{array}{rl} \text{minimize} \enspace \textstyle\sum (z_{vw}u_{vw} : vw \in E) & \\[0.5ex] \text{sujeito a} \enspace y'_w - y'_v + z_{vw} \geq \ph{-}0 & \text{ $vw$ em $E$ com $v$ e $w$ em $V'$} \\ \ph{y'_w} - y'_v + z_{vr}\hspace{0.5ex} \geq \ph{-}0 & \text{ $vr$ em $E$ com $v$ em $V'$} \\ y'_w \ph{{}- y'_r} + z_{rw}\hspace{0.2ex} \geq \ph{-}0 & \text{ $rw$ em $E$ com $w$ em $V'$} \\ \ph{y'_w} - y'_v + z_{vs}\hspace{0.5ex} \geq \ph{-}1 & \text{ $vs$ em $E$ com $v$ em $V'$} \\ y'_w \ph{{}- y'_s} + z_{sw}\hspace{0.2ex} \geq -1 & \text{ $sw$ em $E$ com $w$ em $V'$} \\ z_{rs}\hspace{0.7ex} \geq \ph{-}1 & \text{ se $rs \in E$} \\ z_{sr}\hspace{0.7ex} \geq -1 & \text{ se $sr \in E$} \\ z_{vw}\hspace{0.2ex} \geq \ph{-}0 & \text{ $vw$ em $E$.} \end{array} \end{equation}

Para tornar este pl mais simples, acrescentaremos duas componentes constantes ao vetor $y'$. Mais precisamente, substituiremos $y'$ por um vetor $y$ indexado por $V$ tal que $y_r := 1$, $y_s := 0$ e $y_v := y'_v$ para cada $v$ em $V'$. Com isso, as restrições $y_w - y_v + z_{vw} \geq 0$ podem ser aplicadas a todos os arcos sem exceção e absorvem as restrições $z_{rs} \geq 1$ se $rs \in E$ e $z_{sr} \geq -1$ se $sr \in E$.  O pl \eqref{lp:min-cut-1} pode então ser escrito assim: \begin{equation}\label{lp:min-cut-2} \begin{split} \text{minimize} \enspace \textstyle\sum (z_{vw}u_{vw} : vw \in E) & \\ \text{sob as restrições} \hspace{12ex} y_r \ & = \ 1 \\ y_s \ & = \ 0 \\ y_w - y_v + z_{vw} \ & \geq \ 0 \quad \text{para $vw$ em $E$} \\ z_{vw} \ & \geq \ 0 \quad \text{para $vw$ em $E$.} \end{split} \end{equation}

Para todos os efeitos, este é o dual do pl \eqref{lp:max-flow-1}.

O pl \eqref{lp:min-cut-2} está intimamente relacionado com o problema do corte mínimo. Com efeito, se $\cutout(R)$ é um corte que separa $r$ de $s$ e $y$ é o vetor característico de $R$ e $z$ é o vetor característico de $\cutout(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 \eqref{lp:min-cut-2} é o vetor característico de um corte que separa $r$ de $s$.

Outro programa linear

O problema do fluxo máximo (problema 2.A) pode também ser formulado como um programa linear que representa a decomposição de fluxos em caminhos e ciclos (lema 2.5). Se denotarmos por $\Pcal$ o conjunto de todos os caminhos dirigidos simples de $r$ a $s$, o problema pode ser formulado assim: encontrar um vetor $(w_P : P\in \Pcal)$ que \begin{equation}\label{lp:max-weight-collection-of-paths} \begin{split} \text{maximize} \enspace \textstyle\sum (w_P :P \in\Pcal) & \\ \text{sujeito a} \enspace \textstyle\sum (w_P : e \in P \in \Pcal) & \leq u_e \quad \text{para $e \in E$}\\ w_P & \geq 0 \quad \text{para $P \in \Pcal$.} \end{split} \end{equation}

O número de variáveis é enorme, pois $|\Pcal|$ 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 $(z_e : e\in E)$ que \begin{equation}\label{lp:cut-all-paths} \begin{split} \text{minimize} \enspace \textstyle\sum (z_eu_e : e \in E) & \\ \text{sujeito a} \enspace \textstyle\sum (z_e : e \in P) & \geq 1 \quad \text{para $P \in \Pcal$}\\ z_e & \geq 0 \quad \text{para $e \in E$.} \end{split} \end{equation}

(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 $\Pcal$ seja pelo menos $1$.)  Para qualquer corte que separa $r$ de $s$, o vetor característico $z$ do corte é solução viável de \eqref{lp:cut-all-paths}.

Exercícios 2.7

  1. Discuta as semelhanças e diferenças entre o pl \eqref{lp:max-flow-1} acima e o pl $(2)$ da seção 1.9, que procura um caminho mínimo de $r$ a $s$ num grafo.
  2. Verifique que o pl \eqref{lp:min-cut-1-matrix} é o dual o pl \eqref{lp:max-flow-1-matrix}. Reciprocamente, verifique que \eqref{lp:max-flow-1-matrix} é dual de \eqref{lp:min-cut-1-matrix}.
  3. Verifique que o pl \eqref{lp:min-cut-1} é idêntico ao pl \eqref{lp:min-cut-1-matrix}. Verifique que o pl \eqref{lp:min-cut-1} é equivalente ao pl \eqref{lp:min-cut-2}.
  4. Trocando fluxo por circulação. Suponha dada uma rede $(D,u,r,s)$ em que $sr$ é um arco e $u_{sr}$ é muito grande, maior que $\uout(r)$, por exemplo. Mostre que o problema do fluxo máximo \eqref{lp:max-flow-1} equivale ao problema encontrar uma circulação que maximize $x_{sr}$. Escreva o pl que represente esse segundo problema. Escreva o dual do pl.
  5. Mostre que qualquer corte que separa $r$ de $s$ corresponde a uma solução viável $(y,z)$ do pl \eqref{lp:min-cut-2} 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 \eqref{lp:min-cut-2}. (Sugestão: use o teorema 2.7 para obter uma solução ótima do pl \eqref{lp:max-flow-1}.)
  6. Prove que o pl \eqref{lp:cut-all-paths} é o dual do pl \eqref{lp:max-weight-collection-of-paths}. Reciprocamente, prove que \eqref{lp:max-weight-collection-of-paths} é dual de \eqref{lp:cut-all-paths}.

2.8 Poliedros e seus vértices

Para entender a relação entre os pl's \eqref{lp:max-flow-1} e \eqref{lp:min-cut-2} 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 desses poliedros?

O poliedro dos fluxos

Seja $X(D,u,r,s)$ o poliedro do pl \eqref{lp:max-flow-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.

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$ cujo arcos não estão vazios nem cheios de fluxo. (Veja o exercício abaixo.) 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)(ii) então $x$ é vértice do poliedro.

Exemplo 2.6: Considere a rede descrita abaixo por sua matriz de adjacências e sua função-ca­pa­ci­dade.

\[ \begin{array}[t]{r*{5}{r}} & rv & rw & vw & vs & ws \\[0.5ex] r & -1 & -1 & & & \\ v & +1 & & -1 & -1 & \\ w & & +1 & +1 & & -1 \\ s & & & & +1 & +1 \end{array} \hspace{5ex} \begin{array}[t]{*{5}{c}} rv & rw & vw & vs & ws \\[0.5ex] 7 & 9 & 4 & 9 & 7 \end{array} \]
figs/sch17/fig-4dot3-x.png
A seguir, as restrições do pl \eqref{lp:max-flow-1} escritas por extenso: \[ \begin{array}{*{5}{r}@{\enspace}c@{\enspace}l} x_{rv}& & {}-x_{vw}& {}-x_{vs}& & = & 0 \\ & x_{rw}& {}+x_{vw}& & {}-x_{ws}& = & 0 \\ x_{rv}& & & & & \leq & 7\\ & x_{rw}& & & & \leq & 9\\ & & \hg x_{vw}& & & \leq & 4\\ & & & \hg x_{vs}& & \leq & 9\\ & & & & \hg x_{ws}& \leq & 7\\ x_{rv}& & & & & \geq & 0\\ & x_{rw}& & & & \geq & 0\\ & & \hg x_{vw}& & & \geq & 0\\ & & & \hg x_{vs}& & \geq & 0\\ & & & & \hg x_{ws}& \geq & 0 \end{array} \]

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

\[ \begin{array}[t]{l@{\quad}rrrrr} & rv & rw & vw & vs & ws \\[0.5ex] % int x' & 7 & 7 & 0 & 7 & 7 \\ % máximo % 14 x''\ph{''} & 4 & 0 & 4 & 0 & 4 % 4 \end{array} \]

O vetor $x'''$ abaixo está em $X(D,u,r,s)$ mas não é vértice pois tanto $x'''+\d'''$ quanto $x'''-\d'''$ também estão no poliedro. Observe que o suporte de $\d'''$ é 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 o lema F.4).

\[ \begin{array}[t]{l@{\quad}*{5}{c}} & rv & rw & vw & vs & ws \\[0.5ex] x'''\ph{'} & 5 & 5 & 1 & 4 & 6 \\ % 10 \d''' & 0 & 0 & 0.5 &-0.5 & 0.5 % cam de aumento \end{array} \]

O vetor $x''''$ está em $X(D,u,r,s)$ mas não é vértice porque $x''''+\d''''$ e $x''''-\d''''$ estão no poliedro. Observe que o suporte de $\d''''$ é o caminho $(r,w,v,s)$.

\[ \begin{array}[t]{l@{\quad}*{5}{c}} & rv & rw & vw & vs & ws \\[0.5ex] x'''' & 7 & 6 & 1 & 6 & 7 \\ % 13 \d'''' & 0 & 0.2 &-0.2 & 0.2 & 0 % cam de aumento \end{array} \]

Já os vetores $x'$ e $x''$ 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 \eqref{lp:max-flow-1} é um vértice do poliedro $X(D,u,r,s)$.

Qualquer solução ótima do pl \eqref{lp:max-flow-1} é um fluxo máximo de $r$ a $s$. Portanto, qualquer algoritmo de programação linear — como o Simplex, por exemplo — resolve o problema 2.A. Mas é claro que um algoritmo especializado, como o de Edmonds–Karp, é mais eficiente.

O poliedro dos cortes

Seja $Y(D,r,s)$ o poliedro do pl \eqref{lp:min-cut-2}, isto é, o conjunto de todos os pares $(y,z)$ que satisfazem 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 $y_r=1$ e $y_s=0$. Faça $z_{pq} := \max\,(0,y_p-y_q)$ para todo arco $pq$. (Em outras palavras, se $y_q \geq y_p$ então $z_{pq}:=0$ e se $y_q \lt y_p$ então $z_{pq}:=y_p-y_q$.)  Com $z$ assim definido, o par $(y,z)$ pertence ao poliedro.

Exemplo 2.7: Considere novamente a rede do exemplo 2.6. Veja as restrições do pl \eqref{lp:min-cut-2} escritas por extenso: \[ \begin{array}{ll*{5}{l}@{\enspace}c@{\enspace}l} y_r& & & & & & & = & 1\\ y_s& & & & & & & = & 0\\ y_v&\ha {}-y_r&\hb {}+z_{rv}& & & & & \geq & 0\\ y_w&\ha {}-y_r& &\hb {}+z_{rw}& & & & \geq & 0\\ y_w&\ha {}-y_v& & &\hb {}+z_{vw}& & & \geq & 0\\ y_s&\ha {}-y_v& & & &\hb {}+z_{vs}& & \geq & 0\\ y_s&\ha {}-y_w& & & & &\hb {}+z_{ws}& \geq & 0\\ & &\hd z_{rv} & & & & & \geq & 0\\ & & &\hd z_{rw} & & & & \geq & 0\\ & & & &\hd z_{vw} & & & \geq & 0\\ & & & & &\hd z_{vs} & & \geq & 0\\ & & & & & &\hd z_{ws}& \geq & 0 \end{array} \] Veja a seguir uma amostra de elementos do poliedro $Y(D,r,s)$.

\[ \begin{array}{*{9}{l}} r & v & w & s & rv & rw & vw & vs & ws \\[0.5ex] 1 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & 0 \\ 1 & 0.5 & 1 & 0 & 0.5 & 0 & 0 & 0.5 & 1 \\ 1 & 0.5 & 0.5 & 0 & 0.5 & 0.5 & 0 & 0.5 & 0.5 \\ \end{array} \]

Muitos outros vetores de $Y(D,r,s)$ podem ser obtidos a partir desses se observarmos que, para todo $(y,z)$ em $Y(D,r,s)$ e qualquer $z'\geq z$, o vetor $(y,z')$ 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 $y_p$ por $y_p+1$ e trocarmos $z_{pq}$ por $z_{pq}+1$ para cada arco $pq$ que sai de $p$, o vetor modificado estará em $Y(D,r,s)$. Analogamente, se trocarmos $y_p$ por $y_p-1$ e $z_{qp}$ por $z_{qp}+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 característico é $y$. Então $r\in R$, $s\notin R$, $z_{pq}\geq 1$ para todo arco em $\cutout(R)$, e $z_{pq}\geq 0$ para os demais arcos. Se $(y,z)$ minimiza $zu$ e $u$ não tem componentes nulas, temos $z_{pq}=1$ para todo $pq$ em $\cutout(R)$ e $z_{pq}=0$ para todos os demais arcos. Assim, $z$ é o vetor característico de $\cutout(R)$.

Exercícios 2.8

  1. Mostre que o poliedro $X(D,u,r,s)$ é limitado e não é vazio.
  2. 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.
  3. Seja $x$ um vetor no 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.
  4. 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)$.
  5. Analise o poliedro $X(D,u,r,s)$ correspondente à rede descrita abaixo por sua matriz de adjacências e seu vetor de capacidades.
    \[ \begin{array}[t]{r*{5}{r}} & rv & rw & vw & vs & ws \\[0.5ex] r & -1 & -1 & & & \\ v & +1 & & -1 & -1 & \\ w & & +1 & +1 & & -1 \\ s & & & & +1 & +1 \end{array} \hspace{5ex} \begin{array}[t]{*{6}{c}} rv & rw & vw & vs & ws \\[0.5ex] 9 & 7 & 4 & 7 & 9 \end{array} \]
  6. 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 $\xin(r)=0$? \[ \begin{array}{rl} \text{maximize} \enspace \xinout(s) & \\ \text{sob as restrições} \enspace \xinout(v) = 0 & \enspace \text{para $v$ em $V\setm \conj{r,s}$}\\ x_e \geq 0 & \enspace \text{para $e$ em $E$.} \end{array} \]

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 $\infty$ a um arco $e$ da rede equivale a eliminar a restrição $x_e \leq u_e$. 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 correspondente 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 $\infty$ por um número suficientemente grande e assim voltar ao problema 2.A. Por exemplo, podemos substituir $\infty$ por um número maior que $\sum (u_e : e \in E')$, onde $E'$ o conjunto de arcos da rede que têm capacidade finita.

Exercícios 2.9

  1. Suponha que a função-ca­pa­ci­dade $u$ pode atribuir $\infty$ 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 $\infty$. (Dica: Enuncie e prove em separado a parte se e a parte somente se.) [CCPS 3.3]
  2. Suponha que a função-ca­pa­ci­dade $u$ pode atribuir $\infty$ 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 $\infty$. Seja $E'$ é o conjunto de $e$ tais que $u_e \lt \infty$. Mostre que, do ponto de vista do problema do fluxo máximo, podemos substituir a capacidade de cada arco que está em $E(D)\setm E'$ pelo número $1 + \sum ( u_e : e\in E')$. [AMO 6.23]
  3. Considere uma instância $(D,u,r,s)$ do problema do fluxo máximo e suponha que a função-ca­pa­ci­dade $u$ pode atribuir $\infty$ a alguns arcos. Quando $u_e = \infty$, a restrição $x_{e} \leq u_{e}$ do pl \eqref{lp:max-flow-1} deveria ser ignorada, fazendo desaparecer a componente $z_e$ de $z$ no pl dual \eqref{lp:min-cut-1}. Reescreva o pl's \eqref{lp:max-flow-1} da forma correta. Calcule o pl dual. Escreva as condições de folgas complementares para o par dual de pl's.