Você está na página 1de 8

Capı́tulo 4

Árvores
Edmilson Marmo Moreira
Universidade Federal de Itajubá - UNIFEI
Instituto de Engenharia de Sistemas e Tecnologia da Informação - IESTI

“A educação é a arma mais poderosa que você pode usar para mudar o mundo”.

Nelson Mandela

1 Considerações Iniciais
Um grafo A é dito uma árvore se A é conexo e não tem ciclos. A figura 1 apresenta
um exemplo de árvore. Uma floresta é um grafo sem ciclos; logo, as componentes conexas
de uma floresta são árvores. Um grafo sem ciclo é dito acı́clico. A árvore que consiste
em um único vértice e nenhuma aresta é dita árvore degenerada.

v1 v2 v3

v4 v5 v6

v7 v8 v9

Figura 1: Exemplo de árvore

Considerando uma árvore A, claramente, existe apenas um caminho simples entre dois
vértices de A; caso contrário, os dois caminhos formariam um ciclo. Além disso:

1. Supondo que não existe uma aresta {u, v} em A e se for adicionada a aresta a =
{u, v} a A. Então, o caminho simples de u até v em A mais o vértice a formará um
ciclo; neste caso, A deixará de ser uma árvore.

2. Por outro lado, supondo que existe uma aresta a = {u, v} em A e se esta aresta for
deletada de A, então, A não é mais um grafo conexo (já que não existe um caminho
entre u e v); neste caso, A deixa de ser uma árvore.

Uma folha de um grafo é um vértice de grau 1. As folhas são chamadas também de


vértices terminais ou vértices pendentes.

1
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 2

Teorema 1.1 Toda árvore com ao menos dois vértices tem uma folha.

Demonstração: Seja T uma árvore com ao menos dois vértices e seja P o caminho mais
longo em T . Como T é conexo e contém ao menos dois vértices, P tem dois ou mais
vértices. Supondo, P = v0 ∼ v1 ∼ . . . ∼ vl , onde l ≥ 1. Afirma-se que o primeiro e
o último vértices de P (isto é, v0 e vl ) são folhas de T .
Supondo, por contradição, que v0 não seja folha. Como v0 tem ao menos um vizinho
(v1 ), tem-se que d(v0 ) ≥ 2. Seja x outro vizinho de v0 (isto é, x 6= v1 ). Nota-se que
x não é um vértice em P , pois, em caso contrário, existiria um ciclo:

v0 ∼ v1 ∼ . . . ∼ x ∼ v0 .

Pode-se, assim, antepor x ao caminho P para formar o caminho Q:

Q = x ∼ v0 ∼ v1 ∼ . . . ∼ vl .

Todavia, Q é um caminho em T que é mais longo do que P . Isso é uma contradição!


Portanto, v0 é uma folha. Da mesma forma, vl é uma folha. Portanto, T tem ao
menos duas folhas.

Teorema 1.2 Seja G um grafo com v > 1 vértices. Então, as seguintes afirmações são
equivalentes:

1. G é uma árvore.

2. G é um grafo acı́clico e tem v − 1 arestas.

3. G é conexo e tem v − 1 arestas.

Demonstração: A demonstração é por indução sobre v. O teorema certamente é verdade


para o grafo que possui apenas um vértice e, portanto, nenhuma aresta. Isto é, o
teorema vale para v = 1.
Assumindo que v > 1 e que o teorema vale para grafos com menos do que v vértices.

(1) implica (2): Supondo que G é uma árvore. Então, G é acı́clico, e precisa-se
mostrar apenas que G tem v − 1 arestas. Conforme demonstrado no teorema
1.1, G tem pelo menos dois vértices de grau 1. Deletando-se um destes vértices
e sua respectiva aresta, obtém-se uma árvore A que tem v − 1 vértices. O
teorema vale para A, portanto, A tem v − 2 arestas. Logo, G tem v − 1 arestas.
(2) implica (3): Supondo que G é acı́clico e tem v − 1 arestas. Precisa-se mostrar
apenas que G é conexo. Supondo que G é desconexo e tem k componentes
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 3

A1 , A2 , . . . , Ak , que são árvores, uma vez que cada uma é conexa e acı́clica.
Supondo que Ai tem vi vértices. Note que vi < v. Portanto, o teorema vale
para Ai , e logo Ai tem vi − 1 arestas. Portanto, v = v1 + v2 + v3 + . . . + vk e

v − 1 = (v1 − 1) + (v2 − 1) + . . . + (vk − 1) = v1 + v2 + . . . + vk − k = v − k

Assim, k = 1. Mas isso contradiz a hipótese de que G é desconexo e tem k > 1


componentes. Logo, G é conexo.
(3) implica (1): Supondo que G é conexo e tem v−1 arestas. É necessário mostrar
apenas que G é acı́clico. Supondo que G tem um ciclo contendo um aresta a.
Deletando a, obtem-se o grafo H = G − a, que também é conexo. Mas H
tem v vértices e n − 2 arestas, e isto é uma contradição. Logo, G é acı́clico e,
portanto, é uma árvore.

2 Árvore Geradora
Um subgrafo A de um grafo conexo é uma árvore geradora de G se A é uma árvore
e A inclui todos os vértices de G. A figura 2 mostra um grafo G e as árvores geradores
A1 , A2 e A3 de G.

• • • • • • • • • • • •

• • • • • • • • • • • •

G A1 A2 A3

Figura 2: Árvores Geradoras

Supondo que G é um grafo conexo ponderado, ou seja, cada aresta de G está associada
a um número não negativo (peso). Então, qualquer árvore geradora A de G está associada
a um peso total obtido pela soma dos pesos das arestas em A. Uma árvore geradora
minimal de G é uma árvore geradora cujo peso total é o menor possı́vel. Se só existir
uma árvore geradora minimal, ela será mı́nima. Por sua vez, uma árvore geradora
maximal é a árvore geradora de maior custo em G. Da mesma forma, a árvore maximal
será máxima se for única. Os algoritmos a seguir permitem encontrar a árvore geradora
minimal A de um grafo conexo ponderado G, onde G tem v vértices.
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 4

Algoritmo Árvore Geradora Minimal – A entrada é um grafo conexo ponderado G


com v vértices.

Passo 1: Ordene as arestas de G em ordem decrescente de peso.

Passo 2: Sequencialmente, delete cada aresta que não desconecta o grafo até que restem
v − 1 arestas.

Passo 3: Saia.

O peso de uma árvore minimal geradora é único, mas a árvore, propriamente dita, não
é. Árvores geradoras minimais distintas podem ocorrer quando duas ou mais arestas têm
o mesmo peso. Neste caso, a ordenação das arestas no Passo 1 do algoritmo não é única
e pode, portanto, resultar em diferentes árvores geradoras minimais.

2.1 Algoritmo de Prim


Este algoritmo foi proposto por Robert C. Prim (1957). De fato, o algoritmo foi
proposto anteriormente por Jarnik (1930), em checo. A estratégia do algoritmo é incluir
de forma gulosa, um a um, os vértices da árvore. Considerando os conjuntos Amin , A, e V ,
onde Amin ⊆ M , A ⊆ N , V ⊆ N , o algoritmo de Prim pode ser descrito como proposto
a seguir:

Algoritmo de Prim – A entrada é um grafo conexo ponderado G(N, M ) sendo


D = [dij ] a matriz de pesos de G.

Passo 1: Escolher qualquer vértice i ∈ N .

Passo 2: Iniciar os conjuntos:

• A ← {i}
• V ← N − {i}
• Amin ← ∅

Passo 3: Enquanto V 6= N faça:

• Encontrar a aresta (j, k) ∈ M tal que j ∈ A, k ∈ V e djk é mı́nimo


• A ← A ∪ {k}
• V ← V − {k}
• Amin ← Amin ∪ (i, k)

Passo 4: Devolver Amin .


Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 5

O Algoritmo parte de qualquer vértice de G. A cada passo, acrescenta a menor aresta


incidente no conjunto de vértices que já foi selecionado e que possui uma extremidade em
vértices fora desse conjunto.
A figura 3 exemplifica o funcionamento do algoritmo de Prim para a solução do grafo
marcado com o passo 1. O passo 6 da figura exibe a árvore final, com as arestas em
azul. Observe que a cada passo do algoritmo um novo vértice é acrescentado à árvore em
formação através da aresta mais barata incidente no conjunto de vértices já examinados.
Por exemplo, no passo 3 as arestas examinadas são (2,4); (2,5); (3,4) e (3,5). Nesta figura,
o conjunto já examinado é representado pela demarcação pontilhada.

Figura 3: Evolução do algoritmo de Prim

2.2 Algoritmo de Prim Colorido


Utilizando-se a matriz de adjacência e uma busca linear no conjunto de arestas, a
versão apresentada do algoritmo de Prim possui complexidade O(n3 ). Entretanto, este
algoritmo pode ficar mais eficiente com um controle das arestas que são examinadas. Essa
versão do algoritmo de Prim é denominada Prim Colorido, descrito nos passos a seguir:

Algoritmo de Prim Colorido – A entrada é um grafo conexo ponderado G(N, M )


sendo D = [dij ] a matriz de pesos de G.

Passo 1: Escolher qualquer vértice j ∈ N .

Passo 2: Iniciar os conjuntos e variáveis:

• i←0
• A = (NA , MA )
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 6

• NA ← {j}
• MA ← ∅

Passo 3: Colorir com verde as arestas incidentes ao vértice j.

Passo 4: Enquanto i < n − 1 faça:

• Selecionar a aresta verde (j, k), j ∈ NA tal que djk é mı́nima e colori-la de
azul.
• MA ← MA ∪ (j, k); NA ← NA ∪ {k}
• Para cada aresta (k, z), z 6∈ NA faça:
1. Se não existir aresta verde incidente em z, colorir (k, z) com verde
2. Senão: se existe aresta verde (w, z) tal que dwz > dkz colorir (w, z) com
vermelho e (k, z) com verde
• i←i+1

Passo 5: Devolver Ai {a ávore geradora mı́nima}.

Da mesma forma que o algoritmo de Prim clássico, esta versão escolhe aleatoriamente
o vértice inicial da árvore geradora. O algoritmo Prim Colorido pode ser implementado
com complexidade O(n2 ).
A figura 4 exemplifica o funcionamento do algoritmo de Prim Colorido, iniciando com
o vértice 1. No primeiro passo, as arestas (1,2) e (1,3) são coloridas de verde. Em seguida,
a menor aresta verde é colorida de azul e inserida na solução. Após esta seleção, o vértice 2
é escolhido para ser examinado e, portanto, as arestas (2,4) e (2,5) são coloridas de verde.
Observe que a aresta (2,3) não é colorida de verde, pois o vértice 3 já possui uma aresta
verde incidente sobre ele. Mas, logo em seguida, a aresta (1,3) é colorida de vermelho, pois
o custo desta aresta é maior que o custo da aresta (2,3) que, por consequência, é colorida
de azul. Em seguida, o vértice 3 é escolhido para ser examinado. Como consequência,
a aresta (3,5) é colorida de verde e a aresta (2,5) é colorida de vermelho. Neste ponto,
existem duas arestas verdes com o mesmo peso. O algoritmo escolhe uma deles, no exemplo
(3,5), e a colore de azul para que ela faça parte da solução. O vértice 5 é escolhido para
ser examinado e a aresta (5,6) é colorida de verde. Em seguida, a aresta (5,4) é colorida
de verde e a aresta (2,4) é colorida de vermelho. Dentre as arestas verdes, a menor (5,4)
é colorida de azul e incluı́da na solução. Finalmente, o vértice 4 é escolhido para exame,
a aresta (4,6) não será colorida, pois já existe uma aresta incidente ao vértice 6 com peso
menor. Neste passo do algoritmo, a aresta (5,6) é colorida de azul, pois é a única aresta
verde. Observe que i = n−1, finalizando a estrutura de repetição e, portanto, o algoritmo.
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 7

Figura 4: Evolução do algoritmo de Prim Colorido

2.3 Algoritmo de Kruskal


Semelhante ao primeiro algoritmo apresentado neste nota, este método foi proposto
por Joseph B. Kruskal (1956). O raciocı́nio de Kruskal está voltado para a formação da
árvore através da inclusão de arestas, não de vértices, como no algoritmo de Prim.

Algoritmo Árvore Geradora Mı́nima (Kruskal) – A entrada é um grafo conexo


ponderado G com v vértices.

Passo 1: Ordene as arestas de G em ordem crescente de peso.

Passo 2: Começando apenas com vértices de G e procedendo sequencialmente, adicione


cada aresta que não gere um ciclo até que v − 1 arestas sejam adicionadas.

Passo 3: Saia.

Referências
GERSTING, J. L. Fundamentos Matemáticos Para a Ciência da Computação. 5a. ed.
Rio de Janeiro: Livros Técnicos e Cientı́ficos Editora S.A., 2004. 597 p.

GOLDBARG, M.; GOLDBARG, E. Grafos: conceitos, algoritmos e aplicações. 1a. ed.


Rio de Janeiro: Elsevier, 2012.
Teoria dos Grafos - Notas de Aula - Capı́tulo 04 - 8

LIPSCHUTZ, S.; LIPSON, M. Teoria e Problemas de Matemática Discreta. 2a. ed. Porto
Alegre: Bookman, 2004. 511 p.

PINTO, J. S. Tópicos de Matemática Discreta. [S.l.], 2005.

ROSEN, K. H. Discrete Mathematics and Its Applications. 5th. ed. New York: McGraw
Hill, 2005.

SCHEINERMAN, E. R. Matemática Discreta: Uma introdução. 1a. ed. São Paulo:


Thomson, 2003.

Você também pode gostar