• Nenhum resultado encontrado

Sobre Algoritmo de Emparelhamento Máximo e Grafos p-extensíveis

N/A
N/A
Protected

Academic year: 2021

Share "Sobre Algoritmo de Emparelhamento Máximo e Grafos p-extensíveis"

Copied!
86
0
0

Texto

(1)

Mo

de

lo

ANDRÉ DA

CUNHA

R

IBEIRO

Sobre Algoritmo de Emparelhamento

Máximo e Grafos p-extensíveis

Goiânia 2008

(2)

ANDRÉ DA

CUNHA

R

IBEIRO

Sobre Algoritmo de Emparelhamento

Máximo e Grafos p-extensíveis

Dissertação apresentada ao Programa de Pós–Graduação do Instituto de Informática da Universidade Federal de Goiás, como requisito parcial para obtenção do título de Mestre em Ciência da Computação.

Área de concentração: Algoritmos e Teoria dos Grafos. Orientadora: Profa. Diane Castonguay

Goiânia 2008

(3)

Sobre Algoritmo de Emparelhamento

Máximo e Grafos p-extensíveis

Dissertação defendida no Programa de Pós–Graduação do Instituto de Informática da Universidade Federal de Goiás como requisito parcial para obtenção do título de Mestre em Ciência da Computação, aprovada em 28 de Março de 2008, pela Banca Examinadora constituída pelos professores:

Profa. Diane Castonguay Instituto de Informática – UFG

Presidente da Banca

Prof. Fábio Protti Instituto de Matemática – UFRJ

Prof. Humberto José Longo Instituto de Informática – UFG

(4)

Todos os direitos reservados. É proibida a reprodução total ou parcial do trabalho sem autorização da universidade, do autor e do orientador(a).

André da Cunha Ribeiro

Possui graduação em Ciência Habilitação em Matemática pela Universidade de Rio Verde (1994) e pós-graduação lato sensu em Ciências da Computação pela Universidade Católica de Goiás (1998). Atualmente é professor titular do Centro Federal de Educação Tecnologica de Rio Verde-GO. Tem experiência na área de Ciência da Computação, atuando principalmente nos seguintes te-mas: software livre, banco de dados, algoritmo e programação de computado-res. Durante o Mestrado, na UFG - Universidade Federal de Goiás, foi bolsista da CAPES pelo Programa Institucional de Qualificação Docente para a Rede Federal de Educação Profissional e Tecnológica (PIQDTEC) e desenvolveu um trabalho teórico sobre grafos extensíveis.

(5)
(6)

Agradecimentos

Agradeço primeiramente a Deus, pela força e saúde que tive para superar todos os obstáculos encontrados. Agradeço a toda a minha família pelo apoio recebido, princi-palmente a minha esposa, meus pais, minha irmã e meus sobrinhos. Agradeço a minha orientadora, professora Diane, pela atenção dispensada e pela confiança que sempre de-monstrou ter em mim, desde o início do curso. Agradeço ao professor Rommel, ao apoio na realização deste trabalho e pela possibilidade de realizar um intercâmbio na COPPE da UFRJ. Agradeço aos professores Fábio e Humberto pela colaboração no aprimoramento dessa dissertação. Agradeço a todos os professores e colegas que colaboraram, direta ou indiretamente na realização do meu mestrado. Agradeço ao CEFET Rio Verde pela libe-ração e apoio financeiro para a realização desse trabalho.

(7)

Cora Coralina,

(8)

Resumo

Ribeiro, André da Cunha. Sobre Algoritmo de Emparelhamento Máximo e Grafos p-extensíveis. Goiânia, 2008. 85p. Dissertação de Mestrado. Instituto de Informática, Universidade Federal de Goiás.

Um grafo G = (V, E), de ordem par n = |V |, é p-extensível, onde p é um número entre 0 e (n/2) − 1, se G tem emparelhamento perfeito e se todo conjunto de p arestas independentes se estende para um emparelhamento perfeito. Exibimos várias famílias de grafos p-extensíveis. A extensibilidade de G é o maior valor de p, tal que G é p-extensível. Estudamos limites para a extensibilidade de algumas classes de grafos. Estruturamos o algoritmo de Kameda e Munro, que encontra o emparelhamento máximo em um grafo com a complexidade de tempo O(nm). Baseado neste algoritmo de emparelhamento

máximo trabalhamos na estruturação do algoritmo de Lou, Saito e Teng, que determina se um grafo G é 1-extensível em O(m2).

Palavras–chave

Grafos, Emparelhamento Máximo, Emparelhamento Perfeito, Grafos p-extensíveis, Extensibilidade.

(9)

Ribeiro, André da Cunha. Maximum matching algorithm and p-extendable graphs. Goiânia, 2008. 85p. MSc. Dissertation. Instituto de Informática, Uni-versidade Federal de Goiás.

A graph G= (V, E) of even order n = |V | is p-extendable, with p an integer such that 0≤ p < n/2, if it contains a perfect matching and if every matching of p independent edges extends to a perfect matching of G. In this dissertation, we present a large family of examples of p-extendable graphs. The extendability of G is the maximum value of p, such that G is p-extendable. We study limits for the extendability of some classes of graphs. We structure the algorithm of Kameda and Munro, that finds the maximum matching in a graph with the complexity of time O(nm). Based on this algorithm, we structure the

algorithm present by Lou, Saito and Teng, which determine if a graph is 1-extendable in

O(m2).

Keywords

Graphs, Maximum Matching, Perfect Matching, p-extendable Graphs, Extend-ability.

(10)

Sumário

Lista de Figuras 10 Lista de Algoritmos 13 Introdução 14 1 Preliminares 17 2 Emparelhamento 25 2.1 Emparelhamento máximo 26

2.2 Algoritmo de Emparelhamento Máximo 29

2.3 Correção do algoritmo de emparelhamento máximo 42

2.4 Complexidade do algoritmo de emparelhamento máximo 44

2.5 Emparelhamento máximo em grafos bipartidos 45

3 Grafos p-extensíveis 49 3.1 Definições Básicas 49 3.2 Grafos bipartidos 55 3.3 Grafos fator-crítico 59 3.4 Grafos planares 60 3.5 Grafos livre deK1,3 64 3.6 Árvores 66 3.7 Grau mínimo 67

4 Algoritmos para grafos extensíveis 69

4.1 Algoritmo1-extensível 69

4.2 O problemap-extensível é co-NP 75

Conclusão 79

Referências Bibliográficas 81

(11)

1.1 Grafo simples. 17 1.2 2regular. 18 1.3 K3. 18 1.4 Grafos bipartidos. 19 (a) Grafo K2,2 19 (b) Grafo bipartido 19 (c) Completo K3,3 19 1.5 Subgrafos induzidos. 20 (a) Grafo G 20 (b) Grafo H 20 (c) Grafo I 20 1.6 Subgrafos geradores. 20 (a) G 20 (b) H 20 (c) I 20 1.7 Emparelhamentos. 22 (a) Maximal. 22 (b) Máximo e Perfeito. 22 1.8 Cubo. 23 1.9 Fator-crítico. 24 (a) 1−fator-crítico. 24 (b) 2−fator-crítico. 24 1.10 3fator-crítico. 24 2.1 Grafo bipartido. 25 2.2 Broto 26 2.3 EmparelhamentoM 27 2.4 CaminhoP 28 2.5 EmparelhamentoP⊕ M 28

2.6 Caminhos nos brotos. 33

(a) Grafo G 33

(b) Grafo H 33

2.7 Processo de rotulação. 33

(a) Caminho M-alternante 33

(b) S1 33

(c) S2 33

2.8 Rotulação do broto. 36

(12)

(b) S1 36

(c) S2 36

2.9 Encontro de um broto e um sub-broto. 38

(a) Encontro do sub-broto 38

(b) S1 38

(c) S2 38

(d) Rotulação do broto e sub-broto 38

(e) S1 38

(f) S2 38

2.10 Caminho aumentante. 40

2.11 Teorema de Hall. 46

2.12 Grafos bipartidos com emparelhamento perfeito. 47

(a) k−regular 47

(b) não regular 47

2.13 Grafos(X,Y )−bipartidos. 47

(a) Com emparelhamento perfeito 47

(b) Sem emparelhamento perfeito 47

2.14 Sem emparelhamento perfeito. 48

3.1 Grafos extensíveis. 50 (a) 1−extensível 50 (b) 2−extensíveis 50 3.2 GrafoC8. 52 3.3 Grafos extensíveis. 53 (a) Bipartido 53 (b) Bicrítico 53 (c) 1-extensível 53 3.4 Produto de grafos. 54 (a) 54 (b) 1-extensível 54 (c) 2-extensível 54 3.5 ConjuntosA. 55 (a) Estende 55 (b) Não estende 55 3.6 Grafos da famíliaGn,p. 56 (a) G4,1 56 (b) G6,2 56 (c) G8,3 56 3.7 Família2Ct. 56 3.8 Grafo residual. 58 3.9 Grafos bipartidos. 60 (a) 0-fator-crítico 60 (b) n-fator-crítico 60

3.10 Grafo com o componente borboleta. 60

3.11 GrafoG31. 62

3.12 GrafoH14. 62

(13)

3.17 Árvores. 67

(a) Sem emparelhamento 67

(b) Com emparelhamento 67 3.18 4-regular. 68 4.1 Grafo1-extensível. 72 (a) Grafo G 72 (b) x0y0∈ M/ 72 (c) Subgrafo H 72

4.2 Grafo que não é1-extensível. 73

(a) Grafo G 73

(b) x0y0∈ M/ 73

(14)

Lista de Algoritmos

2.1 MétodoBerge 29 2.2 EmparelhamentoMáximo 30 2.3 caminho-aumentante() 32 2.4 caminho-alternante() 35 2.5 encontrar-broto() 37 2.6 verificar-pilhas() 39 2.7 atualizar-pilhas() 40 2.8 aumentar-emparelhamento() 41 4.1 1-extensível 70 4.2 diminuir-lista() 71 4.3 1-extensível-ingênuo 75 4.4 Decisão co-NP 76 4.5 Extensível 77

(15)

A ciência da computação é o estudo dos algoritmos e de suas aplicações, bem como das estruturas matemáticas indispensáveis à sua formulação. Ela precisa desses conceitos fundamentais tanto para a teoria da complexidade computacional, quanto para a computação aplicada.

Na complexidade computacional estudamos a classificação dos problemas de decisão. Um problema de decisão é o problema que possui apenas duas respostas: sim ou não. Nesta dissertação restringimos a problemas de decisão. Indiretamente, porém, tratamos de outros tipos de problemas. Afinal, a existência de um algoritmo polinomial para o problema de decisão implicaria em um algoritmo polinomial para o problema de otimização. Outra maneira de entender problemas de decisão é como reconhecimento de linguagens. Todo problema de decisão pode ser visto como, dada uma entrada x, decidir se x∈ L para uma linguagem específica L.

A classe P é o conjunto de problemas de decisão que pode ser resolvidos por um algoritmo polinomial. A sigla P surgiu de deterministic polinomial time (tempo polinomial determinístico), pois uma outra definição para a classe P é a classe dos problemas que podem ser resolvidos em tempo polinomial por uma máquina de Turing determinística e essas máquinas modela o computador que temos hoje.

A classe NP é um conjunto de problemas de decisão que tem um algoritmo de verificação em tempo polinomial para um certificado polinomial quando a resposta for sim. A sigla NP surgiu de non-deterministic polinomial time (tempo polinomial não de-terminístico), pois uma outra definição para a classe NP é a classe dos problemas que podem ser resolvidos em tempo polinomial por uma máquina de Turing não determinís-tica. Sem entrarmos em muitos detalhes, uma máquina de Turing não determinística é um modelo para um computador que pode, a cada instrução executada, se bifurcar em dois ca-minhos de processamento distintos, respondendo sim caso algum caminho responda sim e não, caso todos os caminhos respondam não. A máquina de Turing não determinísitica, diferente da máquina de Turing determinística, modela um computador que, pelo menos por enquanto, não sabemos como construir fisicamente. A classe co-NP de problemas de decisão é a que possui certificado polinomial para a resposta não.

(16)

15

de tal modo, que todo problema de decisão em NP se reduz polinomialmente a ele. Em maio de 2000, o Clay Mathematics Institute[9], com sede em Cambridge, Massachusetts,

propôs o que designou por problemas do milênio. Trata-se de um conjunto de sete problemas, dos quais um deles é provar que NP= P. O instituto oferece um milhão de

dólares americanos pela resolução desse problema.

Pode-se dizer que os problemas da classe NP-completo são os mais difíceis da classe NP. A razão é que se conseguíssemos encontrar uma maneira de resolver qualquer problema NP-completo em tempo polinomial, então poderíamos utilizar algoritmos para resolver todos os problemas NP em tempo polinomial, provando que NP= P.

Vários dos problemas da classe NP-completo podem ser modelados usando gra-fos. Muitos dos problemas sobre grafos tornaram-se célebres como desafios intelectuais ou por suas importantes aplicações práticas, como no exemplo a seguir.

Seja um grafo cujos vértices representam projetos que podem ser executados em uma unidade de tempo. Todo projeto que utiliza recursos comuns a um outro projeto são interligados por uma aresta. O conjunto independente máximo representa o conjunto maximal de projetos, que podem ser executados em paralelo (simultaneamente) em um único período de tempo. Dado um grafo G, o problema de determinar se há um conjunto independente de tamanho k é um problema da classe NP-completo. Apesar disso, em algumas classes de grafos é possível encontrar o conjunto independente máximo através de algoritmos polinomiais, como por exemplos os grafos livre de K1,3 e os grafos p-extensível. Neste último caso, temos um limite superior, que depende de p, para a cardinalidade de um conjunto independente máximo.

O conceito de grafo p−extensível foi introduzido por Plummer em 1980. Um grafo G de ordem par n é p−extensível, onde p é um número inteiro entre 0 e (n/2) − 1, se o grafo G tem emparelhamento perfeito e se cada conjunto de p arestas independentes estão contidas em algum emparelhamento perfeito.

Um emparelhamento no grafo G é um conjunto de arestas independentes, tal que, quaisquer duas arestas nesse conjunto não possuem vértices em comum. Um emparelhamento é perfeito se o conjunto de arestas incidem em todos os vértices do grafo G.

O conjunto de todos os grafos que satisfazem uma dada propriedade constitui uma família de grafos. Temos na literatura diversas famílias que vêm sendo, ao longo do tempo, exaustivamente estudadas, como por exemplo: os grafos conexos, planares, árvores, dentre outros. Nesta dissertação, estudaremos a família dos grafos p-extensíveis. Normalmente, a definição de uma família consiste em mencionar a propriedade satisfeita pelos grafos que a constituem, exatamente como fizemos no exemplo acima. Em vários casos, essa propriedade pode ser acrescida de novas condições, originando propriedades mais específicas, que definem subfamílias.

(17)

Quando uma nova família de grafos é definida, um importante problema compu-tacional a ser resolvido é o do reconhecimento, que consiste em obter um algoritmo para verificar se um grafo qualquer pertence ou não à família em questão. Em alguns casos, verificar diretamente se o grafo dado satisfaz ou não à propriedade, conduz a algoritmos não polinomial (ineficientes).

Um dos objetivos desta dissertação é apresentar os resultados sobre grafos p-extensíveis, apresentando um texto de forma clara e simples, melhorando algumas provas e classificando algumas subfamílias de grafos p-extensíveis. Outro objetivo é estudar um algoritmo que encontra um emparelhamento máximo nos grafos gerais, para ser usado nos algoritmos de grafos p-extensíveis. E por fim, será apresentado o algoritmo polinomial 1-extensível. Veremos que o reconhecimento de grafos p-extensíveis é um problema co-NP. Esta dissertação foi organizada em quatro capítulos. No capítulo 1 mostraremos algumas definições, notações básicas e alguns resultados sobre grafos.

No capítulo 2, abordaremos os principais conceitos e teoremas sobre empare-lhamento máximo em grafos. Também será estudado o algoritmo de empareempare-lhamento máximo de Kameda e Munro, iremos demonstrar a correção e a complexidade dele.

No capítulo 3, revisaremos os principais conceitos e teoremas sobre grafos p-extensíveis. Os grafos p-extensíveis também serão estudados nas principais famílias de grafos, tais como: grafos bipartido, grafos fator-crítico, grafos planares, grafos livre de

K1,3, árvores e os grafos com grau mínimo.

No capítulo 4, estudaremos os algoritmos sobre grafos extensíveis. O primeiro algoritmo determina se um grafo geral é ou não 1-extensível. Também estudaremos a demonstração e a complexidade desse algoritmo. Neste capítulo, mostraremos outro algoritmo para grafos 1-extensíveis. Mostraremos que o problema p-extensível é co-NP. Finalmente, apresentaremos as conclusões deste trabalho.

(18)

CAPÍTULO

1

Preliminares

Este capítulo antecede os assuntos principais deste trabalho e serão introduzidas as definições, notações básicas e alguns resultados de grafos utilizados nesta dissertação. Para este capítulo, usamos as seguintes referências: Diestel[3], Scheinerman [29] e West [30].

Um grafo G= (V, E) é um par de conjuntos, onde V é um conjunto não vazio

e finito cujos elementos são chamados de vértices e E é um conjunto de pares não ordenados de vértices que são chamados de arestas. Dada uma aresta e = vw ∈ E ou

e= (v, w) ∈ E, os vértices v e w são denominados extremidades da aresta e, e dizemos

que e é incidente nos vértices v e w. Comumente, iremos denotar V(G) como o conjunto

de vértices de um grafo G e E(G) como o conjunto de arestas de um grafo G.

Neste trabalho, todos os grafos considerados serão simples. Um grafo é chamado de simples quando ele não possui arestas múltiplas e nem laços. Arestas múltiplas são arestas que têm as mesmas extremidades. Um laço é uma aresta da forma xx, ou seja, cujas extremidades são iguais.

Seja G= (V, E) um grafo qualquer. A cardinalidade de vértices de G é chamado

de ordem do grafo e ela é denotada por|V |. A cardinalidade de arestas de G é denotada por|E|. Usaremos sempre as convenções n = |V | e m = |E|.

Podemos visualizar um grafo através de uma representação geométrica de um ponto, para cada vértice, sobre uma superfície e para cada aresta vw uma reta (ou curva) ligando v a w. Se dois vértices são conectados por uma aresta, então eles são chamados de adjacentes . O exemplo abaixo mostra uma representação geométrica de um grafo.

abcde

(19)

Um grafo é planar se existir uma representação geométrica do grafo no plano sem cruzamentos de arestas.

Os vizinhos, ou a vizinhança, de um vértice x é o conjunto de todos os vértices adjacentes a x. O conjunto de vizinhos de um vértice x é denotado por NG(x) ou simplesmente N(x). Por exemplo, no grafo da figura1.1temos N(b) = {a,c,d}.

O grau de um vértice x de um grafo é o número de arestas que incidem em x, denotado por dG(x) ou simplesmente d(x). O grau mínimo de um grafo é denotado por

δ(G) e o grau máximo por(G). Na figura1.1, temos d(b) = 3,δ(G) = 2 e(G) = 3.

A proposição abaixo mostra uma relação direta entre os graus dos vértices e a quantia de arestas de um grafo.

Proposição 1.1 (West[30]) A soma dos graus de todos os vértices de um grafo é igual a duas vezes o número de arestas.

Prova. Uma aresta com extremidades x e y contribui com uma unidade para d(x) e outra

para d(y). Portanto, cada aresta contribui exatamente duas unidades para a soma dos

graus. 

Vamos nos inteirar de alguns tipos especiais de grafos. Uns desses tipos são os grafos regulares. Um grafo G = (V, E) é regular se todos os vértices do grafo têm

o mesmo grau, ou seja, quando δ(G) =(G). Um grafo é chamado de k-regular se δ(G) =(G) = k. Alguns grafos recebem denominação especial de acordo com o valor

de k, como por exemplo: para k= 3, temos um grafo cúbico e para k = 2, temos um ciclo.

O exemplo abaixo mostra um ciclo.

abcd Figura 1.2: 2−regular.

Outro tipo especial de grafo são os grafos completos. Um grafo G= (V, E) é

completo, se todos os pares de vértices distintos são adjacentes. Um grafo completo com

n vértices é denotado por Kn. Os grafos completos são muito importantes, pois vários resultados sobre grafos podem ser aplicados a eles.

abc Figura 1.3: K3.

(20)

19

Um tipo especial de grafos são os que não tem ciclos ímpares, chamados de grafos bipartidos. Um grafo G= (V, E) é bipartido, se existe uma partição do conjunto

de todos os vértices em dois subconjuntos X e Y , tal que nenhuma aresta do grafo tenha ambas as extremidades em X ou ambas as extremidades em Y . Outra característica importante dos grafos bipartidos é o fato de que esses grafos podem ser coloridos com apenas duas cores, ou seja, um cor para cada partição de vértice.

Um grafo bipartido é chamado de completo quando todos os vértices da partição

X estão ligado a todos os vértices da partição Y . Ele é denotado por Ks,t, onde s= |X| e

t= |Y |. A figura1.4exemplifica grafos bipartidos.

abcd (a) Grafo K2,2 • abcdef (b) Grafo bipartido • abcdef (c) Completo K3,3 Figura 1.4: Grafos bipartidos.

Proposição 1.2 Seja G= (V, E) um grafo bipartido. A soma dos graus dos vértices de uma partição é igual ao número de arestas de G.

Prova. Seja G um grafo com a bipartição X e Y . Pela definição de grafo bipartido, temos

que toda aresta que incide na partição X também incide na partição Y . Então, cada aresta contribui exatamente com uma unidade para a soma dos graus dos vértices de uma

partição. Portanto,∑v∈Xd(v) =v∈Yd(v) = m. 

Um grafo H é um subgrafo do grafo G, desde que os vértices de H estejam contidos nos vértices de G e as arestas de H estejam contidas nas arestas de G. Um subgrafo é obtido através da remoção de vértices ou de arestas. Temos um tipo especial quando removemos somente vértices ou somente arestas. No primeiro caso temos um subgrafo induzido e no segundo caso temos um subgrafo gerador, como mostrar as definições e os exemplos abaixo.

Um grafo H é um subgrafo induzido do grafo G se, e somente se, V(H) ⊆ V (G) e E(H) = {xy ∈ E(G) | x ∈ V (H) e y ∈ V (H)}, ou seja, as únicas remoções permitidas de G para obter H são as remoções de vértices e suas arestas incidentes. Denotaremos

G[V1] o subgrafo induzido pelo subconjunto de vértices V1. Para qualquer subconjunto S de V(G), denotamos por G − S o subgrafo induzido G[V (G) − S]. Se v é um vértice de G, então G− v é o subgrafo induzido de G, obtido da remoção do vértice v. Os grafos das figuras1.5(b)e1.5(c)são subgrafos induzidos do grafo da figura1.5(a).

(21)

abcde (a) Grafo Gabc (b) Grafo Hbcde (c) Grafo I

Figura 1.5: Subgrafos induzidos.

Um grafo H é um subgrafo gerador do grafo G se, e somente se, H for um subgrafo de G com os vértices de H sendo todos os vértices de G, ou seja, H e G têm os mesmos vértices e as únicas remoções permitidas de G para obter H são as remoções de arestas. Se e é uma aresta de G, então G−e é o subgrafo gerador de G, obtido da remoção da aresta e. Os grafos das figuras 1.6(b) e 1.6(c) são subgrafos geradores do grafo da figura1.6(a). • abcde (a) Gabcde (b) Habcde (c) I Figura 1.6: Subgrafos geradores.

Um fator de um grafo G é um subgrafo gerador de G. Um k-fator é um subgrafo gerador k-regular. Na figura1.6 os grafos H e I são subgrafos geradores de G, logo eles são fatores de G. De fato, o grafo I é 2−fator de G, pois ele é um subgrafo 2−regular.

Pela sua importância, em Teoria de Grafos, vamos destacar as seqüências de vértices e arestas. Um caminho entre dois vértices x e y de um grafo G é uma seqüência de vértices P= (v1, v2, v3, . . . , vk) onde, x = v1, y= vk, e vivi+1 pertence às arestas do grafo, para todo i= 1, . . . , k − 1. Um caminho é denominado simples se os vértices que o constituem são todos distintos. Um caminho simples de k vértices é denotado por Pk, seu comprimento é de k− 1 arestas.

Existe um tipo especial de caminho de comprimento maior ou igual a 3, em que o primeiro e o último vértices coincidem, esse caminho é denominado de ciclo. Um ciclo simples é um ciclo onde todos os vértices que o constituem são distintos, à exceção do primeiro e do último vértices que coincidem. Um ciclo simples de k vértices é denotado

(22)

21

por Ck, seu comprimento é de k arestas. Uma propriedade importante dos grafos bipartidos é que não existem ciclos ímpares.

Um caminho (ciclo) hamiltoniano é um caminho (ciclo) simples que contém todos os vértices do grafo.

Um grafo é conexo se para qualquer par de vértices (v, w), existe um caminho

simples com extremos v e w, caso contrário, o grafo é desconexo. Um subgrafo conexo

H de um grafo G é maximal, se H não pertence a nenhum subgrafo conexo de G. Um

componente de um grafo é um subgrafo conexo maximal. A partir da definição de grafo conexo e componente, podemos afirmar que um grafo é conexo se, e somente se, tiver um único componente. Se um grafo não tem arestas, então cada um de seus vértices constitui um componente conexo.

Sejam G um grafo conexo e B ⊆ V (G) um subconjunto dos vértices de G. O conjunto B é chamado separador do grafo G, desde que G− B tenha mais de um componente.

A conectividade de G, κ(G), é o tamanho do menor conjunto separador B.

Dizemos que G é k−conexo, se κ(G) ≥ k, ou seja, se |V (G)| > k e G − B for conexo para todo B⊆ V com |B| < k. Para todo grafo G, temos que 0 < κ(G) ≤ n − 1. Um grafo conexo é 1-conexo e vice-versa. Quando não temos um conjunto separador, então

κ(G) = n − 1, esse é o caso dos grafos completos.

Proposição 1.3 (West[30]) Se Kné um grafo completo entãoκ(G) = n − 1.

Prova. Seja Kn um grafo completo, então temos que mostrar que κ(G) = n − 1. Para isso, Kn não pode ter conjunto separador. Seja X ⊆ V um conjunto separador de Kn. Por definição G− X, tem mais de um componente, consideramos x e y dois vértices pertencentes a componentes distintos. Como o grafo Kn é completo, existe uma aresta entre x e y. Logo eles estão na mesma componente de G− X, uma contradição. 

Um emparelhamento no grafo G é um conjunto de arestas independentes, tal que, quaisquer duas arestas nesse conjunto não possuem vértices em comum. Os vértices incidentes nas arestas de um emparelhamento são chamados de saturados e os vértices não incidentes são ditos de não saturados.

Um emparelhamento M é chamado maximal se não existir outro emparelha-mento M∗ que o contenha, ou seja, ele não é subconjunto próprio de outro emparelha-mento do grafo.

O emparelhamento de maior cardinalidade do grafo é chamado de emparelha-mento máximo. A cardinalidade de um emparelhaemparelha-mento máximo é denotado porα′(G).

Todo emparelhamento máximo é maximal, mas nem todo emparelhamento maximal é máximo, como mostra o exemplo da figura1.7.

(23)

As arestas, que estão em negrito nos grafos da figura 1.7, mostram dois empa-relhamentos. O emparelhamento na figura1.7(a) é maximal, mas não é máximo. O em-parelhamento da figura 1.7(b) é maximal e máximo, também podemos observar que ele satura todos os vértices do grafo e com as arestas desse emparelhamento máximo temos um sugbrafo gerador 1-fator.

• 1 • 2 • 3 • 4 • 5 •6 (a) Maximal. • 1 • 2 • 3 • 4 • 5 •6 (b) Máximo e Perfeito. Figura 1.7: Emparelhamentos.

Um tipo particular de emparelhamento máximo deve ser destacado: o empare-lhamento perfeito. Um empareempare-lhamento é perfeito quando satura todos os vértices de um grafo. É evidente que todo emparelhamento perfeito é máximo e maximal. Um empare-lhamento perfeito só existe num grafo de ordem par e é um empareempare-lhamento contendo

n/2 arestas.

As arestas que pertencem a algum emparelhamento perfeito são chamadas de arestas permitidas e as arestas que não pertençam a nenhum emparelhamento perfeito são chamadas de arestas proibidas. Um grafo G de ordem par é elementar se as arestas permitidas formam um subgrafo conexo.

Seja um grafo G. Dizemos que um subconjunto de vértices S ⊆ V (G) é um conjunto independente, desde que não haja dois vértices adjacentes em S. Em outras palavras, um subconjunto S⊆ V (G) é independente se, e somente se, o subgrafo induzido

G[S] não tem arestas.

Um conjunto independente maximal é aquele que não faz parte de um outro conjunto independente maior. O maior conjunto independente do grafo é chamado de conjunto independente máximo. O número de independência de um grafo é o tamanho do maior conjunto independente, denotado porα(G).

O grafo da figura 1.8 tem vários conjuntos independentes, tais como: {a, f },

{b,e}, {c,h}, {d,g}, {a,d,e,h} e {b,c, f ,g}. No grafo G, temos conjuntos independentes

maximal de tamanho igual a dois, masα(G) = 4.

Os conceitos de emparelhamento máximo e conjunto independente estão relaci-onados com a quantidade de arestas e vértices, respectivamente, onde o emparelhamento máximo é o maior conjunto de arestas independentes e o conjunto independente é o maior conjunto de vértices independentes. Para encontrar o emparelhamento máximo de um

(24)

23 • abc d• •efgh Figura 1.8: Cubo.

grafo temos algoritmos polinomiais, mas não temos nenhum algoritmo polinomial para encontrar o conjunto independente máximo, ou seja, encontrar um conjunto independente de tamanho k é um problema que está na classe NP. Veja em[11]. Apenas para algumas

classes de grafos, é possível encontrar o número de independência em tempo polino-mial, em outras classes temos limites superiores ou inferiores para esse número, como por exemplo, a classe de grafos p-extensíveis, que tem um limite deα(G) = n/2 − p.

Seja G um grafo conexo de ordem par. Um grafo G é p-extensível , onde

p é um número inteiro entre 0 e (n/2) − 1, se G tem emparelhamento perfeito e se

quaisquer conjunto de p arestas independentes (não adjacentes) estende-se para um emparelhamento perfeito de G, isto é, quaisquer p arestas independentes estão contidas em algum emparelhamento perfeito de G.

Neste trabalho, vamos estudar a relação dos grafos p-extensíveis e k-fator-crítico. Essa relação é muito importante, porque temos um limite superior para o número de independência dos grafos p-extensíveis que não são bipartidos. Um grafo de ordem n é k−fator-crítico, onde k é um inteiro 0 ≤ k ≤ n e n + k é par, se G − X admite um emparelhamento perfeito para todo conjunto X de k vértices. Um grafo é chamado de bicrítico se ele é 2-fator-crítico.

Os grafos k-fator-crítico não são(k − 1)-fator-crítico, pois temos pela definição que k+ n tem que ser par, ou seja, eles são de mesma paridade. Mas quando fazemos k− 1, temos que k fica com paridade diferente de n, contradizendo assim a definição.

Porém, temos o resultado abaixo para(k − 2)-fator-crítico.

Proposição 1.4 (Favaron[5]) Se G é um grafo k-fator-crítico de ordem n ≥ k + 2, então

G é(k − 2)-fator-crítico.

Um grafo que é k−fator-crítico não é necessariamente (k+2)-fator-crítico, como mostra o exemplo da figura 1.10 que é um grafo 3-fator-crítico, mas não é

(25)

5-fator-• abcde (a) 1−fator-crítico.abcdef (b) 2−fator-crítico. Figura 1.9: Fator-crítico.

crítico, pois se os vértices (a, c, d, f , g) forem retirados, o grafo fica desconexo e não

tem emparelhamento. • abcdefg Figura 1.10: 3−fator-crítico.

(26)

CAPÍTULO

2

Emparelhamento

Neste capítulo serão abordados os principais conceitos e teoremas sobre empa-relhamento máximo em grafos. Também será estudado um algoritmo de empaempa-relhamento máximo, a demonstração da correção e a complexidade desse algoritmo.

Uma das possíveis aplicações de emparelhamento máximo em grafo é mostrado no seguinte exemplo: suponha que há quatro candidatos c1, c2, c3e c4para as três vagas de uma empresa que serão chamadas de v1, v2e v3 e que nem todos os candidatos tenha competência para todas as vagas. O candidato c1pode concorrer para as vagas v2e v3, c2 para as vagas v1 e v2, c3 para as vagas v1e v3e, finalmente, c4para a vaga v3. Isso pode ser representado por um grafo bipartido, mostrado na figura2.1, onde cada aresta liga um candidato a uma vaga que ele poderia eventualmente ocupar.

c1 • v1 ◦ c2 • v2 ◦ c3 • v3 ◦ c4

Figura 2.1: Grafo bipartido.

Será possível preencher todas as vagas disponíveis pela empresa? Uma combi-nação possível seria a de escolher o candidato c1 para a vaga v2, o candidato c2 para a vaga v1e finalmente o candidato c3para a vaga v3. Também é possível trocar o candidato c3 pelo candidato c4, obtendo, assim, outra combinação. Encontrar um emparelhamento máximo no grafo é um dos problemas estudados em teoria de grafos e será estudado com mais detalhe na próxima seção.

(27)

2.1

Emparelhamento máximo

Nesta seção estudaremos as definições e resultados sobre emparelhamento má-ximo que serão necessários para o entendimento do algoritmo polinomial que encontra o emparelhamento máximo. Uma boa referência sobre o assunto é o livro do Plummer[15].

Seja M um emparelhamento qualquer. Um caminho M-alternante é um ca-minho simples que alterna arestas em M e arestas que não estão em M. Um caca-minho

M-aumentante é um caminho M-alternante, onde os extremos não são saturados pelas

arestas de M. Pela definição podemos observar que um caminho M-aumentante é neces-sariamente de comprimento ímpar. Um ciclo M-alternante é um ciclo formado por um caminho M-alternante de comprimento par.

Um broto é um ciclo ímpar que é um caminho M-alternante. O único vértice do broto que não é saturado por arestas de M que estão no broto é chamado de base do broto.

• 1 • 2 • 3 Figura 2.2: Broto

Na figura 2.2, temos a aresta 12, que pertence ao emparelhamento e o vértice 3 é a base do broto, pois o vértice não está saturado por aresta do emparelhamento que pertence ao broto.

Sejam A e B dois conjuntos, a diferença simétrica entre esses conjuntos é denotado por A⊕ B = (A − B) ∪ (B − A), ou seja, a diferença simétrica entre A e B é o conjunto cujos elementos são os elementos de A, que não estão em B, junto com os elementos de B que não estão em A.

Vamos ver os resultados envolvendo a diferença simétrica entre dois emparelha-mentos e a diferença simétrica entre um caminho M-aumentante e um emparelhamento qualquer. Esses resultados serão usados na demonstração do teorema2.4 de Berge e nos algoritmos sobre emparelhamento máximo e grafos extensíveis.

Lema 2.1 (West [30]) Sejam M1 e M2 dois emparelhamentos de um grafo G, então o subgrafo gerador G(V, M1⊕ M2) é composto de vértices isolados, de caminhos alternantes e de ciclos alternantes.

Prova. Sejam M1 e M2 dois emparelhamentos e seja o subgrafo G(V, M1⊕ M2). Como M1e M2são emparelhamentos, todos os vértices do subgrafo tem no máximo uma aresta de cada emparelhamento, assim o subgrafo tem no máximo duas arestas para cada vértice, ou seja,∆(G) ≤ 2. Logo, os componentes de G∗são os seguintes:

(28)

2.1 Emparelhamento máximo 27

• Vértices isolados que não têm aresta.

• Caminho alternante, ou seja, as extremidades do caminho têm grau um e os outros

vértices no centro do caminho têm grau dois. Portanto, o caminho alternante pode começar com uma aresta de M1, ou M2, e termina com uma aresta de M2, ou M1, respectivamente, ou ainda, esse caminho alternante pode começar e terminar com arestas de M1, ou M2, respectivamente.

• Ciclo alternante tem todos os vértices de grau dois e, portanto, a mesma quantidade

de arestas de M1e de M2.



O lema abaixo mostra a principal idéia do teorema de Berge, que é procurar os caminhos M-aumentantes, para aumentar o emparelhamento em uma aresta.

Lema 2.2 (West [30]) Sejam M um emparelhamento e P um caminho M-aumentante, então P⊕ M é um emparelhamento de cardinalidade |M| + 1. Observamos que P ⊕ M satura todos os vértices saturados por M.

Prova. Queremos mostrar que P⊕ M é um emparelhamento de cardinalidade |M| + 1.

Pela definição, temos que um caminho M-aumentante é um caminho M-alternante, onde as extremidades não são saturadas por M. O caminho P começa e termina com uma aresta que não está em M e alterna com arestas que estão em M, assim temos uma cardinalidade de 2k+ 1 arestas para o caminho P, onde k é o número de arestas em P que

estão em M. Portanto,|P ⊕ M| = |(P ∪ M) − (P ∩ M)| = |P| + |M| − |P ∩ M| − |P ∩ M| =

|P| + |M| − 2|P ∩ M| = 2k + 1 + |M| − 2k = |M| + 1. Falta verificar que P ⊕ M é um

emparelhamento. Sabemos que as únicas arestas de M que incidem em P são as arestas de M que estão em P, e essas arestas não pertencem a P⊕ M. Portanto, P ⊕ M é um

emparelhamento. 

2 •3 •4 •5 •6 •7

Figura 2.3: Emparelhamento M

A figura2.3 mostra um emparelhamento M, a figura2.4 mostra um caminho P que é M-aumentante. Por fim a figura 2.5 mostra a diferença simétrica entre o empare-lhamento M e o caminho P. O empareempare-lhamento P⊕ M tem uma aresta a mais do que o emparelhamento M.

(29)

◦ 1 •2 •3 •4 •5 •6 •7 ◦8 Figura 2.4: Caminho P • 1 •2 •3 •4 •5 •6 •7 •8 Figura 2.5: Emparelhamento P⊕ M

Podemos observar que se um caminho P for um caminho M-alternante e ambas as extremidades são saturadas por arestas de P, então P⊕ M é um emparelhamento com menos arestas. De fato, P é um caminho simples de 2k vértices, onde k é a quantidade de arestas que está em M, pois todos os vértices do caminho P estão saturados por M. Por definição de caminho simples a quantidade de arestas do caminho P é 2k− 1. Portanto,

|P ⊕ M| = |P| + |M| − 2|P ∩ M| = 2k − 1 + |M| − 2k = |M| − 1. Logo, |P ⊕ M| = |M| − 1.

Outro caso é quando um caminho P for um caminho M-alternante com uma aresta da extremidade em M e a outra extremidade não saturada, então P⊕ M é um emparelhamento de mesma cardinalidade. De fato, um caminho P tem a mesma quan-tidade de arestas de M e arestas que não estão em M, logo|P| = 2k. Portanto, |P ⊕ M| =

|P| + |M| − 2|P ∩ M| = 2k + |M| − 2k = |M|. Logo, |P ⊕ M| = |M|.

Quando um caminho P for um caminho M-alternante e uma ou ambas as extremidades forem saturadas por arestas que não estão em P, então P⊕ M não é um emparelhamento, pois um ou ambos os vértices das extremidades do caminho P, serão saturados por arestas de M e P ao mesmo tempo, um absurdo.

O lema2.3é um resultado que encontramos muito interessante e será usado no algoritmo 1-extensível.

Lema 2.3 Sejam M um emparelhamento e C um ciclo M-alternante, então C⊕ M é um

emparelhamento de cardinalidade|M|. Observamos que C ⊕M satura os mesmos vértices que M.

Prova. Queremos mostrar que C⊕ M é um emparelhamento de cardinalidade |M|. Pela

definição, temos que um ciclo M-alternante tem cardinalidade|C| = 2k, onde k é o número de arestas no ciclo que estão em M. Portanto, podemos observar que o ciclo M-alternante é de comprimento par e |C ⊕ M| = |C| + |M| − 2|C ∩ M| = 2k + |M| − 2k = |M|. Logo,

(30)

2.2 Algoritmo de Emparelhamento Máximo 29

Em 1957, Berge obteve um resultado importante que caracteriza quando um emparelhamento em um grafo é máximo.

Teorema 2.4 (Berge [2]) Um emparelhamento M tem cardinalidade máxima em G se, e somente se, G não possui caminho M-aumentante.

Prova. Suponha que M é um emparelhamento de cardinalidade máxima e P um caminho M-aumentante. Esse caminho é de comprimento ímpar e com as extremidades não

saturadas por M. Pelo lema2.2, temos que M⊕ P é um emparelhamento de cardinalidade

|M| + 1, uma contradição.

Suponha que G não tenha caminho M-aumentante e que M não seja um em-parelhamento máximo em G. Seja M∗ um emparelhamento de cardinalidade maior que a cardinalidade de M. Pelo lema 2.1, temos que M⊕ M∗ é composto de caminhos

M-alternantes, vértices isolados e de ciclos. Todos os ciclos M-alternantes são de

com-primento par e contém o mesmo número de arestas de M e de M∗. Como pela hipótese

Mé um emparelhamento maior, então pelo menos um dos caminhos M-alternantes deve conter mais arestas de M, ou seja, será um caminho M-aumentante, uma contradição. 

O teorema de Berge conduz ao algoritmo MétodoBerge2.1, utilizado na maioria dos algoritmos, para construir um emparelhamento maximal num grafo.

Algoritmo 2.1: MétodoBerge Entrada: Grafo G qualquer

Saída: Um emparelhamento máximo M início

1

seja M um emparelhamento em G 2

enquanto existir um caminho M-aumentante P em relação a 3

M faça

construa um novo emparelhamento M= M ⊕ P 4 M= M5 fim 6 fim 7

2.2

Algoritmo de Emparelhamento Máximo

Em 1965, Edmonds apresentou em [15] um algoritmo de complexidade O(n4) que encontra o emparelhamento máximo de um grafo em tempo polinomial. O algoritmo utiliza a estratégia do teorema de Berge que é encontrar os caminhos M-aumentantes

(31)

para que o emparelhamento possa ser aumentado. Os caminhos M-aumentantes são encontrados usando a idéia de florestas alternantes, árvores alternantes e contração de brotos. No mesmo ano, Witzgall e Zahn apresentaram em [31] um algoritmo de

complexidade O(n3).

A partir desse algoritmo muitos pesquisadores estudaram esse problema e, progressivamente, algoritmos mais eficientes foram desenvolvidos.

Algoritmo 2.2: EmparelhamentoMáximo Entrada: Grafo G qualquer

Saída: Um emparelhamento máximo Minício

1

M /0

2

para cada vértice r∈ V faça 3

se vértice r não é saturado então 4 S1← /0; S2← /0 5 Lista_Vértices /0 6 se caminho-aumentante() então 7 M← aumentar-emparelhamento() 8 fim 9 fim 10 fim 11 M← M 12 fim 13

Em 1974, Kameda e Munro apresentaram em[10] um algoritmo que encontra um

emparelhamento máximo em um grafo de complexidade O(nm). Eles usam a estratégia

do teorema 2.4 de Berge para encontrar o emparelhamento máximo. O melhor tempo conhecido dos autores até agora é de O(mn) encontrado por Micali e Vazirani em [20]

no ano de 1980.

Neste trabalho, vamos utilizar o algoritmo de Kameda e Munro. Escolhemos esse algoritmo por sua implementação simples e sua boa complexidade. O algoritmo original de Kameda e Munro usa seqüências que não estão estruturadas, dificultando a análise do mesmo. Estruturamos o algoritmo encontrado no artigo [10] dividindo o mesmo em vários algoritmos. Outro objetivo da estruturação é facilitar a implementação do algoritmo.

De acordo com a estratégia de Berge, o algoritmo EmparelhamentoMáximo2.2

tem que procurar por caminhos M-aumentantes até que eles não existam mais. A cada caminho M-aumentante encontrado, o emparelhamento será aumentado em uma aresta pela diferença simétrica entre o emparelhamento e o caminho M-aumentante.

(32)

2.2 Algoritmo de Emparelhamento Máximo 31

O algoritmo utiliza duas pilhas, S1 e S2, e uma lista de vértices, essa lista é denominado por Lista_Vértices, onde cada vértice v da Lista_Vértices contém os parâmetros(v.NUM, v.po, v.pe). Esse parâmetros formam o rótulo do vértice. Através dos rótulos é criado um novo subgrafo que forma o caminho M-aumentante. Esse processo é definido como rotulação dos vértices. A seguir temos a descrição de como esses vértices são rotulados.

A Lista_Vértices será utilizada no processo de rotulação e cada vértice v é composto pelos parâmetros v.NUM, v.po e v.pe, onde v é o vértice que está sendo analisado. O número v.NUM recebe a ordem de seqüência do vértice v no subgrafo. Um

vértice v é par quando v.NUM é um número par e o vértice v é ímpar quando o v.NUM é

um número ímpar. O número v.porecebe o número da seqüência anterior do caminho M-alternante, que junto com o v.NUM forma uma aresta do caminho M-alternante que não

pertence ao emparelhamento e que está a uma distância ímpar da raiz até o vértice v ou retorna−1, quando a aresta ainda não foi analisada. O número v.pe recebe o número da seqüência anterior do caminho M-alternante que, junto com o v.NUM forma uma aresta

do caminho M-alternante, que pertence ao emparelhamento e está a uma distância par da raiz até o vértice v ou retorna−1, quando a aresta ainda não foi analisada.

Se o grafo não for bipartido, então o algoritmo pode encontrar na rotulação um broto. Um broto é um ciclo ímpar que aparece quando uma aresta não examinada conecta dois vértices pares, ambos no subgrafo rotulado, formando um caminho M-alternante fechado de comprimento ímpar. A raiz do broto é o vertice não saturado pelas arestas do emparelhamento que pertence ao ciclo. A identificação de um broto no subgrafo é feita pelos rótulos dos seus vértices.

As pilhas são definidas por S1 e S2. A pilha S1 guarda os vértices do caminho M-alternante. A pilha S2guarda os vértices dos brotos que ainda não foram analisados.

Depois de iniciar as pilhas e a lista, escolhe-se um vértice que não esteja saturado e, a partir dele, procura-se um caminho M-aumentante, usando a função

caminho-aumentante(). Se o caminho M-aumentante for encontrado, então a função aumentar-emparelhamento() será usada para aumentar uma aresta ao emparelhamento M.

Para encontrar os caminhos M-aumentantes será usada a função

caminho-aumentante(). A função usa a idéia de rotulação dos vértices. Os vértices serão rotulados,

como um novo subgrafo, para isso serão usadas as duas pilhas, S1e S2, e a Lista_Vértices do algoritmo2.2.

(33)

Funçãocaminho-aumentante

Entrada: Lista_Vértices, S1, S2, r, M

Saída: Verdadeiro, Falso início

1

/* Rotulação da raiz do subgrafo */

i← 0; S1← i; u ← r; r.NUM ← i; r.po← −1 ; r.pe← i 2

enquanto Verdadeiro faça 3

se existe(u, v) /∈ M e a aresta não foi examinada então

4

se v6= r e v não é saturado então 5

/* Encontro de um caminho M-aumentante */

retorna Verdadeiro 6

fim 7

se v não é rotulado então 8 /* Processo de rotulação */ caminho-alternante() 9 senão 10 se v.pe6= −1 então 11 /* Encontro de um broto */ encontrar-broto() 12 se verificar-pilhas() então 13

/* Não existe caminho M-aumentante */

retorna Falso 14 fim 15 fim 16 fim 17 senão 18 se atualizar-pilhas() então 19

/* Não existe caminho M-aumentante */

retorna Falso 20 fim 21 fim 22 fim 23 fim 24

O processo de rotulação cria um caminho M-alternante, a partir de um vértice não saturado chamado de raiz, até encontrar um outro vértice não saturado para ter um caminho M-aumentante. Os rótulos são criados de tal maneira que seja possível, a partir de um vértice, retornar à raiz do subgrafo. Mesmo se o caminho M-alternante encontrar

(34)

2.2 Algoritmo de Emparelhamento Máximo 33

um broto, o processo de rotulação garante os rótulos necessários para recriar o caminho de volta.

Podemos observar que se os rótulos v.po e v.pe são diferentes de −1, então o vértice v.NUM faz parte de um broto, ou seja, a aresta (v.NUM, v.po) não pertence a M e a aresta (v.NUM, v.pe) pertence a M. Com esses rótulos, o caminho tem a possibilidade de, entrando pela raiz, seguir qualquer direção do broto. Essa direção vai depender de qual vértice do broto o caminho irá seguir, como por exemplo, os caminhos da figura abaixo.

• 2 • 0 • 1 • 3 • 4 (a) Grafo G • 2 • 4 • 0 • 1 • 3 (b) Grafo H

Figura 2.6: Caminhos nos brotos.

O primeiro rótulo é feito pela função caminho-aumentante() na raiz do subgrafo e a partir da raiz, o subgrafo é rotulado pela função caminho-alternante(). Temos na figura 2.7 um exemplo desse processo de rotulação. Para as figuras seguintes que representam o caminho M-aumentante vamos utilizar o seguinte esquema: as arestas contínuas são arestas já examinadas; as arestas pontilhadas são arestas que não foram examinadas; as arestas finas são arestas que não pertence ao emparelhamento M; as arestas em negrito são arestas que pertence a M.

• 6[−1,5] • 7[6, −1] • • 5[4, −1] 8[−1,7] • 4[−1,3] • 3[2, −1] • 2[−1,1] • 1[0, −1] • 0[−1,0] (a) Caminho M-alternante

8 7 6 5 4 3 2 1 0 (b) S1 (c) S2

(35)

Agora, vamos entender como é feito a rotulação dos vértices da figura2.7. A raiz do subgrafo é o primeiro vértice que é rotulado, ele recebe o rótulo(0, −1,0). Depois o algoritmo verifica se existe alguma aresta que incide na raiz que ainda não foi examinada. No exemplo temos a aresta uv, onde u é a raiz do subgrafo e v é o extremo da aresta que não foi examinada. Agora o algoritmo testa se o vértice v está saturado, caso ele não esteja saturado, então foi encontrado um caminho M-aumentante. Como o vértice v já está saturado então é chamado a função caminho-alternante() para rotular o vértice v da seguinte forma(1, 0, −1) e o vértice m(v) como (2,−1,1). O vértice m(v) é o vértice do outro extremo da aresta que pertence a M e que incide em v. Esses rótulos mostra que no vértice m(v) temos a aresta 21, que pertence ao emparelhamento e no vértice v temos a

aresta 10, que não pertence ao emparelhamento.

Depois desse processo o algoritmo move o vértice m(v) para o vértice u e faz

novamente o teste para saber se existe alguma aresta que ainda não foi examinada a partir do vértice u que agora é o vértice 2. Como podemos observar na figura temos duas arestas que ainda não foram examinadas. O algoritmo escolhe uma das arestas e verifica que o vértice é saturado, então é chamado função caminho-alternante() para rotular os vértices

v e m(v). O vértice v recebe o rótulo (3, 2, −1) e o vértice m(v) recebe o rótulo (4,−1,3).

Esse processo é repetido até que o vértice que recebe o rótulo(8, −1,7) seja rotulado pelo algoritmo.

O processo de rotulação continua criando o caminho M-alternante, verificando se alguma aresta ainda não foi examinada pela função, ou seja, uma aresta cujo vértice da extremidade já foi ou não rotulado. Temos as seguintes condições para analisar:

• se uma aresta conecta um vértice par com um vértice que não foi rotulado e não

está saturado pelo emparelhamento, então a função termina e foi encontrado um caminho M-aumentante;

• se uma aresta conecta um vértice par com um vértice que não foi rotulado, mas está

saturado pelo emparelhamento, então foi encontrado um caminho M-alternante e o procedimento caminho-alternante() será executado para continuar com a rotulação dos vértices do caminho M-alternante;

• se uma aresta conecta dois vértices pares rotulados com v.pediferente de−1, então foi encontrado um broto. O procedimento encontrar-broto() será executado para rotular os vértices do broto e depois a função verificar-pilhas() será executada para escolher o próximo valor para o vértice u;

• se uma aresta conecta um vértice par a um vértice ímpar foi encontrado um ciclo

par e a função não precisa fazer nada.

Se não existir uma aresta uv para ser examinada, então é executado a função

(36)

2.2 Algoritmo de Emparelhamento Máximo 35

topo da pilha S1será escolhido como o novo vértice u, e a partir de u a função continuará a procurar o caminho M-aumentante. Se as pilhas ficarem vazias, então a função

caminho-aumentante() termina e nenhum caminho M-aumentante foi encontrado.

O procedimento caminho-alternante() é executado toda vez que um vértice v saturado e que não foi rotulado é encontrado pela função caminho-aumentante(). O procedimento tem a função de aumentar o caminho M-alternante através da rotulação dos vértices da aresta que pertence ao emparelhamento. Como o vértice v é um vértice saturado, então existe uma única aresta m(v) pertencente ao emparelhamento M.

O procedimento utiliza o vértice v e o vértice m(v) para fazer a rotulação do

caminho M-alternante. O procedimento cria os rótulos do vértice v da seguinte maneira: o v.NUM recebe o próximo vértice do subgrafo; o v.po recebe o vértice anterior, pois a aresta(v.NUM, v.po) não pertence a M e o vértice v está a uma distância ímpar da raiz e o v.perecebe−1.

Depois os rótulos do vértice m(v) são criados da seguinte maneira: o m(v).NUM

recebe o próximo vértice do subgrafo; o m(v).pe recebe o vértice anterior, pois a aresta

(m(v).NUM, m(v).pe) pertence a M e o vértice m(v) está a uma distância par da raiz e o

m(v).porecebe−1. Procedimentocaminho-alternante Entrada: Lista_Vértices, S1, u, i início 1 /* Rótula o vértice v */ i← i + 1 2 v.NUM ← i; v.po← u.NUM; v.pe← −1 3 S1← i 4 /* Rótula o vértice m(v) */ i← i + 1 5 m(v).NUM ← i; m(v).po← −1; 6 m(v).pe← v.NUM S1← i 7 u← m(v) 8 fim 9

Quando a função caminho-aumentante() encontra uma aresta que conecta dois vértices pares rotulados com v.pe diferente de−1, foi encontrado um broto, ou seja, um caminho M-alternante fechado de comprimento ímpar.

A função não precisa tratar os caminhos M-alternantes fechados de comprimento par, pois esses caminhos são ciclos M-alternantes, ou seja, alternam arestas que estão no emparelhamento com arestas que não estão no emparelhamento.

(37)

Agora os caminhos M-alternantes fechados de comprimento ímpar tem um vér-tice, denominado base do broto, com duas arestas que não pertençam ao emparelhamento, ou seja, o processo de rotulação tem que indicar quais rótulos esses vértices têm que re-ceber, para que seja possível criar um caminho M-alternante. Os rótulos dos vértices dos ciclos M-alternantes de comprimento ímpar, formam um caminho com duas direções pos-síveis.

As funções e procedimentos do algoritmo EmparelhamentoMáximo 2.2 reali-zam operações com as pilhas S1 e S2, e essas funções e procedimentos utilizam algumas funções para essas operações, que são as seguintes: A função TOPO() retorna o topo de uma pilha; A função SegundoTOPO() retorna o primeiro elemento abaixo do topo da pi-lha; A função MOVE() move o topo de uma pilha para outra pipi-lha; A função REMOVE() apaga o topo de uma pilha.

Quando um broto é encontrado, executa-se o procedimento encontrar-broto(). Os vértices do broto são movidos da pilha S1para a pilha S2e seus rótulos são atualizados de tal maneira, que todos os vértices tenham a identificação tanto da aresta que está em

M quanto da aresta que não está em M. A figura2.8mostra um exemplo do processo de rotulação do broto a partir da figura2.7.

A figura 2.8 mostra quando a função caminho-aumentante() escolhe a aresta que liga o vértice 8 ao vértice 4 e foi encontrado um broto, então a função executa o procedimento encontrar-broto() para que os vértices sejam rotulados. Os rótulos serão dados da seguinte maneira: primeiro o vértice 8 recebe no poo valor do vértice 4, depois o vértice 7 recebe no pe o valor do vértice 8. Esse procedimento será realizado até que todos os vértices do broto sejam rotulados. O vértice 4 é o único que não recebe um rótulo pois ele é a base do broto.

• 6[7, 5] • 7[6, 8] • • 5[4, 6] 8[4, 7]• • • 4[−1,3] • • • • • (a) Broto 4 3 2 1 0 (b) S1 5 6 7 8 (c) S2

(38)

2.2 Algoritmo de Emparelhamento Máximo 37

Logo depois é executada a função verificar-pilhas(). Essa função verifica a existência de vértice na pilha S2, caso isso aconteça, o topo da pilha S2 será colocado no topo da pilha S1junto com uma marcação # e o topo de S1passa ser o novo vértice u.

Quando o procedimento encontrar-broto(), achar um vértice na pilha S1 com a marcação #, então foi encontrado um sub-broto nesse caminho. O broto que está contido em um outro broto é chamado por sub-broto. O procedimento apaga o vértice com a marcação da pilha S1e o topo S1passa ser a base do sub-broto.

Procedimentoencontrar-broto Entrada: Lista_Vértices, S1, S2 início 1 z← v; teste4 ← verdade 2

enquanto teste4 faça 3 x← z 4 y.NUM ← TOPO(S1) 5 se SegundoTOPO(S1) 6= /0então 6 z.NUM ← SegundoTOPO(S1) 7 fim 8

se y.NUM ≤ v.NUM então 9

teste4← f also

10

senão 11

se y.NUM não tem marcação # então

12

/* Rotulação dos vértices do broto */

y.po← x.NUM; z.pe← y.NUM 13

MOVE(S1, S2)/* move y.NUM de S1 para S2 */ 14

MOVE(S1, S2)/* move z.NUM de S1 para S2 */ 15

senão 16

REMOVE(S1)/* apaga o valor y.NUM# de S1 */ 17

se z.NUM > v.NUM então

18

/* Rotulação da base do sub-broto */

z.po← x.NUM ∗ (y.NUM); z.NUM ← z.pe 19 senão 20 teste4← f also 21 fim 22 fim 23 fim 24 fim 25 fim 26

(39)

Na seqüência, é verificado no subgrafo se a ordem do vértice z.NUM é maior do

que a ordem do vértice v.NUM, caso isso aconteça, foi encontrado a base do sub-broto

e o seu rótulo será atualizado para x.NUM ∗ (y.NUM). Essa marcação indica qual aresta o broto tem que seguir para criar o caminho M-alternante, onde x.NUM é um vértice

do broto e y.NUM é o vértice de entrada do sub-broto. A figura 2.9(d) mostra como é encontrado e rotulado um broto e um sub-broto, seguindo as figuras2.7e2.8.

• • • 9[7,−1] • • •10[−1,9] • •11[10,−1] • •12[2,11] • • •

(a) Encontro do sub-broto

12 11 10 9 7# 4 3 2 1 0 (b) S1 7 8 (c) S2 • • • 9[7,10] • • •10[11,9] • 4[9 ∗ (7),3] •11[10,12] • 3[2, 4] •12[2,11] • • •

(d) Rotulação do broto e sub-broto 2 1 0 (e) S1 3 4 9 10 11 12 7 8 (f) S2

Figura 2.9: Encontro de um broto e um sub-broto.

Depois que a função caminho-aumentante() encontrou e rotulou os vértices do broto, será executada a função verificar-pilhas() para escolher qual será o próximo valor para o vértice u. Esse novo valor pode ser um vértice de um broto ou apenas um vértice do caminho M-alternante. O vértice u é usado na função caminho-aumentante() para continuar o processo de rotulação que cria o caminho M-alternante. A função

verificar-pilhas() executa um dos seguintes testes:

• se a pilha S2 não estiver vazia, então o vértice u recebe o topo da pilha S2, sendo esse valor pertencente a algum broto. Depois, a pilha S1recebe u.NUM juntamente com a marcação #. Essa marcação indica em qual vértice do broto sai o caminho

M-alternante;

• se a pilha S2 estiver vazia e a pilha S1 não estiver vazia, então o vértice u recebe o topo da pilha S1 e a função caminho-aumentante() continua o processo de rotulação, pois não temos vértice do broto que possa dar seqüência ao caminho

M-aumentante;

• se as duas pilhas estiverem vazias, então o caminho M-aumentante não foi

encon-trado e será finalizada a função caminho-aumentante(), pois todos os vértices dos caminhos M-alternantes, saindo de r, foram visitados e portanto rotulados.

(40)

2.2 Algoritmo de Emparelhamento Máximo 39 Funçãoverificar-pilhas Entrada: Lista_Vértices, S1, S2, u Saída: Verdadeiro,Falso início 1 se S26=/0então 2

/* Escolhe um vértice do broto */

u← TOPO(S2); S1← u.NUM# 3 senão 4 se S16= /0então 5

/* Escolhe um vértice da pilha S1 */

u← TOPO(S1) 6

senão 7

/* Não existe mais vértices nas pilhas */

retorna Verdadeiro 8 fim 9 fim 10 retorna Falso 11 fim 12

Quando todas as arestas incidentes no vértice u já foram examinadas, então é executada a função atualizar-pilhas() para mudar o vértice que será examinado, e se for o caso terminar a função caminho-aumentante().

Se no topo de S1 tiver uma marcação #, então o vértice faz parte de um broto, ou de um sub-broto, e não foi encontrada nenhuma aresta para sair do broto a partir do vértice u. Nesse caso, a função atualizar-pilhas() apaga NU M(u) das pilhas S1e S2, pois o mesmo vértice fica nas duas pilhas quando temos a saída de um broto. Depois é executado a função verificar-pilhas() para escolher outro vértice u, que pode ser da pilha S2 ou S1, o vértice u será usado para continuar o caminho M-alternante. Se as duas pilhas ficarem vazias, então a função atualizar-pilhas() termina.

Se no topo de S1não tiver a marcação #, então não foi encontrada nenhuma aresta incidente no vértice u que ainda não foi examinada. Portanto, não é possível aumentar o caminho M-alternante a partir do vértice u. A função atualizar-pilhas() apaga duas vezes o topo da pilha S1e tira essa aresta do caminho. Na seqüência o vértice u recebe o novo topo da pilha S1.

Toda vez que a função caminho-aumentante() encontra um caminho M-aumentante será executada a função aumentar-emparelhamento(). Essa função utiliza os rótulos da lista de vértices para criar o caminho M-aumentante do vértice v até o vértice r. A figura2.10mostra um subgrafo rotulado que começa no vértice 0 até o vértice 13,

(41)

pode-mos observar que o vértice 0 é a raiz do subgrafo e ele não é saturado. O último vértice do caminho M-aumentante é o vértice 13. Portanto, o caminho M-aumentante é formado do último vértice 13, até a raiz do subgrafo, o vértice 0. No exemplo da figura2.10, o caminho

M-aumentante é composto dos seguintes vértices: P= (13, 3, 4, 8, 7, 9, 10, 11, 12, 2, 1, 0).

O emparelhamento é aumentado em uma aresta usando a operação M⊕ P.

Funçãoatualizar-pilhas

Entrada: Lista_Vértices, S1, S2, u

Saída: Verdadeiro,Falso início

1

se u.NUM em S1tem marca # então 2

/* Não existe aresta para examinar nesse vértice */

REMOVE(S1); REMOVE(S2) 3

se verificar-pilhas() então 4

/* Não existe vértices nas pilhas */

retorna Verdadeiro 5 fim 6 senão 7

/* Remove uma aresta do caminho */

REMOVE(S1); REMOVE(S1); u← TOPO(S1) 8 fim 9 retorna Falso 10 fim 11 • 6[7, 5] • 7[6, 8] • 9[7,10] • 5[4, 6] 8[4, 7] •10[11,9] • 4[9 ∗ (7),3] •11[10,12] • 3[2, 4] •12[2,11] • 13[3, −1] •2[−1,1] •1[0,−1] •0[−1,0]

(42)

2.2 Algoritmo de Emparelhamento Máximo 41

Funçãoaumentar-emparelhamento

Entrada: Lista_Vértices, v, M

Saída: Um emparelhamento M= M ⊕ P

/* P é o caminho M-aumentante definido pela Lista_Vértices */

início 1

i← Total(Lista_Vértices)-1; M← M

2

enquanto(v.NUM 6= r.NUM) e (i > 0) faça 3

se (v.pocontém∗) e (i não for par) então 4 d← número depois do ∗ 5 a← número antes do ∗ 6 b← v 7

/* Adiciona a aresta que sai do sub-broto */

M← M+ (d, a); v ← d; i ← i − 1

8

enquanto b6= v faça 9

/* Examina as arestas de um broto */

se i for par então 10 M← M− (v.NUM,v.pe); v ← v.pe/* (v.NUM, v.pe) ∈ M */ 11 senão 12 M← M+ (v.NUM, v.po); v ← v.po/* (v.NUM, v.po) /∈ M */ 13 fim 14 i← i − 1 15 fim 16 v← a 17 senão 18

se i for par então 19 M← M− (v.NUM,v.pe); v ← v.pe/* (v.NUM, v.pe) ∈ M */ 20 senão 21 M← M+ (v.NUM, v.po); v ← v.po/* (v.NUM, v.po) /∈ M */ 22 fim 23 i← i − 1 24 fim 25 fim 26 retorna M27 fim 28

Nesse processo, a função aumentar-emparelhamento() pode encontrar alguns brotos ou sub-brotos, ou seja, o caminho M-aumentante pode passar pelo broto entrando em seus vértices ou na base broto. A base é o único vértice do broto que pode ser saturado

Referências

Documentos relacionados