• Nenhum resultado encontrado

Algoritmo do emparelhamento perfeito

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

O problema do emparelhamento perfeito é um caso especial do problema7.1do empa- relhamento máximo. (Um emparelhamento é perfeito se cobre todos os nós.) Como já sugerimos ao tratar da fórmula de Tutte Berge e do teorema de Tutte, o caminho para encontrar um emparelhamento máximo passa pela nossa habilidade de encontrar um ep.

Problema 7.9 (do emparelhamento perfeito) Encontrar um emparelhamento perfeito num grafo.

Gostaríamos de ter um algoritmo que receba um grafo e produza um de dois objetos: um ep ou um conjunto de nós que viola a condição de Tutte (veja o teorema 7.5). O segundo objeto é uma prova de que o grafo não tem ep.

A ideia de um tal algoritmo já foi indicada na seção 7.2. Cada iteração começa com um emparelhamento e procura um caminho aumentador; se tiver sucesso, começa- nova iteração com um emparelhamento maior; se fracassar, encontra uma violação da condição de Tutte.

Árvores alternantes

Dado um emparelhamento M , o processo de procurar um caminho aumentador é iterativo. Cada iteração começa com uma coleção de caminhos alternantes, todos com origem em um nó exposto r. Essa coleção de caminhos constitui uma árvore M-alternante, conforme a definição a seguir.

Uma árvore T com raiz r é M -alternante se tem três propriedades: (a) r é exposto, (b) cada nó de T − r é coberto por uma aresta de M ∩ E(T ), e (c) para todo nó v de T , o caminho simples de r a v em T é M -alternante.

Dada uma árvore M -alternante T , denotamos por A(T ) o conjunto dos nós de T que estão à distância ímpar da raiz e por B(T ) o conjunto dos nós de T que estão à distância par da raiz. (Na figura, os nós de A(T ) são brancos e os de B(T ) são pretos.) É claro que |B(T )| = |A(T )| + 1.

Uma árvore M -alternante T cresce sempre que houver uma aresta, digamos vw, com v em B(T ) e w fora de T . (Uma tal aresta certamente não pertence a M .) Se o nó w for coberto por alguma aresta wz de M , as arestas vw e wz são acrescentadas a T produzindo uma nova árvore M -alternante. Se, por outro lado, o nó w for exposto, teremos um caminho M -aumentador. Nesse segundo caso, calculamos um novo em- parelhamento, maior que M , e começamos a construir uma nova árvore. Para uso futuro, encapsulamos esse processo em duas rotinas:

A rotina ESTENDEÁRVORErecebe G, M , T e vw tal que v ∈ B(T ), w /∈ V (T ) e w é coberto por M , determina a aresta wz de M que cobre w, acrescenta as arestas vw e wz a T , e devolve a árvore resultante.

A rotina AUMENTAEMP recebe G, M , T , r e vw tal que v ∈ B(T ), w /∈ V (T ) e wé exposto por M , determina o caminho simples P de r a v em T , e devolve o emparelhamento M ⊕ E(P0), sendo P0 a concatenação P com (v, w).

O processo que acabamos de descrever só chega ao fim quando não há mais arestas de G com uma ponta em B(T ) e outra fora de T . Quando isso acontece, toda aresta com uma ponta em B(T ) tem a outra ponta em A(T ) ∪ B(T ). (Nada impede que G também tenha arestas com uma ponta em A(T ) e outra fora de T .) Se toda aresta com uma ponta em B(T ) tem a outra ponta em A(T ), dizemos que a árvore T é frustrada. Proposição 7.10 Se um grafo G tem uma árvore M -alternante frustrada então G não tem emparelhamento perfeito.

PROVA: Adote as abreviaturas A := A(T ) e B := B(T ). Observe que cada nó de B constitui uma componente ímpar de G − A. Logo, oc(G − A) = |B| = |A| + 1 > |A|. De acordo com o teorema de Tutte (teorema7.5) isso mostra que G não tem empare- lhamento perfeito.

Suponha agora que uma aresta vw de G tem ambas as pontas em B(T ). Como o caminho simples de w a v em T tem comprimento par (por quê?), o grafo T + vw tem um circuito ímpar. Não é fácil lidar com esses circuitos ímpares. Felizmente, uma classe importante de grafos não tem circuito ímpar algum. Esse é o assunto da próxima seção.

Exercícios

7.30 Seja T uma árvore M -alternante e v e w dois nós em B(T ). Mostre que o caminho simples de v a wem T tem comprimento par.

O caso dos grafos bipartidos

Como se sabe, grafos bipartidos não têm circuitos ímpares. Assim, o esboço de algo- ritmo feito na seção anterior é suficiente no caso de grafos bipartidos.

Proposição 7.11 Seja G um grafo bipartido, M um emparelhamento de G, e T uma árvore M -alternante. Se nenhuma aresta de G liga B(T ) a V (G) r V (T ) então G não tem emparelhamento perfeito.

PROVA: Suponha por um momento que T não é frustrada e seja vw uma aresta de G tal que v ∈ B(T ) mas w /∈ A(T ). De acordo com hipóteses, w ∈ B(T ). A aresta vw e o caminho simples em T que vai de w a v formam um circuito ímpar. Isso é contraditório, pois grafos bipartidos não têm circuitos ímpares. Portanto, a árvore T é frustrada. Pela proposição7.10, G não tem ep.

Segue o código do algoritmo. (Note que o algoritmo não tem conhecimento explícito de uma bipartição do grafo.)

EMPBIPARTIDOPERFEITO (G)  G é bipartido 01 M ← ∅

02 seja r um nó exposto por M 03 T ← ({r}, ∅)

04 enquanto existe vw em E(G) com v ∈ B(T ) e w /∈ V (T ) faça 05 se w é coberto por M

06 então T ← ESTENDEÁRVORE(G, M, T, vw) 07 senão M ← AUMENTAEMP(G, M, T, r, vw)

08 se G tem nó exposto por M

09 então seja r um nó exposto por M

10 T ← ({r}, ∅)

11 senão devolva M e pare  M é perfeito

12 devolva A(T ) e pare  A(T ) viola a condição de Tutte

Esse algoritmo é essencialmente igual ao que foi descrito, em termos de fluxo máximo, na prova do teorema de K˝onig (teorema4.2, página44).

EXEMPLO4: Aplique o algoritmo EMPBIPARTIDOPERFEITOao grafo G representado pela matriz de adjacências abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

a b c d e f g h i a − 1 − − − − − − − b 1 − − − − − − − − c − − − 1 1 1 − − − d − − 1 − − − − − − e − − 1 − − − − − − f − − 1 − − − 1 − − g − − − − − 1 − 1 − h − − − − − − 1 − 1 i − − − − − − − 1 − a c g i b d e f h

Examine os nós em ordem alfabética. O algoritmo termina com a árvore frustrada T = ({e, c, d}, {ec, ed}), que tem raiz r = e. O emparelhamento é M = {ab, cd}. O algoritmo devolve o conjunto A(T ) = {c}, que viola a condição de Tutte. Note que o algoritmo termina antes de examinar o grafo todo. Repita o exemplo examinando os nós em alguma ordem diferente.

Exercícios

7.31 Seja G um grafo bipartido com bipartição (P, Q). Seja M um emparelhamento em G e T uma árvore M -alternante com raiz em P . Mostre que A(T ) ⊆ Q e B(T ) ⊆ P . Suponha agora que T é frustrada e mostre que N (B) ⊆ A(T ), sendo N (B) o conjunto de todos os vizinhos de nós de B. 7.32 Teorema de Hall. Seja G um grafo bipartido com bipartição (P, Q). Use o algoritmo EMPBIPAR-

TIDOPERFEITO para provar que G tem um emparelhamento de tamanho |P | se e somente se |N (B)| ≥ |B| para todo subconjunto B de P , sendo N (B) o conjunto de todos os nós em Q que são vizinhos de nós em B. (Sugestão: Se T é uma árvore alternante frustrada então N (B(T )) ⊆ A(T ) e |N (B(T ))| ≤ |A(T )| = |B(T )| − 1.)[CCPS 3.21]

7.33 Que acontece se o nó r escolhido na linha 02 do algoritmo EMPBIPARTIDOPERFEITOfor isolado (isto é, tiver grau 0)?

7.34 Aplique o algoritmo EMPBIPARTIDOPERFEITOao grafo com bipartição (P, Q) representado pela matriz binária P × Q abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

g h i j k l a 1 − − − − − b − 1 − − − − c − 1 1 − − − d − − − 1 − − e − − − 1 − − f − − − − 1 − a b c d e f g h i j k l

7.35 Aplique o algoritmo EMPBIPARTIDOPERFEITOao grafo G com bipartição (P, Q) representado pela matriz P × Q abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

e f g a 1 − 1 b − 1 1 c 1 1 1 d − − 1 a b c d e f g

7.36 ? Seja G o grafo bipartido com bipartição (P, Q) representado pela matriz P × Q abaixo. Execute o algoritmo EMPBIPARTIDOPERFEITOcomeçando com M = {f b, gc} e o nó exposto a. Faça figuras que mostrem o estado de coisas no início de cada iteração externa.

a b c d e f 1 1 1 − − g 1 1 1 1 1 h − − − − 1

7.37 Seja M um emparelhamento imperfeito em um grafo bipartido G. Suponha que, de alguma maneira, sei que M é máximo. Escreva um algoritmo que receba G e M e devolva um conjunto A que viola as condições de Tutte.

Flores e contrações

Retomemos a discussão que a subseção anterior interrompeu. Seja M um emparelha- mento qualquer de um grafo arbitrário G. Suponha que a construção de uma árvore M-alternante T chegou ao fim. Portanto, toda aresta de G com uma ponta em B(T ) tem a outra ponta em A(T ) ∪ B(T ).

Suponha que T não é frustrada. Então alguma aresta vw de G tem ambas as pontas em B(T ). Nesse caso, como já observamos acima, T + vw tem um circuito ímpar. Qualquer circuito desse tipo é conhecido como flor (= blossom). A contração da flor (veja a página102) preserva boa parte das estruturas: as arestas de M que sobrevivem à contração constituem um emparelhamento M0 e as arestas de T que sobrevivem à contração constituem uma árvore T0 que é M0-alternante. O nó que resulta da contra-

ção da flor pertence a B(T0).

EXEMPLO 5: Seja T a árvore M -alternante indicada pelas linhas contínuas da figura. As linhas interrompidas indicam arestas que não pertencem a T . Uma dessas arestas liga A(T ) a um nó exposto u que está fora de T . Há um caminho aumentador que começa em r, “desce” pela árvore até w, percorre wv, “volta” pela árvore até o vizinho de u, e finalmente chega a u. Mas a rotina AUMENTAEMPnão tem como usar esse caminho aumentador.

A aresta vw de G tem ambas as pontas em B(T ) e portanto o circuito de T + vw é uma flor. Depois da contração da flor, a rotina AUMENTAEMP é capaz de usar o caminho aumentador que estava invisível antes da contração.

A operação de contração pode ser encapsulada na seguinte rotina:

CONTRAIFLOR recebe G, M , T , r e uma aresta vw de G tal que v e w estão em B(T ), calcula a flor C formada por vw e o caminho simples de w a v em T , faz G ← G×C, M ← M r E(C), e troca T pela árvore que tem conjunto de arestas E(T ) r E(C). Se a raiz r de T estiver em C, faz r ← C.

Proposição 7.12 Depois da aplicação da rotina CONTRAIFLOR, M é um emparelha- mento de G, T é uma árvore M -alternante de G e C pertence a B(T ).

O grafo obtido a partir de G por uma sequência de contrações de circuitos ímpares é chamado grafo derivado (= derived graph). Todo grafo derivado G0 tem nós de dois

tipos: os nós originais do grafo G e os pseudonós, que resultaram de contrações de circuitos ímpares. Os pseudonós são recursivos: cada um resulta da contração de um

circuito ímpar cujos nós podem ser, por sua vez, pseudonós produzidos por contrações anteriores.

Para cada nó v de um grafo derivado G0, seja S(v) o conjunto de nós do grafo original G definido recursivamente da seguinte maneira: se v é um nó original então S(v) = {v}; se v é um pseudonó que resultou da contração de um circuito ímpar C então S(v) é a união de todos os conjuntos S(w) para w em C. É claro que todo conjunto S(v) tem cardinalidade ímpar. Além disso, a coleção dos conjuntos S(v) para todos os nós v de um grafo derivado G0 é uma partição do conjunto de nós do grafo original G.

Suponha que M0é um emparelhamento em um grafo derivado G0e T é uma árvore M0-

alternante. Os pseudonós estão à distância par da raiz da árvore. Portanto, todos os nós em A(T ) são originais, ou seja, |S(v)| = 1 para cada v em A(T ). Essa observação leva à seguinte generalização da proposição7.10, que permite reconhecer grafos desprovidos de emparelhamento perfeito:

Proposição 7.13 Seja G0 um grafo derivado de G, M0 um emparelhamento em G0, e

T uma árvore M0-alternante em G0. Se T é frustrada e todos os nós de A(T ) são originais1 então G não tem emparelhamento perfeito.

PROVA: Adote as abreviaturas A := A(T ) e B := B(T ). Considere as componentes ímpares de G−A. O conjunto de nós de cada componente ímpar de G−A é igual a S(v) para algum v em B. Como S(v) é ímpar, temos oc(G − A) = |B|. Como |B| = |A| + 1, o teorema7.5garante que G não tem ep.

Exercícios

7.38 Mostre que o caminho simples que vai da raiz da árvore M -alternante até o primeiro nó de uma flor tem comprimento par.

7.39 Laminaridade. Uma coleção L de subconjuntos de V é laminar se, para cada par (L1, L2) de

elementos da coleção, tem-se L1∩ L2 = ∅ou L1 ⊆ L2ou L1 ⊇ L2. Mostre que o conjunto de

flores é laminar.

O algoritmo das flores para emparelhamento perfeito

O algoritmo que resolve o problema do emparelhamento perfeito em grafos arbitrários foi descoberto por J. Edmonds [Edm65] e ficou conhecido como algoritmo de Edmonds ou algoritmo das flores (= blossom algorithm) .

EMPPERFEITO(G)

01 seja r um nó qualquer

02 T ← ({r}, ∅), M0 ← ∅, G0 ← G

03 enquanto existe aresta vw de G0 com v ∈ B(T ) e w /∈ A(T ) faça 04 caso w /∈ V (T ) e w é coberto por M0

:

05 T ←ESTENDEÁRVORE(G0, M0, T, vw) 06 caso w /∈ V (T ) e w é exposto por M0

: 07 M0 ← AUMENTAEMP(G0, M0, T, r, vw) 08 estenda M0 a um emparelhamento M de G

09 se G tem nó exposto por M

10 então seja r um nó exposto por M 11 T ← ({r}, ∅), M0 ← M , G0 ← G

12 senão devolva M e pare  M é perfeito 13 caso w ∈ B(T ):

14 CONTRAIFLOR(G0, M0, T, r, vw) 15 devolva A(T ) e pare  G não tem ep

O algoritmo opera sobre grafos derivados de G. Ao encontrar um emparelhamento maior que M0em um grafo derivado G0, o algoritmo estende M0a um emparelhamento de G (linha 08). Essa extensão usa o mecanismo descrito na prova da proposição 7.6

para propagar o emparelhamento, recusivamente, para dentro das flores.

Se o processo iterativo das linhas 03–14 se esgota, a árvore T é frustrada e então a proposição7.13mostra que G não tem emparelhamento perfeito.

Proposição 7.14 O algoritmo EMPPERFEITO termina depois de O(n) invocações de AUMENTAEMP, O(n2)invocações de CONTRAIFLOR, e O(n2)invocações de ESTENDE-

ÁRVORE, sendo n o número de nós do grafo.

ESBOÇO DA PROVA: É claro que há um total de O(n) invocações de AUMENTAEMP. Considere os eventos entre duas invocações consecutivas de AUMENTAEMP. Cada invocação de CONTRAIFLOR diminui |V (G0)|mas não altera |V (G0) r V (T )|. Cada in- vocação de ESTENDEÁRVOREdiminui |V (G0) r V (T )| mas não altera |V (G0)|. Portanto, temos O(n) de invocações CONTRAIFLOR e de ESTENDEÁRVORE entre duas invoca- ções consecutivas de AUMENTAEMP.

EXEMPLO6: Aplique o algoritmo das flores ao grafo G definido pela matriz de adjacências abaixo. (Use o gabarito de posição dos nós para fazer uma figura.)

a b c d e f g h i a − 1 1 − − − − − − b 1 − − 1 1 − − − − c 1 − − − 1 − − 1 − d − 1 − − − 1 1 1 − e − 1 1 − − − − − − f − − − 1 − − − 1 − g − − − 1 − − − − 1 h − − 1 1 − 1 − − 1 i − − − − − − 1 1 − b d g a e f i c h

Comece com o emparelhamento M = {bd, ce, f h, gi} e a árvore M -alternante T representada pela matriz de adjacências abaixo, à esquerda. Cada “M ” na matriz representa uma aresta de M . Nos

cabeçalhos de linhas e colunas da matriz, os nós de B(T ) estão em negrito. A raiz de T é a. a b c d e f g h i a − 1 1 − − − − − − b 1 − − M − − − − − c 1 − − − M − − − − d − M − − − 1 1 − − e − − M − − − − − − f − − − 1 − − − M − g − − − 1 − − − − M h − − − − − M − − − i − − − − − − M − − a b c K e g i a − 1 1 − − − − b 1 − − M − − − c 1 − − − M − − K − M − − − 1 − e − − M − − − − g − − − 1 − − M i − − − − − M − a b c L e a − 1 1 − − b 1 − − M − c 1 − − − M L − M − − − e − − M − − A primeira iteração escolhe a aresta dh, que liga dois nós de B(T ) e assim produz a flor K := (d, h, f, d). A contração da flor transforma G em G0 := G×K, transforma M num emparelha- mento M0:= M r E(K), e transforma T numa árvore M0-alternante T0, representada pela matriz acima, no meio. O novo nó K pertence a B(T0).

A segunda iteração escolhe a aresta Ki, que liga dois nós de B(T0)e assim produz a flor L :=

(K, i, g, K). A contração da flor produz um novo nó L, transforma G0em G00:= G×L, M0em M00:=

M0r E(L), e T0em T00, representada na matriz acima, à direita. O novo nó L pertence a B(T00). Agora temos B(T00) = {a, L, e}e A(T00) = {b, c}. Todas as arestas que têm uma ponta em B(T00)

têm a outra ponta em A := A(T00). Portanto, A viola as condições de Tutte em G00. Como todos os

nós de A são originais, A também viola as condições de Tutte em G. Com efeito, oc(G − A) = 3 > 2 = |A|. As três componentes ímpares de G − A têm conjuntos de nós {a}, {d, h, f, i, g} e {e}.

Implementação. Estruturas de dados apropriadas permitem implementar o algo- ritmo EMPPERFEITO de modo que o consumo total de tempo seja O(mn log n), sendo mo número de arestas e n o número de nós do grafo.

Exercícios

7.40 Refaça o exemplo 6 escolhendo a aresta hi (no lugar de dh) na primeira iteração. 7.41 Refaça o exemplo 6 depois de acrescentar um nó j e uma aresta gj ao grafo.

7.42 Mostre que o algoritmo EMPPERFEITOpode contrair circuitos (ímpares) que não são justos (veja a página103). Isso pode acontecer durante a construção da última árvore alternante?[CCPS 5.12]

7.43 Seja M um emparelhamento imperfeito em um grafo G. Suponha que, de alguma maneira, sei que M é máximo. Escreva um algoritmo que receba G e M e devolva um conjunto A que viola as condições de Tutte.

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