Dados conjuntos W e R de nós de um grafo G, dizemos que R divide W se R separa dois nós de W . Em outras palavras, R divide W se W ∩ R 6= ∅ e W ∩ R 6= ∅. Se R divide W , diremos também que ∂(R) divide W .
Um corte ∂(R) é W -mínimo se tiver capacidade mínima no conjunto de todos os cortes que dividem W . (Esta é a segunda definição da expressão “corte mínimo” .) É claro que a capacidade de um corte W -mínimo é o mínimo das capacidades dos cortes (r, s)- mínimos para todos os pares (r, s) de nós de W . Um corte V (G)-mínimo também é chamado globalmente mínimo.
EXEMPLO 4: Seja (T, u) um grafo capacitado em que T é uma árvore não-dirigida. Seja a uma aresta de capacidade mínima. Então {a} é um corte globalmente mínimo de (T, u).
EXEMPLO5: Seja (C, u) um grafo capacitado em que C consiste em um circuito. Seja a uma aresta de capacidade mínima de C e b uma aresta de capacidade mínima de C − a. Então {a, b} é um corte globalmente mínimo de (C, u).
Problema 6.4 (corte mínimo) Dado um grafo capacitado (G, u) e um subconjunto W de V (G), encontrar um corte W -mínimo.
Diremos que W é um conjunto de terminais e que os elementos de W são nós ter- minaisdo grafo. Uma instância do problema tem solução se e somente se há dois ou mais nós terminais. Se há exatamente dois nós terminais, o problema 6.4 é um caso particular do problema do (fluxo máximo e) corte mínimo discutido na seção3.5. As instâncias do problema6.4que têm k nós terminais podem ser resolvidas mediante k(k − 1)/2 invocações de um algoritmo de fluxo máximo e corte mínimo. (Veja o exercício 3.38, página 39.) Gomory e Hu propuseram um algoritmo que faz apenas k − 1cálculos de fluxo máximo e corte mínimo para resolver o problema. O seguinte teorema resume a ideia:
Teorema 6.5 (Gomory e Hu) Seja W um conjunto de dois ou mais nós de um grafo capacitado (G, u). Para quaisquer dois nós r e s de W e qualquer corte (r, s)-mínimo ∂(R)tem-se
cap(G, u, W ) = min cap(G0, u0, W ∩ R), u(R), cap(G00, u00, W ∩ R) ,
sendo (G0, u0)o grafo capacitado que resulta da contração de R e (G00, u00)o grafo capa-
Nesse enunciado, cap(G, u, W ) denota a capacidade de um corte W -mínimo em (G, u). Se |W | < 2, adotamos a convenção cap(G, u, W ) := ∞.
ESBOÇO DA PROVA: Seja ∂(Z) um corte W -mínimo em (G, u). É claro que u(Z) = cap(G, u, W ). Começamos por mostrar que
u(Z) ≤ min (α0, u(R), α00) ,
sendo α0 := cap(G0, u0, W ∩ R) e α00 := cap(G00, u00, W ∩ R). Se α0 = ∞, é evidente que u(Z) < α0. Suponha agora que α0 < ∞. Pode-se dizer que qualquer corte (W ∩ R)-mínimo em G0 divide W em G e, em virtude de (2) na seção 6.3, tem a mesma
capacidade em (G0, u0) e (G, u). Portanto, u(Z) ≤ α0. Um argumento análogo mostra que u(Z) ≤ α00. Finalmente, u(Z) ≤ u(R) pois ∂(R) divide W .
Resta mostrar que u(Z) ≥ α0ou u(Z) ≥ α00ou u(Z) ≥ u(R). Há três casos a considerar: Caso 1: ∂(Z) divide W ∩R. Seja p um nó em W ∩R∩Z e q um nó em W ∩R∩Z. O corte ∂(Z)é (p, q)-mínimo. Como p e q estão em R, o lema6.2garante que X ⊆ R para algum corte (p, q)-mínimo ∂(X). É claro que u(X) = u(Z). Como X é subconjunto de V (G0)
e divide W ∩ R, temos u0(X) ≥ α0. De acordo com (2) na seção 6.3, u0(X) = u(X). Portanto, u(Z) ≥ α0.
Caso 2: ∂(Z) divide W ∩R. Um argumento análogo ao do caso 1 mostra que u(Z) ≥ α00. Caso 3: ∂(Z) não divide W ∩ R nem W ∩ R. Como ∂(Z) divide W , temos Z = R ou Z = R. Portanto, u(Z) = u(R).
O teorema leva imediatamente ao seguite algoritmo, que recebe um grafo capacitado (G, u) e um conjunto W com 2 ou mais nós e devolve uma margem de um corte W - mínimo: CORTEMÍNIMO(G, u, W ) |W | ≥ 2 01 sejam r e s dois nós de W 02 R ← MAXFLOWMINCUT(G, u, r, s) 03 se |W ∩ R| ≥ 2 04 então (G0, u0) ←CONTRAÇÃO G, u, R 05 R0 ← CORTEMÍNIMO(G0, u0, W ∩ R)
06 se u(R0) < u(R)então R ← R0 u(R0) = u0(R0)
07 se |W ∩ R| ≥ 2
08 então (G00, u00) ←CONTRAÇÃO(G, u, R) 09 R00← CORTEMÍNIMO G00, u00, W ∩ R
10 se u(R00) < u(R)então R ← R00 u(R00) = u00(R00)
11 devolva R
Na linha 02, a rotina MAXFLOWMINCUTimplementa um algoritmo de fluxo máximo e corte mínimo, como o da seção 3.6, na página 38. A rotina recebe dois nós r e s e devolve uma das margens de um corte (r, s)-mínimo. (Também devolve um fluxo máximo, mas esse é ignorado.)
que resulta da contração de R. O propósito da contração de R na linha 04 é garantir que os cortes calculados por CORTEMÍNIMOna linha 05 não dividam R.
O terceiro argumento das várias invocações recursivas de CORTEMÍNIMO é sempre um subconjunto do conjunto original de terminais, ou seja, o terceiro argumento nunca inclui nós contraídos. Por outro lado, cada nó contraído contém, em geral, nós criados por contrações anteriores.
EXEMPLO 6 (ÁRVORE): Seja G o grafo capacitado representado pela matriz de adjacências-e- capacidades abaixo. Faça uma figura e observe que G é uma árvore não-dirigida.
a b c d e f a − 1 − − − − b 1 − 2 − 3 − c − 2 − − − − d − − − − 4 − e − 3 − 4 − 5 f − − − − 5 −
Aplique o algoritmo CORTEMÍNIMOao grafo capacitado (G, u) com W = V (G). Suponha que r = be s = e na linha 01 e R = {a, b, c} na linha 02. O grafo G0tem conjunto de nós {a, b, c, R} mas apenas os nós a, b e c são considerados terminais. Depois da linha 05, podemos ter R0 = {a}(ou R0= {b, c, R}). O grafo G00tem conjunto de nós {R, d, e, f } mas apenas os nós d, e e f são terminais. Depois da linha 09, podemos ter R00= {d}. (Observe que a coleção {R, R0, R00} é laminar, podendo ser representada pela expressão ((a) b c) (d).) Como u(R) = 3, u(R0) = 1e u(R00) = 4o algoritmo devolve R0na linha 11.
EXEMPLO 7 (CIRCUITO): Seja G o grafo representado pela matriz de adjacências-e-capacidades abaixo. Faça uma figura e observe que G consiste em um circuito com 4 nós.
a b c d a − 7 − 5 b 7 − 3 − c − 3 − 2 d 5 − 2 −
Submeta (G, u, W ) ao algoritmo CORTEMÍNIMOcom W = V (G). Suponha que r = a e s = b na linha 01. No fim da linha 02 teremos R = {a, d} e u(R) = 9. No fim da linha 05 teremos R0 = {d}e u(R0) = 7. No fim da linha 09 teremos R00= {c}e u(R00) = 5. Portanto, cap(G, u, W ) = min (7, 9, 5) = 5. (Ao longo de todas as invocações recursivas de CORTEMÍNIMO, a variável R
assume os valores {a, d}, {d} e {c}. Essa coleção de conjuntos é laminar, podendo ser representada pela expressão ((d) a) (c).)
EXEMPLO8: Aplique o algoritmo CORTEMÍNIMOao grafo capacitado (G, u) da figura com W = V (G). (A figura foi copiada decseweb.ucsd.edu/classes/fa06/cse202/Gomory-Hu%20Tree.pdf.) A tabela à direita da figura mostra os sucessivos valores das variáveis r, s e R. O algoritmo devolve o conjunto de nós {h, i}. (A coleção de todos os valores que R assume é laminar, podendo ser representada pela expressão (g (j)) (h (i)).)
r s R u(R) e j g j 5 g j j 5 e h h i 2 h i i 4
EXEMPLO9: Podemos repetir o exemplo 8 fazendo escolhas diferentes de r, s e R. Veja o resultado na tabela abaixo. O algoritmo devolve {e, g, j}. (A coleção de todos os conjuntos R pode ser representada pela expressão (e (g (j))) (h).)
r s R u(R) e h e g j 2 e j g j 5 g j j 5 h i h 4
Se o grafo G estiver representado por uma figura numa folha de papel, o algoritmo CORTEMÍNIMO pode ser executado de maneira informal e iterativa. As contrações não precisam ser feitas explicitamente. No início de cada iteração, teremos um coleção laminar R de subconjuntos de V . Cada elemento de R é indicado na figura por uma “bola”, como num diagrama de Venn. Em cada iteração, escolha dois nós terminais p e q que não estejam separados por nenhum elemento de R e encontre um conjunto R que tenha as seguintes propriedades: separe p de q, minimize u(R), e seja laminar com relação a R. Feito isso, acrescente R a R e comece nova iteração.
Consumo de tempo. O consumo de tempo do algoritmo CORTEMÍNIMOé proporci- onal ao número de invocações do algoritmo MAXFLOWMINCUT. Se denotarmos por f (k)o número máximo de invocações ao processar um grafo com k terminais, teremos f (1) = 0e f (k) = 1 + max (f (k0) + f (k00))para k ≥ 2, sendo max tomado sobre todos os pares (k0, k00)de inteiros positivos tais que k0 + k00 = k. Portanto,
f (k) = k − 1
para todo k ≥ 1. Assim, o consumo de tempo do algoritmo é O(k F (n, m)), sendo F (n, m)o consumo de MAXFLOWMINCUTpara um grafo com n nós e m arestas. Como k ≤ ne F (n, m) = O(nm), podemos dizer que o algoritmo consome O(n2m)unidades
de tempo.
O algoritmo CORTEMÍNIMO não é muito rápido. Outros algoritmos para o pro- blema6.4têm o mesmo consumo assintótico mas são mais rápidos porque a constante escondida na notação O() é menor. (Surpreendentemente, alguns desses algoritmos não usam qualquer algoritmo de fluxo máximo e corte mínimo.) Apesar disso, é im- portante discutir o algoritmo CORTEMÍNIMO porque ele é a porta de entrada para o algoritmo mais abrangente a ser estudado em seguida.
Exercícios
6.6 Complete a prova do teorema6.5.
6.7 Cortes mínimos em árvores. Descreva um algoritmo especializado que resolva as instâncias do problema6.4em que G é uma árvore não-dirigida.
6.8 Cortes mínimos em circuitos. Descreva um algoritmo especializado que resolva as instâncias pro- blema6.4em que G consiste em um circuito e nada mais.
6.9 Grafo teta. Seja H um grafo conexo cada um de cujos nós tem grau 2 ou 3. Suponha que exatamente dois dos nós têm grau 3. Seja u uma função-capacidade para H. Qual a capacidade de um corte globamente mínimo em (H, u)?
6.10 Reescreva o código do algoritmo CORTEMÍNIMO de modo que ele também aceite grafos com apenas um nó terminal. (Será preciso inventar uma convenção apropriada para representar uma solução nesse caso extremo.)