• Nenhum resultado encontrado

Corte globalmente mínimo

No documento Curso de Otimização Combinatória (páginas 93-97)

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.)

No documento Curso de Otimização Combinatória (páginas 93-97)