Prévia do material em texto
Razer Anthom Nizer Rojas Montaño
TEORIA DOS GR
AFOS
Razer Anthom
N
izer Rojas M
ontaño
A Teoria dos Grafos (TG) é uma área de estudo e pesquisa que possibilita
a resolução de problemas de diversos setores, como logística,
comunicações, tubulações, genética, química, entre outros. O objetivo
da TG é a representação de problemas, como por exemplo, as estruturas
matemáticas, chamadas de grafos, e a aplicação de soluções algorítmicas,
sempre considerando aspectos computacionais de desempenho, em tempo
de execução e armazenamento.
Neste livro, buscou-se um equilíbrio entre a teoria, necessária para o
entendimento matemático dos grafos, e os algoritmos, que levam em
consideração sua composição computacional na solução de problemas.
Código Logístico
59398
Fundação Biblioteca Nacional
ISBN 978-85-387-6636-0
9 7 8 8 5 3 8 7 6 6 3 6 0
Teoria dos Grafos
Razer Anthom Nizer Rojas Montaño
IESDE BRASIL
2020
© 2020 – IESDE BRASIL S/A.
É proibida a reprodução, mesmo parcial, por qualquer processo, sem autorização por escrito do autor e do detentor dos
direitos autorais.
Projeto de capa: IESDE BRASIL S/A. Imagem da capa: EnvatoElements
Todos os direitos reservados.
IESDE BRASIL S/A.
Al. Dr. Carlos de Carvalho, 1.482. CEP: 80730-200
Batel – Curitiba – PR
0800 708 88 88 – www.iesde.com.br
CIP-BRASIL. CATALOGAÇÃO NA PUBLICAÇÃO
SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ
M765t
Montaño, Razer Anthom Nizer Rojas
Teoria dos grafos / Razer Anthom Nizer Rojas Montaño. - 1. ed. -
Curitiba [PR] : IESDE, 2020.
126 p. : il.
Inclui bibliografia
ISBN 978-85-387-6636-0
1. Teoria dos grafos. 2. Algoritmos I. Título.
20-63940 CDD: 511.5
CDU: 519.17
Razer Anthom
Nizer Rojas Montaño
Doutor em Ciência da Computação e mestre em
Informática pela Universidade Federal do Paraná (UFPR),
na área de inteligência computacional. Graduado
bacharel em Informática pela mesma instituição.
Atualmente, é professor do curso superior de
Tecnologia em Análise e Desenvolvimento de Sistemas
e coordenador acadêmico do Setor de Educação
Profissional e Tecnológica da UFPR. Tem experiência
nas áreas de análise, projeto e desenvolvimento de
software (com ênfase na plataforma Java e aplicações
corporativas), aprendizado de máquina (regressão,
classificação, clusterização, regras de associação,
linguagem R, avaliação de modelos), planejamento em
inteligência artificial (com ênfase em lógica matemática,
SAT, redes de Petri e raciocínio sobre ações) e aplicações
em mensuração florestal.
Agora é possível acessar os vídeos do livro por
meio de QR codes (códigos de barras) presentes
no início de cada seção de capítulo.
Acesse os vídeos automaticamente, direcionando
a câmera fotográ�ca de seu smartphone ou tablet
para o QR code.
Em alguns dispositivos é necessário ter instalado
um leitor de QR code, que pode ser adquirido
gratuitamente em lojas de aplicativos.
Vídeos
em QR code!
SUMÁRIO
1 Introdução ao estudo dos grafos 9
1.1 História e teoria dos grafos 9
1.2 Noções e definições básicas 12
1.3 Tipos de grafos 14
1.4 Vizinhança e grau 17
1.5 Isomorfismo 21
1.6 Representação computacional 27
1.7 Aplicações dos grafos 29
2 Conectividade 34
2.1 Grafos conexos e componentes 34
2.2 Caminhos e circuitos 36
2.3 Subgrafos 40
2.4 Cortes 42
3 Caminho mínimo e árvores geradoras 51
3.1 Busca em grafos e árvore geradora 51
3.2 Árvore Geradora Mínima 62
3.3 Caminho Mínimo 65
4 Grafos eulerianos e hamiltonianos 74
4.1 Grafos eulerianos 74
4.2 Grafos hamiltonianos 84
5 Problemas em Grafos 97
5.1 Cliques e Conjuntos Estáveis 97
5.2 Cliques Máximas 101
5.3 Coberturas 104
5.4 Planaridade 106
5.5 Coloração 111
Gabarito 118
APRESENTAÇÃO
Vídeo A Teoria dos Grafos (TG) é uma área de estudo e pesquisa que
possibilita a resolução de problemas de diversos setores, como logística,
comunicações, tubulações, genética, química, entre outros. O objetivo da
TG é a representação de problemas, como por exemplo, as estruturas
matemáticas, chamadas de grafos, e a aplicação de soluções algorítmicas,
sempre considerando aspectos computacionais de desempenho, em
tempo de execução e armazenamento.
Na área de estudo dos grafos, pode-se abordar o assunto com viés
teórico ou algorítmico. Na abordagem teórica, tem-se um peso maior nos
aspectos matemáticos dos grafos, dos teoremas e das provas. Na abordagem
algorítmica, estudam-se os problemas, as maneiras de resolução (eficientes
ou não) e a implementação computacional dessas soluções.
Neste livro, buscou-se um equilíbrio entre a teoria, necessária para
o entendimento matemático dos grafos, e os algoritmos, que levam em
consideração sua composição computacional na solução de problemas.
Os capítulos estão organizados de modo a apresentar os conceitos e
problemas gradualmente.
Inicia-se com os conceitos básicos necessários para equalizar o
vocabulário e mostrar a estrutura matemática de um grafo, bem como sua
história. Na sequência, conceitos mais avançados são expostos e alguns
algoritmos são apresentados, além de teoremas pertinentes ao assunto.
Em suma, essa obra traz informações básicas para a compreensão geral da
Teoria dos Grafos em todas as áreas em que sua aplicação é possível.
Bons estudos!
Introdução ao estudo dos grafos 9
1
Introdução ao estudo dos grafos
Neste capítulo, será introduzido o estudo sobre a teoria dos grafos, o
qual está organizado da seguinte maneira: na Seção 1.1 é apresentado o
surgimento da teoria dos grafos, mostrando que a alavanca para o seu
desenvolvimento foram problemas reais que os cientistas tiveram na épo-
ca. Na Seção 1.2 abordam-se as noções e definições básicas dos grafos,
sua caracterização matemática e sua representação gráfica. Na Seção 1.3
são mostrados os vários tipos de grafos e suas definições. Já os conceitos
de vizinhança, grau e caminhos serão tratados na Seção 1.4. Na Seção 1.5
exploram-se o conceito de isomorfismo em grafos e as suas caracterizações.
Para executar algoritmos em grafos, também será necessário o estudo
das representações computacionais, as quais estão descritas na Seção
1.6. Por fim, na Seção 1.7 são abordadas algumas aplicações de grafos em
problemas do mundo real.
1.1 História e teoria dos grafos
Vídeo Um grafo é uma estrutura que formaliza relações de interdependência exis-
tentes entre os elementos de um conjunto e que possui uma representação grá-
fica facilitadora do entendimento e desenvolvimento de alguns conceitos. Assim,
os componentes de um grafo que representam os elementos de um conjunto em
questão são diagramados como pontos e denominados como vértices ou nós. Para
representar as relações entre os elementos do conjunto, traçam-se setas interli-
gando os vértices, as quais são denominadas arestas ou arcos.
Os grafos podem ser usados para resolver problemas em diversas áreas, por
exemplo, na química, em que a estrutura de uma molécula pode ser represen-
tada por meio de um grafo; nas redes de rotas de transporte (estradas, logís-
tica etc.); nas redes de comunicações (rede de computadores local ou mesmo
na internet); na distribuição de produtos e serviços, caso das tubulações de gás,
água, petróleo etc.
De acordo com Szwarcfiter (2018), o estudo dos grafos surgiu com o proble-
ma das sete pontes de Königsberg. Em um artigo publicado por Leonhard Euler
(1707–1783), em 1736, o autor discorreu sobre o assunto, apresentando uma so-
lução negativa, a qual originou a teoria dos grafos. Königsberg – que até 1945 foi
território da Prússia – é uma cidade cortada pelo Rio Prególia, com duas grandes
ilhas e sete pontes entre elas. A região foi bombardeada durante a Segunda Guerra
Mundial e tomada pelos russos, quando foi renomeada para Kaliningrado. Durante
10 Teoria dos Grafos
esse período, duas das sete pontes existentes foram destruídas. Observe a seguir o
mapa das pontes em 1652 (as em vermelho foram destruídas).
Se
rg
ey
M
er
ku
lo
v/
Sh
ut
te
rs
to
ck
Em 1736, Eulerprovou que não havia a possibilidade de passar por todas essas
pontes sem repetir qualquer uma delas. Para comprovar essa tese, o estudioso
desenhou o problema das pontes usando um diagrama como este:
v4
v1
v2
v3
Grafo do problema das sete pontes de Königsberg
Euler descobriu que só seria possível passar por cada ponte uma única vez caso hou-
vesse nenhum ou dois pontos de onde saísse um número ímpar de caminhos. Assim,
para que fosse possível chegar em um ponto e depois sair por uma aresta diferente,
cada ponto deveria conter um número par de arestas (um para entrar, outro para sair).
Os dois pontos com número ímpar de caminhos representam o início e o final do per-
curso, pois não precisam de uma aresta para entrar e uma para sair. Se não houvesse
um número ímpar de caminhos, o percurso começaria e terminaria no mesmo ponto.
O autor, então, provou que para um grafo conexo ser euleriano, isto é, possuir
um ciclo que passe por todas as arestas de um grafo somente uma vez, iniciando
e terminando no mesmo vértice, todos os vértices precisam possuir um número
par de arestas incidentes. O artigo de Euler foi considerado o primeiro resultado da
teoria dos grafos, uma vez que continha o primeiro teorema provado dessa nova
área, o qual determinou um método para solucionar problemas desse tipo.
Introdução ao estudo dos grafos 11
Outros problemas também foram resolvidos pela teoria dos grafos, como a colo-
ração de mapas. Determinar o mínimo de cores necessário para se colorir o desenho
de um mapa era uma difícil missão, até que Francis Guthrie (1831–1899) conjecturou,
em 1852, que era preciso, no mínimo, quatro cores. Mas apenas em 1976 essa hipó-
tese foi comprovada por Kenneth Appel (1932–2013) e Wolfgang Haken (1928–), com
a ajuda de um IBM 360. A solução de Appel e Haken foi a construção de um programa
que verificava todos os possíveis exemplos de mapas (1936 ao todo), sendo esse o
primeiro teorema matemático provado com o auxílio de um computador, o que tam-
bém gerou controvérsia. A descoberta ficou conhecida como o teorema das quatro
cores. A figura a seguir mostra o mapa do Brasil colorido com quatro cores, sendo os
estados adjacentes coloridos com cores diferentes.
Filip Bjorkm
an/Shutterstock
Apesar de o artigo de Euler ser o primeiro resultado da teoria dos grafos, o ter-
mo foi utilizado pela primeira vez, com a conotação aqui apresentada, por James
Joseph Sylvester (1814–1897) e Arthur Cayley (1821–1895). Em 1857, os estudiosos
aplicaram os conceitos de grafos à química, enumerando isômeros de hidrocar-
bonetos, visto que toda molécula também pode ser representada por um diagra-
ma. O termo grafo apareceu nas palavras dos autores em um artigo publicado em
1878, no primeiro volume do American Journal of Mathematics Pure and Applied, na
revista Nature.
Em 1859, William Rowan Hamilton (1805–1865) elaborou um jogo chamado
icosiano ou viagem à volta do mundo, inspirado pela prática de caixeiro-viajante.
O objetivo era encontrar caminhos e circuitos no grafo dodecaédrico, satisfazendo
determinadas condições, como achar um circuito que passasse uma única vez por
cada vértice do grafo (conhecido como caminho hamiltoniano).
Em 1930, Kazimierz Kuratowski (1896–1980) encontrou uma condição
necessária e suficiente para a planaridade de um grafo (desenhar um grafo com
arestas que não se cruzam). Já o primeiro livro didático sobre grafos foi escrito por
Dénes König (1884–1944) em 1936.
IBM 360 é um mainframe lan-
çado pela empresa International
Business Machines Corporation
(IBM) em 1964. Trata-se de um
dos primeiros computadores
fabricados com a utilização de
circuitos integrados.
Saiba mais
caixeiro-viajante: representante
de vendas; uma pessoa que vendia
produtos em outras cidades e que,
para isso, fazia muitas viagens.
Glossário
dodecaedro: sólido contendo 12
faces, limitado por polígonos, com
30 arestas e 20 vértices.
Glossário
12 Teoria dos Grafos
Em 1962, Lester Randolph Ford (1886–1967) e Delbert Ray Fulkerson (1924–
1976) desenvolveram a teoria dos fluxos em redes, um dos mais importantes resul-
tados da teoria dos grafos. Esse estudo é muito usado hoje em dia na distribuição
de energia, na capacidade de redes de computadores, entre outras aplicabilidades,
possibilitando o mapeamento e a análise dos fluxos em redes.
Atualmente, os grafos aparecem em várias áreas e modelam problemas di-
versos. O mapeamento de amigos em uma rede social é um exemplo disso, sen-
do os vértices as pessoas e as arestas a relação de amizade entre elas. A própria
internet pode ser vista como um grafo, em que cada dispositivo conectado é um
vértice e cada conexão, com ou sem fio, é uma aresta. Até mesmo aplicativos
de mapas usam algoritmos de grafos para traçar uma rota entre dois pontos e
calcular tempos de viagem. Redes de telefonia, saneamento básico, distribuição
de energia, transporte público, todos esses serviços são exemplos da aplicação
de grafos.
1.2 Noções e definições básicas
Vídeo Um grafo G é um par (V, A) em que V é um conjunto não vazio de vértices, tam-
bém representado por V (G), e A é um conjunto finito de arestas, também represen-
tado por A (G). Cada aresta é um par não ordenado (v, w) que pode ser denotado
como vw ou wv, sendo v, w ∈ V. Uma aresta vw incide em v e w, sendo estes pontas
da aresta (BOAVENTURA NETTO; JURKIEWICZ, 2009).
No geral, usa-se uma representação gráfica de um grafo para facilitar o entendi-
mento, por exemplo, o grafo G = (V, A):
V = {v1, v2, v3, v4, v5}
A = {(v1, v2), (v2, v3), (v2, v4), (v4, v5), (v2, v5), (v4, v4), (v1, v2)}
O grafo G pode ser visto da seguinte maneira:
v4
v5
v3
v2
v1
Figura 1
Grafo G
Fonte: Elaborada pelo autor.
Para facilitar o entendimento, pode-se nomear as arestas da seguinte forma:
V = {v1, v2, v3, v4, v5}
A = {a1, a2, a3, a4, a5, a6, a7}
Tal que: a1 = (v1, v2 ), a2 = (v2, v3 ), a3 = (v2, v4), a4 = (v4, v5), a5 = (v2, v5), a6 = (v4, v4), a7 = (v1, v2)
No filme Gênio Indomável,
Will Hunting (Matt Damon)
é faxineiro em uma univer-
sidade e possui um grande
talento para a matemá-
tica. Em uma das cenas,
o professor Lambeau
(Stellan Skarsgård) deixa
um problema de grafos
no quadro como desafio
para seus alunos de
pós-graduação e Hunting o
resolve, impressionando o
professor e seus alunos.
Direção: Gus Van Sant Jr. Estados
Unidos: Miramax, 1997.
Filme
Introdução ao estudo dos grafos 13
Então, representa-se da seguinte maneira o que é chamado grafo rotulado:
Figura 2
Grafo com arestas nomeadas
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
a6
a4
a5
a2
a7
a1
a3
Se no grafo G todas as suas arestas (v, w) são tais que v ≠ w e não existem duas
arestas diferentes que incidem nos mesmos vértices, diz-se que o grafo é simples.
O grafo com arestas nomeadas (Figura 2) não é simples, pois tem duas arestas en-
tre os vértices v1 e v2, e o vértice v4 tem uma aresta com ele mesmo.
Se um grafo é simples e possui arestas entre todos os seus vértices é denomina-
do completo. Por exemplo, os grafos da Figura 3 são completos.
Figura 3
Grafos completos
v5v4
v1 v3
v2
v1 v2
v3v4v1 v3
v2v2
v1
Fonte: Elaborada pelo autor.
Assim, o grafo G = (V, A) é completo se A = V2, em que V2 representa o conjunto
de todos os pares não ordenados de elementos de V. Assim, G = (V, A) é completo
se, e somente se,
A
v, w ∈ V, v ≠ w,
E
a ∈ A, a = (v, w) (Figura 4).
Figura 4
Grafo completo
Fonte: Elaborada pelo autor.
v4 v5
v3
v2
v1
14 Teoria dos Grafos
Os grafos completos são também denominados Kn, em que n é o número corres-
pondente à quantidade de vértices. Assim, na Figura 3, tem-se K1, K2, K3, K4, K5.
O complemento de um grafo G = (V, A) é o grafo G = (V, V2\A). Isto é, assumindo o
grafo completo formado por todos os vértices V, o grafo complemento G é formado
por todas as arestas resultantes da retirada das arestas A do grafo G.
Por exemplo, seja o grafo G = (V, A), como na figura a seguir (Figura 5), seu com-
plemento (Figura 6) é o grafoG = (V, V2\A).
Figura 5
Grafo g
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 6
Complemento do grafo g
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Essas definições apresentadas servem de base para o estudo dos grafos. Por
meio delas, é possível elaborar problemas complexos de maneira correta, seguindo
o formalismo matemático.
1.3 Tipos de grafos
Vídeo Os grafos podem ser classificados em diversos tipos, de acordo com algumas
características específicas. Essas podem ser estruturais, sendo direcionamento das
arestas, ou na composição dos seus elementos, por exemplo, possuindo somente
um vértice e nenhuma aresta.
Relembrando a definição apresentada na Seção 1.2, um grafo simples não
possui laços, isto é, arestas com pontas no mesmo vértice, nem arestas diferen-
tes que incidem nos mesmos vértices, ou paralelas (Figura 7). Um pseudografo
é um grafo que contém laços; já um multigrafo é um grafo que contém arestas
paralelas.
v4
v5
v3
Figura 7
Grafo simples
Fonte: Elaborada pelo autor.
v2
v1
O livro Uma Introdução
Sucinta à Teoria dos Grafos
é uma leitura complemen-
tar que reforça os concei-
tos básicos de grafos.
FEOFILOFF, P.; KOHAYAKAWA, Y.;
WAKABAYASHI, Y. São Paulo: Edusp,
2011.
Livro
Introdução ao estudo dos grafos 15
Ademais, estendendo a definição dos grafos, pode-se ter grafos com arestas
direcionadas, em que uma aresta v, w conecta o vértice v a w e, portanto, é dife-
rente da aresta (w, v), que conecta o vértice w a v. Nesse caso, tem-se um grafo
orientado ou digrafo. Este último é representado graficamente com as arestas
contendo setas (Figura 8). Também, é possível que os grafos possuam valores
(pesos) nas arestas, sendo chamados, nesse caso, de grafo ponderado ou valora-
do, podendo ou não ser direcionado (Figura 9).
Figura 9
Grafo ponderado ou valorado
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
3
1
1
5
8
20
10
Figura 8
Digrafo ou grafo direcionado
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Um grafo nulo é um grafo que possui um conjunto de vértices
vazio, ou seja, G = (V, A), V = Ø. Já um grafo trivial possui apenas um
vértice e nenhuma aresta.
Um grafo regular é um grafo em que todos os vértices possuem
o mesmo número de arestas incidentes (Figura 10).
Outros exemplos de grafos regulares podem ser vistos na figura a
seguir. É importante perceber, também, que qualquer grafo comple-
to é regular, como observado na Figura 2.
Figura 11
Grafos regulares
Fonte: Elaborada pelo autor.
Um grafo é conexo quando é possível estabelecer um caminho desde um vértice
até qualquer outro vértice passando por arestas. Todos os grafos apresentados até
agora são conexos, caso contrário, trata-se de um grafo desconexo. No exemplo a
seguir, o vértice v3 faz parte do grafo, mas não tem aresta com nenhum outro vértice.
Já na Figura 12-B, os vértices v3 e v5 possuem aresta entre si, mas não aresta com a
outra parte do grafo, sendo, também, desconexo.
Figura 10
Grafo regular
Fonte: Elaborada pelo autor.
v4
v3
v2
v1
16 Teoria dos Grafos
Figura 12
Grafo desconexo
v4
v5
v3
v2
v1
Fonte: Elaborada pelo autor.
A – Exemplo de grafo com um vértice desconexo. B – Grafo com um subgrafo desconexo.
v4
v5
v3
v2
v1
Um grafo é dito acíclico se não possui ciclos, isto é, quando não é possível caminhar
de um vértice a vértices adjacentes até retornar à origem. O grafo simples da Figura 7 é
cíclico, visto que se pode caminhar de v2 até v4 por uma aresta, então de v4 a v5 por ou-
tra aresta e de v5 até v2. Caso contrário, é chamado de grafo acíclico, como na Figura 13.
v4
v5
Figura 13
Grafo acíclico
Fonte: Elaborada pelo autor.
v3
v2
v1
Chama-se árvore um grafo simples, acíclico e conexo. Simples significa que não
pode ter laços nem arestas paralelas; acíclico indica que não é possível caminhar
entre os vértices partindo de v e chegando novamente em v; e conexo determi-
na que todos os vértices precisam ser atingíveis por qualquer vértice. O grafo da
Figura 13 também é uma árvore.
Se o grafo for simples, acíclico, mas não conexo, é chamado de floresta, isto é,
uma união disjunta de árvores. A Figura 14 apresenta uma floresta formada por
três árvores.
v4
v5
Figura 14
Grafo floresta
Fonte: Elaborada pelo autor.
v3
v7
v9
v6
v8
v2
v1
Introdução ao estudo dos grafos 17
Um grafo é chamado bipartido por ser separado em dois conjuntos de vérti-
ces, V1 e V2, de modo que não haja arestas entre elementos do mesmo conjunto
e que toda aresta de G una um vértice de V1 a outro de V2. Por exemplo, o grafo
da Figura 15 é bipartido, pois é possível separar seus vértices em dois conjuntos
V1 = {v1, v2} e V2 = {v3, v4, v5} sem que haja arestas entre {v1, v2}, nem arestas entre
{v3, v4, v5} e todas as arestas conectam vértices de V1 e V2, ou seja,
A
(v, w) ∈ A, v ∈
V1 e w ∈ V2. A Figura 16 apresenta os subconjuntos V1 e V2.
Figura 15
Grafo bipartido
Fonte: Elaborada pelo autor.
v4 v5
v2v1
v3
Figura 16
Grafo bipartido com os subconjuntos
Fonte: Elaborada pelo autor.
v4
v1
v3 v5
v2
V1
V2
Um grafo bipartido completo é um grafo bipartido em que há arestas en-
tre todos os elementos de V1 e V2. Assumindo |V1| = m e |V2| = n, então, o
grafo é denotado Km,n. Na Figura 17, pode-se observar alguns grafos bipartidos
completos.
K1,3 K2,3 K3,3
Figura 17
Grafos bipartidos completos
Fonte: Elaborada pelo autor.
O artigo Algoritmos para Grafos em C via Sedgewick, de Paulo Feofiloff, apresenta uma vasta
gama de materiais básicos e avançados sobre grafos, todos com base no volume Graph
Algorithms, da terceira edição do livro Algorithms in C, de Robert Sedgewick, que é um clássico
na ciência da computação.
Acesso em: 14 abr. 2020.
https://www.ime.usp.br/~pf/algoritmos_para_grafos/
Artigo
1.4 Vizinhança e grau
Vídeo Nesta seção serão apresentados alguns conceitos referentes à vizinhança e ao
grau, que darão base para o estudo de problemas mais complexos.
O número de vértices de um grafo (G = (V, A)) é representado por |V|, sendo a
quantidade de elementos de V (G) denominada ordem do grafo G. Já o número de
https://www.ime.usp.br/~pf/algoritmos_para_grafos/
18 Teoria dos Grafos
arestas de um grafo é representado por |A|, sendo a quantidade de elementos de
A (G) denominada dimensão do grafo G.
Por exemplo, qual a ordem e a dimensão do grafo da figura a seguir?
Figura 18
Grafo G com arestas
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1 a3
a1
a5
a2
a4
Pode-se visualizar, na Figura 18, a ordem cinco (quantidade de vértices) e a di-
mensão cinco (quantidade de arestas).
Dados dois vértices v e w e a aresta a = vw que os conecta, diz-se que a aresta
a incide em v e incide em w. Considerando o grafo da Figura 18, a aresta a1 incide
sobre os vértices v2 e v5.
O par de vértices v e w é dito adjacente se conectado por uma aresta. Duas ares-
tas são adjacentes quando incidem em um mesmo vértice. Por exemplo, no grafo
da Figura 18, os vértices v4 e v3 não são adjacentes, pois não possuem uma aresta
que os conecta. As arestas a2 e a4 são adjacentes, pois incidem no mesmo vértice v2.
A vizinhança de um vértice é o conjunto de vértices adjacentes a v, denotado
por vizinhos (v), sendo v não incluído nesse conjunto. A vizinhança fechada é o
conjunto vizinhos [v] que é o conjunto vizinhos (v), incluindo-se v.
Analisando o grafo da Figura 18, é possível perceber que a vizinhança de v2 são
os vértices adjacentes a v2, nesse caso, {v1, v3, v4, v5}. Já a vizinhança fechada de v2 é
a sua vizinhança incluindo v2, ou seja, {v1, v2, v3, v4, v5}.
O grau de um vértice é o número de arestas incidentes em v, denotado por
grau (v). Um vértice que possui grau zero é chamado isolado. No grafo da Figura 18
não há nenhum vértice isolado (grau zero); já o grau do vértice v3 é um e o grau do
vértice v4 é dois.
O grau de um grafo G é a soma dos graus de todos os seus vértices, denotado
por d (G). Pode-se demonstrar facilmente com o seguinte teorema:
Seja G = (V, A) um grafo não orientado, então:d (G) = ∑v∈V grau (v) = 2 * |A|
Para saber o grau de um grafo, deve-se somar o grau de todos os seus vértices,
isto é, a quantidade de arestas incidentes em cada vértice. Como cada aresta incide
sobre dois vértices, cada aresta é sempre considerada duas vezes. Assim, o grau do
grafo é o dobro do número de arestas.
O grau máximo de um grafo é o grau do vértice de maior grau em V (G), deno-
tado por ∆ (G). Já o grau mínimo de um grafo é o grau do vértice de menor grau em
V (G), denotado por δ (G).
Introdução ao estudo dos grafos 19
O grau do grafo da Figura 18 é dez, pois é a soma dos graus de todos os vértices.
Percebe-se que é, também, igual ao dobro do número de arestas. O seu grau má-
ximo é quatro, pois é o grau do vértice que contém o maior grau, que, nesse caso,
é v2. Já o grau mínimo é um, pois v1 e v3 são os vértices com menor grau.
Uma sequência de vértices v1,...,vk, tal que (vi, vi+1) ∈ A, 1 ≤ i < k, é denominada
caminho ou passeio, quando v1 atinge ou alcança vk. Diz-se, ainda, que vk é atingível
ou alcançável. Um caminho de k vértices é formado por k – 1 arestas, e o valor k – 1
revela o tamanho do caminho. Um ciclo é um caminho que começa e termina no
mesmo vértice.
Quando um caminho passa por todos os vértices do grafo, sem repetição, é
chamado de caminho hamiltoniano. Este, se for um ciclo, então, é denominado de
ciclo hamiltoniano, e o grafo que contém um ciclo hamiltoniano é conhecido como
grafo hamiltoniano.
Já quando um caminho passa por todas as arestas do grafo, sem repetição, é
chamado de caminho euleriano. Este, se for um ciclo, então, é denominado de ciclo
euleriano, e grafo que contém um ciclo euleriano é conhecido como grafo euleriano.
No grafo da Figura 18, v1 é alcançável por meio de v5, pois consegue um caminho
partindo de v5 e chegando a v1, por exemplo, v5, v4, v2 e v1. O tamanho desse caminho
é três, que é o número de arestas presentes.
A distância entre dois vértices, denotada por d (v, w), é o comprimento do
menor caminho entre v e w. A excentricidade de um vértice de um grafo é o valor
máximo da distância entre v e w para todo vértice w ∈ V. Define-se como centro de
G o subconjunto dos vértices de excentricidade mínima.
Assim, a distância entre os vértices v1 e v5, no grafo da Figura 18, denotada por
d (v1, v5), é dois, pois, apesar de haver dois caminhos entre v1 e v5 – a saber, (v1, v2, v4,
v5) e (v1, v3, v5) – o de menor comprimento é o último, que é dois.
Os grafos direcionados (digrafo), conforme apresentado anteriormente, são
aqueles em que as arestas são direcionadas, ou seja, são pares ordenados de
vértices. Então, sendo G um grafo direcionado, a aresta (v, w) possui uma única
direção de v para w.
Define-se, também, o grau de saída de um vértice como sen-
do o número de arestas que saem de v, e o grau de entrada de
um vértice como sendo o número de arestas que chegam em v.
Se um vértice no grafo G possui grau de entrada nulo, então,
é chamado de fonte. Se possui grau de saída nulo, é chamado de
sumidouro.
O grafo da Figura 19 é um digrafo. O vértice v2 possui grau de
saída dois e grau de entrada três; o vértice v3 é uma fonte, pois
não possui arestas de entrada; e o vértice v5 é um sumidouro,
pois não possui arestas de saída.
Os conceitos de caminho e alcançabilidade de vértices tam-
bém se aplicam aos digrafos, sempre levando em consideração
as direções das arestas. Se um vértice alcançar todos os vértices,
então, v é chamado de raiz do digrafo.
Figura 19
Digrafo
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
3
1
1
5
8
20
10
20 Teoria dos Grafos
Analisando-se o grafo da Figura 19, o vértice v1 é alcançável por meio de v3, pois
há o caminho (v3, v2, v1). Já o vértice v4 não é alcançável por v3, pois não há caminho
partindo de v3 que chega em v4, seguindo as orientações das arestas. Pelas particu-
laridades desse grafo, nenhum de seus vértices consegue alcançar todos os outros,
portanto, não há raiz.
Seja G um digrafo, o grafo obtido pela retirada de todas as direções das arestas
de G é um multigrafo não direcionado, conhecido como grafo subjacente de G.
O grafo subjacente do grafo da Figura 19 é o grafo da Figura 20.
v4
v5
v3
v2
v1
Figura 20
Grafo subjacente
Fonte: Elaborada pelo autor.
3
1
1
5
8
20
10
Conforme apresentado anteriormente, uma árvore é um grafo sem ciclos
(acíclico) e conexo (todas as arestas são alcançáveis). Se algum vértice possuir grau
menor ou igual a um é chamado de folha, caso contrário, com grau maior que um,
é denominado de vértice interior.
Percebe-se que toda árvore com n vértices possui exatamente n – 1 arestas.
Assim, um grafo T é uma árvore se, e somente se, existir um único caminho entre
cada par de vértices de T.
Uma árvore T = (V, A) é dita enraizada quando algum vértice v ∈ V é escolhido,
portanto, chamado de raiz da árvore. Uma árvore não enraizada é conhecida como
árvore livre.
Seja a árvore T = (V, A) enraizada, de raiz r, sendo dois vértices v, w ∈ V. Se v per-
tence ao caminho entre r e w, então, v é chamado ancestral de w, e w é descendente
de v. Se v ≠ w, v é ancestral próprio de w, e w é descendente próprio de v. Se (v, w)
é uma aresta de T e v é ancestral de w, então, v é pai de w, e w é filho de v. Dois
vértices que possuem o mesmo pai são chamados de irmãos. Assim, a raiz de uma
árvore não possui pai, e todo vértice que não é raiz tem exatamente um pai.
Um vértice folha não possui filhos. O nível de um vértice v, denotado por nível (v),
é o número de vértices do caminho entre a raiz e v. Assim, se r é raiz de uma árvore
T, nível (r) = 1. Se dois vértices são irmãos, então, possuem o mesmo nível. A altura
da árvore T é o valor máximo de nível (v) para todo vértice v ∈ T.
Introdução ao estudo dos grafos 21
O grafo da Figura 21 é uma árvore, pois é um grafo ací-
clico e conexo. Os vértices v3, v7, v6 e v8 possuem grau ≤ 1,
portanto, são vértices folha. Já os vértices v1, v2, v4 e v5 são
vértices interiores. Como essa árvore possui oito vértices,
ela também conta com exatamente sete arestas.
Pode-se escolher o vértice v2 para ser a raiz dessa árvore,
chamando-a, portanto, de árvore de enraizada. Assim, diz-se
que v4 é ancestral de v8, pois está no caminho entre a raiz (v2) e
v8. O vértice v8 também é conhecido como descendente de v4.
Já o vértice v4 é pai dos vértices v5 e v6, pois existem ares-
tas (v4, v5) e (v4, v6), sendo v4 ancestral de v5 e de v6. Os vérti-
ces v5 e v6, portanto, são filhos de v4. Já os vértices v6 e v5, por
possuírem o mesmo pai, são irmãos.
O valor de nível (v2), por ser a raiz, é um. O nível (v6) é
três, pois tem-se três arestas entre a raiz (v2) e v6. A altura da árvore da Figura 21 é
três, pois dentro todos os vértices v8 têm valor de nível (v8) = 4.
v4
v6
v5
v3
v2
v1
v7
Figura 21
Árvore
Fonte: Elaborada pelo autor.
v8
1.5 Isomorfismo
Vídeo Como foi visto, é comum referir-se a um grafo por meio de sua representação
gráfica ou geométrica. Dessa forma, dois grafos são isomorfos entre si se suas re-
presentações geométricas se referem ao mesmo grafo. De outra forma, dois grafos
são isomorfos entre si se existe correspondência entre seus vértices e suas arestas,
preservando as adjacências entre os vértices.
Assim, dados dois grafos G1 = (V1, A1) e G2 = (V2, A2), tal que |V1| = |V2| = n,
ambos são isomorfos se existe uma função unívoca (com somente uma correspon-
dência) f : V1 → V2, tal que (v, w) ∈ A1 se, e somente se, (f (v), f (w)) ∈ A2 para todo
v, w ∈ V11 (RODRIGUES, 2014).
Figura 22
Grafos isomorfos entre si
v3
v2
v1
v4
G1
a4
a3
a2
a1
G2
Fonte: Elaborada pelo autor.
22 Teoria dos Grafos
Na Figura 22, os dois grafos G1 = (V1, A1) e G2 = (V2, A2) são isomorfos entre si, pois:
V1 = {v1, v2, v3, v4}
A1 = {(v2, v3), (v1, v2), (v4, v2), (v1, v4)}
V2 = {a1, a2, a3, a4}
A2 = {(a1, a4), (a1, a2), (a1, a3), (a3, a2)}
|V1| = |V2| = 4
f : V1 → V2 tal que:
• f (v1) = a3
• f (v2) = a1
• f (v3) = a4
• f (v4) = a2
Assim como as arestas sãopreservadas da seguinte forma:
(v2, v3) = (a1, a4)
(v1, v2) = (a1, a3)
(v4, v2) = (a1, a2)
(v1, v4) = (a3, a2)
Uma das maneiras de se caracterizar o isomorfismo entre grafos é usando o
Teorema de Whitney, que se baseia no conceito de grafos linha e é formulado da
seguinte forma: dois grafos conexos G e H são isomorfos entre si se, e somente se,
seus grafos linha L (G) e L (H) são isomorfos. Para esse teorema, tem-se duas exce-
ções, a saber: K3 (grafo completo com três vértices) e K1,3 (grafo bipartido completo),
pois não são isomorfos, mas seus grafos linha, L (K3) e L (K1,3), são.
Para entender esse teorema, deve-se primeiramente definir um grafo linha. O
grafo linha de G, denotado por L (G) = (V’, A’), é o grafo em que seus vértices (V’) são
as arestas de G, e existe aresta ab ∈ A’ em L (G) se a e b possuírem um vértice em
comum em G.
Por exemplo, observe a figura a seguir.
Figura 23
Grafo G
v2
v1
v4
v3
a2
a3
a4
a1
Fonte: Elaborada pelo autor.
Para encontrar o grafo linha do grafo G, L (G), é preciso seguir os passos:
1. Encontrar os vértices de L (G); cada aresta de G é representada por um vértice
em L (G), conforme a Figura 24.
Introdução ao estudo dos grafos 23
Figura 24
Vértices de L (G) que são as arestas de G
v2
v1
v4
v3
a2
a3
a1
a1
a3
a2
a4
a4
Fonte: Elaborada pelo autor.
2. Encontrar o primeiro vértice de L (G); como a3 e a2 possuem o vértice v3 em
comum, adiciona-se uma aresta entre a3 e a2 em L (G), conforme a Figura 25.
Figura 25
Primeiro vértice de L (G)
v2
v1
v4
v3
a2
a3
a4
a1
a1
a3
a2
a4
Fonte: Elaborada pelo autor.
3. Encontrar o segundo vértice de L (G); como a4 e a3 possuem o vértice v2 em
comum, adiciona-se uma aresta entre a4 e a3 em L (G), conforme a Figura 26.
Figura 26
Segundo vértice de L (G)
v2
v1
v4
v3
a2
a3
a4
a1
a1
a3
a2
a4
Fonte: Elaborada pelo autor.
24 Teoria dos Grafos
4. Encontrar o terceiro vértice de L (G); como a1 e a2 possuem o vértice v4 em
comum, adiciona-se uma aresta entre a1 e a2 em L (G), conforme a Figura 27.
Figura 27
Terceiro vértice de L (G)
v2
v1
v4
v3
a2
a3
a4
a1
a1
a3
a2
a4
Fonte: Elaborada pelo autor.
5. Encontrar o quarto vértice de L (G); como a1 e a4 possuem o vértice v1 em
comum, adiciona-se uma aresta entre a1 e a4 em L (G) a3, conforme a Figura 28.
Figura 28
Quarto e último vértice de L (G)
a3
a1
a4
a2
v2
v1
v4
v3
a2
a3
a4
a1
Fonte: Elaborada pelo autor.
6. Por fim, o grafo L (G) é o grafo representado pela Figura 29.
a3
a1
a4
a2
Figura 29
Grafo L(G)
Fonte: Elaborada pelo autor.
Desse modo, pelo Teorema de Whitney, dois grafos G e H são isomorfos se, e
somente se, L (G) e L (H) são isomorfos. Usando o exemplo da Figura 22, tem-se os
grafos linha de G1 e G2 representados na Figura 29.
Introdução ao estudo dos grafos 25
Seja V (L (G1)) e V (L (G2)) o conjunto de vértices de L (G1) e L (G2), respectivamente.
Claramente, os grafos L (G1) e L (G2) são isomorfos, pois conseguem uma função
f : V (L (G1)) → V (L (G2)), tal que:
f (a1) = e2
f (a2) = e4
f (a3) = e1
f (a4) = a3
Tal que:
(a1, a2) = (e2, e4)
(a2, a4) = (e4, e3)
(a3, a4) = (e1, e3)
(a1, a4) = (e2, e3)
(a3, a2) = (e1, e4)
Portanto, G1 e G2 são isomorfos.
Figura 30
Grafos L (G1) e L (G2)
a1
a3
a2
a4
L (G1)
v2
v3
v4
v1
a1
a2a4
a3
G1
L (G2)
e1
e3
e2
e4
e2
e3
e1
e4
a3
a4
a2
a1
G2Fonte: Elaborada pelo autor.
Os grafos G3 e G4 da Figura 31 possuem o mesmo número de vértices e o mes-
mo número de arestas, mas não são isomorfos.
26 Teoria dos Grafos
v1
a1
a3
a4
a2
v4
v2 v3
G3
b2
G4
b1 b3
b4
w1
w2 w4
w3
Figura 31
Grafos G3 e G4
Fonte: Elaborada pelo autor.
Ao representar seus grafos linha, obtém-se L (G3) e L (G4), conforme a Figura 32.
v1
a1
a3
a4
a2
v4
v2 v3
G3
a1
a3
a2
a4
L(G3)
Figura 32
Grafos linha L (G3) e L (G4)
L(G4)
b2
G4
b1 b3
b4
w1
w2 w4
w3 b1
b3
b2
b4
Fonte: Elaborada pelo autor.
Claramente, L (G3) e L (G4) não são isomorfos, pois não possuem o mesmo nú-
mero de arestas.
Uma solução algorítmica para isomorfismo é analisar cada uma das n! permu-
tações da função que define o isomorfismo (buscar todas as funções possíveis). O
problema é que, no pior caso, esse algoritmo necessita de n! passos, sabidamente
intratáveis. Hoje, não se conhece um algoritmo eficiente para o problema geral do
isomorfismo em grafos.
Introdução ao estudo dos grafos 27
1.6 Representação computacional
Vídeo Um grafo G = (V, A) é dito esparso se |A| é muito menor que |V|2. Se |A| está
próximo de |V|2 é dito que o grafo é denso.
Tem-se basicamente três formas padrão de se representar computacionalmente
um grafo: lista de adjacências, matriz de adjacências e matriz de incidências.
Na lista de adjacências armazena-se uma lista para cada vértice, e, em cada
lista, referenciam-se os vértices que são adjacentes.
v3
v1
v4
v5
v2
v2
v1 v2
v2
v3
v5
v4
v4
v2
v2
v1
v3
v4
v5
v5
Fonte: Elaborada pelo autor.
Na Figura 33, o vértice v2 é representado por uma posição na lista. Esta possui
uma lista de todos os vértices adjacentes a v2, no caso, v1, v3, v4 e v5.
Se o grafo for orientado (digrafo), a representação pode ser a mesma, como vis-
to na Figura 34. A diferença é que a vizinhança representada na lista é dada pelos
vértices atingíveis por arestas de saída.
v3
v2
v1
v4
v5
v1
v2
v2
v4
v4
v3
v4
v5
v3
v5
v4
Figura 34
Lista de adjacências em grafo orientado
Fonte: Elaborada pelo autor.
Ao se analisar as listas de adjacências apresentadas, percebe-se que a soma dos
comprimentos de todas as listas de adjacências para um grafo não orientado é o
dobro do número de arestas, 2 * |A|, visto que cada aresta incide em dois vértices
e que, portanto, precisa ser representada duas vezes. Já para o grafo orientado,
essa soma é o número exato de arestas, isto é, |A|.
Na matriz de adjacências representa-se a estrutura do grafo G = (V, A) como
uma matriz com dimensões |V| x |V|, em que cada posição aij é dada por:
Figura 33
Lista de
adjacências
28 Teoria dos Grafos
1, se a aresta (i, j) ∈ A
0, caso contrárioaij=
Com essa representação, consultar se uma aresta faz parte do gráfico é feito em
tempo constante.
v1 v2 v3 v4 v5
v1 0 1 0 0 0
v2 1 0 1 1 1
v3 0 1 0 0 0
v4 0 1 0 0 1
v5 0 1 0 1 0
v3
v1
v4
v5
v2
Figura 35
Matriz de adjacências
Fonte: Elaborada pelo autor.
Na Figura 35 tem-se a matriz de adjacências representada no grafo. A quantida-
de de memória necessária para compor a matriz tem limite assintótico restrito no
quadrado do número de vértices, portanto, Θ (V2).
Como o grafo é não direcionado, percebe-se que a matriz é igual à sua trans-
posta, representando-se, portanto, somente os elementos abaixo da diagonal
principal.
v3
v2
v1
v4
v5
Figura 36
Matriz de adjacências de um grafo orientado
Fonte: Elaborada pelo autor.
v1 v2 v3 v4 v5
v1 0 1 0 0 0
v2 0 0 1 1 0
v3 0 0 0 0 0
v4 0 0 0 1 1
v5 0 1 0 0 0
A Figura 36 apresenta a matriz de adjacências de um grafo orientado (digrafo).
Percebe-se que, como as arestas são orientadas, a matriz não é igual à sua trans-
posta, pois uma aresta (v, w) não é a mesma que (w, v). Essa representação é ideal
para grafos densos.
Outra forma matricial de representação de grafos é a matriz de incidências.
Para o grafo G = (V, A), define-se como uma matriz com dimensões |V| x |A|, em
que cada posição aij é dada por:
1, se a aresta j incide no vértice i
0, caso contrárioaij=
Introdução ao estudo dos grafos 29
v3
v2
a6
a5
a4
a2
a3
a1
v4
v1 v5
Figura 37
Matriz de incidências
a1 a2 a3 a4 a5 a6
v1 0 0 0 0 0 1
v2 1 1 1 0 0 1
v3 0 0 1 0 0 0
v4 1 0 0 1 1 0
v5 0 1 0 1 0 0
Fonte: Elaborada pelo autor.
A Figura 37 mostra a matriz de incidências de um grafo. Cada coluna represen-
ta uma aresta e cada linha um vértice. As arestas contam com duas incidências,
exceto a aresta a5, que é um laço. Para representar a matriz de incidências de um
digrafo, pode-se optar pela seguinte definição:
1, se a aresta j incideno vértice i
–1, se a aresta j sai do vértice i
0, caso contrário
aij=
Essa representação pode ser observada na Figura 38.
v4
v5
v3
v2
a6
a5
a4
a2
a3
a1
v1
Figura 38
Matriz de incidências em digrafo
Fonte: Elaborada pelo autor.
a1 a2 a3 a4 a5 a6
v1 0 0 0 0 0 –1
v2 –1 1 –1 0 0 1
v3 0 0 1 0 0 0
v4 1 0 0 –1 1 0
v5 0 –1 0 1 0 0
1.7 Aplicações dos grafos
Vídeo Muitos problemas do mundo real, para serem resolvidos, são transformados
em problemas de grafos. Essa comutação pode fornecer um ponto de vista diferen-
te sobre o problema, tornando-o mais simples e abrindo um leque de técnicas para
a solução. Um exemplo disso foi o problema do caixeiro-viajante – ou TSP (Travelling
Salesman Problem) –, no qual tentava-se resolver como esse profissional, que preci-
sava visitar várias cidades, poderia fazer isso para efetuar suas vendas. As cidades
eram conectadas por estradas ou rodovias, sempre aos pares. Para maximizar seus
30 Teoria dos Grafos
lucros, o caixeiro-viajante devia visitar todas as cidades somente uma vez e pela
rota mais curta. Ou seja, ele precisava de um caminho ótimo passando por todas
as cidades, sem repeti-las.
O TSP é um problema NP-Completo, isto é, faz parte da classe de problemas
mais difíceis em NP, e NP é a classe de problemas que podem ser resolvidos em
tempo polinomial, em uma Máquina de Turing Não Determinística. Atualmente, as
soluções para os problemas NP-Completos levam um tempo exponencial em rela-
ção à entrada. Por exemplo, no caso do TSP, a solução mais simples é enumerar
todas as rotas possíveis e escolher. No caso de n cidades, havendo estradas entre
todas elas, deve-se efetuar (n – 1)! escolhas.
Suponha um computador que pode efetuar 1 trilhão de adições por segundo
(1012), isto é, 1 teraflop. Para um problema com cinco cidades, n = 5, a máquina é capaz
de avaliar 10
12
4
= 250 bilhões de rotas por segundo. Como ele precisa calcular 4! rotas,
demorará 4!/(250 bilhões) = 0,000000000096 segundos, um tempo insignificante.
Efetuando os mesmos cálculos para outras quantidades de cidades, tem-se o
Quadro 1 a seguir.
Quadro 1
Tempo de execução da solução simples para o TSP.
n Rotas/segundo (n-1)! Tempo total
5 250.000.000.000 24 0,000000000096 s
10 110.000.000.000 362.880 0,00000329891 s
15 71.000.000.000 87.178.291.200 1,22786325633 s
20 53.000.000.000 1,216451 * 1017 26,56 dias
25 42.000.000.000 6,204484 * 1023 468.435,470 anos
100 10.000.000.000 9,332621 * 10155 2,9593 * 10138 anos
399 2.500.000.000 4,0121881 * 10863 5.089026 * 10846 anos
Fonte: Elaborado pelo autor.
Levando em consideração que se estima a idade do universo em 14 bilhões de
anos, ou seja, 1,4 * 1010 anos, o tempo de cálculo de todas as rotas para um esta-
do do tamanho do Paraná, com 399 cidades, usando um computador que efetua
1 trilhão de adições por segundo, é completamente inviável.
Assim, a solução de encontrar todas as rotas e verificar a melhor não pode ser
aplicada. Quando mapeado para grafos, esse problema é enunciado como buscar
um circuito hamiltoniano ótimo em um grafo valorado. Assim, resolver o problema
de rotas é resolver um problema em grafos.
No artigo Algumas aplicações da teoria dos grafos, dos autores Pereira e Câmara, publicado
em Famat em Revista, os conceitos básicos dessa teoria são revisitados e algumas aplicações
são apresentadas, como é o caso do problema do caixeiro-viajante, enunciado sobre algumas
cidades do estado de Minas Gerais. Também, são apresentados alguns algoritmos para sua
solução.
Acesso em: 14 abr. 2020.
http://www.pucrs.br/ciencias/viali/graduacao/po_2/literatura/grafos/artigos/Famat_artigo_04.pdf
Artigo
http://www.pucrs.br/ciencias/viali/graduacao/po_2/literatura/grafos/artigos/Famat_artigo_04.pdf
Introdução ao estudo dos grafos 31
Outra problematização que pode ser mapeada para grafos é a robustez da ma-
lha elétrica para distribuição de energia. A malha elétrica é formada por torres e
linhas de transmissão. Para saber quantas linhas no mínimo precisam falhar para
que haja um apagão, isto é, para que parte do sistema fique desconectado, pode-se
mapear as torres como vértices e as linhas de transmissão como arestas. Assim, o
problema do apagão se transforma em descobrir o corte mínimo em um grafo, ou
seja, o conjunto de arestas que, quando retiradas do grafo, interrompe o fluxo de
um vértice a outro (Figura 39).
t2
t1
t4
t5
t3
t6
t7
t8
t9
Figura 39
Malha elétrica
Fonte: Elaborada pelo autor.
A Figura 39 apresenta um exemplo de torres e linhas de transmis-
são. Partindo de t1 até t9, por exemplo, quantas arestas no mínimo
precisam ser retiradas para que t9 sofra um apagão?
O problema de alocação de professores e disciplinas também
pode ser representado como um grafo. Sejam n professores e m
disciplinas, assumindo que cada professor pode ministrar algumas
disciplinas, mas que só poderá ofertar uma disciplina no semestre, é
possível que todas as disciplinas sejam ofertadas simultaneamente?
Qual o maior número de disciplinas que pode ser ofertado?
A Figura 40 mostra a representação do problema de alocação de
professores e disciplinas. Pode-se observar que esse é um grafo bi-
partido e que, portanto, definições e algoritmos referentes a esse
tipo de grafo são úteis para a solução do problema.
Outro problema interessante é o famoso lema do aperto de
mão, que é consequência do teorema do grau dos grafos, apresen-
tado na Seção 1.4. Informalmente, em qualquer festa contendo um
grupo de pessoas, sendo que algumas se cumprimentam (apertam
as mãos), o número de pessoas que apertam um número ímpar de
mãos sempre é par.
Seja o problema mapeado como um grafo, em que os vértices são
pessoas e uma aresta indica que uma pessoa aperta a mão de outra,
P1
P2
P3
P4
P5
d1
d2
d3
d4
d5
Professores Disciplinas
Figura 40
Professores X disciplinas
Fonte: Elaborada pelo autor.
32 Teoria dos Grafos
a quantidade de vezes que uma pessoa aperta a mão de outra é o grau do vértice.
Suponha que esse grafo tenha um número ímpar de vértices de grau ímpar. Assim,
a soma desses graus é ímpar. Sabendo-se que a soma dos graus dos vértices de
grau par sempre é par, então, a soma dos graus de todos os vértices, nesse caso,
é ímpar. Isso contradiz o teorema que indica que a soma dos graus dos vértices de
um grafo é o dobro do número de arestas, logo, um número par. Portanto, o núme-
ro de vértices de grau ímpar deve obrigatoriamente ser par.
CONSIDERAÇÕES FINAIS
Este capítulo apresentou a história dos grafos, mostrando a sua origem, que é mais
antiga do que os computadores conhecidos hoje em dia. Mesmo sendo uma teoria
ancestral, os grafos até hoje são usados para mapear problemas do mundo a serem
resolvidos com algoritmos computacionais.
Também foi possível observar os vários conceitos complexos necessários para o
estudo dos grafos. Convém ressaltar que essa teoria, por se tratar de um ramo da
matemática, com aplicações em várias áreas, é defina por uma notação formal a ser
absorvida. Esse formalismo é necessário para que o desenvolvimento de conceitos
avançados e algoritmos possa ser feito de maneira correta.
ATIVIDADES
1. Observe o problema das pontes de Königsberg, conforme a figura a seguir.
Se
rg
ey
M
er
ku
lo
v/
Sh
ut
te
rs
to
ck
Esse problema é mapeado pelo seguinte grafo:
v4
v1
v2
v3
Introdução ao estudo dos grafos 33
Sabendo que não é possível partir de qualquer ponto e passar por todas as pontes
somente uma vez, retornando ao ponto de partida, uma vez que o grafo resultante
não é euleriano, construa mais algumas pontes de modo que o grafo torne-se euleria-
no e seja possível passar por cada aresta somente uma vez, partindo e chegando no
mesmo ponto.
2. Construa a representação geométrica do grafo G = (V, A), tal que:
V = {1, 2, 3, 4, 5, 6}
A = {(1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (3,5), (4,5)}
3. Construa a matriz de adjacências do grafo da Questão 2.
4. Verifique se o seguinte grafo é bipartido. Dê os dois conjuntos de vérticescaracterísticos.
32
4
5
1
6
5. Desenhe um possível grafo que contenha vértices de grau 5, 2, 2, 2, 2, 1. Quantas
arestas esse grafo possui?
REFERÊNCIAS
BOAVENTURA NETTO, P. O.; JURKIEWICZ, S. Grafos: introdução e prática. São Paulo: Blucher, 2009.
EULER, L. Solutio problematis ad geometriam situs pertinentis. Commentarii Academiae Scientiarum
Petropolitanae, v. 8, p. 128-140, 1736.
RODRIGUES, E. J. Um Algoritmo para o Problema do Isomorfismo de Grafos. São Paulo, 2014. Dissertação
(Mestrado em Ciência da Computação) – Universidade Federal do ABC. Disponível em: http://biblioteca.
ufabc.edu.br/index.php?codigo_sophia=75394 Acesso em: 14 abr. 2020.
SZWARCFITER, J. L. Teoria Computacional de Grafos. Rio de Janeiro: Elsevier, 2018.
34 Teoria dos Grafos
Conectividade
2
A conectividade em grafos é um aspecto muito importante no estudo da
teoria de grafos, pois muitos problemas podem ser mapeados e analisados
através de uma sequência de arestas. Para isso, deve-se conceituar grafos co-
nexos e desconexos, bem quanto suas componentes conexas. Para caminhar
em um grafo, tanto orientado como não orientado, faz-se necessária a aplicação
de conceitos, como caminhos e circuitos. E destes conceitos surgem os grafos
eulerianos e hamiltonianos. Quando se trabalha com componentes conexas de
grafos também se faz necessário o estudo de subgrafos e suas denominações.
Assim, neste capítulo será apresentada, na Seção 2.1, a teoria sobre grafos
conexos e desconexos, bem como a definição de componentes conexas e suas
implicações. Na Seção 2.2 são apresentadas noções sobre caminhos e circuitos,
bem como a formalização de grafos conexos e componentes conexas. Também
são apresentados formalmente os conceitos de grafos eulerianos e hamiltonia-
nos. Na Seção 2.3 são mostrados os subgrafos e seus usos. Os conceitos de vér-
tice de corte, arestas de corte e suas aplicações são apresentados na Seção 2.4.
2.1 Grafos conexos e componentes
Vídeo Um grafo conexo é aquele em que é possível estabelecer um caminho desde um
vértice a outro, passando pelas arestas; caso um grafo não atenda esta condição, é
chamado grafo desconexo (BOAVENTURA NETTO). Por exemplo, na Figura 1, o vértice
v3 faz parte do grafo, mas não tem aresta com nenhum outro vértice e, na Figura 2, os
vértices v3 e v5 possuem aresta entre si, mas não possuem aresta com a outra parte
do grafo, caracterizando, portanto, dois grafos desconexos.
v4
v5
v3
v2
v1
Figura 1
Grafo desconexo com aresta desconexa
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 2
Grafo desconexo com duas componentes conexas
Fonte: Elaborada pelo autor.
Conectividade 35
Denominam-se componentes conexas do grafo G todos os subgrafos maximais
conexos de G, isto é, subgrafos conexos que não estão estritamente contidos em
outros subgrafos conexos. Por exemplo, o grafo G (Figura 3) possui três compo-
nentes conexas, G’, G’’, G’’’, a saber:
G’ = (V’, A’)
• V’ = {v1, v2, v3}
• A’ = {(v1, v2), (v2, v3), (v3, v4)}
G’’ = (V’’, A’’)
• V’’ = {v4, v5, v6, v7}
• A’’ = {(v4, v5), (v5, v6), (v6, v4), (v7, v6)}
G’’’ = (V’’’, A’’’)
• V’’’ = {v8}
• A’’’ = {}
v4
v5
v6
v7
v8
v3
v2
v1
Figura 3
Grafo G com três componen-
tes conexas
Fonte: Elaborada pelo autor.
Para ser uma componente conexa, o subgrafo deve ser maximal, ou seja, não
deve estar contido em outro subgrafo. No exemplo da Figura 3, o subgrafo formado
pelos vértices v5 e v6, juntamente com a aresta (v5, v6), não é uma componente cone-
xa, pois está contido no subgrafo G’’.
Um grafo é chamado totalmente desconexo se todos os seus vértices pos-
suem grau zero, como na Figura 4.
v3v2v1
Figura 4
Grafo Totalmente Desconexo
Fonte: Elaborada pelo autor.
Os conceitos de conectividade, como componentes conexas, são importantes
para o entendimento de assuntos como caminhos e circuitos, cortes, árvores e ou-
tros. Em muitos problemas mapeados para grafos, a conectividade é discutida e
calculada, o que torna esses conceitos imprescindíveis.
Um subconjunto X’ de um con-
junto X é dito maximal em relação
a alguma propriedade, se X não
for subconjunto de nenhum outro
subconjunto de X que possua
aquela propriedade. Cuidado para
não confundir maximal com
máximo. Maximal diz respeito
à pertinência e máximo, à cardi-
nalidade (número de elementos)
(GOLDBARG; GOLDBARG, 2012).
No caso aqui, uma componente
conexa é um subgrafo maximal,
G’, isto é, um subgrafo para o qual
não existe outro subgrafo H’, tal
que G’ está contido em H’.
Saiba mais
36 Teoria dos Grafos
2.2 Caminhos e circuitos
Vídeo O conceito de caminho é muito usado em vários problemas mapeados para grafos.
Um desses problemas é descobrir se existe um caminho entre um vértice e outro; se
existe um conjunto de arestas que, quando visitadas em sequência, levam do ponto
origem ao ponto destino.
Segundo Szwarcfiter (2018), um caminho ou passeio em um grafo G = (V, A) é
uma sequência de vértices v1,...,vk, tal que vi ∈ V, (vi, vi+1) ∈ A, 1 ≤ i < k. Esse caminho
é formado pelas seguintes arestas: (v1, v2), (v2, v3), (v3, v4),...(vk-1, vk).
v3
v2v1
v4
v6
v5
Figura 5
Grafo G
Fonte: Elaborada pelo autor.
Por exemplo, o grafo G da Figura 5 possui, pelo menos, um caminho entre v4 e
v6, formado pelas arestas (v4, v2), (v2, v5), (v5, v6). Perceba que, a partir da segunda,
cada aresta é adjacente à anterior.
Um trajeto é definido como um caminho sem arestas repetidas. Um caminho
simples é um caminho que não possui vértices repetidos. O caminho entre v4 e v6
formado pelas arestas (v4, v2), (v2, v5), (v5, v6) sobre o grafo G (Figura 5) é um trajeto,
pois não repete arestas. Também é um caminho simples, pois não repete vértices.
Já o caminho formado pelas arestas (v4, v1), (v1, v2), (v2, v4), (v4, v6) não é um caminho
simples, pois repete o vértice v4. E o caminho formado pelas arestas (v4, v2), (v2, v1),
(v1, v4), (v4, v2), (v2, v5), (v5, v6) não é um trajeto, pois repete a aresta (v4, v2) (ou (v2, v4),
já que é um grafo não dirigido).
O primeiro vértice v1 que faz parte do caminho é chamado origem, e seu último
vértice vk é conhecido como término. Assim, diz-se que esse caminho vai de v1 a vk.
No exemplo apresentado anteriormente, o vértice v4 é a origem do caminho e v6 o
seu término.
Com a definição de caminho, é possível formular que um grafo é conexo quan-
do existe caminho entre cada par de vértices e, caso contrário, é desconexo. O ta-
manho de um caminho é dado pelo número de arestas que fazem parte dele. Se
o caminho é formado por k vértices, então possui pelo menos k – 1 arestas e o valor
k – 1 é o tamanho do caminho. Se o caminho é simples (sem vértices repetidos) en-
tão seu comprimento é exatamente k – 1. Assim, a distância entre dois vértices
pode ser medida pelo tamanho do menor caminho entre eles (FEOFILOFF, 2020).
No exemplo aplicado ao grafo G (Figura 5), o caminho simples (v4, v2), (v2, v5), (v5, v6)
é formado por quatro vértices e tem tamanho três.
Conectividade 37
É definido como ciclo um caminho v1,..., vk, vk+1, de tal forma que v1 = vk+1 e k ≥
3. Isto é, um ciclo é um caminho que começa e termina no mesmo vértice, desde
que contenha mais de dois vértices envolvidos. Um ciclo simples ou elementar é
um ciclo v1,..., vk, vk+1 em que o caminho v1,..., vk é simples, não possui vértices re-
petidos, exceto o primeiro e último, o que determina ser um ciclo. Se não houver
ambiguidade, os termos caminho e ciclo são usados denotando caminho simples
e ciclo simples, respectivamente. Se o ciclo possuir tamanho três, então é chama-
do triângulo.
Para o grafo G, da Figura 5, o caminho simples (v4, v2), (v2, v5), (v5, v6), (v6, v4) é um
ciclo, pois seu início e término são pelo mesmo vértice (v4), e é simples, pois não
repete vértices. Nesse mesmo grafo, o ciclo (v4, v2), (v2, v1), (v1, v4) é um triângulo,
pois possui tamanho três.
Se um ciclo puder ser obtido de outro pela permutação circular dos seus vérti-
ces, então esses ciclos são considerados idênticos. O grafoG (Figura 5) representa
dois ciclos: (v4, v2), (v2, v1), (v1, v4) e (v2, v1), (v1, v4), (v4, v2). Perceba que ambos os
ciclos possuem as mesmas arestas e só mudam em relação a sua origem e tér-
mino. Assim, um é permutação circular do outro, fazendo com que sejam ciclos
idênticos.
Todos os conceitos apresentados também são aplicados a digrafos (grafos
orientados). Nesse caso, um caminho ou passeio em um digrafo D = (V, A) é uma
sequência de vértices v1,..., vk tal que (vi, vi+1) ∈ A, 1 ≤ i < k. Esse caminho é formado
pelas seguintes arestas orientadas: (v1, v2), (v2, v3), (v3, v4),…(vk– 1, vk). Convém ressal-
tar que, por ser um grafo orientado, a aresta (vi, vi+1) indica que o vértice vi+1 é adja-
cente ao vértice vi, mas a recíproca não é necessariamente verdadeira.
Por exemplo, na Figura 6, o digrafo D tem um caminho formado pelas seguin-
tes arestas: (v5, v3), (v3, v1), (v1, v2), (v2, v5). Já a seguinte sequência de arestas: (v3,
v1), (v1, v4), (v4, v5), (v5, v3) não é um caminho, pois a aresta (v1, v4) não existe, a
aresta existente é (v4, v1), a ordem importa.
Figura 6
Digrafo D com caminho
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
38 Teoria dos Grafos
Seja o digrafo D = (V, A), se para qualquer par de vértices vi, vj houver caminho
orientado partindo de vi a vj, e se houver caminho orientado partindo de vj a vi, o
digrafo é chamado fortemente conexo. Informalmente, qualquer vértice é acessível a
partir de qualquer outro e essa propriedade pode ser observada no grafo da Figura
7. Perceba que para qualquer par de vértices vi e vj, há um caminho partindo de vi e
chegando em vj, e um caminho partindo de vj e chegando em vi.
Se para o digrafo D = (V, A) e qualquer par de vértices vi, vj, houver caminho
orientado partindo de vi a vj, mas não houver caminho orientado partindo de vj a vi,
então o digrafo é chamado unilateralmente conexo. Se o digrafo não for fortemente
conexo, mas tiver seu grafo subjacente – resultante da retirada das orientações das
arestas – conexo, então é dito fracamente conexo. O digrafo da Figura 6 não é forte-
mente conexo, mas seu grafo subjacente (Figura 8) é conexo. Portanto, o digrafo da
Figura 6 é fracamente conexo.
Um caminho em um grafo G que contém todos os vértices de G
somente uma vez é chamado de caminho hamiltoniano. Seja um ci-
clo v1,..., vk, vk+1 em um grafo G, se o caminho v1,..., vk for hamiltonia-
no, então o ciclo v1,..., vk, vk+1 é denominado ciclo hamiltoniano. Um
grafo que contém um ciclo hamiltoniano é um grafo hamiltoniano.
Se um grafo contiver um caminho hamiltoniano, mas não um ciclo
hamiltoniano, é um grafo semi-hamiltoniano. Na prática, um grafo
semi-hamiltoniano se torna hamiltoniano ao acrescentar uma ares-
ta entre a origem e o término do caminho hamiltoniano.
As definições de caminho, ciclo e grafo hamiltoniano também se
aplicam a digrafos (grafos orientados). Um caminho orientado em
um digrafo é um caminho hamiltoniano, se contiver todos os vérti-
ces do digrafo sem repetição de vértices. Agora, se for um caminho
hamiltoniano e iniciar e terminar no mesmo vértice, um ciclo orien-
tado em um digrafo é um ciclo hamiltoniano. Já um digrafo é hamiltoniano se con-
tiver um ciclo orientado hamiltoniano. Se um digrafo contiver um caminho orientado
hamiltoniano, o digrafo é semi-hamiltoniano (NICOLETTI; HRUSCHKA JUNIOR,
2018).
Como resultado dessa definição, é possível perceber que um grafo completo Kn,
sendo n ≥ 3, é sempre hamiltoniano. Isso ocorre porque em um grafo completo to-
dos os n vértices possuem arestas incidentes a todos os demais n – 1
vértices. Assim, para todo vértice vi, 1 ≤ i ≤ n, existe o seguinte cami-
nho C = {(v1, v2), (v2, v3), (v3, v4)..., (vn–1, vn)}, que passa por todos os vér-
tices {v1,..., vn} somente uma vez. Como todos vértices são adjacentes
aos demais, o vértice vn também é adjacente a v1, assim o caminho
C adicionando-se a aresta (vn, v1) é um ciclo que passa por todos os
vértices, portanto, é um ciclo hamiltoniano e o grafo é hamiltoniano.
Ao se analisar o grafo da Figura 9, percebe-se que o caminho
(v2, v3), (v3, v5), (v5, v1), (v1, v4) passa por todos os vértices, exata-
mente uma vez, portanto, é um caminho hamiltoniano. No mes-
mo grafo, o caminho (v2, v3), (v3, v5), (v5, v1), (v1, v4), (v4, v2) é um ciclo
Figura 7
Digrafo fortemente conexo
Fonte: Elaborada pelo autor.
v1
v3
v2
Figura 8
Grafo Subjacente de D
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 9
Grafo hamiltoniano
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Conectividade 39
(começa e termina em v2), caracterizando-o, portanto, como um ciclo hamiltonia-
no e, por conta disso, o grafo é hamiltoniano.
Se um caminho em um grafo G contém todas as arestas do grafo somente uma
vez, é chamado de caminho euleriano. Se esse caminho for um ciclo, então é co-
nhecido como ciclo euleriano. Um grafo que contém um ciclo euleriano é um grafo
euleriano. Um grafo é semieuleriano se possuir um caminho euleriano, mas não
um ciclo euleriano. Na prática, um grafo semieuleriano se torna euleriano bastando
inserir uma aresta entre a origem e o término do caminho euleriano (NICOLETTI;
HRUSCHKA JUNIOR, 2018).
Conforme já apresentado, um grafo não orientado é um grafo euleriano se, e
somente se, todos os seus vértices possuem grau (número de arestas incidentes)
par. Um grafo é semieuleriano se possuir dois vértices com grau ímpar e todos os
demais com grau par.
Observando o grafo da Figura 10, percebe-se que há um caminho passando pelos
seguintes vértices na sequência (v1, v2, v3, v4, v5, v6, v1, v4, v2, v5, v1) que passa por todas
as arestas, somente uma vez, sendo, portanto, um caminho euleriano. Como esse
caminho começa em v1 e termina em v1, é um ciclo euleriano e, consequentemente,
o grafo é euleriano.
Os conceitos também se aplicam a digrafos, isto é, se um caminho orientado em
um digrafo D contém todas as arestas do grafo somente uma vez, então é um ca-
minho euleriano. Se esse caminho for um ciclo orientado, então é conhecido como
ciclo euleriano. Um digrafo que contém um ciclo euleriano é chamado de digrafo
euleriano.
Para verificar se um digrafo é euleriano há uma condição necessária e suficien-
te. Um digrafo D = (V, A) é euleriano se, e somente se, for unilateralmente conexo e
se para todo vértice vi ∈ V, o grau de entrada de vi – denotado como grau
+(vi) ou o
número de vértices que chegam em vi– for igual ao grau de saída de vi – denotado
como grau– (vi) ou o número de vértices que saem de vi.
Por exemplo, o digrafo da Figura 11 é euleriano, pois é unilateralmente conexo
– para cada par de vértices há um caminho orientado entre eles, em algum sentido
– e para cada vértice, o número de vértices que entram (grau de entrada) é igual ao
número de vértices que saem (grau de saída).
No digrafo da Figura 11, um ciclo euleriano é: (v6, v4), (v4, v2), (v2,, v3), (v3, v4), (v4, v5),
(v5, v3), (v3, v1), (v1, v5), (v5, v2), (v2, v6).
Um teorema similar existe para verificar se o digrafo possui um caminho eule-
riano (não um ciclo). Um digrafo D = (V, A) possui um circuito euleriano se, e somen-
te se, for unilateralmente conexo e se possuir as seguintes condições:
1. Dois de seus vértices vi e vj são tais que:
• o grau de entrada de vi é igual ao seu grau de saída mais um, isto é, grau
+(vi)
= 1 + grau–(vi);
• o grau de saída de vj é igual ao seu grau de entrada mais um, isto é, grau
–
(vj) = 1 + grau
+(vj).
2. Para todos os demais vértices, seus graus de entrada e saída são iguais, isto
é,
A
v ∈ V, grau–(v) = grau+(v).
Figura 10
Grafo euleriano
Fonte: Elaborada pelo autor.
v4
v6
v3
v2
v5v1 a7
a9
a10
a1 a4
a8
a6
a2
a5
a3
Figura 11
Digrafo Euleriano
v2
v1
v6
v3
v5
v4
Fonte: Elaborada pelo autor.
40 Teoria dos Grafos
Com essas condições, o caminho euleriano se inicia em vj (o vértice com mais
arestas de saída do que de entradas) e termina em vi (o vértice com mais arestas de
entrada do que de saídas).
Como exemplo, pode-seanalisar o digrafo da Figura 12, que é unilateralmente
conexo. Os graus dos seus vértices são:
• vértice v1: grau
+(v1) = 1 e grau
–(v1) = 2
• vértice v2: grau
+(v2) = 3 e grau
–(v1) = 2
• vértice v3: grau
+(v3) = 2 e grau
–(v1) = 2
• vértice v4: grau
+(v4) = 2 e grau
–(v1) = 2
• vértice v5: grau
+(v5) = 2 e grau
–(v1) = 2
• vértice v6: grau
+(v6) = 1 e grau
–(v1) = 1
Claramente percebe-se que o grau de entrada de v2 é o seu grau de saída
mais um. O grau de saída de v1 é o seu grau de entrada mais um. Todos os
demais vértices possuem grau de entrada igual ao grau de saída. Assim, esse
digrafo possui um caminho euleriano que inicia exatamente em v1 e termina
em v2. O caminho euleriano nesse dígrafo é: (v1, v5), (v5, v3), (v3, v4), (v4, v5), (v5,
v2), (v2, v6), (v6, v4), (v4, v2), (v2, v3), (v3, v1), (v1, v2).
Figura 12
Digrafo com caminho euleriano
v2
v1
v6
v3
v5
v4
Fonte: Elaborada pelo autor.
2.3 Subgrafos
Vídeo De maneira coloquial, um subgrafo de um grafo G é uma parte dele, ou seja, é
um grafo contendo uma parte dos vértices e das arestas de G. Quais e quantos
vértices e arestas do grafo G definem o tipo de subgrafo se torna. Define-se um
grafo H como um subgrafo de G, como sendo um grafo em que todo vértice de H
também é vértice de G e toda aresta de H também é aresta de G (FEOFILOFF; KOHA-
YAKAWA; WAKABAYASHI, 2011). Por exemplo, o grafo G, na Figura 13.
Ao analisar o grafo da Figura 14, percebe-se que todo vértice de H
está em G e que toda aresta de H também está em G. Portanto, o
grafo H é um subgrafo de G.
Segundo Feofiloff, Kohayakawa e Wakabayashi (2011), um grafo H
é um subgrafo próprio de G, se H for subgrafo e diferente de G. Um
grafo H é um subgrafo gerador de G, se tiver todos os vértices de G.
O grafo H da Figura 14 não é um sub-
grafo gerador de G, pois tem vértices
em G que não estão em H. Do mes-
mo modo, como H é diferente de G,
diz-se que H é um subgrafo próprio de G.
O subgrafo H é um subgrafo induzido de G se
todo arco de G, que tem ambas as pontas em H,
também for um arco de H, isto é, se H possuir to-
Figura 13
Grafo G
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 14
Subgrafo de G
Fonte: Elaborada pelo autor.
v4
v3
v2
v1
Conectividade 41
das as arestas que aparecem em G sobre os mesmos vértices. A
Figura 15 apresenta um grafo induzido de G. Todas as arestas de
G que possuem as duas pontas em arestas do subgrafo aparecem
no grafo induzido.
Um grafo H é um grafo parcial de G, se H for um subgrafo de
G e se possuir o mesmo conjunto de vértices que G. Na Figura
16 percebe-se que o grafo possui todos os vértices do grafo G da
Figura 13, portanto, esse é um grafo parcial de G.
Pode-se definir também G’ como um supergrafo de G, se G for
subgrafo de G’.
Os conceitos de subgrafos também são aplicáveis a digrafos,
levando-se em consideração que as arestas são dirigidas. Seja G =
(V, A) um grafo. Dois subgrafos de G, G’ = (V’, A’) e G’’ = (V’’, A’’) são
chamados aresta-disjuntos se não possuírem arestas em comum,
ou seja, A’∩ A’’ = ∅. Da mesma maneira, são chamados de vérti-
ces-disjuntos se não possuírem vértices em comum, ou seja, V’ ∩
V’’ = Ø.
Por exemplo, dado o grafo G da Figura 13, a Figura 17 apresen-
ta dois subgrafos aresta-disjuntos de G e a Figura 18 apresenta
dois subgrafos vértice-disjuntos de G.
Figura 16
Grafo parcial de G
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 17
Subgrafos de G aresta-disjuntos
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
v4
v5
v3
v2
v1
Figura 18
Subgrafos de G vértice-disjuntos
Fonte: Elaborada pelo autor.
v4
v5
v3
v2
v1
Figura 15
Subgrafo induzido de G
Fonte: Elaborada pelo autor.
v4
v5
v2
v1
42 Teoria dos Grafos
2.4 Cortes
Vídeo Seja G = (V, A) um grafo conexo. Denomina-se vértices de corte ou corte de vérti-
ces de G o subconjunto minimal de vértices V’ ⊂ V, cuja remoção de G torna o grafo
desconexo ou trivial (apenas um vértice sem qualquer aresta). O grafo G – V’ é des-
conexo ou trivial. Qualquer subconjunto próprio de V’, a saber, V’’ ⊂ V’, se retirado de
G, isto é G – V’’, torna o grafo conexo e não trivial (SZWARCFITER, 2018).
Um corte de arestas pode ser definido da seguinte maneira: seja G = (V, A) um
grafo conexo, um corte de arestas é um subconjunto A’ ⊂ A, cuja remoção de G tor-
na o grafo desconexo, ou seja, G – A’ é um grafo desconexo. Assim, para qualquer
subconjunto próprio de A’, a saber, A’’ ⊂ A’, o grafo G – A’’ é conexo.
O termo conectividade de vértices (cv de G) denota a cardinalidade do menor
corte de vértices de G. Já conectividade de arestas (cA de G) denota a cardinalidade
do menor corte de arestas de G. Assim, cV é o menor número de vértices que,
quando removidos de G, torna-o desconexo ou trivial. Se G é um grafo descone-
xo, então cV = cA = 0.
Considerando o grafo G mostrado na Figura 19.
Figura 19
Grafo G
Fonte: Elaborada pelo autor.
v6v1
v7v3
v8
v5v2
v4
Observe que um corte de vértices de G pode ser c1 = {v4}, pois o grafo G’ (Figura
20) com os vértices V’ = V – {v4} é desconexo. Perceba também que o conjunto c1 =
{v4} é minimal, pois não há qualquer subconjunto de c1 que, quando retirados os
vértices em G, torne o grafo desconexo.
Figura 20
Grafo G’
Fonte: Elaborada pelo autor.
v6
v7
v8
v5
v1
v3
v2
Um subconjunto X’ de um conjun-
to X é dito minimal, em relação a
alguma propriedade, se X não for
superconjunto de nenhum outro
subconjunto de X que possua
aquela propriedade. Cuidado
para não confundir minimal com
mínimo. Minimal diz respeito à
pertinência e mínimo à cardina-
lidade (número de elementos)
(GOLDBARG; GOLDBARG, 2012).
Saiba mais
É conveniente observar que um
grafo completo K
n
, n > 1, não
possui subconjunto próprio de
vértices V’ ⊂ V cuja remoção de K
n
o desconecte, embora a remoção
de n – 1 vértices torne o grafo
trivial.
Importante
Conectividade 43
Já, para o mesmo grafo G, um corte de arestas pode ser c2 = {(v2, v4), (v3, v4)}, pois
retirando essas arestas, é obtido o grafo G’’ (Figura 21), que é desconexo. Perceba
que o conjunto c2 = {(v2, v4), (v3, v4)}, é minimal, pois não há qualquer subconjunto de
c2 que, quando retiradas as arestas em G, torne o grafo desconexo.
Figura 21
Grafo G’’
Fonte: Elaborada pelo autor.
v6
v7
v8
v5
v1
v3
v2
v4
Para o conjunto c3 = {(v2, v4), (v3, v4), (v4, v6)}, quando essas arestas são retiradas
de G, é gerado o grafo G’’’ (Figura 22), que é desconexo. Mas c3 não é um corte de
arestas, pois não é um conjunto minimal, isto é, existe um subconjunto próprio
de c3, que no caso é o c2, que também desconecta o grafo quando as arestas são
retiradas de G.
Figura 22
Grafo G’’’
Fonte: Elaborada pelo autor.
v6
v7
v8
v5
v1
v3
v2
v4
Para determinar a conectividade de vértices cv, obtém-se o corte de vértices de
menor cardinalidade (número de elementos), ou seja, o menor número de vértices
que, quando removidos, desconecta o grafo. Para o grafo G da Figura 19, os menores
cortes de vértices são os conjuntos c1 = {v4} e c2 = {v6}, portanto, a conectividade de
vértices de G é cv = 1.
Para determinar a conectividade de arestas cA, obtém-se o corte de arestas de
menor cardinalidade (número de elementos); o menor número de arestas que,
quando removidas, desconecta o grafo. Para o grafo G da Figura 19, o menor
corte de arestas é o conjunto c3 = {(v6, v8)}, portanto, a conectividade de arestas
de G é cA = 1.
Um subconjunto X’ de um
conjunto X é dito próprio se X’
é subconjunto de X, mas não é
igual a X. Em outras palavras,
existe pelo menos um elemento
de X que não está no seu
subconjunto X’.
Atenção
44 Teoria dos Grafos
Segundo Szwarcfiter (2018), um grafo G é k-conexo em vértices se a sua conec-
tividade de vértices for cv ≥ k. Da mesma maneira, um grafo G é k-conexo em ares-
tas quando a sua conectividade de arestas for cA ≥ k. O valor k é importante, pois
se um grafo é k-conexo em vértices (arestas), não existe corte de vértices (arestas)
menorque k. O grafo G da Figura 19 é 1-conexo em vértices e 1-conexo em arestas.
Quando um grafo é 2-conexo também é chamado biconexo.
Para um grafo G = (V, A) e um corte de arestas de G, A’ ⊆ A, sempre é possível
encontrar um corte de vértices V’ de tamanho |V’| ≤ |A’|. Para isso, escolhe-se para
fazer parte de V’ um subconjunto de vértices tal que, para toda aresta a ∈ A’, A inci-
de neste vértice. Por exemplo, seja o grafo G da Figura 23.
Figura 23
Grafo G
Fonte: Elaborada pelo autor.
v6
v5
v1
v2
v4
v3
Um corte de arestas é o conjunto c1 = {(v4, v6), (v3, v6), (v5, v6)}. A
eliminação dessas arestas gera o grafo G’ da Figura 24.
Assim, consegue-se obter um corte de vértices a partir de c1 eli-
minando um subconjunto dos vértices cujas arestas em c1 incidem.
Os vértices em c1 são v4, v3, v5, v6. Observe que eliminando v4, v3
tem-se o grafo da Figura 25, desconexo, e que não há subconjunto
de c2 = {v4, v3} que desconecte o grafo, sendo esse, portanto, um
corte de vértices. Percebe-se também que o |c2| ≤ |c1|.
Posto isso, conclui-se que cv ≤ cA, a conectividade de vértices de
um grafo qualquer é sempre menor ou igual à sua conectividade de
arestas. Dado um grafo G não completo, cujo vértice v possui grau
mínimo, é possível desconectar G removendo grau(v) arestas, que
são as arestas que incidem em v. Por exemplo, uma vez que o grafo
G da Figura 23 é um vértice de grau mínimo, ele é v1, sendo grau
(v1) = 3. Assim, é possível desconectar o grafo G removendo todas
as arestas incidentes a v1; nesse caso, são três arestas, a saber: (v1,
v2), (v1, v3), (v1, v4).
Portanto, sendo v um vértice de grau mínimo, grau(v) ≥ cA ≥ cv. Se
o grafo G for um grafo completo (G = Kn), então todos seus vértices
possuem o mesmo grau n – 1 (pois estão conectados com todos os
demais vértices) e, portanto, grau(v) = cA = cv = n – 1.
Figura 24
Grafo G’
Fonte: Elaborada pelo autor.
v6
v5
v1
v2
v4
v3
Figura 25
Grafo com vértices retirados
Fonte: Elaborada pelo autor.
v6
v5
v1
v2
Conectividade 45
Se um vértice de um grafo, ao ser removido, o desconecta, o vértice é chama-
do de articulação. Igualmente, se uma aresta do grafo, quando removida, desco-
necta o grafo, então essa aresta é chamada ponte. A Figura 26 mostra um grafo
com articulações e uma ponte.
Figura 26
Grafo com ponte e articulações
Fonte: Elaborada pelo autor.
v6
v7v5v2
v8v1 v4v3
Articulações
Ponte
Dessa maneira, um grafo é biconexo em vértices se, e somente se, não possuir
articulações. Isso acontece, pois, se o grafo possuir uma articulação, significa que
o vértice, se removido, desconecta o grafo, portanto ele seria 1-conexo. Analoga-
mente, um grafo é biconexo em arestas se, e somente se, não possuir pontes, o
raciocínio é o mesmo (SZWARCFITER, 2018).
Com o conceito de caminho, consegue-se dizer que em um grafo conexo G = (V, A),
|V| > 2, as seguintes afirmações (SZWARCFITER, 2018):
1. Um vértice v ∈ V é articulação de G se, e somente se, existirem vértices v1, v2 ≠
v, tais que em todo caminho entre v1 e v2 em G, v está presente.
2. Uma aresta (v1, v2) ∈ A é ponte se, e somente se, (v1, v2) for o único caminho
simples entre v1 e v2.
Tirando a prova
Observe, a seguir, as provas dessas afirmações.
Afirmação 1: um vértice v ∈ V é articulação de G se, e somente se, existirem
vértices v1, v2 ≠ v, tais que em todo caminho entre v1 e v2, em G, v está presente.
Prova de ida →: assumimos que v é uma articulação, portanto, retirar v de G,
pela definição de articulação, desconecta o grafo. Se o grafo G’ resultante da re-
moção de v é desconexo, então, é formado por, pelo menos, duas componentes
conexas, dois vértices (v1 e v2) em componentes conexas diferentes. Então, como v
é articulação, qualquer caminho entre v1 e v2 passa por v.
Prova de volta ← : assumimos dois vértices v1 e v2 de G, diferentes de v, tal que
todo caminho entre v1 e v2 passa por v. Assim, se todo caminho entre v1 e v2 passa
por v, significa que se o vértice v for removido do grafo G, então, v1 não é mais al-
cançável a partir de v2 (e vice-versa, assumindo G não dirigido), isto é, não há mais
caminho entre dois vértices do grafo, o que caracteriza um grafo desconexo. Um
vértice que quando removido desconecta o grafo, é a definição de articulação, por-
tanto, v é uma articulação G.
Sempre que se deve provar uma
afirmação que contém se, e so-
mente se, a prova é formada por
duas partes: a ida (→) e a volta
(←). Por exemplo, queremos
provar a afirmação: Chove se, e
somente se, faz frio. A ida significa
provar que se chove, então faz frio.
Já a volta significa provar que se
faz frio, então chove (GERSTING;
IÓRIO, 2012).
Importante
46 Teoria dos Grafos
Afirmação 2: uma aresta (v1, v2) ∈ A é ponte se, e somente se, {v1, v2} for o único
caminho simples entre v1 e v2.
Prova de ida → : assumimos a aresta (v1, v2) ∈ A é ponte do grafo G e, portanto,
retirar essa aresta de G, pela definição de ponte, desconecta o grafo. Se o grafo G’
resultante da remoção de (v1, v2) é desconexo, então, v1 e v2 estão em componentes
conexas distintas. Assim, a aresta (v1, v2) é o único caminho simples entre v1 e v2.
Prova de volta ← : assumimos que a aresta a (v1, v2) ∈ A é o único caminho
simples entre v1 e v2. Como v1 e v2 são adjacentes (há uma aresta entre eles), ser o
único caminho simples significa que não se tem arestas repetidas entre v1 e v2, nem
outro caminho entre eles passando por outros vértices. Assim, remover a aresta
(v1, v2) de G faz com que v1 não seja mais alcançável a partir de v2 (e vice-versa, as-
sumindo um grafo não dirigido), portanto, o grafo se torna desconexo. Uma aresta
que quando removida do grafo o desconecta é a definição de ponte, portanto, (v1,
v2), é ponte de G.
Para um grafo G, definem-se componentes biconexas aos subgrafos maximais
de G que sejam biconexos em vértices ou que sejam isomorfos a K2. As componen-
tes biconexas são também chamadas de blocos do grafo. Se um grafo G for bicone-
xo, ele só possui um bloco, que é o próprio G. A Figura 27 mostra todos os blocos
do grafo da Figura 26 (FEOFILOFF, 2020).
Figura 27
Bloco do grafo
Fonte: Elaborada pelo autor.
v6
v5
v4
v4v3
v2
v1 v3 v6
v7
v8
Por essa definição, percebe-se que cada aresta de um grafo pertence a exatamente
um bloco do grafo. Também percebe-se que um vértice é articulação do grafo se, e
somente se, pertencer a mais de um bloco do grafo.
Na Figura 27 é possível perceber que cada aresta faz parte de somente um bloco
do grafo e que os vértices v3, v4 e v6, que são articulações, são os únicos vértices que
aparecem em mais de um bloco.
A caracterização de corte de vértices e de arestas é importante para a aplica-
ção de grafos na modelagem de alguns problemas reais. Veja como exemplo uma
rede de computadores como a da Rede Nacional de Ensino e Pesquisa (RNP), or-
ganização responsável, entre outras coisas, pela manutenção da Rede Ipê – a rede
acadêmica brasileira que interliga universidades. A rede é formada por Pontos de
Presença (PoP) em cada uma das unidades da federação e esses pontos são conec-
tados por fibra ótica de alta velocidade (REDE..., 2020). Um dos problemas em que
grafos são aplicáveis, apesar de nesse caso ser uma modelagem simples, é para
Conectividade 47
verificar se há algum ponto em que essa rede pode ficar desconectada se algum
link de internet deixar de funcionar.
Modelar essa rede como um grafo é simplesmente assumir que cada PoP é um vér-
tice do grafo e cada link de internet entre os PoPs é uma aresta.
Figura 28
Mapa de tráfego da Rede Ipê
Fonte: RNP, 2020b.
Esta rede é mapeada pelo grafo da Figura 29.
Figura 29
Rede Ipê mapeada por um grafo
Fonte: Elaborada pelo autor com base em RNP, 2020b.
RO
AC
RS
SC
MT
MS
PR BA SE AL
AP
PE PB2
PB1
MARR
AM
PA
PI
SP RJ ES
GO
TO
DF MG CE RN
48 Teoria dos Grafos
Encontrar um link de rede que deixa algum estado desconectado é o mesmo
que encontrar um corte de arestas no grafo que o torna desconexo. Esse grafo,em especial, é 1-conexo, pois se for retirada a aresta (PA, AP), o grafo se torna
desconexo. Assim, se cair o link de internet entre os PoPs Pará e Amapá, o Amapá
ficará desconectado do resto da rede. Com esse resultado, os engenheiros podem
planejar expansões na rede, inclusive como um caminho alternativo entre PA e AP,
para que haja redundância na rede.
Na Figura 28 percebe-se que o link entre PE e CE está em preto que, segundo
a legenda, significa que não há tráfego entre esses dois pontos. Isso significa que
qualquer comunicação entre MT e MS deve passar por outro caminho. Entre os
possíveis caminhos estão: (MT, GO), (GO, DF), (DF, SP), (SP, PR), (PR, MS).
CONSIDERAÇÕES FINAIS
Este capítulo apresentou conceitos relativos à conectividade de grafos, como gra-
fos conexos e desconexos, as componentes conexas e suas caracterizações. Também
foram mostrados os conceitos de caminhos e ciclos, que são de grande importância
para a aplicação de grafos em problemas reais. Os conceitos de grafos hamiltonianos
e eulerianos foram definidos sobre caminhos e ciclos, bem como em digrafos (grafos
dirigidos ou orientados).
Ao final, foram expostas as definições de subgrafos, vértices de corte e arestas de
corte. Em especial, os conceitos de pontes e articulações, que também são de grande
importância no mapeamento de problemas reais para grafos. O problema de busca
de pontes em grafos foi aplicado à Rede Ipê, para descobrir fraquezas na rede, em
que a queda de um link de internet entre duas instituições pode deixar parte da rede
desconectada.
ATIVIDADES
1. Dado o grafo a seguir, dê suas componentes conexas.
v1
v5
v3
v4
v2
v6
Conectividade 49
2. Dado o digrafo a seguir, encontre um caminho entre v3 e v4.
v2v1
v6v3
v5
v4
3. Dado o grafo a seguir, encontre um ciclo euleriano.
v4
v2
v5
v1
v3
4. Dado o grafo semi-hamiltoniano a seguir, explique o que precisa ser feito para que
se torne um grafo hamiltoniano?
v4
v2
v3v1
5. Dado o grafo a seguir, dê o subgrafo induzido contendo os vértices v1, v2 e v5.
v4
v2
v5
v1
v3
50 Teoria dos Grafos
6. Dado o grafo a seguir, apresente todas as suas componentes biconexas.
v4
v1
v3
v2
v5
v6
v7
v8
v8
REFERÊNCIAS
BOAVENTURA NETTO, P. O.; JURKIEWICZ, S. Grafos: introdução e prática. São Paulo: Blucher, 2009.
FEOFILOFF, P. Instituto de Matemática e Estatística – USP, 2020. Algoritmos para grafos via Sedgewick.
Disponível em: https://www.ime.usp.br/~pf/algoritmos_para_grafos/. Acesso em: 14 maio 2020.
FEOFILOFF, P.; KOHAYAKAWA, Y.; WAKABAYASHI, Y. Uma introdução sucinta à Teoria dos Grafos. São
Paulo: Instituto de Matemática e Estatística – USP, 2011. Disponível em: https://www.ime.usp.br/~pf/
teoriadosgrafos/. Acesso em: 14 maio 2020.
GERSTING, J. L.; IÓRIO, V. de M. Fundamentos matemáticos para a ciência da computação: um tratamento
moderno de matemática discreta. 5. ed. Rio de Janeiro: LTC, 2012.
NICOLETTI, M. C; HRUSCHKA JUNIOR, E. R. Fundamentos da teoria dos grafos para computação. 3. ed. São
Paulo: LTC, 2018.
RNP. Rede Nacional de ensino e pesquisa, 2020a. Página inicial. Disponível em: https://www.rnp.br.
Acesso em: 14 maio 2020.
RNP. Panorama de Tráfego da Rede Ipê. Rede Nacional de ensino e pesquisa, 2020b. Disponível em: https://
www.rnp.br/sistema-rnp/ferramentas/panorama-de-trafego. Acesso em: 15 de abr. 2020.
SZWARCFITER, J. L. Teoria Computacional de Grafos. Rio de Janeiro: Elsevier, 2018.
Caminho mínimo e árvores geradoras 51
3
Caminho mínimo e
árvores geradoras
Assumindo que problemas do mundo real podem ser mapeados
para grafos, a resolução, às vezes, exige procedimentos que variam des-
de uma busca simples até o encontro de outros subgrafos com algumas
características.
Nesse sentido serão apresentados na Seção 3.1 deste capítulo os al-
goritmos de busca em profundidade e largura dos grafos, indicando que
esses conseguem encontrar as árvores geradoras dos grafos. Se os grafos
possuem pesos, será explorado na Seção 3.2 o problema de encontrar
a árvore geradora mínima, por meio dos algoritmos de Prim e Kruskal.
Por fim, na Seção 3.3 será trabalhado o problema do caminho mínimo, isto
é, encontrar o menor caminho entre dois vértices, que pode ser resolvido
pelo algoritmo de Dijkstra.
3.1 Busca em grafos e árvore geradora
Vídeo Muitos problemas em grafos são resolvidos por procedimentos
com base em algoritmos de busca ou suas adaptações, desde encon-
trar um caminho entre dois vértices até achar o emparelhamento
máximo de um grafo.
Os procedimentos de busca em grafos se resumem em caminhar
de maneira sistemática pelo grafo, considerando algumas condições
para decidir se o problema foi resolvido. Em termos de busca, o ob-
jetivo é visitar todos os vértices e todas as arestas, evitando repetir a
passagem nesses elementos. Essa questão é crucial na resolução de
problemas, pois garante que não haja retrabalho, mas também exi-
ge a necessidade de recursos adicionais para marcar quando uma
aresta ou um vértice já foi visitado. Assim, um vértice é dito marcado
quando já foi visitado pelo procedimento de busca e, portanto, é dis-
tinto dos vértices não marcados.
O Algoritmo 1 1 apresenta um algoritmo básico de busca em
grafos, que tem como entrada um grafo conexo com todos os seus
vértices desmarcados. No primeiro passo, escolhe-se um vértice
para ser o inicial, marcando-o. Já no segundo, elege-se um vértice
Um algoritmo é uma
sequência finita de passos
usada para resolver algum
problema. Os algoritmos
são independentes de lin-
guagens de programação e
podem ser codificados em
qualquer plataforma.
ZIVIANI, N. Projeto de Algoritmos
Com Implementações em Pascal e C.
Pioneira Thomson Learning. São Paulo:
2a ed. 2004.
1
Um emparelhamento M, em um
grafo não dirigido, é um conjunto de
arestas em que todo vértice do grafo
incide em, no máximo, um elemento
de M (FEOFILOFF, 2020). Encontrar
o emparelhamento máximo de
um grafo pode ser útil para a
determinação de rotas de veículos, a
designação de tarefas etc.
Saiba mais
52 Teoria dos Grafos
marcado v1, que possua um vértice incidente v2, tal que a aresta (v1, v2) ∈ A e ain-
da não tenha sido selecionada. Em seguida, o vértice v2 é marcado, se ainda não
estiver. Esse processo termina quando todas as arestas de G forem selecionadas.
Sempre que a aresta (v1, v2) é selecionada com base no vértice marcado v1, ela
é dita explorada. Um vértice se denomina explorado quando todas as arestas in-
cidentes forem exploradas. Nesse processo, é possível que um vértice seja alcan-
çado várias vezes pelo procedimento de busca, então, este será chamado visitado.
O mesmo conceito se aplica a arestas, caso precisem ser alcançadas várias vezes
pelo procedimento.
Algoritmo 1
Busca em grafo
Dados: Grafo G = (V, A)
1 Desmarcar todos os vértices
2 Escolher o vértice inicial
3 Marcar o vértice inicial
4 ENQUANTO existir algum vértice v1 marcado e com aresta (v1, v2) não explorada FAÇA
5 Escolher o vértice v1
6 Explorar a aresta (v1, v2)
7 SE v2 não está marcado ENTÃO
8 Marcar v2
9 FIM SE
10 FIM ENQUANTO
Fonte: Adaptado de Szwarcfiter, 2018.
Percebe-se que no Algoritmo 1 há vários pontos de escolha que ficaram em
aberto, a saber:
• Qual vértice inicial escolher?
• Qual vértice marcado v1 escolher?
• Qual aresta incidente ao vértice marcado v1, (v1, v2), escolher?
A maneira com a qual essas escolhas são feitas determina o tipo de busca. O cri-
tério sobre qual vértice v1 marcado escolher indica se a busca é em profundidade
ou em largura. Por exemplo, se o vértice selecionado for o último analisado, então,
é uma busca em profundidade. Já se o vértice priorizar os vértices no mesmo nível
(distância da raiz) antes de escolher os vértices do nível superior, então, é uma
busca em largura.
A busca em profundidade (do inglês depth-first search – DPS) ocorre quando o
próximo vértice marcado a ser escolhido for o mais recentemente alcançado pelo
algoritmo de busca. Esse critério garante que a determinaçãodo vértice seja única
e sem ambiguidade.
Basicamente, ela pode ser implementada de duas formas: recursivamente ou
pelo uso de uma pilha. O Algoritmo 2 mostra o pseudocódigo recursivo, em que
Adj(v) é o conjunto de todos os vértices adjacentes a v.
Caminho mínimo e árvores geradoras 53
Algoritmo 2
Busca em profundidade recursiva
Dados: Grafo conexo G = (V, A)
1 PROCEDIMENTO Busca (v, pai)
2 Marcar v
3 PARA w ∊ Adj(v) FAÇA
4 SE w não está marcado ENTÃO
5 Visitar aresta de árvore (v, w)
6 Busca (w, v)
7 SENÃO
8 SE w ≠ pai ENTÃO
9 Visitar aresta de retorno (v, w)
10 FIM SE
11 FIM SE
12 FIM PARA
13 FIM PROCEDIMENTO
14
15 Desmarcar todos os vértices de G
16 Escolher um vértice s
17 Busca (s, NULO)
Fonte: Adaptado de Szwarcfiter, 2018.
Convém ressaltar que visitar uma aresta significa efetuar uma operação espe-
cífica, por exemplo, adicionar em outro grafo. O procedimento Busca (v, pai)
recebe como parâmetros o vértice a ser analisado e o vértice anterior da busca, o
qual está sendo chamado de pai, para facilitar a compreensão.
O procedimento Busca executa algumas atividades, como:
• Linha 2: marca o vértice recebido para garantir que ele não seja novamente
escolhido.
• Linha 3: o vértice que está sendo processado retorna todos os seus vértices
adjacentes e, para cada um deles, é feita uma análise.
• Linhas 4, 5 e 6: se o vértice adjacente não está marcado, significa que ain-
da não foi processado, desse modo, visita a aresta e invoca recursivamen-
te o procedimento Busca, passando como parâmetros: o vértice adjacente
encontrado e o próprio vértice que estava sendo processado como pai. Ao
retornar dessa chamada recursiva, passa-se a processar o próximo vértice
adjacente.
• Linhas 7, 8 e 9: se o vértice adjacente está marcado, é necessário verificar se
ele não é igual ao seu próprio pai. Se for, ignora-se, pois acabou de ser pro-
cessado. Se não for, visita-se a aresta, chamada de aresta de retorno.
Especialmente na linha 6, o procedimento Busca (w, v) é invocado recursi-
vamente para cada vértice w adjacente a v, dado pelo laço da linha 3. Isso significa
que uma nova busca inicia, sendo o vértice w escolhido para ser o ponto inicial des-
sa busca. Quando há retorno de uma chamada recursiva, o processo é denomina-
do também de backtracking, isto é, o processo retorna para continuar o algoritmo
com os próximos vértices adjacentes.
54 Teoria dos Grafos
No grafo da Figura 1, por exemplo, se fosse assumido o vértice v1 como pon-
to inicial, na linha 3 seriam retornados os vértices adjacentes {v2, v4, v5}. O proce-
dimento é invocado recursivamente usando v2. Ao retornar, isto é, ao executar o
backtracking, ainda faltarão os vértices v4 e v5 para serem processados, os quais
serão usados nas próximas interações do laço.
As arestas visitadas são classificadas de duas formas: arestas de árvore e
arestas de retorno. As primeiras são as arestas encontradas na árvore da bus-
ca em profundidade. Uma aresta (v1, v2) é uma aresta de árvore se o vértice v2 foi
alcançado pela primeira vez pela aresta (v1, v2). Já as segundas são arestas (v1, v2)
que conectam o vértice v1 a um antecessor, nesse caso, v2, que já foi explorado.
O procedimento Busca, dentro de seu laço da linha 3, possui uma condicional
para verificar qual tipo de aresta está tratando. Se forem consideradas somente as
arestas de árvore (linha 5 do Algoritmo 2), por exemplo, para a construção de um
outro grafo (nesse caso, um subgrafo), o grafo resultante claramente não teria ci-
clos, pois nesse trecho, o algoritmo nunca visita uma aresta adjacente a um vértice
já marcado. Assim, é possível dizer que o algoritmo constrói uma árvore de busca
em profundidade.
O vértice escolhido como sendo o primeiro a ser visitado, tam-
bém, é chamado de raiz da árvore de busca em profundidade.
Para ilustrar e execução do Algoritmo 2, observe o grafo da Figura 1.
O algoritmo começa desmarcando todos os vértices e escolhe
qualquer um destes para ser a raiz da busca. Aqui, será selecionado
o vértice v1, mas poderia ser qualquer um, pois não há indicação no
algoritmo. Ao ser chamado pela primeira vez, o procedimento é in-
vocado com Busca (v1, NULO), pois nesse momento não há ne-
nhum vértice anterior a v1 na busca, nesse momento.
Ao entrar no procedimento, o vértice v1 é marcado e todos os vér-
tices adjacentes são retornados, a saber: {v2, v4, v5}. Isso significa que
dentro do laço haverá uma volta para um desses vértices. Na primeira
volta, w = v2 e, como não está marcado, o processo entra no condicional
da linha 4. A aresta (v1, v2) é visitada e o procedimento Busca é invoca-
do, de maneira recursiva como Busca (v2, v1). O grafo estará como
na Figura 2, em que o vértice marcado é representado com fundo mais
claro, a aresta de árvore visitada em tracejado e a aresta de retorno
visitada com pontilhado.
Na chamada recursiva com Busca (v2, v1), o vértice analisado
é o v2, portanto, ele é marcado e seus vértices adjacentes são retor-
nados: {v1, v3, v4}. O laço da linha 3 será executado para cada um
desses vértices. Iniciando com v1, o condicional da linha 4 falha (pois
já está marcado) e o da linha 8 também (pois v1 é o pai de v2, ou seja,
foi passado como segundo parâmetro na chamada do procedimen-
to Busca). Desse modo, o laço retorna para obter o segundo vértice
adjacente a v2, que é v3.
Figura 1
Grafo G
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Figura 2
Grafo G – Busca em v1
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Caminho mínimo e árvores geradoras 55
Como v3 não está marcado, o processo entra no condicional da
linha 4, visitando a aresta de árvore (v2, v3) e chamando o procedi-
mento recursivamente como Busca (v3, v2) (Figura 3).
Na chamada recursiva com Busca (v3, v2), o vértice a ser ana-
lisado é o v3, portanto, ele é marcado e seus vértices adjacentes são
retornados: {v2, v4}. O laço da linha 3 será executado para cada um
desses vértices. Iniciando com v2, o condicional da linha 4 falha (pois
já está marcado) e o da linha 8 também (pois v2 é o pai de v3, isto é,
foi passado como segundo parâmetro na chamada do procedimen-
to Busca). Desse modo, o laço retorna para obter o segundo vértice
adjacente a v3, que é v4.
Como v4 não está marcado, o processo entra no condicional da
linha 4, visitando a aresta de árvore (v3, v4) e chamando o procedi-
mento recursivamente como Busca (v4, v3) (Figura 4).
Na chamada recursiva com Busca (v4, v3), o vértice analisado
é o v4, portanto, ele é marcado e seus vértices adjacentes são retor-
nados: {v3, v2, v1, v5}. O laço da linha 3 será executado para cada um
desses vértices. Iniciando com v3, o condicional da linha 4 falha (pois
já está marcado) e o da linha 8 também (pois v3 é o pai de v4, isto é,
foi passado como segundo parâmetro na chamada do procedimento
Busca). Assim, o laço retorna para obter o segundo vértice adjacente
a v4, que é v2.
Como v2 já está marcado, o processo entra no senão da linha 7
(Algoritmo 2). Como v2 não é o pai de v4, o processo visita a aresta
de retorno (v4, v2). Os condicionais terminam e o processo vai para
a próxima volta do laço da linha 3 para tentar analisar o próximo
vértice adjacente a v5.
Como v1 já está marcado, o processo entra no senão da linha 7.
Como v1 não é o pai de v4, o processo visita a aresta de retorno (v4, v1).
Os condicionais terminam e o processo vai para a próxima volta do
laço da linha 3, analisando o próximo vértice adjacente a v4, que é v5.
Como v5 não está marcado, o processo entra no condicional da
linha 4, visitando a aresta de árvore (v4, v5) e chamando o procedi-
mento recursivamente como Busca (v5, v4) (Figura 5).
Na chamada recursiva com Busca (v5, v4), o vértice analisado
é o v5, portanto, ele é marcado e seus vértices adjacentes são retor-
nados: {v4, v1}. O laço da linha 3 será executado para cada um desses
vértices. Iniciando com v4, o condicional da linha 4 falha (pois já está
marcado) e o da linha 8 também (poisv4 é o pai de v5). Assim, o laço
retorna para obter o segundo vértice adjacente a v5, que é v1.
Como v1 já está marcado, o processo entra no senão da linha 7.
Como v1 não é o pai de v5, o processo visita a aresta de retorno (v5, v1).
Os condicionais terminam e o processo vai para a próxima volta do
laço da linha 3, analisando o próximo vértice adjacente a v4, que é v1.
Figura 3
Grafo G – Busca em v2
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Figura 4
Grafo G – Busca em v3
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Figura 5
Grafo G – Busca em v4
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
56 Teoria dos Grafos
Como não há mais vértices adjacentes a v5, o laço da linha 3 termina e a chama-
da recursiva também, retornando à última invocação de Busca (linha 6). Quando o
procedimento analisa o vértice v4, o grafo fica como na Figura 6.
No retorno da última chamada recursiva, o procedimento estava
analisando o vértice v4, cujos vértices adjacentes eram {v3, v2, v1 e v5}
e já haviam sido analisados todos. Portanto, o laço da linha 3 termi-
na e essa chamada recursiva termina, retornando à última invoca-
ção de Busca (linha 6).
No retorno da última chamada recursiva, o procedimen-
to estava analisando o vértice v3 cujos vértices adjacentes eram
{v2, v4} e já haviam sido todos analisados. Portanto, o laço da linha
3 termina e a chamada recursiva também, retornando à última in-
vocação de Busca (linha 6), quando o procedimento estava anali-
sando o vértice v2.
No retorno da última chamada recursiva, o procedimento estava
analisando o vértice v2 cujos vértices adjacentes eram {v1, v3, v4} e já
haviam sido analisados os vértices v1 e v3. Portanto, o próximo vérti-
ce a ser analisado é o v4.
Como v4 já está marcado, o processo entra no senão da linha 7. Não sendo v4
pai de v2, o processo visita novamente a aresta de retorno (v2, v4). Os condicionais
terminam e o processo vai para a próxima volta do laço da linha 3.
Já que não há mais vértices adjacentes a v2, o laço da linha 3 termina e a chama-
da recursiva também, retornando à última invocação de Busca (linha 6), quando o
procedimento estava analisando o vértice v1.
No retorno da última chamada recursiva, o procedimento estava analisando o
vértice v1 cujos vértices adjacentes eram {v2, v4, v5} e já havia sido analisado o vértice
v2. Portanto, o próximo vértice a ser verificado seria o v4.
Como v4 já está marcado, o processo entra no senão da linha 7. Como v4 não é
o pai de v1, o processo visita novamente a aresta de retorno (v1, v4). Os condicionais
terminam e o processo vai para a próxima volta do laço da linha 3. O próximo vér-
tice a ser analisado na lista de adjacentes é o v5.
Uma vez que v5 já está marcado, o processo entra no senão da
linha 7. Como v5 não é o pai de v1, o processo visita novamente a
aresta de retorno (v1, v5). Os condicionais terminam e o processo vai
para a próxima volta do laço da linha 3.
Já que não há mais vértices adjacentes a v1, o laço da linha 3 ter-
mina e a chamada do procedimento Busca também, finalizando o
processo de busca em profundidade.
Como resultado, a Figura 7 apresenta a árvore de busca em pro-
fundidade resultante da aplicação do algoritmo que contém o vérti-
ce v1 como raiz. Na composição foram usados somente os vértices
visitados na linha 5 do algoritmo, que são os vértices de árvore.
Figura 6
Grafo G – Busca em v5
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Figura 7
Árvore de busca em profundidade de G
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Caminho mínimo e árvores geradoras 57
Um subgrafo de G é dito subgrafo gerador se possui todos os vértices de G. Se
esse subgrafo for uma árvore, ele é denominado árvore geradora.
As arestas de árvore encontradas pela aplicação do Algoritmo 2, que podem ser
vistas na Figura 7, foram: A’ = {(v1, v2), (v2, v3), (v3, v4), (v4, v5)}. Assim, o grafo T = (V, A’),
resultante do processo de busca em profundidade, é uma árvore geradora do grafo
G = (V, A).
Outro tipo de busca que pode ser efetuado é a busca em largura pelo gra-
fo. Ela é feita quando se escolhe o vértice incidente menos recentemente alcança-
do na busca. Para isso, assim que se obtém a lista de vértices adjacentes, deve-se
enfileirá-los em uma estrutura de dados Fila. Toda vez que se escolhe um vértice,
deve-se obtê-lo retirando-o da fila; toda vez que um vértice é marcado, deve-se en-
fileirá-lo. O Algoritmo 3 apresenta o pseudocódigo da busca em largura.
Algoritmo 3
Busca em largura
Dados: Grafo conexo G = (V, A)
1 PROCEDIMENTO Busca Largura(s)
2 Q <- Fila Vazia
3 Marcar s
4 Inserir s em Q
5 ENQUANTO Q ≠ ∅ FAÇA
6 v <- Primeiro Elemento de Q
7 PARA w ∈ Adj(v) FAÇA
8 SE w não está marcado ENTÃO
9 Visitar aresta de árvore (v, w)
10 Marcar w
11 Inserir w em Q
12 SENÃO
13 SE w está em Q ENTÃO
14 Visitar aresta de retorno (v, w)
15 FIM SE
16 FIM SE
17 FIM PARA
18 Retirar v de Q
19 FIM ENQUANTO
20 FIM PROCEDIMENTO
21
22 Desmarcar todos os vértices de G
23 Escolher um vértice s
24 BuscaLargura(s)
Fonte: Adaptado de Szwarcfiter, 2018.
Se forem consideradas somente as arestas de árvore (linha 9 do Algoritmo 3)
para a construção de um outro grafo (nesse caso, um subgrafo), o resultado cla-
ramente não teria ciclos, pois nesse trecho o algoritmo nunca visita uma aresta
adjacente a um vértice já marcado. Assim, diz-se que o algoritmo constrói uma
árvore de busca em largura. O vértice escolhido como sendo o primeiro a ser
visitado também é chamado de raiz da árvore de busca em largura.
Fila é uma estrutura de dados
baseada em uma lista linear em
que todas as operações são feitas
nas suas extremidades. O início da
fila é chamado de frente e o final
de trás. O modelo intuitivo de uma
fila é o mesmo usado em filas de
bancos, aeroportos, mercados etc.
Uma pessoa que chega na fila
entra na extremidade de trás, e a
próxima que sai, para ser servida, é
a que está no início (frente).
Assim, esse padrão é seguido na
estrutura de dados Fila, isto é,
quando se insere um elemento
na fila, este sempre é inserido
na extremidade de trás; quando
um elemento é retirado, sempre
é removido da extremidade da
frente. Como não há remoção ou
inserção de elementos em outras
posições da fila, duas operações
de manipulação são permitidas:
inserir ou enfileirar e remover ou
desenfileirar.
Saiba mais
58 Teoria dos Grafos
Para ilustrar e execução do Algoritmo 3, considere novamente o grafo da
Figura 1. O algoritmo começa desmarcando todos os vértices e escolhe qualquer
um destes para ser a raiz da busca. Aqui, será escolhido o vértice v1, mas poderia
ser qualquer um, pois não há indicação no algoritmo. Ao ser chamado pela primeira
vez, o procedimento é denominado como BuscaLargura(v1). Para essa execução
será usada uma Fila denotada por Q e composta por uma coleção de elementos,
no caso, de vértices.
O que caracteriza uma fila é o local de inserção e remoção dos elementos.
Pode-se fazer uma analogia, por exemplo, com uma fila de banco: sempre que você
chega nela, precisa ficar no final; a pessoa a ser atendida sempre é a que está no
início. Desse modo, sempre que um elemento é inserido na fila isso é feito na parte
de trás, enquanto que a remoção do elemento é feita na parte da frente. A Figura 8
mostra uma fila com alguns elementos já inseridos.
Figura 8
Fila Q
d a f b d
Frente Trás
Fonte: Elaborada pelo autor.
Ao incorporar o elemento c na Fila Q, ele é colocado na parte de trás, logo após
o elemento d. Com a inserção, a fila fica como mostrado na Figura 9.
Figura 9
Fila Q com a inserção do elemento c
d a f b d c
Frente Trás
Fonte: Elaborada pelo autor.
Caso haja uma remoção na Fila Q, o elemento a ser extraído é sempre o que se
encontra na frente da fila, que, no caso, é o elemento d. Havendo a retirada, a fila
fica como mostrado na Figura 10.
Figura 10
Fila Q com a remoção de um elemento
a f b d c
Frente Trás
Fonte: Elaborada pelo autor.O procedimento BuscaLargura inicia e a fila Q é criada e tornada vazia,
marcando-se o vértice inicial v1 e inserindo-o na fila (Figura 11).
Figura 11
Busca em largura - Vértice v1
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V1
Frente Trás
Fila Q
Caminho mínimo e árvores geradoras 59
O laço da linha 5 serve para que o procedimento só termine depois que não haja
elementos para serem processados na fila. Ao longo da execução do laço, novos
vértices são inseridos e removidos.
Na primeira volta do laço, a variável v recebe o primeiro elemento da fila, no caso,
v1. O laço da linha 7 varre todos os elementos adjacentes a v1, a saber, {v2, v4 e v5},
e, para cada volta do laço, um desses é analisado.
Inicia-se com v2, como não está marcado, e visita a aresta de árvore (v1, v2).
Marca-se v2 e insere-se v2 em Q. O resultado pode ser visto na Figura 12.
Figura 12
Busca em largura – Vértice v2
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V1 V2
Frente Trás
Fila Q
O mesmo processo dentro desse laço é feito para v4 e v5. Como nenhum desses
está marcado, o procedimento sempre entra no condicional da linha 8. O resultado
é apresentado na Figura 13.
Figura 13
Busca em largura – Vértices v4 e v5
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V1 V2 V4 V5
Frente Trás
Fila Q
Ao término do laço da linha 7, a linha 18 é executada retirando-se da fila o vértice
v, que, nesse caso, vale v1, sobrando para serem processados os vértices v2, v4 e v5.
Ao retornar à linha 5, o processo verifica que a fila não está vazia. Na linha 6,
obtém-se o primeiro elemento da fila, no caso, v2. O laço da linha 7 varre todos os
elementos adjacentes a v2, no caso {v1, v4, v3}, e, para cada volta do laço, um desses
vértices é analisado.
Inicia-se com v1, como está marcado, e executa-se o caso contrário na linha 12.
O condicional da linha 13 verifica se v1 está na fila; como não está, o condicional
termina, retornando ao próximo vértice adjacente a v2.
O próximo vértice a ser analisado pelo laço da linha 7 é v4. Como já está mar-
cado, executa o caso da linha 12 e, no condicional da linha 13, encontra v4 ainda
60 Teoria dos Grafos
na fila. Assim, visita-se a aresta de retorno (v2, v4) e termina-se essa volta do laço
retornando ao próximo vértice adjacente a v2.
Em seguida, analisa-se v3. Como não está marcado, entra no condicional da li-
nha 8, visitando a aresta (v2, v3), marcando o vértice v3 e inserindo v3 na fila. Em
seguida, finaliza o condicional e retorna ao laço da linha 7. Como v2 não tem mais
vértices adjacentes, termina-se esse laço e executa-se a linha 18, retirando v2 da fila.
O resultado pode ser visto na Figura 14.
Figura 14
Busca em largura – Término do processamento de v2
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V4 V5 V3
Frente Trás
Fila Q
O laço da linha 5 reinicia. Na linha 6, o vértice v4 é atribuído a v e, na linha 7,
inicia-se o laço sobre todos os elementos adjacentes a v4, a saber, {v3, v2, v1, v5}.
Analisando o vértice v3, percebe-se que ele já está marcado, então, entra no caso
contrário da linha 12. Como v3 está na fila, executa a linha 14, que visita a aresta de
retorno (v4, v3). Ao final, retorna à próxima volta do laço da linha 7.
Analisando o vértice v2, percebe-se que ele já está marcado, então, entra no caso
contrário da linha 12. Como v2 não está na fila, termina o condicional sem visitar a ares-
ta (pois ela já foi visitada). Ao final, retorna à próxima volta do laço da linha 7.
Também o vértice v1 já está marcado, assim, entra no caso contrário da linha 12.
Como v1 não está na fila, termina o condicional sem visitar a aresta (pois ela já foi visi-
tada). Ao final, retorna à próxima volta do laço da linha 7.
Já o vértice v5, que também está marcado, entra no caso contrário da linha
12. Como v5 está na fila, executa a linha 14, que visita a aresta de retorno (v4, v5).
Ao final, retorna à próxima volta do laço da linha 7. Terminando o laço da linha 7,
pois os vértices adjacentes de v4 acabaram, a execução do procedimento sai do laço
e executa a linha 18, removendo v4 da fila. O resultado pode ser visto na Figura 15.
Figura 15
Busca em largura – Término do processamento de v4
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V5 V3
Frente Trás
Fila Q
Caminho mínimo e árvores geradoras 61
O laço da linha 5 reinicia. Na linha 6, o vértice v5 é atribuído a v e, na linha 7,
inicia-se o laço sobre todos os elementos adjacentes a v5, a saber, {v4, v1}.
Analisando o vértice v4, percebe-se que ele já está marcado, então, entra no caso
contrário da linha 12. Como v4 não está na fila, termina o condicional sem visitar a
aresta (pois ela já foi visitada). Ao final, retorna à próxima volta do laço da linha 7.
O vértice v1 também está marcado, assim, entra no caso contrário da linha 12.
Como v1 não está na fila, termina o condicional sem visitar a aresta (pois ela já foi
visitada). Ao final, retorna à próxima volta do laço da linha 7.
Terminando o laço da linha 7, pois os vértices adjacentes de v5 acabaram, sai do
laço e executa a linha 18, removendo v5 da fila. O resultado pode ser visto na Figura 16.
Figura 16
Busca em largura – Término do processamento de v5
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
V3
Frente Trás
Fila Q
O laço da linha 5 reinicia. Na linha 6, o vértice v3 é atribuído a v e, na linha 7,
inicia-se o laço sobre todos os elementos adjacentes a v3, a saber, {v4, v2}.
Analisando o vértice v4,, percebe-se que ele já está marcado, então, entra no caso
contrário da linha 12. Como v4 não está na fila, termina o condicional sem visitar a
aresta (pois ela já foi visitada). Ao final, retorna à próxima volta do laço da linha 7.
O vértice v2 também está marcado, assim, entra no caso contrário da linha 12.
Como v2 não está na fila, termina o condicional sem visitar a aresta (pois ela já foi
visitada). Ao final, retorna à próxima volta do laço da linha 7.
Terminando o laço da linha 7, pois os vértices adjacentes a v3 acabaram, sai
do laço e executa a linha 18, removendo v3 da fila. O resultado pode ser visto na
Figura 17.
Figura 17
Busca em largura – Término do processamento de v3
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
Frente Trás
Fila Q
62 Teoria dos Grafos
Já que a fila está vazia, o laço da linha 5 termina e a busca em largura é finaliza-
da. Como resultado, a Figura 18 apresenta a árvore de busca em largura resultante
da aplicação do algoritmo, que contém o vértice v1 como raiz. Para a composição,
são usadas somente as arestas visitadas na linha 9 do algoritmo, que são as arestas
de árvore.
As arestas de árvore encontradas foram: A’ = {(v1, v2), (v1, v4), (v1, v5),
(v2, v3)}. Assim, o grafo T = (V, A’), resultante do processo de busca em
largura, também é uma árvore geradora do grafo G = (V, A).
Os procedimentos de busca apresentados foram aplicados
a grafos não orientados e conexos. Percebe-se que todo grafo
não orientado conexo tem, pelo menos, uma árvore geradora.
Nos exemplos mostrados são conseguidas duas árvores gerado-
ras, mas, trocando a ordem de escolha dos vértices, facilmente
chega-se a outras árvores.
Por suas características, uma árvore com n vértices possui exata-
mente n-1 arestas, portanto, a árvore geradora de um grafo conexo
não orientado com n vértices tem exatamente n-1 arestas.
Figura 18
Árvore de busca em largura
Fonte: Elaborada pelo autor.
v5 v2
v4 v3
v1
3.2 Árvore Geradora Mínima
Vídeo Encontrar uma árvore geradora mínima é muito importante na teoria dos gra-
fos, pois vários problemas reais podem ser mapeados e solucionados por ela.
Por exemplo, para efetuar o projeto de uma rede de fibra ótica entre os nós,
desconsiderando redundâncias, é preciso que todos os nós estejam conectados, e
o objetivo é gastar o mínimo possível. Em um extremo, pode-se conectar todos os
n nós com todos os outros, criando um grafo completo Kn. Se há um custo consi-
derável na ligação entre nós, este será em média multiplicado por n (n-1)
2
, que é o
número de arestasque um grafo completo Kn possui.
Assim, dado um grafo conexo, um conjunto de arestas que o mantém – todos os
vértices são alcançáveis – é uma árvore geradora. Se houver um custo associado, o
objetivo é conseguir uma árvore geradora mínima.
Supondo que há a necessidade de asfaltar estradas entre cidades, com um dado
conjunto de municípios e vias, o objetivo é asfaltar determinado subconjunto para
que todas as cidades sejam interligadas por vias asfaltadas e que o custo seja míni-
mo (BARROSO, 2014). Nesse caso, vários fatores devem ser analisados e considera-
dos para o custo de pavimentação de vias, como aspectos geológicos, de traçado,
hidrológicos etc. Assim, para a modelagem do problema, assume-se que essas in-
formações já foram obtidas e que, para a análise matemática, tem-se um grafo no
qual os vértices são as cidades, as arestas são as estradas que as conectam e cada
aresta é ponderada com o custo de pavimentação.
Analisando esse grafo, conectar todas as cidades com estradas pavimentadas a
um custo mínimo significa encontrar um conjunto de estradas a serem asfaltadas
de tal forma que todas as cidades sejam alcançadas sem grandes valores, isto é,
não havendo redundância (ciclos). Esse conjunto de arestas, juntamente com seus
Uma formulação detalhada
desse problema e das
técnicas de resolução,
como a aplicação de
Árvores Geradoras
Mínimas e Árvore de
Steiner, pode ser vista no
artigo Aplicação de grafos
em um problema de rede.
BARROSO, M. M. de A. Abakós, v.
2, n. 2, p. 48-78, 30 maio 2014.
Disponível em: http://periodicos.
pucminas.br/index.php/abakos/arti-
cle/view/P.2316-9451.2014v2n2p48.
Acesso em: 29 maio 2020.
Leitura
Caminho mínimo e árvores geradoras 63
vértices incidentes, será uma árvore (pois não possui ciclos) geradora, já que conta
com todos os vértices do grafo original e é mínima, uma vez que o objetivo é encon-
trar o custo mínimo de pavimentação.
Assim, um dos problemas clássicos em grafos é encontrar uma árvore geradora
mínima em um grafo não dirigido com custos (ou pesos) nas arestas. Para isso,
faz-se necessário definir alguns conceitos.
Dado um grafo G não dirigido com custos, o custo de cada aresta
pode ser positivo ou negativo e o custo de um subgrafo ou uma
árvore de G é a soma dos custos de cada aresta.
Uma árvore geradora mínima de um grafo G, também conhecida
como minimum spanning tree (MST), é uma árvore geradora de G com
custo mínimo. Em outras palavras, é uma árvore geradora com custo
menor dentre todas as possíveis árvores geradoras de G.
Convém ressaltar que, se todas as arestas tiverem o mesmo custo,
então, qualquer árvore geradora é mínima, pois conta com o mesmo
número de arestas, os mesmos custos em cada aresta e, portanto, o
mesmo custo total.
Observe o grafo da Figura 19. Claramente, ele conta com várias
árvores geradores.
Partindo de v1 como vértice raiz, a Figura 20 apresenta duas
dessas árvores.
Figura 20
Árvores geradoras
Fonte: Elaborada pelo autor.
v2 v4
v3
v1
2
6
10
v2 v4
v3
v1
2
5
1
Ao calcular o custo da árvore geradora da esquerda, somando os custos das
arestas, o valor total é 18. Já o valor total da árvore da direita é 8.
De acordo com Kruskal (1956) e Prim (1957), dois algoritmos são apresentados
para encontrar a MST de um grafo: o algoritmo de Kruskal (concebido em 1956) e
o algoritmo de Prim (concebido em 1957). Ambos são aplicados a grafos conexos
ponderados, nos quais os pesos não são negativos.
Figura 19
Grafo ponderado
Fonte: Elaborada pelo autor.
v2 v4
v3
v1
2
6
1
10
5
64 Teoria dos Grafos
Os algoritmos que encontram uma MST são de busca gulosa, isto é, a cada passo
selecionam a melhor aresta possível para compor a árvore. O Algoritmo 4 apresen-
ta o algoritmo de Prim para encontrar uma árvore geradora mínima (PRIM, 1957).
Algoritmo 4
Árvore Geradora Mínima – Algoritmo de Prim
Dados: Grafo conexo ponderado G = (V, A)
1 v <- Um vértice qualquer do grafo
2 T <- {v}
3 Tmin <- ∅
4 V’ <- V \ {v}
5 ENQUANTO V’ ≠ ∅ FAÇA
6 Encontrar aresta (t, v’) ∈ A tal que t ∈ T e v’ ∈ V’, sendo o custo de (t,v’) o menor valor
7 T <- T ∪ {v’}
8 V’ <- V’ \ {v’}
9 Tmin <- Tmin ∪ (t, v’)
10 FIM ENQUANTO
Fonte: Adaptado de Goldbarg; Goldbarg, 2012.
O algoritmo de Prim é simples e inicia escolhendo-se um vértice para ser a raiz
da árvore. Logo após, ele mantém três estruturas auxiliares: V’, T e Tmin.
O conjunto V’ mantém os vértices que ainda não foram escolhidos pelo algoritmo.
Inicialmente, ele recebe o mesmo conjunto V (vértices do grafo) subtraído do vérti-
ce escolhido como raiz da árvore. O conjunto V’ faz com que o algoritmo não esco-
lha uma aresta a um vértice já usado na árvore, evitando ciclos. O conjunto T, que
inicia com o vértice raiz, a cada volta do laço é adicionado ao vértice cuja aresta foi
recentemente escolhida. O conjunto Tmin inicia vazio e, ao final do algoritmo, terá
todas as arestas que fazem parte da árvore geradora mínima.
O algoritmo possui um laço que é repetido enquanto o conjunto V’ não é
vazio, isto é, enquanto ainda existem vértices para serem adicionados à árvore.
Dentro do laço, o algoritmo escolhe a aresta que dá o menor valor entre um vér-
tice já escolhido na árvore (conjunto T) e entre um vértice ainda não escolhido
(conjunto V’).
Logo após, atualizam-se os conjuntos auxiliares. A T é adicionado o vértice
que foi escolhido; de V’ é subtraído o mesmo vértice escolhido, para que não
se repita na árvore; e em Tmin é acrescentada a aresta de menor custo. Ao final
do algoritmo, o conjunto Tmin contém todas as arestas participantes da árvore
geradora mínima.
O algoritmo de Kruskal constrói a árvore geradora mínima de uma forma um
pouco diferente. Enquanto o algoritmo de Prim inclui vértices para a geração da
árvore, Kruskal está voltado para inclusão de arestas (KRUSKAL, 1956). Confira um
exemplo no Algoritmo 5.
Apesar de simples, o algoritmo
de Prim apresentado é ineficiente.
Sua eficácia depende do processo
de escolha da aresta pertencente
à árvore e à estrutura de dados
utilizada. Para a implementação
simples aqui representada, usando
uma matriz de adjacências, a
complexidade é O (|A|*|V|).
Com uma implementação usando
uma heap binária, chega-se a
O(|A| log |V|), que é um ganho
significativo (JOHNSON, 1975).
Com o uso de outras estruturas
mais elaboradas, como uma
heap de Fibonacci, consegue-se
uma complexidade de O(|V|
log |V| + |A|), que é muito
boa para grafos esparsos
(FREDMAN; TARJAN, 1987).
Saiba mais
Caminho mínimo e árvores geradoras 65
Algoritmo 5
Árvore Geradora Mínima – Algoritmo de Kruskal
Dados: Grafo conexo ponderado G = (V, A)
1 Ordenar as arestas ai em ordem crescente sobre seu custo no vetor A’
2 A’ <- [ai], i = 1, 2, ..., |A|
3 Tmin <- A’[1]
4 PARA TODO ai ∈ A’, i = 2, 3, ..., |A| FAÇA
5 SE Tmin ∪ ai é um grafo acíclico ENTÃO
6 Tmin <- Tmin ∪ ai
7 FIM SE
8 FIM PARA
Fonte: Adaptado de Goldbarg; Goldbarg, 2012.
O algoritmo de Kruskal utiliza duas estruturas auxiliares: Tmin e A’. O conjunto
Tmin recebe as arestas que fazem parte da árvore sendo construída. Ao final do
algoritmo, Tmin contém a árvore geradora mínima. O vetor A’ mantém as arestas
ordenadas em ordem crescente por peso. Assim, o primeiro passo do algoritmo é
ordenar essas arestas para que o laço interno faça a varredura em ordem.
O algoritmo possui um laço (linha 4) que termina quando todas as arestas, de
maneira ordenada, forem analisadas. A cada volta do laço verifica-se uma aresta.
Se a inclusão dessa aresta mantém o grafo acíclico, desse modo, a aresta é adicio-
nada; caso contrário, é ignorada.
Assim que a árvore for construída, mesmo que mais arestas sejam analisadas, o
condicional da linha 5 não é satisfeito, pois a inclusão de mais arestas leva a ciclos,
o que garante que não serão inseridas mais arestas do que as necessárias para a
árvore (no caso |V|–1 arestas).
Vê-se que os algoritmos de Prim e Kruskal, para encontrar uma árvore
geradora mínima, são simples,mas suas complexidades dependem de ou-
tras estruturas de dados. Descobrir os gargalos de um algoritmo não é tarefa fácil
e, muitas vezes, uma operação que inicialmente parece simples pode depreciar o
desempenho de um programa de maneira drástica.
O algoritmo de Kruskal também é
muito simples, mas sua complexi-
dade reside em ordenar as arestas
e verificar se a inclusão de uma
aresta gera um grafo acíclico.
A implementação mais eficiente
conhecida tem complexidade
O(|A| log |V|) e faz uso de
otimizações na representação e
verificação de conjuntos disjuntos.
A estrutura chamada UNION-FIND,
usando técnicas como union
by rank e path compression
(CP-ALGORITHMS, 2020), é capaz
de melhorar o desempenho do
algoritmo de Kruskal.
Saiba mais
3.3 Caminho Mínimo
Vídeo Percebe-se que os processos de busca em profundidade e largura apresentados
caminham por todos os vértices do grafo, mas claramente é possível alterá-los para
partir de um vértice v e chegar a outro vértice w. Assim, consegue-se encontrar uma
sequência de vértices que determina um caminho de v a w.
O custo de um caminho em grafos ponderados, isto é, com pesos nas arestas,
é dado pela soma dos pesos de todas as arestas que fazem parte do caminho. Em
um grafo não ponderado, define-se como caminho mínimo entre o vértice v1 e v2 o
caminho de menor tamanho, isto é, menor número de arestas entre v1 e v2.
Em razão da natureza do procedimento de busca em profundidade, não há
como garantir que o caminho encontrado é o caminho mínimo. Para isso, em gra-
fos não ponderados, deve-se efetuar uma busca em largura pelo grafo.
66 Teoria dos Grafos
Para grafos ponderados, o caminho mínimo entre o vértice v1 e v2 é o caminho
cuja soma dos pesos nas arestas possui o menor valor. Assim, em grafos pondera-
dos, o caminho mínimo pode não ser aquele que possui menor número de arestas.
O algoritmo de Dijkstra, publicado em 1959, rotula todos os vértices do grafo
por meio de um vértice origem, indicando qual o menor caminho entre esse vértice
e qualquer outro do grafo. Assim, ao final do algoritmo, consegue-se o caminho
mínimo entre o vértice origem e qualquer outro vértice, bastando caminhar pela
rotulação efetuada partindo do vértice destino.
Fonte: Adaptado de Goldbarg; Goldbarg, 2012.
Algoritmo 6
Caminho Mínimo em Grafo Ponderado – Algoritmo de Dijkstra
Dados: Grafo conexo ponderado G = (V, A), D = {dij}, em que dij é o peso da aresta entre o
vértice i e j, um vértice inicial da busca s
1 PARA v ∈ V FAÇA
2 rot[v] <- 0
3 dt[v] <- ∞
4 FIM PARA
5 dt[s] <- 0
6 V’ <- V
7 ENQUANTO V’ ≠ ∅ FAÇA
8 v <- elemento de V’, tal que dt [v] é o menor entre os elementos de V’
9 V’ <- V’ \ {v}
10 PARA u ∈ Adj(v) FAÇA
11 SE dt[v]+dvu < dt[u] ENTÃO
12 dt[u] <- dt[v]+ dvu
13 rot[u] <- v
14 FIM SE
15 FIM PARA
16 FIM ENQUANTO
O Algoritmo 6 apresenta o algoritmo de Dijkstra e tem como objetivo encontrar
o caminho mínimo entre um vértice e qualquer outro vértice do grafo. Seu funcio-
namento não é exato se houver pesos negativos nas arestas, portanto, usa-se so-
mente para quando todos os pesos são positivos.
Tendo como ponto de partida um vértice inicial s, esse algoritmo cria rótulos para
cada vértice do grafo, indicando sua distância a partir de v e qual vértice foi usado para
chegar até ele. Esses rótulos são mantidos por duas estruturas auxiliares, dt e rot, em
que dt mantém as distâncias a partir de v e rot mantém o vértice adjacente do caminho.
As linhas de 1 a 6 são usadas para inicializar os dados auxiliares e os rótulos.
Fora o rótulo do vértice inicial, o laço da linha 1 inicia todos os rótulos com zero e
todas as distâncias com ∞.
O laço da linha 7 é executado enquanto o conjunto auxiliar V’, que foi inicializado
com todos os vértices na linha 6, não for vazio. A cada volta do laço, um elemento
de V’ é escolhido, sendo o que possui a menor distância. Perceba que na primeira
volta será escolhido o vértice inicial cuja distância foi iniciada com zero, sendo os
demais iniciados com ∞.
Segundo Goldbarg e Goldbarg
(2012), para encontrar o caminho
mínimo em grafos pondera-
dos, quando há a presença de
pesos negativos, pode-se usar
o algoritmo de Bellman-Ford,
de 1956.
Agora, para encontrar o caminho
mínimo entre todos os pares de
vértices de um grafo, usa-se o
algoritmo de Floyd-Warshall, de
1959 (FLOYD, 1962).
Saiba mais
Caminho mínimo e árvores geradoras 67
Na linha 9, o vértice escolhido v é retirado de V’ e o laço da linha
10 varre todos os vértices adjacentes a v.
O condicional da linha 11 verifica se a distância do vértice escolhi-
do v, acrescida do peso da aresta (v, u), é menor que o valor da distân-
cia do vértice u. Se sim, significa que foi encontrado um caminho
melhor de s (vértice inicial) até u e que, portanto, o valor da distância
e seu rótulo devem ser atualizados (linhas 12 e 13). Perceba que se o
vértice u ainda não foi visitado, seu valor de distância está inicializado
com ∞, portanto, será sempre atualizado na primeira visita.
Para ilustrar a execução do algoritmo, considere o grafo pon-
derado da Figura 21. O algoritmo inicia definindo os rótulos para
cada vértice, que nas representações gráficas apresentadas serão
adicionados perto do vértice para melhor entendimento, como
mostra a Figura 22.
Em cada caixa perto do vértice, o primeiro compartimento indi-
ca o rótulo de vértice (rot) e o segundo a distância (dt). A Figura 22
apresenta as estruturas após a inicialização que ocorre nas linhas
de 1 a 5.
Na primeira volta do laço, V’ contém todos os vértices do grafo
(inicializado na linha 6), portanto, V’ = {v1, v2, v3, v4, v5}. O primeiro ele-
mento de V’ que possui a menor distância é v1.
O vértice v1 é removido de V’ na linha 9, portanto, V’ = {v2, v3, v4,
v5}. Na linha 10 busca-se e varre-se todos os vértices adjacentes a
v1, nesse caso, {v2, v3, v5}.
Para v2, verifica-se se dt[v1] (que é zero), acrescido do custo da
aresta (v1, v2) (que é 10), é menor que dt[v2] (que é infinito). Como é
menor, desse modo, a distância dt[v2] recebe 10 e o rótulo rt[v2] assu-
me o vértice v1. O laço, então, retorna para processar o próximo vér-
tice adjacente a v1. O grafo e as estruturas ficam como na Figura 23.
Figura 23
Processamento de (v1, v2)
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
0 ∞
v1 10
0 0
0 ∞
0 ∞
Figura 22
Estruturas inicializadas
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
0 ∞
0 ∞
0 0
0 ∞
0 ∞
68 Teoria dos Grafos
Para v3, verifica-se se dt[v1] (que é zero), acrescido do custo da
aresta (v1, v3) (que é 8), é menor que dt[v3] (que é infinito). Como é
menor, a distância dt[v3] recebe 8 e o rótulo rt[v3] assume o vérti-
ce v1. O laço, assim, retorna para processar o próximo vértice ad-
jacente a v1. O grafo e as estruturas ficam como na Figura 24.
Para v5, verifica-se se dt[v1] (que é zero), acrescido do custo da
aresta (v1, v5) (que é 3), é menor que dt[v5] (que é infinito). Como é
menor, a distância dt[v5] recebe 3 e o rótulo rt[v5] recebe o vértice
v1. O laço retorna para processar o próximo vértice adjacente a v1.
O grafo e as estruturas ficam como na Figura 25.
Como não há mais vértices adjacentes a v1, o laço das linhas
10 a 15 termina e o processo retorna ao laço da linha 7. Como o
conjunto V’ ainda não é vazio, mais uma volta desse laço será
executada.
Na linha 8 é escolhido o elemento de V’ = {v2, v3, v4, v5} que
possui a menor distância dt, nesse caso, v5. Na linha 9, o vértice v5
é removido de V’ e, portanto, V’ = {v2, v3, v4}. Já na linha 10 busca-se
e varre-se todos os vértices adjacentes a v5, nesse caso, {v1, v4}.
Para v1, verifica-se se dt[v5] (que é 3), acrescido do custo da
aresta (v5, v1) (que é 3), é menor que dt[v1] (que é zero). Como não
é menor, não faz qualquer atualização, e o grafo e as estruturas
são mantidos da mesma forma. O laço, assim, retorna para pro-
cessar o próximo vértice adjacente a v5.
Para v4, checa-se se dt[v5](que é 3), acrescido do custo da
aresta (v5, v4) (que é 2), é menor que dt[v4] (que é infinito). Como
é menor, a distância dt[v4] recebe 5 e o rótulo rt[v4] assume o
vértice v5. O laço, então, retorna para processar o próximo vértice
adjacente a v5. O grafo e as estruturas ficam como na Figura 26.
Como não há mais vértices adjacentes a v5, o laço das linhas 10 a
15 termina e o processo retorna ao laço da linha 7. Como o conjunto
V’ ainda não é vazio, mais uma volta desse laço é executada.
Na linha 8 é escolhido o elemento de V’ = {v2, v3, v4} que possui
a menor distância dt, nesse caso, v4. Na linha 9, o vértice v4 é
removido de V’, portanto, V’ = {v2, v3}. Já na linha 10 busca-se e
varre-se todos os vértices adjacentes a v4, nesse caso, {v2, v3, v5}.
Para v2, verifica-se se dt[v4] (que é 5), acrescido do custo da
aresta (v4, v2) (que é 5), é menor que dt[v2] (que é 10). Como não
é menor, não faz qualquer atualização, e o grafo e as estruturas
são mantidos da mesma forma. O laço, então, retorna para pro-
cessar o próximo adjacente a v4.
Para v3, checa-se se dt[v4] (que é 5), acrescido do custo da
aresta (v4, v3) (que é 6), é menor que dt[v3] (que é 8). Como não
é menor, não faz qualquer atualização, e o grafo e as estruturas
Figura 24
Processamento
de (v1, v3)
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
V1 8
V1 10
0 0
0 ∞
0 ∞
Figura 25
Processamento
de (v1, v5)
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
V1 8
V1 10
0 0
V1 3
0 ∞
Figura 26
Processamento
de (v5, v4)
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
V1 8
V1 10
0 0
V1 3
V5 5
Caminho mínimo e árvores geradoras 69
são mantidos da mesma forma. O laço, desse modo, retorna para processar o
próximo vértice adjacente a v4.
Para v5, verifica-se se dt[v4] (que é 5), acrescido do custo da aresta (v4, v5) (que é
2), é menor que dt[v5] (que é 3). Como não é menor, não faz qualquer atualização, e
o grafo e as estruturas são mantidos da mesma forma. O laço, então, retorna para
processar o próximo vértice adjacente a v4.
Como não há mais vértices adjacentes a v4, o laço das linhas 10 a 15 termina e
o processo retorna ao laço da linha 7. Como o conjunto V’ ainda não é vazio, mais
uma volta desse laço é executada.
Na linha 8 é escolhido o elemento de V’ = {v2, v3} que possui a menor distância dt,
nesse caso, v3. Na linha 9, o vértice v3 é removido de V’, portanto, V’ = {v2}. A linha 10
busca e varre todos os vértices adjacentes a v3, nesse caso, {v1, v2, v4}.
Para v1, verifica-se se dt[v3] (que é 8), acrescido do custo da aresta (v3, v1) (que é
8), é menor que dt[v1] (que é 0). Como não é menor, não se faz qualquer atualiza-
ção, e o grafo e as estruturas são mantidos da mesma forma. O laço, assim, retorna
para processar o próximo vértice adjacente a v3.
Para v2, checa-se se dt[v3] (que é 8), acrescido do custo da aresta (v3, v2) (que é 1),
é menor que dt[v2] (que é 10). Como é menor, a distância dt[v2] recebe 9 e o rótulo
rt[v2] assume o vértice v3. O laço, desse modo, retorna para processar o próximo
vértice adjacente a v3. O grafo e as estruturas ficam como na Figura 27.
Para v4, verifica-se se dt[v3] (que é 8), acrescido do custo da
aresta (v3, v4) (que é 6), é menor que dt[v4] (que é 5). Como não
é menor, não faz qualquer atualização, e o grafo e as estruturas
são mantidos da mesma forma. O laço, então, retorna para pro-
cessar o próximo vértice adjacente a v3.
Como não há mais vértices adjacentes a v3, o laço das linhas 10
a 15 termina e o processo retorna ao laço da linha 7. Como o con-
junto V’ ainda não é vazio, mais uma volta desse laço é executada.
Na linha 8, é escolhido o elemento de V’ = {v2} que possui a
menor distância dt, nesse caso, v2, que é removido de V’, na linha
9, portanto, V’ = Ø. Na linha 10 busca-se e varre-se todos os vérti-
ces adjacentes a v2, nesse caso, {v1, v3, v4}.
Para v1, checa-se se dt[v2] (que é 9), acrescido do custo da ares-
ta (v2, v1) (que é 10), é menor que dt[v1] (que é 0). Como não é
menor, não é feita qualquer atualização, e o grafo e as estruturas
são mantidos da mesma forma. O laço retorna para processar o
próximo vértice adjacente a v2.
Para v3, verifica-se se dt[v2] (que é 9), acrescido do custo da aresta (v2, v3) (que é
1), é menor que dt[v3] (que é 8). Como não é menor, não é feita qualquer atualiza-
ção, e o grafo e as estruturas são mantidos da mesma forma. O laço retorna para
processar o próximo vértice adjacente a v2.
Para v4, checa-se se dt[v2] (que é 9), acrescido do custo da aresta (v2, v4) (que é
5), é menor que dt[v4] (que é 5). Como não é menor, não é feita qualquer atualiza-
Figura 27
Processamento de (v3, v2)
Fonte: Elaborada pelo autor.
v2 v4
v5v3
v1
8
5
1
3
6
10
2
V1 8
V3 9
0 0
V1 3
V5 5
70 Teoria dos Grafos
ção, e o grafo e as estruturas são mantidos da mesma forma. O laço retorna para
processar o próximo vértice adjacente a v2.
Como não há mais vértices adjacentes a v2, o laço das linhas 10 a 15 termina e o
processo retorna ao laço da linha 7. Como o conjunto V’ é vazio, o procedimento e
as estruturas de rótulos e distâncias ficam como na Figura 27.
Percebe-se que as distâncias mínimas entre v1 e cada um dos vértices são dadas
de maneira direta pela estrutura dt. Já o caminho mínimo precisa ser calculado
caminhando-se entre os rótulos, iniciando do vértice destino.
Por exemplo, para calcular o caminho mínimo entre v1 e v4, verifica-se o rótulo
rot[v4], que possui v5. Isso indica que o caminho partindo de v1 passa por v5 para
chegar em v4, isto é, a aresta (v5, v4) faz parte do caminho.
Analisando v5, percebe-se que seu rótulo rot[v5] possui v1. Significa que o cami-
nho passa por v1, isto é, a aresta (v1, v5) faz parte do caminho. Como se chegou em
v1 (vértice origem), não há mais o que calcular, portanto, o caminho entre v1 e v4 é
dado por: {(v1, v5), (v5, v4)}.
Efetuando-se todos os cálculos, as distâncias mínimas entre v1 e os demais vér-
tices do grafo, bem como os caminhos mínimos, são:
• De v1 para v2 : distância 9, caminho {(v1, v3), (v3, v2)}
• De v1 para v3 : distância 8, caminho {(v1, v3)}
• De v1 para v4 : distância 5, caminho {(v1, v5), (v5, v4)}
• De v1 para v5 : distância 3, caminho {(v1, v5)}
Assim, percebe-se que o algoritmo de Dijkstra varre o grafo todo desde de um
vértice inicial e dá como resultado a distância e o caminho entre o vértice inicial es-
colhido e cada um dos vértices do grafo. Para encontrar o caminho entre um vértice
qualquer e o vértice inicial, basta caminhar pelos rótulos em sequência.
Para digrafos (grafos direcionados), o algoritmo é o mesmo, bastando respeitar as
orientações das arestas ao retornar a lista de vértices adjacentes, linha 10 do Algoritmo 6.
Uma melhoria no algoritmo de Dijkstra apresentado é na linha 10. Nesse pon-
to, o algoritmo retorna todos os vértices adjacentes a v, mas pode-se melhorá-lo
para que sejam considerados somente vértices que ainda não foram analisados,
isto é, aqueles pertencentes a V’
CONSIDERAÇÕES FINAIS
Muitos problemas em grafos, bem como problemas reais mapeados para grafos,
são essencialmente resolvidos pela aplicação de algoritmos de busca ou adaptações.
Assim, estes representam um papel importante no entendimento e nas aplicações da
teoria de grafos.
Para grafos não ponderados, foi apresentado que a busca em largura é capaz de en-
contrar o caminho mínimo entre dois vértices, levando em consideração que o tamanho
ou o custo de um caminho não ponderado é dado em número de arestas. Para grafos
ponderados, o tamanho ou o custo de um caminho é gerado pela soma dos custos de
suas arestas, assim, faz-se necessário o uso do algoritmo de Dijkstra, o qual calcula o
Caminho mínimo e árvores geradoras 71
custo dos caminhos entre um vértice inicial e todos os demais vértices do grafo. Vale
ressaltar que o algoritmo de Dijkstra exige a positividade dos custos das arestas.
Já no caso de grafos em que ocusto das arestas pode ser negativo, deve-se aplicar
o algoritmo de Bellman-Ford. E para encontrar o caminho mínimo entre todos os pa-
res de vértices de um grafo, utiliza-se o algoritmo de Floyd-Warshall.
Outro problema apresentado foi o de encontrar a árvore geradora mínima em
grafos conexos e ponderados, também usada em vários problemas em grafos. Uma
árvore geradora é uma árvore formada por todos os vértices do grafo, de modo que
o custo da árvore é a soma dos custos individuais de suas arestas. Para tanto, foram
apresentados os algoritmos clássicos de Prim e Kruskal.
ATIVIDADES
1. Considere o grafo a seguir.
Aplique o algoritmo de busca em profundidade,
iniciando em v1. Dê a árvore de busca em
profundidade resultante.
Restrição: para efeito de escolha de vértices
a serem analisados, assuma que os vértices
do grafo estão ordenados e que você sempre
escolhe o qual tem índice menor. Por exemplo,
se em um ponto de escolha há os vértices v6 e
v3, você deve selecionar, primeiramente, o v3.
2. Observe o grafo a seguir.
Aplique o algoritmo de busca em largura,
iniciando em v1. Dê a árvore de busca em lar-
gura resultante.
Restrição: para efeito de escolha dos
vértices a serem analisados, assuma que os
vértices do grafo estão ordenados e que você
sempre escolhe o qual tem índice menor. Por
exemplo, se em um ponto de escolha há os
vértices v6 e v3, você deve selecionar, primei-
ramente, o v3.
v5 v3
v2
v1
v4
v6
v5 v3
v2
v1
v4
v6
72 Teoria dos Grafos
3. Dado o grafo a seguir, aplique o algoritmo de Prim, iniciando em v1, e encontre a
árvore geradora mínima.
v5 v3
v2
v1
v4
v6
1
10
4
2
35
3 4
4. Dado o grafo a seguir, aplique o algoritmo de Kruskal, iniciando em v1, e encontre a
árvore geradora mínima.
v5 v3
v2
v1
v4
v6
1
10
4
2
35
3 4
5. Dado o grafo a seguir, aplique o algoritmo de Dijkstra e encontre todos os rótulos
e todas as distâncias, partindo do vértice v1.
v5 v3
v2
v1
v4
v6
1
10
4
2
35
3 4
Caminho mínimo e árvores geradoras 73
REFERÊNCIAS
BARROSO, M. M. de A. Aplicação de grafos em um problema de rede. Abakós, v. 2, n. 2, p. 48-78, 30
maio 2014. Disponível em: http://periodicos.pucminas.br/index.php/abakos/article/view/P.2316-
9451.2014v2n2p48. Acesso em: 29 maio 2020.
FEOFILOFF, P. Algoritmos para Grafos via Sedgewick, 2020. Página inicial. Disponível em: https://www.ime.
usp.br/~pf/algoritmos_para_grafos/. Acesso em: 29 maio 2020.
FLOYD, R. W. Algorithm 97: Shortest path. Communications of the ACM, v. 5, n. 6, p. 345, jun. 1962. Disponível
em: https://dl.acm.org/doi/10.1145/367766.368168. Acesso em: 29 maio 2020.
FREDMAN, M. L.; TARJAN, R. E. Fibonacci heaps and their uses in improved network optimisation
algorithms. Journal of the ACM, v. 34, n. 3, p. 596-615, jul. 1987. Disponível em: https://dl.acm.org/
doi/10.1145/28869.28874. Acesso em: 29 maio 2020.
GOLDBARG, M. C.; GOLDBARG, E. Grafos: conceitos, algoritmos e aplicações. 1. ed. Rio de Janeiro: Elsevier,
2012.
JOHNSON, D. B. Priority queues with update and finding minimum spanning trees. Information Processing
Letters, v. 4, n. 3, p. 53-57, dez. 1975. Disponível em: https://www.sciencedirect.com/science/article/abs/
pii/0020019075900010. Acesso: 29 maio 2020.
KRUSKAL, J. B. On the shortest spanning subtree of a graph and the traveling salesman problem.
Proceedings of the American Mathematical Society, v. 7, n. 1, p. 48-50, fev. 1956. Disponível em: https://www.
jstor.org/stable/2033241?seq=1. Acesso em: 29 maio 2020.
PRIM, R. C. Shortest connection networks and some generalizations. The Bell System Technical Journal,
v. 36, n. 6, p. 1389-1401, nov. 1957. Disponível em: https://ieeexplore.ieee.org/document/6773228. Acesso
em: 29 maio 2020.
SZWARCFITER, J. L. Teoria Computacional de Grafos. Rio de Janeiro: Elsevier, 2018.
74 Teoria dos Grafos
4
Grafos eulerianos e hamiltonianos
Este capítulo trata de grafos que têm certas características específicas:
os eulerianos e os hamiltonianos. São apresentados teoremas que carac-
terizam esses grafos, algumas aplicações e alguns algoritmos.
Para tanto, o estudo está organizado do seguinte modo: na Seção 4.1
são abordados os conceitos que definem quando um grafo é euleriano, os
teoremas que apresentam condições necessárias e suficientes, e os algo-
ritmos para a construção de um caminho euleriano. Já na Seção 4.2 estão
descritas as condições para que um grafo seja hamiltoniano, bem como os
teoremas que colocam as condições suficientes (mas não necessárias) e a
discussão de algoritmos para encontrar um caminho hamiltoniano.
4.1 Grafos eulerianos
Vídeo Os grafos eulerianos possuem esse nome graças a Leonhard Euler (1707–1783),
que, em 1736, resolveu o famoso problema das sete pontes de Königsberg, dando
origem à teoria dos grafos (SZWACFITER, 2018). O enigma se passa na cidade de
Kaliningrado, que, à época, era conhecida como Königsberg. A cidade é cortada
pelo Rio Prególia e possuía sete pontes (Figura 1), das quais duas foram destruídas
por bombardeios na Segunda Guerra Mundial.
Figura 1
As pontes de Königsberg.
As marcações em ver-
melho indicam as pontes
destruídas na Segunda
Guerra Mundial.
Se
rg
ey
M
er
ku
lo
v/
Sh
ut
te
rs
to
ck
Figura 2
Grafo do problema das 7
pontes de Königsberg
v1
v2
v3
v4
Fonte: Elaborada pelo autor.
Grafos eulerianos e hamiltonianos 75
4.1 Grafos eulerianos
Vídeo Os grafos eulerianos possuem esse nome graças a Leonhard Euler (1707–1783),
que, em 1736, resolveu o famoso problema das sete pontes de Königsberg, dando
origem à teoria dos grafos (SZWACFITER, 2018). O enigma se passa na cidade de
Kaliningrado, que, à época, era conhecida como Königsberg. A cidade é cortada
pelo Rio Prególia e possuía sete pontes (Figura 1), das quais duas foram destruídas
por bombardeios na Segunda Guerra Mundial.
Figura 1
As pontes de Königsberg.
As marcações em ver-
melho indicam as pontes
destruídas na Segunda
Guerra Mundial.
Se
rg
ey
M
er
ku
lo
v/
Sh
ut
te
rs
to
ck
Figura 2
Grafo do problema das 7
pontes de Königsberg
v1
v2
v3
v4
Fonte: Elaborada pelo autor.
Na época, havia uma discussão se era possível atravessar todas as pontes, ini-
ciando e retornando na mesma margem, sem repetir qualquer uma delas. Em 1736,
Euler provou que não era possível e, para isso, mapeou o problema com pontos e
linhas ligando-os, conforme a Figura 2. Por esse diagrama,
indicou as condições necessárias e suficientes para que fos-
se possível atravessar todas as pontes somente uma vez,
iniciando e terminando na mesma margem, e destacou que
as pontes de Königsberg não possuíam tais condições. As-
sim, surgiu a teoria dos grafos.
Como mencionado, ao longo desta seção serão apre-
sentadas as condições necessárias e suficientes para que
um grafo seja euleriano, bem como a discussão dos teo-
remas e algoritmos envolvidos para a construção de ciclos
eulerianos.
Dado um grafo não dirigido e conexo G = (V, A), um ca-
minho euleriano é um caminho que passa por todas as
arestas do grafo somente uma vez. Ou seja, é uma sequên-
cia de vértices, v1, v2, ..., vk, tal que vi ∈ V e (vi, vi+1) ∈ A, para
todo i, 1 ≤ i ≤ k, de modo que todas as arestas (vi, vi+1) do
grafo estão presentes nesse caminho somente uma vez.
Considere o grafo G = (V, A) da Figura 3 e o mesmo grafo
G com arestas rotuladas da Figura 4.
Figura 3
Grafo com caminho euleriano
v1
v2
v3
v4
v5
v6
v7
Fonte: Elaborada pelo autor.
76 Teoria dos Grafos
Figura 4
Grafo com arestas rotuladas e caminho euleriano
v1
v2
v3
v4
v5
v6
v7
a1
a2
a3
a4
a5
a6
a7
a8
Fonte: Elaborada pelo autor.
Na Figura 4, o grafo não dirigido G = (V, A) pode ser descrito por meio de seus
componentes:
• Vértices: V = {v1, v2, v3, v4, v5, v6, v7}
• Arestas: A = {(v1, v2), (v2, v3), (v3, v4), (v4, v5), (v4, v2), (v4, v6), (v6, v7), (v7, v2)}
• Arestas nomeadas:
a1 = (v1, v2)
a2 = (v7, v2)
a3 = (v4, v2)
a4 = (v4, v6)
a5 = (v6, v7)
a6 = (v4, v5)
a7 = (v3, v4)
a8 = (v2, v3)
Dadoo caminho {v1, v2, v3, v4, v2, v7, v6, v4, v5}, é possível passar por todas as
arestas somente uma vez na seguinte ordem: a1, a8, a7, a3, a2, a5, a4, a6. Portanto,
diz-se que o grafo G possui um caminho euleriano. Se este for um ciclo, isto é,
começar e terminar no mesmo vértice, é chamado de ciclo euleriano.
Considere o grafo G = (V, A) apresentado na Figura 5, contendo arestas rotuladas.
Grafos eulerianos e hamiltonianos 77
Figura 5
Grafo com arestas rotuladas e ciclo euleriano
v1 v2
v4v5
v3v6v7
a1
a2
a3
a4
a5
a10
a9
a6
a7
a8
Fonte: Elaborada pelo autor.
O grafo G (Figura 5) pode, também, ser descrito por meio de seus elementos:
• Vértices: V = {v1, v2, v3, v4, v5, v6, v7}
• Arestas: A = {(v1, v2), (v2, v3), (v3, v4), (v4, v5), (v4, v2), (v4, v6), (v6, v7), (v7, v2), (v1, v7),
(v7, v5)}
• Arestas nomeadas:
• a1 = (v1, v2)
• a2 = (v7, v2)
• a3 = (v4, v2)
• a4 = (v4, v6)
• a5 = (v6, v7)
• a6 = (v4, v5)
• a7 = (v3, v4)
• a8 = (v2, v3)
• a9 = (v1, v7)
• a10 = (v7, v5)
Dado o caminho {v7, v5, v4, v6, v7, v2, v4, v3, v8, v1, v7}, percebe-se que é possível
passar por todas as arestas do grafo, somente uma vez, a saber: a10, a6, a4, a5, a2, a3,
a7, a8, a1, a9. Portanto, trata-se de um caminho euleriano. Também vê-se que esse
caminho é um ciclo e que, desse modo, o grafo contém um ciclo euleriano.
Denomina-se grafo euleriano um grafo que possui um ciclo euleriano. Assim,
pode-se dizer que o grafo da Figura 5 é euleriano.
Se um grafo possui um caminho euleriano, mas não um ciclo euleriano, então,
é dito semieuleriano. Para que um grafo semieuleriano se torne euleriano, deve-se
inserir uma aresta entre o vértice de origem e o de término do caminho euleriano
78 Teoria dos Grafos
(NICOLETTI; HRUSCHKA JUNIOR, 2018). O grafo da Figura 3, por exemplo, é um gra-
fo semieuleriano. Adicionando-se a aresta (v1, v5), consegue-se um grafo euleriano,
pois resulta o seguinte ciclo: {v1, v2, v3, v4, v2, v7, v6, v4, v5, v1}, que é um ciclo euleriano.
A Figura 6, por sua vez, apresenta o mesmo grafo com a aresta inserida (represen-
tada pela linha tracejada para facilitar a visualização).
Figura 6
Grafo semieuleriano com aresta inserida
v1
v2
v4
v5
v3
v6
v7
Fonte: Elaborada pelo autor.
Convém ressaltar que um grafo desconexo não pode ser euleriano, pois não há
a possibilidade de se conseguir um ciclo euleriano, isto é, passando por todas as
arestas, visto que parte do grafo está desconectada.
Observe a seguir dois teoremas importantes que caracterizam os grafos
eulerianos.
Teorema 1
Seja o grafo G = (V, A), tal que o grau de todos os vértices é, pelo menos, dois,
então, G contém um ciclo.
Prova: se o grafo G não for simples, ou seja, possuir laços (arestas incidindo no
mesmo vértice) ou arestas paralelas (arestas distintas incidindo sobre os mesmos
vértices), claramente G tem um ciclo, pois um laço é um ciclo de comprimento 1, e
duas arestas paralelas formam um ciclo de tamanho 2.
Se o grafo G for simples, assume-se um vértice qualquer de G, v0, tomado como
ponto de partida. Assim, como grau(v0) ≥ 2, consegue-se escolher uma aresta, a1,
que incide em outro vértice diferente de v0 (caso fosse obrigatório voltar a v0, o gra-
fo não seria simples). Como grau(v1) deve ser maior ou igual a 2, seleciona-se outra
aresta, a2, que incide em outro vértice diferente de v1, por exemplo, v2. O processo
Grafos eulerianos e hamiltonianos 79
continua até que seja escolhida uma aresta ei, que incida nos vértices vi-1 e vi, de
modo que vi-1 ≠ vi. Como G tem um número finito de vértices, eventualmente será
necessário escolher uma aresta que incida sobre um vértice, chamado de vk, o qual
já foi escolhido. Assim, se o vértice vk foi escolhido duas vezes, o caminho entre sua
primeira escolha até a sua segunda escolha é um ciclo, pois os vértices pertencen-
tes são distintos: o caminho inicia em vk e termina em vk.
Já o Teorema 2 caracteriza os grafos eulerianos pelo grau de seus vértices. Esse
teorema apresenta a condição necessária e suficiente para que um grafo seja eu-
leriano. A prova da ida foi dada por Euler (1736) e a da volta por Hierholzer (1873)
(BOAVENTURA NETTO, 2003).
Teorema 2
Seja o grafo conexo G = (V, A). G é um grafo euleriano se, e somente se, o grau
de todo vértice de G for par.
Prova de ida →: se o grafo G é euleriano, o grau de todo vértice de G é par.
Considere que o grafo G é euleriano, portanto, possui um ciclo que passa por
todas as arestas de G somente uma vez. Caminhando pelo ciclo euleriano, ao pas-
sar por um vértice qualquer, deve-se ter duas arestas incidentes, uma para chegar
ao vértice e outra para sair do vértice. Sendo assim, o grau de todo vértice do ciclo
é par e o grau de todo vértice de G é par.
Prova de volta ←: se o grau de todo vértice de G é par, então, G é euleriano.
Essa demonstração será feita pela indução no número de arestas a = |A(G)|.
Considere que o grau de todo vértice de G é par.
Base da indução: o teorema é verdade para o grafo com número de arestas
igual a zero (a = 0), pois G é conexo, tem somente um vértice.
Passo indutivo: assuma que a > 1 (o grafo possui mais de uma aresta) e que
o teorema é válido para todo grafo com número de arestas menor que a. Isto
é, se o grafo possui vértices com grau par e menos do que a arestas, então, é
euleriano.
Hipótese de indução: o teorema é válido para todo grafo com número de ares-
tas menor que a. Se um grafo possui menos que a arestas e o grau de todos os seus
vértices é par, é euleriano.
Como G é conexo e o grau de seus vértices é par, estes devem possuir grau
maior que 2. Como a quantidade de arestas de G é a > 1, o número de vértices
de G, V(G) é maior ou igual a 2. Assim, pelo Teorema 1, o grafo possui um ciclo
C = {v1, v2, ..., vk, v1}.
Considere G’ o grafo resultante da retirada das arestas participantes do ciclo C,
ou seja, G’ = (V, A \ A(C)). Como cada vértice em C participa do ciclo com um vértice
de entrada e outro de saída, a retirada das arestas pertencentes a C, para gerar
80 Teoria dos Grafos
o grafo G’, remove graus dos vértices aos pares, mantendo a propriedade de que
todos os vértices têm grau par.
Assim, as componentes conexas de G’ contêm somente vértices com grau par.
Sejam G’1, G’2, ..., G’l as componentes conexas não triviais (que possuem mais de um
vértice e mais de uma aresta) de G’, claramente |A(G’i)| < a, tal que i = 1, 2, ..., l. Isto
é, a quantidade de arestas nessas componentes conexas é menor que a quantida-
de de arestas do grafo G.
Assim, pela hipótese de indução, cada G’i, tal que i = 1, 2, ..., l, possui um ciclo
euleriano, denotado aqui como Ti.
Como G é conexo, pelo menos um vértice de cada componente conexa de G’
está presente em C, isto é, V(C) ∩ V(G’i) ≠ ∅. Tome v’i como sendo o vértice mais à es-
querda da sequência de vértices de C, tal que vi ∈ V(C) ∩ V(G’i). Sendo assim, v’i está
presente em C e na componente conexa G’i. Dado o ciclo C, consegue-se separá-lo
nos seguintes componentes:
• C1 = {v1, ..., v’l-1}
• Ci = {v’i+1, ..., v’r-1}
• Cl+1 = {v’l+1, ..., v1}
Essa separação indica exatamente os vértices compartilhados entre C e as com-
ponentes conexas, apontando, dentro de C, a sua localização. Para 2 ≤ i ≤ l, tem-se
o ciclo C = {C1, v’1, C2, v’2, C3..., Cl, v’l, Cl+1}. Assim, no ciclo C, em cada aparição de um
vértice compartilhado com uma componente conexa, basta adicionar o ciclo eule-
riano desta componente, a saber, {C1, T1, C2, T2, C3, ..., Cl, Tl, Cl+1}, resultando em um
ciclo euleriano.
Indução é uma técnica de prova muito usada em ciência da computação e matemática discreta, útil
quando se quer demonstrar afirmações para um conjunto infinito de proposições.
Existem dois tipos. O primeiro princípio de indução se baseia na prova de duas proposições,
assumindo uma propriedade P e provando que P(n) é verdade para todo n inteiro positivo. Deve-se
provar:
1. P(1) é verdade
2. ∀k P(k) → P(k+1)
A proposição 1 é chamada de base da indução oupasso básico. Ela garante o ponto de partida,
provando o caso inicial. A proposição 2 é denominada de passo indutivo. Assume-se que P(k) seja
verdadeiro, o que é conhecido como hipótese de indução; então, prova-se que, dadas essas condi-
ções, P(k+1) é verdadeiro.
O segundo princípio de indução também baseia-se na prova de duas proposições, com algumas
alterações, a saber:
1. P(1) é verdade
2. ∀k P(r) é verdade para todo r, 1 ≤ r ≤ k → P(k+1)
A diferença recai sobre a proposição 2, que, no primeiro princípio, para provar P(k+1), assume-se
somente P(k) como verdade; já no segundo princípio, para provar P(k+1), admite-se que todos os
P(r), entre 1 e k, são verdadeiros.
Saiba mais
Para encontrar um ciclo euleriano em um grafo, são mostrados aqui dois algo-
ritmos: o de Hierholzer e o de Fleury. Ambos assumem que o grafo de entrada é
euleriano e retornam o ciclo partindo de algum vértice.
Grafos eulerianos e hamiltonianos 81
O algoritmo de Hierholzer, de 1873, foi um dos primeiros a ser proposto, po-
dendo ser visto no Algoritmo 1 a seguir. Seu princípio básico de funcionamento é
iniciar o processamento partindo-se de vértices. Assim que um vértice é escolhido,
encontra-se um pequeno ciclo, com arestas aleatórias, o qual será agregado ao
ciclo euleriano final. O ciclo formado por todos os pequenos ciclos adicionados é o
resultado a ser retornado pelo algoritmo.
Fonte: Adaptado de Goldbarg e Goldbarg, 2012.
Algoritmo 1
Algoritmo de Hierholzer
Algoritmo: Constrói um Ciclo Euleriano
Dados: Grafo G = (V, A) euleriano
1 Escolha um vértice v qualquer de G
2 Faça G’= (V’, A’), tal que V’ = V e A’ = A
3 Faça C = {v}
4 ENQUANTO A’ FAÇA
5 Escolha v’ C, tal que grau(v’) > 0 em G’
6 C’ <- Um ciclo em G’ iniciando e terminando em v’, percorrendo
arestas aleatórias
7 G’ <- ( V’, A’ \ A(C’) )
8 Substituir em C o vértice v’ pelo ciclo C’
9 FIM ENQUANTO
10 Retorne C
Dado um grafo euleriano G = (V, A), o processo inicia escolhendo-se um vértice
aleatório de G e adicionando-o a C, que conterá um ciclo euleriano ao final. Tam-
bém é construído um grafo auxiliar G’, o qual será usado para controlar as arestas
já inseridas em C. G’ e é chamado de grafo reduzido induzido, pois é construído após
a retirada de arestas já escolhidas de G.
Na linha 5, o condicional indica que o laço será executado enquanto houver
arestas em G’ a serem consideradas. Na linha 6 escolhe-se um vértice qualquer, v’
de C, que ainda possua arestas incidentes em G’, pois com base neste será construí-
do um pequeno ciclo em G’.
Na linha 6, partindo-se de v’, escolhido anteriormente, retorna-se um ciclo C’
no grafo G’, começando e terminando em v’ e percorrendo quaisquer arestas de
maneira aleatória, mas que formem um ciclo.
Dado o ciclo C’ previamente encontrado, retira-se todas as arestas perten-
centes a C’ do grafo auxiliar G’. Na linha 8 substitui-se, no conjunto C, o vértice
v’ pelo ciclo C’.
O algoritmo de Fleury retorna um ciclo euleriano em um grafo euleriano, ou
um caminho euleriano em grafos que possuem, no máximo, dois vértices com
grau ímpar.
Seja o grafo G dado como entrada no algoritmo de Fleury, para controlar as
arestas já consideradas, usa-se a marcação de aresta, que basicamente é a reti-
rada das arestas de G. Estas formam um grafo reduzido induzido.
82 Teoria dos Grafos
O Algoritmo 2 usa a regra da ponte. Considerando o grafo reduzido induzido,
formado pelas arestas que ainda não foram marcadas, escolhe-se uma aresta (v, w)
que não seja ponte nesse grafo. Se ela não existir, isto é, se só tiver arestas que
são pontes, então, deve ser escolhida, pois não há alternativa. Em suma, deve-se
escolher as arestas de modo que a parte do grafo que resta percorrer não fique
desconexa.
Fonte: Adaptado de Goldbarg e Goldbarg, 2012.
Algoritmo: Constrói um Ciclo Euleriano
Dados: Grafo G = (V, A) euleriano
1 Escolha um vértice v qualquer de V
2 Faça C = {v}
3 REPITA
4 Escolha uma aresta (v, w) não marcada usando a regra da ponte
5 Atravesse (v, w)
6 C <- C {w}
7 Marcar a aresta (v, w)
8 v <- w
9 ATÉ QUE Todas as arestas estejam marcadas
10 C <- C {v}
11 Retorne C
Algoritmo 2
Algoritmo de Fleury
O algoritmo começa com a escolha aleatória de um vértice do grafo, o qual é
incluído em C (linha 2), que conterá o ciclo euleriano.
Na linha 4 escolhe-se uma aresta não marcada, usando a regra da ponte, isto
é, seleciona-se uma aresta que não seja ponte no grafo formado pelas arestas não
marcadas. Na linha 6, o vértice no qual a aresta escolhida incide é adicionado a C, e
a aresta é marcada na linha 7 para que não seja considerada. A linha 8 garante que
o processo continue a partir do vértice adjacente à aresta escolhida. O algoritmo se
repete até que todas as arestas tenham sido marcadas.
Os conceitos se aplicam também a digrafos. Se um caminho orientado, em um di-
grafo, contém todas as arestas do grafo somente uma vez, é chamado de caminho
euleriano. Se esse caminho for um ciclo orientado, é conhecido como ciclo euleriano.
Um digrafo que contém um ciclo euleriano é chamado de digrafo euleriano.
Para verificar se um digrafo é euleriano, há uma condição necessária e suficien-
te. Um digrafo D = {V, A} é euleriano se, e somente se, for unilateralmente conexo
e se, para todo vértice vi ∈ V, o grau de entrada de vi (denotado como grau
+(vi) ou
o número de vértices que chegam em vi) for igual ao grau de saída de vi (denotado
como grau- (vi) ou o número de vértices que saem de vi).
Por exemplo, o digrafo da Figura 7 é euleriano, pois é unilateralmente conexo –
para cada par de vértices há um caminho orientado entre eles em algum sentido –,
Grafos eulerianos e hamiltonianos 83
e, para cada vértice, o número de vértices que entram (grau de entrada) é igual ao
número de vértices que saem (grau de saída).
Figura 7
Digrafo Euleriano
v1
v2
v4
v5
v3
v6
Fonte: Elaborada pelo autor.
No digrafo da Figura 7, um ciclo euleriano é: (v6, v4), (v4, v2), (v2,
v3), (v3, v4), (v4, v5), (v5, v3), (v3, v1), (v1, v5), (v5, v2), (v2, v6).
Um teorema similar existe para verificar se o digrafo possui
um caminho euleriano (não um ciclo). Um digrafo D = (V, A) pos-
sui um caminho euleriano se, e somente se, for unilateralmente
conexo e se contar com as seguintes condições:
• Dois de seus vértices e vi e vj forem:
o grau de entrada de vi é igual ao grau de saída
mais um, isto é, grau+(vi) = 1 + grau
–(vi);
o grau de saída de vj é igual ao grau de entrada
mais um, isto é, grau–(vj) = 1 + grau
+(vj).
• Para todos os demais vértices, seus graus de
entrada e saída devem ser iguais, isto é, ∀v ∈ V,
grau–(v) = grau+(v).
Com essas condições, o caminho euleriano inicia em vj (o vér-
tice com mais arestas de saída do que de entrada) e termina em
vi (o vértice com mais arestas de entrada do que de saída).
Como exemplo, pode-se analisar o digrafo da Figura 8, que é
unilateralmente conexo e os graus dos seus vértices:
• Vértice v1: grau
+(v1) = 1 e grau
–(v1) = 2
• Vértice v2: grau
+(v2) = 3 e grau
–(v2) = 2
• Vértice v3: grau
+(v3) = 2 e grau
–(v3) = 2
• Vértice v4: grau
+(v4) = 2 e grau
–(v4) = 2
• Vértice v5: grau
+(v5) = 2 e grau
–(v5) = 2
• Vértice v6: grau
+(v6) = 1 e grau
–(v6) = 1
Claramente, percebe-se que o grau de entrada de v2 é o grau
de saída mais um e que o grau de saída de v1 é o grau de entra-
da mais um. Todos os demais vértices possuem grau de entrada
igual ao grau de saída. Assim, esse digrafo (Figura 8) conta com
um caminho euleriano que inicia exatamente em v1 e que termi-
na em v2. Um caminho euleriano, nesse digrafo, é: (v1, v5), (v5, v3),
(v3, v4), (v4, v5), (v5, v2), (v2, v6), (v6, v4), (v4, v2), (v2, v3), (v3, v1), (v1, v2).
Um problema clássico de grafos eulerianos é o Problema do
Carteiro Chinês, do inglês, Chinese Postman Problem (CPP). Elabo-
rado pelo matemático chinês Mei-Ku Kwan, em 1962, o dilema é
enunciado assumindo que um carteiro precisa entregar suas car-
v1
v2
v4
v5
v3
v6Figura 8
Digrafo com caminho euleriano
Fonte: Elaborada pelo autor.
84 Teoria dos Grafos
tas e que, para isso, deve passar por todas as ruas do bairro fazendo um caminho
mínimo. Nessa tarefa, o entregador não pode repetir vias e deve começar e terminar
no mesmo ponto de distribuição (GOMES et al., 2009).
Quando essa questão é mapeada para grafos, cada rua é representada por
uma aresta e os vértices são as esquinas do bairro. Se o grafo é euleriano, isto
é, possui um ciclo que passa por todas as arestas ou ruas sem repetir nenhuma
delas, a solução é simplesmente encontrar esse ciclo. Para detectar rapidamente
se o grafo é euleriano, pode-se usar o Teorema 2, o qual demonstra que o grau
de todos os vértices de um grafo euleriano é par. Podem ser aplicados, ainda, os
algoritmos de Hierholzer ou Fleury. Aqui estão sendo desconsiderados os pesos
das arestas, não gerando um grafo ponderado, para facilitar a compreensão.
Se o grafo não for euleriano, existirão arestas com grau ímpar. Convém ressaltar
que o número de vértices de grau ímpar é par, conforme o Lema do Aperto de Mão.
Caso seja necessário repetir ruas, pode-se adicionar as que não fazem parte da
área de cobertura para que o caminho mais curto seja encontrado.
Como pode ser observado, os grafos eulerianos possuem uma caracterização
matemática clara, teoremas que apresentam as condições necessárias e suficien-
tes para determinar se um grafo é euleriano, bem como algoritmos definidos para
encontrar um ciclo euleriano.
4.2 Grafos hamiltonianos
Vídeo
O Lema do Aperto de Mão
(Handshaking Lemma) indica que
a soma dos graus dos vértices, em
um grafo não orientado, é duas
vezes a quantidade de arestas.
Como consequência, o número de
vértices com grau ímpar é sempre
par. Esse resultado foi provado
por Euler no ano de 1736 (SILVA,
2009).
Saiba mais
A origem dos grafos hamiltonianos se deu com o matemático britânico Thomas
Pennington Kirkman (1806–1895), que em 1856 debruçou-se sobre problemas
de enumeração combinatória em poliedros para buscar, mais especificamen-
te, condições para que ciclos sem repetição de arestas ou vértices fossem en-
contrados em poliedros. Antes mesmo de William Rowan Hamilton (1805-1865),
Kirkman apresentou um exemplo de poliedro contendo um ciclo iniciado em um
vértice, passando por todos os vértices sem repetição e retornando à origem
(GOLDBARG; GOLDBARG, 2012).
Em 1857, Hamilton propôs um jogo chamado Icosiano (ou viagem à volta do
mundo) cujo objetivo era encontrar caminhos e ciclos em um dodecaedro (poliedro
de 12 faces), conforme Figura 9.
Grafos eulerianos e hamiltonianos 85
Figura 9
Grafo de representação do jogo icosiano
Fonte: Elaborada pelo autor.
Uma solução para o jogo pode ser vista na Figura 10.
Figura 10
Solução para o jogo icosiano
Fonte: Elaborada pelo autor.
86 Teoria dos Grafos
O ciclo hamiltoniano de representação da solução do jogo pode ser visto na
Figura 11.
Figura 11
Ciclo hamiltoniano para a
solução do jogo icosiano
Fonte: Elaborada pelo autor.
Apesar de ter sido estudado em 1856, o problema de ciclos hamiltonianos foi
amplamente difundido em 1934 por Hassler Whitney (1907–1989) e
Karl Menger (1902–1985) com a publicação de um trabalho na Universidade de
Princeton (FERNANDO et al., 2019).
Dado um grafo G = (V, A), em que o caminho contenha todos os
vértices de G, sendo que cada um aparece somente uma vez, tem-
-se um caminho hamiltoniano. No grafo da Figura 12, o caminho
{(v1, v2), (v2, v3), (v3, v4)} contém todos os vértices do grafo somente
uma vez, portanto, é um caminho hamiltoniano.
Considere um ciclo sobre G contendo os seguintes vértices:
v1, v2, v3, ..., vk, v1. Se o caminho v1, v2, v3, ..., vk for hamiltoniano,
tem-se um ciclo hamiltoniano. Um grafo que contém um ciclo
hamiltoniano é chamado de grafo hamiltoniano.
Ao se analisar o grafo da Figura 13 a seguir, percebe-se que
o caminho (v2, v3), (v3, v5), (v5, v1), (v1, v4) passa por todos os vérti-
ces exatamente uma vez e que, portanto, trata-se de um cami-
nho hamiltoniano. No mesmo grafo, o caminho (v2, v3), (v3, v5),
(v5, v1), (v1, v4), (v4, v2) é um ciclo (começa e termina em v2), sendo
caracterizado, desse modo, como um ciclo hamiltoniano. Em ra-
zão disso, o grafo é hamiltoniano.
Figura 12
Grafo com caminho hamiltoniano
v1
v2
v4
v3
Fonte: Elaborada pelo autor.
Grafos eulerianos e hamiltonianos 87
Se um grafo contém um caminho hamiltoniano, mas não
um ciclo hamiltoniano, é chamado de grafo semi-hamiltoniano.
Percebe-se que para um grafo semi-hamiltoniano se tornar
hamiltoniano, basta adicionar uma aresta entre o vértice iní-
cio e o vértice final do caminho.
Considere novamente o grafo da Figura 12, o qual contém
o caminho hamiltoniano {(v1, v2), (v2, v3), (v3, v4)} e, portanto, é
um grafo semi-hamiltoniano. Para que ele se torne hamilto-
niano, basta adicionar uma aresta entre o início e o final do
caminho, no caso (v4, v1), como pode ser visto na Figura 14 cuja
aresta inserida está tracejada para melhor visualização.
Como resultado dessa definição, consegue-se perceber
que um grafo completo Kn, sendo n ≥ 3, é sempre hamilto-
niano. Isso ocorre porque, em um grafo completo, todos os n
vértices possuem arestas incidentes em todos os demais n-1
vértices. Assim, para todo vértice vi, 1 ≤ i ≤ n, existe o seguinte
caminho C = {(v1, v2), (v2, v3), (v3, v4) … (vn-1, vn )}, o qual passa
por todos os vértices {v1, …, vn} somente uma vez. Como todos
vértices são adjacentes a todos os demais, o vértice vn tam-
bém é adjacente a v1, assim, o caminho C, adicionando a ares-
ta (vn, v1), é um ciclo que passa por todos os vértices, portanto,
um ciclo hamiltoniano, e o grafo é hamiltoniano.
Para grafos hamiltonianos, não se tem uma condição ne-
cessária e suficiente conhecida (isto é, um teorema do tipo
“se, e somente se”), como no caso dos grafos eulerianos. Basi-
camente, os teoremas apresentam condições suficientes para
que o grafo seja considerado hamiltoniano, como pode ser
observado a seguir, no Teorema de Ore (1960).
Figura 13
Grafo hamiltoniano
v1
v2
v4 v3
v5
Fonte: Elaborada pelo autor.
Figura 14
Grafo semi-hamiltoniano com aresta inserida
v1
v2
v3
v4
Fonte: Elaborada pelo autor.
Teorema 3
Teorema de Ore (1960)
O Teorema de Ore foi provado pelo matemático norueguês
Øystein Ore (1899–1968) e estabelece que um grafo contendo uma quantidade su-
ficiente de arestas é hamiltoniano.
Considere o grafo simples G = (V, A), tal que |V| = n e n ≥ 3. Se para todo par de
vértices não adjacentes de G, vi e vj for observado que grau(vi) + grau(vj) ≥ n, então,
G é hamiltoniano.
A prova se dá por contradição, ou seja, assume-se que o grafo possui as con-
dições apresentadas, mas não é hamiltoniano. Encontrando-se uma contradição,
prova-se que o grafo, necessariamente, é hamiltoniano.
88 Teoria dos Grafos
Seja o grafo G com as condições apresentadas, mas que não seja hamiltoniano,
supõem-se que seja semi-hamiltoniano, isto é, possui um caminho hamiltoniano, e a
adição de uma aresta entre o vértice inicial e final desse caminho o torna hamiltoniano.
Se o grafo não for semi-hamiltoniano, pode-se adicionar arestas até que seja.
Convém ressaltar que a adição de arestas extras não contradiz a hipótese, pois
são acrescentadas em vértices não adjacentes, os quais já atendem à condição de
que a soma de seus graus é maior que n.
Assim, para tornar um grafo em hamiltoniano, basta adicionar a aresta (v, w),
indicando que há um caminho passando por todos os vértices de G. Assumindo
v = v1 e w = vn, o caminho é: C = {v, v2, v3, ..., vn-1, w}, conforme pode-se ver a seguir.
v1 v2 vi vn-1 vnvi-1
... ...
A hipótese apresentada – grau(v1) + grau(vn) ≥ n – indica que existe um con-
junto de pelo menos n-2 arestas que incidem em {v1, vn}. Isto é, a aresta (v1, vn)
aumenta em 1 o grau de v1 e o grau de vn, indicando que, para que a soma de
seus graus seja maior que n, n-2 arestas precisam incidir em v1 ou vn. Ademais,
não é possível quetodas as n-2 arestas incidam somente em v1 ou vn, pois seria
necessário, no mínimo, um par de arestas paralelas, contradizendo a condição de
que G é simples. Isso é facilmente verificável, pois assume-se todas as n-2 arestas
incidentes somente em v1. Além da aresta que pertence ao caminho C (v1, v2), v2
seria incidente a v1, em uma nova aresta, para que a condição fosse satisfeita,
gerando arestas paralelas.
A figura a seguir mostra essa composição contraditória de arestas. As arestas
mais finas são as n-2 arestas. Percebe-se que a aresta fina (v1, v2) é paralela à aresta
(v1, v2), a qual pertence ao caminho C, contradizendo a condição do teorema. Des-
considerando essa aresta, tem-se n-3 arestas, o que também contradiz a condição
do teorema, pois, nesse caso, grau(v1) + grau(vn) não seria maior ou igual a n.
v1 v2 vi vn-1 vnvi-1
... ...
Grafos eulerianos e hamiltonianos 89
Assumindo as n-2 arestas incidentes em {v1, v2}, consegue-se apontar os vértices
vi e vi-1, tal que vi é adjacente a v1, aresta (vi, v1), e vi-1 é adjacente a vn, aresta (vi-1, vn),
conforme a figura a seguir.
v1 v2 vi vn-1 vnvi-1
... ...
Posto isso, consegue-se apontar o seguinte ciclo: {v1, v2, ..., vi-1, vn, vn-1, ..., vi+1, vi, v1}. Esse
ciclo é hamiltoniano, portanto, o grafo G é hamiltoniano, contradizendo a suposição.
Teorema 4
Teorema de Dirac (1952)
Outro teorema conhecido é o Teorema de Dirac, provado pelo matemático hún-
garo/britânico Gabriel Andrew Dirac (1925–1984). Ele também dá condições sufi-
cientes para que um grafo seja hamiltoniano com base no grau dos vértices.
Seja o grafo simples G = (V, A), tal que |V| = n e n ≥ 3, se o grau de todo vértice
de G é maior ou igual a n/2, isto é, grau(v) ≥ n
2
, ∀v ∈ V, então, G é hamiltoniano.
Prova: se o grau de todos os vértices é maior que n/2, então, para todo par de
vértices de G, adjacentes ou não, vale a regra:
grau(v) + grau(w) ≥ n
2
n
2
+
Sendo o mesmo que dizer:
grau(v) + grau(w) ≥ n
Assim, pelo Teorema de Ore (Teorema 3), G é hamiltoniano.
As definições de caminho, ciclo e grafo hamiltonianos se aplicam ainda a
digrafos (grafos orientados). Em um digrafo, um caminho orientado é cha-
mado de caminho hamiltoniano se contiver todos os vértices do digrafo, sem
repetição destes. Um ciclo orientado é dito ciclo hamiltoniano se for um ca-
minho hamiltoniano e se iniciar e terminar no mesmo vértice. Já um digrafo
é dito hamiltoniano se contiver um ciclo orientado hamiltoniano. Se contiver
um caminho orientado hamiltoniano, é chamado digrafo semi-hamiltoniano
(NICOLETTI; HRUSCHKA JUNIOR, 2018).
90 Teoria dos Grafos
Algoritmos para encontrar um ciclo hamiltoniano são complicados. Para um
grafo com n vértices, pode haver n! ciclos hamiltonianos. Ao se pensar em grafos
completos, que são claramente hamiltonianos, Kn para n > 2, tem-se exatamente n!
ciclos hamiltonianos, sendo, portanto, um limite superior da quantidade de ciclos
possíveis.
Um algoritmo de força bruta, para encontrar um ciclo hamiltoniano em um gra-
fo, é inviável, pois, dado um grafo com n vértices, tem-se até n! sequências de vér-
tices que podem ser caminhos hamiltonianos e que devem ser
enumeradas e testadas.
Isso ocorre em grafos completos, como o grafo completo K3, re-
presentado pela Figura 15. Observa-se que ele tem 6 ca-
minhos (3!), a saber:
• {(v1, v2), (v2, v3), (v3, v1)}
• {(v2, v3), (v3, v1), (v1, v2)}
• {(v3, v1), (v1, v2), (v2, v3)}
• {(v1, v3), (v3, v2), (v2, v1)}
• {(v2, v1), (v1, v3), (v3, v2)}
• {(v3, v2), (v2, v1), (v1, v3)}
Se for considerado o K4 (grafo completo com quatro
vértices), apresentado na Figura 16, tem-se 24 cami-
nhos (4!), e assim por diante.
Convém ressaltar que quando o problema de en-
contrar ciclos hamiltonianos se inicia em um vértice
específico, tem-se (n-1)! ciclos candidatos. Por exem-
plo, para enumerar todos os ciclos hamiltonianos em
K4, da Figura 16, iniciando em v1 , tem-se (4-1)!, isto é
3! ciclos.
v1 v3
v2
Figura 15
Grafo completo K3
Fonte: Elaborada pelo autor.
Figura 16
Grafo completo K4
v1
v2 v3
v4
Fonte: Elaborada pelo autor.
Essa quantidade de valores pode não parecer mui-
ta, mas considere um algoritmo ingênuo, que enume-
ra todas as possíveis combinações de ciclos em um grafo com n vértices, resultando
em (n-1)! ciclos candidatos, e que testa se cada candidato é um ciclo hamiltoniano.
Considere, também, que para essa tarefa está disponível um computador com a ca-
pacidade de efetuar 12 trilhões de operações de ponto flutuante por segundo (12*1012),
isto é, um computador com 12 teraflops 2 . Para varrer todos os possíveis ciclos de um
grafo com 25 vértices, n = 25, a máquina é capaz de avaliar
12*10
24
12
= 500 bilhões de
ciclos candidatos por segundo. Como ele precisa calcular 24! possíveis ciclos, demorará
24!
(500 bilhões)
≅ 39.348 anos, um tempo complemente inviável.
Para efeitos de comparação, essa
capacidade de processamento é
alcançada por alguns consoles de
videogame, lançados em 2020,
que possuem hardware dedicado
ao processamento de vídeo.
2
Grafos eulerianos e hamiltonianos 91
Um dos problemas mais famosos envolvendo grafos hamiltonianos é o Problema
do Caixeiro Viajante, do inglês Traveling Salesman Problem.
O dilema é enunciado como uma pessoa que precisa visitar várias cidades para
efetuar as suas vendas. Conectando as cidades, tem-se estradas ou rodovias, aos
pares, sendo que cada uma conta com uma distância (um peso). O objetivo é visitar
todos os distritos somente uma vez, fazendo o percurso mais curto e retornando à
cidade de origem.
Representar essa questão na teoria dos grafos é simples. Cada cidade é um vér-
tice e cada rodovia uma aresta ponderada com sua distância. Se houver estradas
entre todas as cidades, o grafo é completo. Assumindo que o custo de um caminho/
ciclo é a soma dos pesos de suas arestas, a solução do problema é encontrar um
ciclo hamiltoniano que tenha a menor despesa.
Por exemplo, considerando quatro cidades do estado de Santa Catarina:
Joaçaba, Treze Tílias, Videira e Campos Novos, a representação em forma de grafo
pode ser vista na Figura 17, indicando os vértices como cidades, as arestas como
estradas e as distâncias como o peso de cada aresta.
Fonte: Elaborada pelo autor.
Figura 17
Cidades de Santa Catarina
v2
v1
v3
v4
34 km
38 km
64 km
66 km
78 km
45 km
Treze Tílias
Videira
Joaçaba
Campos Novos
92 Teoria dos Grafos
Constatando que o número de vértices é igual a 4, tem-se 6 possíveis ciclos, partin-
do de Joaçaba e retornando a Joaçaba, passando por todos os vértices somente uma
vez, a saber:
• Joaçaba → Campos Novos → Videira → Treze Tílias → Joaçaba : 183 km
• Joaçaba → Campos Novos → Treze Tílias → Videira → Joaçaba : 221 km
• Joaçaba → Videira → Campos Novos → Treze Tílias → Joaçaba : 246 km
• Joaçaba → Videira → Treze Tílias → Campos Novos → Joaçaba : 221 km
• Joaçaba → Treze Tílias → Videira → Campos Novos → Joaçaba : 183 km
• Joaçaba → Treze Tílias → Campos Novos → Videira → Joaçaba : 246 km
Percebe-se que alguns ciclos são o inverso de outros. De todos eles, dois
possuem a menor distância, e qualquer um deles é uma solução ao problema
apresentado.
Para resolver o dilema, usa-se um método exato. A maneira mais comum é
enumerar todas as combinações de vértices que formam um ciclo hamiltonia-
no e escolher a de menor custo. Sua complexidade é fatorial, significando que,
para muitas cidades, o problema não termina em tempo hábil.
Outra saída é a aplicação de métodos heurísticos, que podem não resul-
tar exatamente o ciclo de menor custo, mas que chegam a uma boa solução,
terminando o processo em tempo hábil. Os métodos heurísticos demandam
técnicas aplicadas em inteligência artificial, como algoritmos genéticos, buscas
heurísticas, entre outros (SOUZA, 2015).
Há também o método da busca gulosa, um algoritmo não exato, em que,
dado um vértice de partida, é sempre escolhida a aresta de menor custo para
atravessar. Esse processo é repetido sucessivamenteaté que todos os vértices
tenham sido alcançados e que a única opção seja retornar ao vértice origem
(LOPES, 2020).
Pelo algoritmo guloso (Figura 17), partindo de Joaçaba, a primeira escolha
seria Treze Tílias, que possui a menor distância (38 km). De Treze Tílias, o
algoritmo escolheria Videira (34 km). De Videira, a única opção seria Campos
Novos, visto que não se pode voltar a Treze Tílias nem chegar a Joaçaba (final
do ciclo). De Campos Novos, voltar a Joaçaba, resultando o seguinte caminho:
• Joaçaba → Treze Tílias → Videira → Campos Novos → Joaçaba : 183 km
Coincidentemente é o caminho ideal.
Agora, em um segundo exemplo, considerando o grafo da Figura 18, o qual
contém cinco vértices, percebe-se que trata-se de um grafo completo (todos
os vértices são adjacentes a todos os demais) e que, portanto, possui (n-1)!
ciclos hamiltonianos iniciando em v1, no caso, 24. Enumerando todos os ciclos
Grafos eulerianos e hamiltonianos 93
hamiltonianos, é possível perceber que o menor custo é 676, com o seguinte
caminho:
• v1 → v4 → v2 → v3 → v5 → v1
Figura 18
Grafo com ciclos hamiltonianos
133
185
119
121
150
152
120
199
174
200
v2
v1
v3
v4
v5
Fonte: Adaptada de Lopes, 2020.
Aplicando o algoritmo guloso, partindo de v1, as escolhas feitas seriam de:
• v1 para v3: custo 119
• v3 para v5: custo 120
• v5 para v4: custo 199
• v4 para v2: custo 150
• v2 para v1: custo 185
Resultando um custo total de 773, o que não é o menor custo, conforme calcu-
lado anteriormente (676).
Mesmo não sendo o melhor custo, o encontrado pelo método guloso é bem
próximo do melhor custo. Isso deve ser levado em consideração, uma vez que o
tempo para se chegar ao caminho pode ser bem maior pelo método exato.
Uma variação desse algoritmo é o método guloso com repetição, podendo ser
implementado repetindo o algoritmo guloso, partindo de cada vértice, e, ao final,
escolhendo o ciclo de menor caminho. No caso da Figura 18, seriam calculado cinco
ciclos, cada um iniciando em um vértice diferente:
94 Teoria dos Grafos
• v1 → v3 → v5 → v4 → v2 → v1: custo 773
• v2 → v3 → v1 → v5 → v4 → v2: custo 722
• v3 → v1 → v5 → v4 → v2 → v3: custo 722
• v4 → v2 → v3 → v1 → v5 → v4: custo 722
• v5 → v3 → v1 → v4 → v2 → v5: custo 741
Assim, o ciclo escolhido seria:
• v2 → v3 → v1 → v5 → v4 → v2
Como é um ciclo, deslocando-o para que v1 seja o ponto de partida, tem-se:
• v1 → v5 → v4 → v2 → v3 → v1
Não é o ciclo ideal, mas está mais perto, sendo, portanto, uma solução satisfató-
ria que pode ser calculada em tempo hábil.
A formulação de problemas com base em grafos hamiltonianos é ampla, con-
siderando a dificuldade computacional em se encontrar ciclos hamiltonianos, es-
pecialmente em grafos ponderados. Muitas pesquisas são feitas na área, tendo
como objetivo a descoberta de novas técnicas para minimizar os efeitos da explo-
são combinatória.
CONSIDERAÇÕES FINAIS
Neste capítulo, estudou-se os grafos eulerianos e hamiltonianos. Foram mostrados
teoremas que impõem as condições necessárias e suficientes para que um grafo seja
euleriano, assim como os algoritmos de Hierholzer e Fleury, para encontrar um ciclo
euleriano em um grafo euleriano.
Para os grafos hamiltonianos, foi apresentado que não há teoremas que impõem
condições necessárias e suficientes, já que os teoremas de Dirac e Ore têm condições
suficientes, apenas.
Quando o problema de busca pelo ciclo hamiltoniano envolve pesos e tem como
objetivo um ciclo ótimo partindo de um determinado vértice, verificou-se que a explo-
são combinatória é da ordem de (n-1)!, sendo n o número de vértices do grafo. Perce-
be-se, portanto, que um método exato se torna inviável rapidamente, não terminando
de executá-lo em tempo hábil.
Os métodos heurísticos que envolvem técnicas de inteligência artificial são os mais
indicados. Eles não retornam a solução de menor custo, mas uma com um custo satis-
fatório e em tempo factível.
ATIVIDADES
1. Uma expedição para a exploração das luas de Saturno e Júpiter será lançada,
passando por Calisto, Ganímedes, Io, Mimas e Titã. Após visitar essas luas, a nave
deve retornar à Terra. O diagrama a seguir apresenta a duração da missão, em
anos, estimada para a viagem entre cada par de luas. Qual seria o melhor caminho
para tal expedição?
Grafos eulerianos e hamiltonianos 95
Para a resolução deste problema, utilize o algoritmo guloso.
0,8
5,1
4,7
5,7
Io Mimas
Titã
TerraGanímedes
Calisto
5,6
5,9
3,2
3,1
3,6
8,2
8,1
0,6
5,2
1,5
1,1
v2 v1
v3
v4 v5
v6
2. Resolva a Questão 1 pelo algoritmo guloso com repetição. Mostre todos os
caminhos analisados, o tempo de cada caminho, e escolha que der o menor
resultado, rearranjado para iniciar na Terra (se for o caso).
3. Dado o grafo a seguir, apresente um ciclo euleriano partindo de v1.
v1 v8
v2
v7v3
v4 v5 v6
4. Considerando o grafo simples G = (V, A), tal que |V| = 6 e ∀v ∈ V grau(v) = 3, prove
que G é hamiltoniano.
96 Teoria dos Grafos
5. Seja o grafo simples G = (V, A), tal que |V| = 7, os seus vértices possuem os seguintes
graus:
• grau(v1) = 3
• grau(v2) = 1
• grau(v3) = 4
• grau(v4) = 2
• grau(v5) = 2
• grau(v6) = 2
• grau(v7) = 2
Esse grafo é euleriano? Justifique a sua resposta.
REFERÊNCIAS
BOAVENTURA NETTO, P. O. Grafos: teoria, modelos, algoritmos. 3. ed. São Paulo: Blucher, 2003.
FERNANDO, P. H. L. et al. O problema do caixeiro viajante aplicado na distribuição de peças/componentes do
almoxarifado para a montagem de caminhões especiais em uma linha de produção na indústria automobilística.
Sinergia (IFSP Online), São Paulo, v. 20, n. 1, p. 63-74, jan./mar. 2019. Disponível em: https://www.researchgate.
net/publication/332665441_O_PROBLEMA_DO_CAIXEIRO_VIAJANTE_APLICADO_NA_DISTRIBUICAO_DE_
PECASCOMPONENTES_DO_ALMOXARIFADO_PARA_A_MONTAGEM_DE_CAMINHOES_ESPECIAIS_EM_UMA_
LINHA_DE_PRODUCAO_NA_INDUSTRIA_AUTOMOBILISTICA/link/5cc259694585156cd7b18368/download.
Acesso em: 6 jul. 2020.
GOLDBARG, M. C.; GOLDBARG, E. Grafos: conceitos, algoritmos e aplicações. Rio de Janeiro: Elsevier, 2012.
GOMES, M. J. N. et al. O problema do carteiro chinês, algoritmos exatos e um ambiente MVI para análise de
suas instâncias: sistema XNÊS. Pesquisa Operacional, Rio de Janeiro, v. 29, n. 2, p. 323-363, jan./maio/ago. 2009.
Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0101-74382009000200005&lng=en&
nrm=iso. Acesso em: 6 jul. 2020.
LOPES, S. A. Métodos Finitos em Matemática. Arquivo Escolar, 28 mar. 2011. Disponível em: http://
arquivoescolar.org/handle/arquivo-e/45. Acesso em: 6 jul. 2020.
NICOLETTI, M. C. do.; HRUSCHKA JUNIOR, E. R. Fundamentos da teoria dos grafos para computação. São Paulo:
LTC, 2018.
SOUZA, M. M. Heurísticas para o problema do caixeiro viajante com seleção de hotéis. Viçosa, 2015. Dissertação
(Mestrado em Ciência da Computação) – Universidade Federal de Viçosa. Disponível em: https://www.
locus.ufv.br/bitstream/handle/123456789/6650/texto%20completo.pdf?sequence=1&isAllowed=y.
Acesso em: 6 jul. 2020.
SZWARCFITER, J. L. Teoria Computacional de Grafos. Rio de Janeiro: Elsevier, 2018.
Problemas em Grafos 97
5
Problemas em Grafos
O estudo de teoria de grafos é muito amplo e vários problemas surgem
da análise destas estruturas matemáticas. Nesse sentido, serão abordados
neste capítulo alguns problemas em grafos, como as cliques e os conjuntos
estáveis, as cliques máximas, as coberturas, a planaridade e a coloração. Na
seção 5.1 serão apresentados os conceitos de clique em grafos e seu com-
plementar, os conjuntos estáveis. Na seção 5.2 será desenvolvido o concei-
to de clique máxima, problema de solução difícil (NP-Completo). Em seguida,
na seção 5.3, serão abordadas as coberturas de vértices e coberturas de
arestas. O problema da planaridade de grafos também é estudado. Por fim,
na seção 5.5, será exposto o problema da coloração em grafos.
5.1 Cliques e Conjuntos Estáveis
Vídeo Imagine uma empresa que, preocupada com a divulgação de seus produtos,mas com poucos recursos, decide investir em marketing digital em redes sociais.
Levando em consideração um orçamento pequeno, o gerente de marketing quer
divulgar para pessoas ou para empresas que possam ajudar na propagação para
um conjunto bem conectado de contatos, o qual ele chamou de panelinha. Para
otimizar seus gastos, o gerente não quer compartilhar sua divulgação com mais de
um contato de uma mesma panelinha.
A Figura 1 a seguir pode ser utilizada para esquematizar essa estratégia de mar-
keting. Com anúncios em apenas quatro dessas panelinhas, o gerente de marketing
teoricamente conseguiria uma divulgação para 100 pessoas.
Figura 1
Panelinhas
Fonte: Elaborada pelo autor.
Panelinha 1
Empresa
Panelinha 2
Panelinha 3
Panelinha 4
98 Teoria dos Grafos
Modelando este problema para grafos, em que cada pessoa é um vértice e cada
conexão uma aresta, percebe-se que grupos altamente conectados são subgrafos
completos do grafo total, isto é, dentro de cada panelinha todas as pessoas estão
conectadas entre si. Tomando cada panelinha como um grafo individual, diz-se que
é um grafo completo.
Dado um grafo não orientado denotado por G = (V, A), uma clique é um subcon-
junto de vértices de G, em que todos os seus vértices são conectados dois a dois.
Em outras palavras, uma clique V’ de G é tal que V’ ⊂ V e ∀v, w ∈ V’, assim como v ≠
w e (v, w) ∈ A.
Apesar de a definição indicar um subconjunto de vértices, muitos autores tam-
bém definem o termo clique como um subgrafo e, nesse caso, uma clique é um
subgrafo completo de G. Outra maneira de indicar a clique é definindo-a como um
subgrafo isomorfo a um grafo completo Kn.
Percebe-se que o conceito é parecido com o de grafos completos, podendo ser
assim designado quando todos os seus vértices são conectados dois a dois. Os
grafos completos possuem uma notação própria, a saber Kn, em que n é o número
de vértices. Assim, a Figura 2 apresenta os grafos K2, K3, K4 e K5 respectivamente
(lembrando que K1 é um grafo completo contendo somente um vértice).
v5v4
v1 v3
v2
v1 v2
v3v4v1 v3
v2v2
v1
Fonte: Elaborada pelo autor.
Figura 2
Grafos Completos: K2, K3, K4 e K5
Assim, um grafo possui uma clique se possuir um subgrafo completo, por exem-
plo, o grafo G apresentado na Figura 3.
Nesse grafo podem-se observar as seguintes cliques:
• {v1}
• {v2}
• {v3}
• {v4}
• {v5}
• {v1, v2}
• {v2, v3}
• {v3, v4}
• {v4, v5}
• {v1, v5}
• {v2, v4}
• {v2, v3, v4}
Foi no trabalho de Luce e Perry
(1949) que a palavra clique foi
utilizada pela primeira vez para
representar um subgrafo completo,
denotando um grupo de pessoas
que se conhecem em uma rede
social. Essa palavra, portanto, foi
usada para designar um grupo de
pessoas, uma panelinha e não diz
respeito ao ato de clicar.
Curiosidade
Fonte: Elaborada pelo autor.
v5
v2 v4
v3
v1
Figura 3
Grafo G contendo cliques
Problemas em Grafos 99
As cliques {v1, v5}, {v3, v4} e {v2, v3, v4} podem ser visualizadas de acordo com a
Figura 4.
Figura 4
Grafo com algumas cliques destacadas
Fonte: Elaborada pelo autor.
v5
v2 v4
v3
v1
Isolando essas cliques como subgrafos induzidos de G, conforme a Figura 5, per-
cebe-se que cada uma delas é um subgrafo completo de G, sendo respectivamente
K2, K2 e K3.
v4
v3
v2v4
v3
v5v1
Figura 5
Cliques de G separadas
Fonte: Elaborada pelo autor.
Define-se como tamanho de uma clique, ou sua cardinalidade, o
número de vértices em cada; sendo C uma clique, |C| é a sua cardi-
nalidade. Para as cliques da Figura 5, seus tamanhos são dois, dois
e três, respectivamente. Por exemplo, seja o grafo H da Figura 6,
consegue-se observar duas cliques de tamanho três, a saber:
• {v1, v5, v6}
• {v2, v3, v4}
Seus subgrafos induzidos podem ser vistos na Figura 7.
Fonte: Elaborada pelo autor.
v2
v4
v3
v6
v5
v1
Figura 7
Cliques de tamanho 3 do Grafo H
Fonte: Elaborada pelo autor.
v6
v5
v2
v4
v3
v1
Figura 6
Grafo H
100 Teoria dos Grafos
Partindo do conceito de clique, chama-se conjunto independente de vértices, tam-
bém conhecido como conjunto estável de vértices, o conjunto de vértices totalmente
desconexo, sem arestas entre eles. Isto é, um conjunto independente de vérti-
ces S de G é tal que S ⊂ V e ∀v, w ∈ S, para v ≠ w e (v, w) ∉ A.
Dado o grafo da Figura 8, é possível obter os seguintes conjuntos independen-
tes de vértices:
• {v1, v4}
• {v1, v3}
• {v1, v5}
• {v2, v4}
• {v3, v5}
• {v1, v3, v5}
Na Figura 9 consegue-se observar os conjuntos {v1, v4}, {v3, v5} e
{v1, v3, v5}. Percebe-se que, para cada um desses conjuntos, não há
arestas para qualquer par de vértices.
Define-se como tamanho de um conjunto independente de vértices
o seu número de vértices. Para os conjuntos mostrados na Figura 8,
os tamanhos são: dois, dois e três, respectivamente.
Um conjunto independente, ou estável de vértices, é máximo se
tiver a maior cardinalidade entre todos os conjuntos estáveis do gra-
fo. Outro conceito é o número ou índice de estabilidade do grafo, dado
pela cardinalidade de um conjunto estável máximo do grafo. Dado
um grafo G, esse índice é denotado por α(G).
Assim, os conceitos de clique e conjunto independente de vérti-
ces são complementares. Enquanto no primeiro há uma aresta en-
tre todos os pares de vértices, no segundo não há. Isso significa que um conjunto
vértices E é estável em um grafo G, se, e somente se, for uma clique no grafo com-
plementar de G. Seja o grafo J apresentado na Figura 9.
v5
v3
v1
v4
v1 v5
v3
Figura 9
Conjuntos independentes de vértices de G: {v1, v4}, {v3, v5} e {v1, v3, v5}
Fonte: Elaborada pelo autor.
O conjunto de vértices {v1, v3, v5} é um conjunto estável de vértices de J, pois, no
grafo complementar exibido na Figura 10, {v1, v3, v5} é uma clique.
Fonte: Elaborada pelo autor.
v4
v5 v3
v1
v2
Figura 8
Grafo J
Problemas em Grafos 101
Um conceito correlato ao conjunto independente de vértices é o
emparelhamento – matching, ou também acoplamento. Um empare-
lhamento de um grafo G é um conjunto de arestas que não compar-
tilham vértices.
A Figura 11 apresenta um grafo contendo um emparelhamento,
sendo o conjunto de arestas {(v1, v2) e (v4, v5)}. Perceba que essas
arestas não compartilham vértices.
Um emparelhamento máximo é aquele que contém o maior
número de arestas possível. Encontrar um emparelhamento máxi-
mo pode ser feito em tempo polinomial e tem-se vários algoritmos
eficientes desenvolvidos (SZWARCFITER; FIGUEIREDO, 1999).
As aplicações do estudo das cliques extrapolam a área da com-
putação e da matemática. Por exemplo, o trabalho de Rhodes et al.
(2003), na área da química, mapeou o problema de similaridade de
farmacóforos em um banco de dados como um problema de detec-
ção de cliques. Os farmacóforos são um conjunto de características
que asseguram interações moleculares e esse estudo é importante
para o desenvolvimento de moléculas bioativas (RHODES et al., 2003).
A aplicação de emparelhamentos também é ampla; um exemplo
é o problema da atribuição de pessoal (SZWARCFITER; FIGUEIREDO,
1999). Suponha uma possível contratação de candidatos a vagas em
uma empresa, há n candidatos e m posições disponíveis. Cada can-
didato está qualificado a uma ou mais posições. O problema é des-
cobrir se há uma forma de alocar todos os candidatos de modo que
cada um ocupe uma posição. Para uma resolução provável, é possí-
vel realizar o emparelhamento em grafos bipartidos.
Fonte: Elaborada pelo autor.
v5
v2 v4
v3
v1
Figura 11
Grafo com emparelhamento
Fonte: Elaborada pelo autor.
v4
v5 v3
v1
v2
Figura 10
Grafo complementar a J
5.2 Cliques Máximas
Vídeo Dando continuidade ao estudo das cliques, existem dois conceitos importantes
na área de grafos que devem ser levados em consideração: a clique maximal e a
clique máxima.
Uma clique maximal é um conjunto de vértices
todos adjacentes entre si e que não está estritamen-
te contida em outra clique (GOLDBARG; GOLDBARG,
2012). Isso significa que, tomada uma clique C deum
grafo, se houver possibilidade de adicionar mais um
vértice adjacente a todos os demais, formando um
subgrafo completo e, portanto, outra clique C’, a cli-
que C não é maximal. Por exemplo, veja o grafo H da
Figura 12.
v1 v5
v4
v3
v6
v2
Figura 12
Grafo H
Fonte: Elaborada pelo autor.
102 Teoria dos Grafos
Observe a clique C formada pelos vértices { v1, v2, v4 }, a qual pode
ser visualizada por arestas tracejadas na Figura 13 a seguir.
Se houver possibilidade de adicionar mais um vértice à clique C,
de maneira que esse vértice seja adjacente a todos os elementos de
C, então, C não é uma clique maximal. Analisando o grafo da Figura
13, percebe-se que v3 e v6 não são adjacentes a todos os vértices de
C, mas v5, sim. O vértice v5 é adjacente a v1, v2 e v4 , portanto, a clique
C não é maximal, pois está contida em C’ = { v1, v2, v4, v5 }, conforme
mostra a Figura 14.
Analisando os demais vértices, v3 não é adjacente a todos os vér-
tices em C’, assim como v6. Portanto, C’ é uma clique maximal do
grafo H e pode ser visualizada na Figura 15.
Fonte: Elaborada pelo autor.
Figura 14
Clique C’ do Grafo H
v1 v5
v4
v3
v6
v2
Fonte: Elaborada pelo autor.
Figura 15
Clique Maximal C’ do Grafo H
v1 v5
v4v2
Fonte: Elaborada pelo autor.
Figura 13
Clique C no Grafo H
v1 v5
v4
v3
v6
v2
Convém ressaltar que podem haver mais cliques maximais em um grafo. A
exemplo de H, a clique C’’= {v1, v2, v5, v6} também é maximal e pode ser observada
na Figura 16.
Tomando novamente o grafo H de exemplo, a clique C’’’ = { v2, v3, v4 }, mostrada
na Figura 17, também é maximal, apesar de possuir menos vértices que C’ e C’’.
Isso porque uma clique é maximal se ela não está contida em outra clique e não há
relação com outras cliques que podem ser encontradas no grafo.
Fonte: Elaborada pelo autor.
Figura 16
Clique maximal C’’ do Grafo H
v1 v5
v4
v6
Fonte: Elaborada pelo autor.
Figura 17
Clique Maximal C’’’ do Grafo H
v4
v3
v2
Problemas em Grafos 103
Há outro conceito básico em grafos, usado para denotar a maior clique que
pode ser encontrada em um grafo, que é a clique máxima.
Uma clique máxima é uma clique de maior cardinalidade, isto é, a que possui
o maior número de vértices entre todas as possíveis cliques do grafo (GOLDBARG;
GOLDBARG, 2012).
Dado um grafo G = (V, A), o conjunto de todas as cliques de G é denotado por
C(G). O tamanho da clique máxima, também chamado de número de clique, é dado
por ω(G) = max { |C| | C ∈ C(G)}.
Observe o grafo I = (V, A), apresentado na Figura 18.
v1
v5
v4
v3
v6
v2
Figura 18
Grafo I
Fonte: Elaborada pelo autor.
A Figura 19 apresenta todas as cliques maximais de I. Não serão enumeradas
todas as cliques, já que seria necessário acrescentar todos os pares de vértices
adjacentes, pois são cliques de tamanho 2.
v1
v6
v1
v5
v4
v4
v3
v2
v1
v4
v2
Figura 19
Cliques Maximais de I
Fonte: Elaborada pelo autor.
Assim, o grafo I possui três cliques máximas, a saber:
• { v1, v2, v4 }
• { v2, v3, v4 }
• { v1, v4, v5 }
Assim, ω(I) = 3
O Problema da Clique é um problema de decisão, em que, dados um grafo G e
um número inteiro k, deve-se decidir se G tem uma clique de tamanho pelo menos k.
Esse problema é da classe NP-completo e faz parte da clássica lista de Karp, conten-
do 21 problemas provados como NP-completos.
Em seu artigo, Richard Karp (apud
MILLER; THATCHER; BOHLINGER,
1972) demonstrou que 21
problemas famosos da ciência da
computação são NP-completos,
usando como base a prova feita
em 1971, por Stephen Cook, o
qual constatou que o problema
da Satisfatibilidade Booleana
é NP-Completo. O trabalho de
Karp impulsionou os estudos em
complexidade computacional,
principalmente se voltando ao
grande problema não resolvido até
hoje: P = NP?
Curiosidade
104 Teoria dos Grafos
Assim, uma solução exata para o problema da clique é exponencial. Pesqui-
sas atuais tentam diminuir sua ordem de complexidade pelo refinamento de
algoritmos clássicos, como branch-and-bound, técnica baseada na enumeração de
todas as possíveis cliques máximas, descartando aquelas que não satisfazem de-
terminados limites impostos pelo algoritmo (ZUGE, 2017).
5.3 Coberturas
Vídeo Suponha que há um projeto municipal para instalar câmeras de monitoramento
de tráfego em ruas e avenidas de determinada cidade. Um dos objetivos é que os
motoristas, ao trafegarem pelo município, sempre passem por uma câmera. En-
tretanto, como o orçamento é um problema em qualquer administração, deve-se
gastar o mínimo possível, instalando o menor número de câmeras.
Modelando esse problema como um grafo, consegue-se representar as ruas
pelas arestas e os cruzamentos pelos vértices. O objetivo é encontrar o menor nú-
mero de vértices, de modo que todas as arestas desse grafo estejam conectadas a
um vértice desse conjunto. Assim, instalam-se as câmeras nesses cruzamentos.
Dado um grafo não orientado G = (V, A), um conjunto de
vértices S é chamado de cobertura de vértices de G se toda
aresta de G é incidente a pelo menos um vértice de S. Isto é,
S ⊆ V, tal que se (v, w) ∈ A, então, ou v ∈ S, ou w ∈ S (ou
ambos). Diz-se que S cobre as arestas de G (NICOLETTI;
HRUSCHKA, 2018).
Observe o grafo da Figura 20: os conjuntos de vértices
V’ = {v1, v3, v4, v5, v6} e V’’ = {v2, v4, v5} são coberturas de vértices.
Os dois conjuntos podem ser vistos na Figura 21, em
que os vértices das coberturas V’ e V’’, respectivamente,
estão representados normalmente e os vértices desconsi-
derados estão representados em branco. Percebe-se que
todas as arestas possuem, pelo menos, uma ponta em um
vértice da cobertura.
Fonte: Elaborada pelo autor.
Figura 21
Representação das coberturas de Vértices V’ e V’’, respectivamente
v1 v5
v4
v3
v6
v5
v4v2
Fonte: Elaborada pelo autor.
Figura 20
Grafo G
v1 v5
v4
v3
v6
v2
Problemas em Grafos 105
O número de cobertura de vértices de um grafo G é denotado τ(G) e é a car-
dinalidade da menor cobertura de vértices de G. Assim, no exemplo do grafo da Fi-
gura 20, o número de cobertura de vértices seria τ(G) = 3, pois não há um conjunto
de menos de três vértices que cubra as arestas de G.
Um conceito análogo à cobertura de vértices é a cobertura de arestas. Dado um
grafo G = (V, A), um conjunto C de arestas é chamado de cobertura de arestas, se
todo vértice de G for extremidade de, pelo menos, uma aresta de C. Ou seja, C ⊆ A,
tal que ∀v ∈ V e ∃w ∈ V e (v, w) ∈ C. Diz-se que C cobre os vértices de G.
Considerando o grafo G da Figura 20, os conjuntos de arestas A’ = { (v3, v5), (v2, v4),
(v1, v4), (v5, v6) } e A’’ = { (v1, v4), (v2, v6), (v3, v5) } são coberturas de arestas. Esses dois
conjuntos podem ser vistos na Figura 22, em que as arestas das coberturas A’ e A’’,
respectivamente, estão representados normalmente e as arestas desconsideradas
estão representadas em tracejado. Percebe-se que todos os vértices são atingidos
por, no mínimo, uma aresta das coberturas.
Fonte: Elaborada pelo autor.
Figura 22
Representação das Coberturas e Arestas A’ e A’’, respectivamente.
v1 v5
v4v2
v3
v6
v1 v5
v4v2
v3
v6
O número de cobertura de arestas de um grafo G é denotado ξ(G), que é a cardi-
nalidade da menor cobertura de arestas de G. Assim, para o grafo da Figura 20, ξ(G) = 3,
pois não há como cobrir todos os vértices do grafo com menos de três arestas.
O problema da cobertura de vértices mínima é um problema de otimização.
Seu objetivo é encontrar uma cobertura de vértices com o menor número de vérti-
ces possível e sua formulação como um problema de decisão também é um dos 21
problemas NP-Completos de Karp.
O problema da cobertura de arestas mínima é um problema de otimização e
tem como objetivo encontrar uma cobertura de arestas com o menor número de
arestas possível. Ao contrário do problema de cobertura de vértices mínima, esse é
um problema polinomial, isto é, um problema tratável.
Para resolver o problema da cobertura de vértices mínima, não se pode usar um
algoritmo fundado emforça bruta (enumerando todas as possíveis coberturas e
testá-las), pois já se sabe que o tempo de execução é exponencial em relação ao ta-
manho do grafo. Assim, algoritmos que retornam uma solução aproximada precisam
ser empregados, não retornando a uma solução ótima, mas uma solução satisfatória.
Um problema de decisão,
conforme o apresentado para a
cobertura de vértices, é formulado
com um enunciado, para o qual se
deseja uma resposta sim ou não.
No caso, a versão do problema é
a seguinte:
Dado o grafo G e um valor
inteiro positivo k, G contém uma
cobertura de vértices de tamanho,
no máximo, k?
Formulado dessa forma, o proble-
ma faz parte dos 21 problemas
NP-Completos de Karp.
Saiba mais
Segundo Gersting e Iório (2012),
um problema é tratável quando
há um algoritmo que o resolve
em um tempo proporcional a
um polinômio do tamanho de
sua entrada. Esses problemas
estão na classe de complexidade
P, ou seja, os problemas que são
resolvidos em máquinas de turing
determinística, em tempo poli-
nomial, em relação ao tamanho
da entrada.
Convém ressaltar que um polinômio
pode conter qualquer expoente, por
exemplo: n1560. Isso não deixa de
torná-lo tratável, mas pode levar
uma grande quantidade de tempo
de processamento.
Já os intratáveis são aqueles cujos
algoritmos são inerentemente
ineficientes, com tempo expo-
nencial ao tamanho da entrada.
Esses problemas são resolvidos
por uma máquina de turing não
determinística em tempo poli-
nomial, em relação ao tamanho
da entrada, estando, portanto, na
classe de complexidade NP.
Saiba mais
106 Teoria dos Grafos
Já o problema da cobertura de arestas mínima pode ser resolvido de uma ma-
neira ótima, encontrando um emparelhamento máximo, ou seja, um conjunto in-
dependente de arestas que não compartilham vértices e aplicando um algoritmo
guloso para agregar todos os vértices.
5.4 Planaridade
Vídeo Um grafo é planar se sua representação gráfica em um plano pode ser feita
sem que suas arestas se cruzem (SZWARCFITER, 2018).
Tome como exemplo o grafo apresentado na Figura 23. Apesar da sua represen-
tação na Figura 23 apresentar intersecção nas arestas (v2, v3) com (v1, v5) e, também,
(v3, v4) com (v1, v5), o grafo G pode ser representado graficamente de outra forma,
como mostra a Figura 24. Portanto, o grafo é planar.
Fonte: Elaborada pelo autor.
Figura 23
Grafo G com interseções em arestas
v1 v5
v4v2
v3
Fonte: Elaborada pelo autor.
Figura 24
Grafo G com interseções em arestas
v1 v5
v4v2
v3
Uma das motivações do estudo de planaridade de grafos veio do problema das
três casas, enunciado pelo matemático inglês Henry Ernest Dudeney (1857-1930)
em 1913 (SANTOS, 2017).
Nesse problema, três companhias de fornecimento de serviços públicos devem
servir três casas distintas. Todas devem usar tubulações subterrâneas na mesma
profundidade do solo, por questões de segurança. Representado como um gra-
fo, pode-se observar seis vértices e nove arestas. O problema é descobrir se há a
possibilidade de suprir todos os serviços, sem que as linhas se cruzem.
A Figura 25 a seguir ilustra este problema.
Fonte: Elaborada pelo autor.
Figura 25
Problema das três casas
v4 v5 v6
v2 v3v1
Companhia
Luz
Casa 1
Companhia
Água
Casa 2
Companhia
Telefone
Casa 3
Problemas em Grafos 107
Ao ser enunciado como um problema de grafos, percebe-se que o problema das
três casas pode ser representado pelo grafo bipartido completo K3,3. Para respon-
der à questão, deve-se descobrir se o K3,3 permite uma representação gráfica em
que suas arestas não se cruzam, isto é, se ele é planar.
No problema das três casas, em especial, não há uma forma de
desenhar o grafo em um plano sem que as arestas se cruzem. Inclu-
sive, o K3,3 é uma referência para a planaridade, conforme será visto
no teorema de Kuratowski mais adiante.
Em grafos planares, as arestas dividem o plano em regiões cha-
madas de faces. Seja o exemplo do grafo da Figura 26, nesse grafo
tem-se quatro faces e a face de número quatro é chamada de face
externa.
O Teorema a seguir apresenta a Fórmula de Euler que relaciona
os vértices, arestas e faces em um grafo planar conexo.
Teorema 1
Fórmula de Euler (1750)
Seja um grafo conexo planar G e sejam: n o número de vértices, a o número de
arestas e f o número de faces, tem-se n – a + f = 2.
Essa fórmula também pode ser apresentada como n + f = a + 2 e percebe-se,
facilmente, sua igualdade (SZWARCFITER, 2018). Considerando o grafo da Figura 26,
pode-se encontrar n = 4, f = 4 e a = 6, então, n + f = a + 2, assim, 4 – 6 + 4 = 2.
Pela fórmula de Euler, percebe-se que quanto maior for o número de arestas
em um grafo, relativo ao número de vértices, mais difícil será a obtenção de uma
representação plana do grafo. Isso é dado por meio do seguinte corolário, que de-
fine um limite máximo para o número de arestas.
Corolário 1: seja um grafo planar simples contendo n vértices, n ≥ 3, e a arestas,
tem-se a ≤ 3n – 6.
Na prática, isso significa, por exemplo, que em um grafo planar com cinco vér-
tices há, no máximo, 9 arestas. Deve-se tomar cuidado, pois o Corolário 1 pode ser
usado para demonstrar que um grafo não é planar, mas, se a condição for satisfei-
ta, não há garantia de que o grafo é planar.
Outro exemplo pode ser visto ao considerar o K3,3 (Figura 27), o qual possui 6
vértices e 9 arestas. Aplicando-se a fórmula do Corolário 1, a condição é satisfeita,
isto é, 9 ≤ 3*6 – 6, mas o grafo K3,3 não é planar.
Outro resultado importante advindo do Teorema 5.1 é o corolário a seguir.
Corolário 2: todo grafo planar simples contém um vértice cujo grau é no máxi-
mo cinco.
Esse resultado é muito importante, pois coloca um limite numérico em, pelo
menos, um dos vértices do grafo planar.
v4
v3
v2
v1
2
3
4
1
Figura 26
Grafo planar e suas faces
Fonte: Elaborada pelo autor.
Lemas, Teoremas e Corolários são
conceitos são correlatos:
• Lema: é uma afirmação que
ajuda a provar um teorema.
Basicamente, lema é um
teorema anterior, que ajuda a
provar outro teorema.
• Teorema: é uma proposição
verdadeira, visto que possui
uma prova
• Corolário: é uma afirmação,
uma proposição ou outro teore-
ma, que pode ser estabelecido
como consequência de um
teorema já provado.
Saiba mais
108 Teoria dos Grafos
Outros resultados centrais para o estudo de grafos planares são as provas de
que K5 e K3,3 não são planares (NICOLETTI; HRUSCHKA, 2018). A Figura 27 apresenta
as formas mais comuns de representar graficamente K5 e K3,3.
Fonte: Elaborada pelo autor.
Figura 27
Representações de K5 e K3,3
v4 v5 v6
v2 v3v1
K3,3
K5
v4 v3
v2v5
v1
Percebe-se que o K3,3 atende ao Corolário 1, ou seja, a = 9, n = 6, portanto,
9 ≤ 3*6 – 6, isto é 9 ≤ 12. Mesmo assim, K3,3 não é planar.
Fazem-se necessárias, também, algumas definições em grafos para o estudo de
grafos planares. Em um grafo G = (V, A), dois vértices, v, w ∈ V, estão em série, se
existe um vértice x ∈ V, tal que x ≠ v, x ≠ w, grau(x) = 2 e (v, x), (x, w) ∈ A. A Figura 28
apresenta um grafo cujos vértices v2 e v4 estão em série. Perceba que o vértice v3
possui grau 2 e é adjacente a v2 e v4, atendendo às condições impostas na definição.
Dado um grafo G = (V, A) e os dois vértices v, w ∈ V em série, uma redução de
série é a eliminação do vértice x e a substituição das arestas (v, x) e (x, w) pela
aresta (v, w). Assim, para o grafo da Figura 28, o grafo da Figura 29 (lado direito) foi
obtido de uma redução de série, no caso, eliminando-se o vértice v3 e as arestas (v2,
v3) e (v3, v4), ligando o v2 ao v4 pela aresta (v2, v4).
Fonte: Elaborada pelo autor.
Figura 29
Redução de série
v1 v5
v4v2 v3
v1 v5
v4v2
Dois grafos, G’ e G’’, são homeomorfos se podem ser obtidos a partir do mesmo
grafo e de uma sequência de reduções de séries. Outra forma de definir que G’ e
G’’ são homeomorfos é se eles podem ser reduzidos a grafos isomorfos por meio
de reduções de séries.
A Figura 30 (do lado esquerdo) apresenta dois grafos homeomorfos,pois ao se
aplicarem várias reduções de séries, obtém-se dois grafos isomorfos (do lado direito).
Fonte: Elaborada pelo autor.
Figura 28
Grafo com vértices em série
v1 v5
v4v2 v3
Problemas em Grafos 109
No primeiro grafo da Figura 30, foi reduzida a série (v1, v6), (v6, v7) e, em seguida,
a (v1, v7), (v7, v5). No segundo grafo da Figura 30 foi reduzida a série (v1, v7), (v7, v2)
seguida da (v1, v6), (v6, v5) e, por fim, a (v2, v3), (v3, v4).
v1 v5
v4v2
Fonte: Elaborada pelo autor.
Figura 30
Grafos homeomorfos
v1 v5
v4v2 v3
v6 v7
v1 v5
v4v2 v3
v6
v7
v1 v5
v4v2
Por meio dos grafos K5 e K3,3 e do conceito de homeomorfismo de grafos, o Teo-
rema de Kuratowski dá as condições necessárias e suficientes para indicar se um
grafo é planar ou não (NICOLETTI; HRUSCHKA, 2018).
Teorema 2
Teorema Kuratowsk
Um grafo G é planar, se, e somente se, não tem um subgrafo homeomorfo a K5
ou K3,3.
Observe o grafo não planar da Figura 31. Para mostrar que esse grafo não é
planar, pode-se buscar por um subgrafo homeomorfo a K5 ou K3,3. Um subgrafo é
obtido pela remoção de arestas e vértices. Para a propriedade de homeomorfismo,
faz-se redução de série.
v1
v5
v4
v8
v9
v6v7
v2 v3
Figura 18
Grafo não planar
Fonte: Elaborada pelo autor.
110 Teoria dos Grafos
Para provar que esse grafo não é planar, a ideia é eliminar vértices e arestas
para encontrar um subgrafo que seja homeomorfo a K5 ou K3,3. Ao encontrar esse
subgrafo, efetuam-se reduções de série até encontrar um subgrafo que seja iso-
morfo a K5 ou K3,3.
A Figura 32 apresenta os passos efetuados até aqui. Primeiramente, serão elimi-
nadas as arestas (v4, v5) e (v2, v3). Esse subgrafo obtido é homeomorfo a K3,3 e, para
ter certeza, efetuam-se as seguintes reduções de série: 1ª. redução (v1, v9) e (v9, v5),
2ª. redução (v2, v8) e (v8, v5), e 3ª. redução (v3, v7), (v7, v6). Assim, pode-se perceber que
o grafo obtido é isomorfo a K3,3.
Figura 32
Passos para provar que o grafo não é planar
v1
v5
v4
v8
v9
v6v7
v2 v3
Remoção
de (V4, V5) e
(V2, V3)
v1
v5
v8
v9
v6v7
v3
v4
v2
Redução de
série (V1, V9) e
(V9, V5)
v1
v5
v8
v9
v6v7
v3
v4
v2
v1
v5
v8
v6v7
v3
v4
v2
Redução de
série (V2, V8) e
(V8, V5)
v1
v5
v8
v6v7
v3
v4
v2
v1
v5
v6v7
v3
v4
v2
Fonte: Elaborada pelo autor.
Redução de
série (V3, V7) e
(V7 V6)
v1
v5
v6v7
v3
v4
v2
v1
v5
v6
v3
v4
v2
O primeiro algoritmo para teste de planaridade surgiu, em 1961, com Auslander
e Parter (AUSLANDER; PARTER, 1961). O algoritmo posteriormente foi corrigido por
Problemas em Grafos 111
Goldstein e, então, ficou conhecido como Algoritmo Auslander, Parter e Goldstein (Al-
goritmo APG) e possui complexidade cúbica (GOLDSTEIN, 1963).
O primeiro algoritmo com complexidade de tempo linear, para verificação de
planaridade de grafos, é o Hopcroft e Tarjan (Algoritmo HT), fundamentado no al-
goritmo APG (HOPCROFT; TARJAN, 1974).
Outros algoritmos também foram desenvolvidos e são tópicos de pesquisa mais
avançada na área.
5.5 Coloração
Vídeo Em grafos, uma coloração vértices é uma atribuição de rótulos aos vértices de
grafos, tradicionalmente chamados de cores, de tal forma que não haja dois vérti-
ces adjacentes rotulados com a mesma cor (NICOLETTI; HRUSCHKA, 2018). Em teoria
de grafos, também há os conceitos de coloração de arestas e coloração de faces, mas,
aqui, será abordada apenas a coloração de vértices, sendo o ponto de partida para
o estudo de coloração em grafos.
A Figura 33 apresenta um grafo com uma coloração aplicada.
Uma coloração de vértices contendo k cores diferentes é chama-
da de k-coloração e, nesse caso, o grafo é k-colorível. No exemplo
apresentado na figura tem-se três cores, portanto, trata-se de uma
3-coloração para o grafo.
Claramente, percebe-se que em um grafo com n vértices, po-
de-se usar n cores, uma para cada vértice e, dessa forma, segu-
ramente, vértices adjacentes não possuirão a mesma cor. Assim,
encontrar uma n-coloração em um grafo com n vértices, é trivial e
não possui utilidade prática. Já encontrar uma coloração mínima,
isto é, obtida com um número mínimo de cores, é um problema
difícil e possui muitas aplicações práticas.
Em um grafo G, o número mínimo n de cores possíveis, tal que existe uma
n-coloração em G, é chamado de índice cromático ou número cromático, denotado
por χ(G). Assim, se χ(G) = n, então, G é n-cromático.
Se o grafo possui laços (vértices adjacentes a si mesmos), então, não há colora-
ção possível. Se existem arestas paralelas, ou seja, arestas que incidem nos mes-
mos vértices, diz-se que os vértices em questão são adjacentes e será considerada
somente uma dessas arestas. Assim, consideram-se somente grafos simples.
Com base nisso, tem-se os seguintes teoremas e definições:
Teorema 3
Se um grafo G tem n vértices, então, χ(G) ≤ n.
Esse teorema é intuitivo. Se todos os n vértices de um grafo forem conecta-
dos a todos os demais, será necessário n cores para colori-lo. Caso contrário, há a
possibilidade do número cromático ser menor que n. Então, n é um limite máximo
para o número de cores necessárias para colorir qualquer grafo.
v1 v5
v4v2
v3
Figura 33
Grafo com uma coloração aplicada
Fonte: Elaborada pelo autor.
112 Teoria dos Grafos
Um grafo em que cada vértice é conectado a todos os demais é chamado de gra-
fo completo. Um grafo completo, com n vértices, é denotado por Kn e, assim, segue
o próximo teorema.
Teorema 4
Seja o grafo Kn, então, χ(Kn) = n, para todo n ≥ 1.
Isto é facilmente observado em grafos completos. Como o exemplo do K5, na
Figura 34, em que são cinco vértices e cada vértice é adjacente aos outros quatro
vértices. Para o Kn, cada vértice é ligado aos outros n – 1 vértices. Assumindo v1, é
necessária uma cor para colorir v1 e cores diferentes para cada vértice adjacente,
ou seja, mais quatro cores. O mesmo raciocínio vale para Kn.
A Figura 35 apresenta uma coloração possível para o K5.
v4 v3
v2
v1
v5
Figura 34
Grafo K5
Fonte: Elaborada pelo autor.
v4 v3
v2
v1
v5
Figura 35
Grafo K5 colorido
Fonte: Elaborada pelo autor.
O Teorema 4 também relaciona os conceitos de coloração e cliques, isto é,
subgrafos completos. Como são necessárias p cores para colorir os p vértices de
uma clique, então, para um grafo G, seu número cromático é maior ou igual ao
tamanho da sua maior clique. Pode-se dizer que, se um grafo G contém Kn como
subgrafo, então, χ(G) ≥ n.
O próximo teorema apresenta o valor do número cromático para grafos
bipartidos.
Teorema 5
Seja um grafo G não vazio, tem-se χ(G) = 2, ou seja, o grafo é bicolorível, se, e
somente se, G for bipartido.
Esse teorema também é intuitivo, pois os grafos bipartidos são formados por
dois conjuntos de vértices, sendo que os vértices pertencentes a cada um desses
Problemas em Grafos 113
conjuntos não são adjacentes entre si. Desse modo, para cada conjunto, basta atri-
buir uma cor a todos seus vértices e, assim, o grafo total é bicolorível.
A Figura 36 mostra um grafo bipartido, visto que pode ser separado em dois
conjuntos de vértices, {v1, v2} e {v3, v4, v5}, de modo que os vértices não são adja-
centes dentro dos conjuntos apresentados e as arestas existentes ligam vértices
entre os conjuntos. Assim, cada um desses conjuntos recebe uma cor e a Figura 37
apresenta uma coloração possível.
v2
v5v4
v1
v3
Figura 36
Grafo Bipartido
Fonte: Elaborada pelo autor.
Figura 37
Grafo Bipartido Colorido
Fonte: Elaborada pelo autor.
v4 v5v3
v2
v1
O conceito de coloração também é relacionado ao de conjunto independente de
vértices. Um conjunto independente de vértices, ou um conjunto estável de vértices,
de um grafo é o conjunto de vértices totalmente desconexos. Em outros termos,
eles não são adjacentes entre si.
Essa propriedade pode ser observada no grafo da Figura 37, em que os conjun-
tos {v1, v2} e {v3, v4, v5} possuem vértices não adjacentes entre si e, portanto, são
conjuntos estáveis de vértices.
A Figura 38 apresenta o grafoG.
v3
v5v4
v7
v6
v1v2
Figura 38
Grafo G
Fonte: Elaborada pelo autor.
Consegue-se obter três conjuntos independentes de vértices de G, que são
disjuntos, por exemplo:
114 Teoria dos Grafos
• {v5, v1, v7}
• {v2, v3, v4}
• {v6}
Assim, cada um desses conjuntos pode ser colorido com uma cor diferente, con-
forme mostra a Figura 39.
v3
v5v4
v7
v6
v1v2
Figura 39
Grafo G colorido
Fonte: Elaborada pelo autor.
Seja uma k-coloração a um grafo G = (V, A) e sejam V1, V2, ..., Vk os subconjuntos
disjuntos de V, induzidos pela k-coloração, então, cada Vi é um conjunto indepen-
dente de vértices de G. Assim, para determinar uma coloração mínima de G, pode-
-se particionar o conjunto V em um número mínimo de conjuntos independentes
de vértices, sendo que cada um desses conjuntos receberá uma cor.
Considerando o grafo G = (V, A), o grau máximo de G, denotado por ∆(G), é o
grau do vértice que possui o maior grau em G, isto é, ∆(G) = max{ grau(v) | v ∈ V }.
Pode-se observar que sempre é possível colorir um grafo G com ∆(G)+1 cores. Isso
porque, se os vértices possuem grau no máximo ∆(G), usa-se uma cor para o próprio
vértice e ∆(G) cores para os adjacentes. Mesmo para grafos completos, Kn possui ∆(G)
= n – 1, o que significa que são necessárias n cores para colori-lo.
Assim, há um limite para o número cromático, em qualquer grafo, dado por
χ(G) ≤ ∆(G)+1.
O próximo teorema foi enunciado pelo matemático inglês Rowland Leonard
Brooks (1916-1993) em 1941, e dá uma relação do melhor que a apresentada ante-
riormente, entre o número cromático e o grau máximo de um grafo.
Teorema 6
Teorema de Brooks (1941)
Seja um grafo simples conexo G e seja ∆(G) ≥ 3. Se G não é um grafo completo (Kn)
e não possui ciclos ímpares (com um número ímpar de vértices), então, χ(G) ≤ ∆(G).
O Teorema de Brooks é um resultado importante, pois dá um limite melhor para
o número cromático χ(G) de um grafo, com ∆(G) como seu grau máximo. Em suma,
Problemas em Grafos 115
dado um grafo G que atende algumas condições (∆(G) ≥ 3, não ser Kn, nem ter ciclos
ímpares), o número cromático será sempre menor ou igual ao seu grau máximo.
Outro resultado importante da coloração de grafos é o Teorema das Quatro
Cores, conjecturado por Francis Guthrie em 1952, provado pelo matemático
estadunidense Kenneth Appel (1932-2013) e pelo matemático alemão Wolfgang
Haken (1928-) em 1976. Este também foi o primeiro teorema matemático provado
com o auxílio de um computador.
Teorema 7
Teorema das Quatro Cores, Appel e Haken
Todo grafo planar é 4-colorível.
Este teorema indica que qualquer grafo planar pode ser colorido com quatro co-
res. Mas decidir se um grafo planar é 3-colorível é um problema difícil (NP-Completo).
Há várias aplicações para coloração em grafos; um exemplo é a aplicação de
coloração em grafos para o controle de tráfego aéreo (BARNIER; BRISSET, 2004). O
objetivo é evitar o congestionamento e o cruzamento entre voos que trafegam na
mesma altura, modelando os cruzamentos dos voos. Cada voo é modelado como
um vértice e cada cruzamento como uma aresta entre dois voos. Uma coloração,
nesse grafo, determina a distribuição de diferentes alturas, isto é, cada cor uma
altura que deve ser atribuída ao voo, garantindo a segurança nos cruzamentos.
CONSIDERAÇÕES FINAIS
Neste capítulo foram estudados outros problemas em grafos, os conceitos de cli-
que, conjunto estável de vértices e o problema da clique. Também foi abordado o
conceito de cobertura, tanto de arestas quanto de vértices, bem como sua aplicação.
A planaridade do grafo também foi explorada, expondo os teoremas que dão base ao
estudo. Por fim, o problema da coloração de grafos foi apresentado, assim como seus
teoremas e um exemplo de aplicação.
ATIVIDADES
1. Enumere todas as cliques com tamanho maior ou igual a 2 do grafo a seguir.
v1 v5
v4v2
v3
116 Teoria dos Grafos
2. Dê a clique máxima do grafo a seguir.
v7 v5
v1v4
v2
v3
v6
3. Seja o grafo K3,3. desenhe o grafo e dê uma cobertura de arestas.
4. Considerando um grafo planar com oito vértices, qual o limite máximo de arestas
que esse grafo contém?
5. Utilizando o Teorema de Kuratowski, prove que o grafo a seguir não é planar.
v7
v6v8
v1
v2v5
v3v4
6. Dado o grafo a seguir, encontre a uma coloração mínima e dê seu número
cromático.
v7
v6
v8
v1
v2
v5
v3
v4
Problemas em Grafos 117
REFERÊNCIAS
AUSLANDER, L; PARTER, S. On imbeddings graphs in the plane, J. Math and Mech, v. 10, n. 3, p. 517-523,
1961.
BARNIER, N.; BRISSET, P. Graph Coloring for Air Traffic Flow Management. Annals of Operation Research, n.
130, p.163-178, 2004.
GOLDBARG, M. C.; GOLDBARG, E. Grafos: conceitos, algoritmos e aplicações. Rio de Janeiro: Elsevier, 2012.
GOLDSTEIN, A. An efficient and constructive algorithm for testing whether a graph can be embedded in a
plane. Graph and Combinatorics Conference, Dept. Math., Princeton University, p. 16-18, 1963.
HOPCROFT, J; TARJAN, R. Efficient planarity testing. Journal of the Association for Computing Machinery, v. 21,
n. 4, p. 549-568, 1974.
NICOLETTI, M. C.; HRUSCHKA Jr, E. R. Fundamentos da teoria dos grafos para computação. São Paulo: Editora
LTC, 2018.
RHODES, N. et al. CLIP: similarity searching of 3D databases using clique detection. Journal of Chemical
Information and Computer Sciences, v. 43, n. 2, p. 443–448, 2003.
SANTOS, E. L. S. Planaridade em grafos: o teorema de Kuratowski. São Cristóvão, 2017. Dissertação(Mestrado
em Matemática) – Universidade Federal de Sergipe.
SZWARCFITER, J. L. Teoria Computacional de Grafos. Rio de Janeiro: Elsevier, 2018.
SZWARCFITER, J. L.; FIGUEIREDO, C. M. H. de F. Emparelhamento em Grafos: Algoritmos e Complexidade.
Jornada de Atualização em Informática (JAI). Rio de Janeiro. 1999.
ZUGE, A. P. Algoritmos para o problema da clique máxima: análise e comparação experimental. Curitiba,
2017. Tese (Doutorado em Ciência da Computação) – Universidade Federal do Paraná.
118 Teoria dos Grafos
GABARITO
1 Introdução ao estudo dos grafos
1. Pelo teorema de Euler (1736), o teórico provou que para um grafo ser euleriano
todos os seus vértices precisam ter grau par. Assim, uma solução possível é dada
pela figura a seguir. As pontes (arestas) adicionadas estão tracejadas e são a8, a9 e a10.
a1
a2
a8
a4a7
a6
a9
a5v2
a3
a10
v1
v3
v4
E um possível ciclo euleriano, partindo de v1 é: a1, a2, a10, a3, a6, a5, a9, a7, a4, a8.
2. Uma representação geométrica possível é:
3
2
6
4
5
1
Gabarito 119
3. A matriz de adjacências é uma matriz contendo todos os vértices nas linhas e
colunas. Coloca-se 1 se os vértices são adjacentes e 0 caso contrário. Assim, a
matriz de adjacências é:
1 2 3 4 5 6
1 0 0 1 1 1 0
2 0 0 1 1 1 0
3 1 1 0 0 1 0
4 1 1 0 0 1 0
5 1 1 1 1 0 0
6 0 0 0 0 0 0
4. Sim, o grafo é bipartido, portanto, seus vértices podem ser separados em dois
conjuntos: V1 = {1, 2, 4, 5} e V2= {3, 6}, tal que não existe aresta entre os vértices
de V1, nem de V2, e toda aresta conecta um vértice de V1 com um vértice de V2.
Colorindo diferentemente os dois conjuntos, tem-se o grafo a seguir.
32
4
5
1
6
5. O grau de um grafo é dado pela soma do grau de seus vértices, nesse caso: 5+2+2+2+2+1
= 14. Como o grau de um grafo é o dobro do número de arestas, esse grafo possui sete
arestas. Uma possível representação é dada pela figura a seguir:
v4
v5v6
v3v2
v1
2 Conectividade
1. As componentes conexas de um grafo são seus subgrafos maximais – que não
estão contidos em outros grafos – conexos. Assim, no grafo apresentado tem-se
duas componentes conexas:
120 Teoria dos Grafos
v4
v6
v5
v2v1
v3
2. Sendo um digrafo, o caminho deve seguir as orientações das arestas. Portanto um
caminho entre v3 e v4 é: (v3, v6), (v6, v2), (v2, v5), (v5, v4), representado na figura a seguir.
v1
v4
v5
v2
v6v3
3. Um ciclo euleriano é um caminho que inicia e termina no mesmo vértice que passa
por todas as arestas do grafo somente uma vez. Assim, no grafo apresentado um
cicloeuleriano é: (v1, v3), (v3, v5), (v5, v4), (v4, v2), (v2, v1), (v1, v5), (v5, v2), (v2, v3), (v3, v4), (v4, v1)
4. Um grafo semi-hamiltoniano é um grafo que possui um caminho hamiltoniano,
mas não um ciclo hamiltoniano. Assim, basta adicionar uma aresta entre o término
e a origem de um caminho hamiltoniano.
No caso do grafo apresentado, o caminho hamiltoniano é: (v1, v3), (v3, v4), (v4, v2).
Desse modo, basta adicionar a aresta (v2, v1) e o grafo se torna hamiltoniano com o
seguinte ciclo hamiltoniano: (v1, v3), (v3, v4), (v4, v2), (v2, v1).
O grafo fica:
v4
v2
v3v1
5. Um subgrafo induzido G’ sobre um grafo G é aquele em que, dados todos os
vértices pertencentes a G’, todas as arestas em G sobre estes vértices também
Gabarito 121
são arestas em G’. Assim, o subgrafo a seguir é um subgrafo induzido do grafo
apresentado no enunciado da questão.
v5
v2
v1
6. As componentes biconexas, ou blocos de um grafo, são os subgrafos maximais
biconexos em vértices – isto é, não possui articulações – ou isomorfos a K2. Assim,
as componentes biconexas ou blocos do grafo apresentado são:
v8
v8
v7
v6
v2
v6
v2
v6
v7
v4
v1
v2
v3
3 Caminho mínimo e árvores geradoras
1. A árvore de busca em profundidade resultante é:
v5 v3
v2
v1
v4
v6
2. A árvore de busca em largura resultante é:
v5 v3
v2
v1
v4
v6
122 Teoria dos Grafos
3. A árvore geradora mínima obtida pelo algoritmo de Prim é:
v5 v3
v2
v1
v4
v6
1
3
2
3
5
4. A árvore geradora mínima obtida pelo algoritmo de Kruskal é:
v5 v3
v2
v1
v4
v6
1
3
2
3
5
5. Para melhor entendimento, os rótulos e as distâncias estão assinalados no grafo
a seguir.
v5 v3
v2
v1
v4
v6
1
3
10
2
2
4
3
5
V1 4V1 3
V6 6V6 8
V5 9
0 0
4 Grafos eulerianos e hamiltonianos
1. Partindo da terra, as escolhas são:
• Terra → Calisto: 3,1 anos
• Calisto → Io: 0,8 anos
Gabarito 123
• Io → Ganímedes: 1,1 anos
• Ganímedes → Mimas: 5,7 anos
• Mimas → Titan: 0,6 anos
• Titan → Terra: 8,1 anos
Total de 19,4 anos de expedição.
2. A busca gulosa com repetição calcula um ciclo hamiltoniano iniciando de cada
vértice e escolhe o menor. Os ciclos encontrados são:
• Terra → Calisto → Io → Ganímedes → Mimas → Titã → Terra: 19,4 anos
• Calisto → Io → Ganímedes → Terra → Titã → Mimas → Calisto: 19 anos
• Io → Calisto → Ganímedes → Terra → Titã → Mimas → Io: 18,9 anos
• Ganímedes → Io → Calisto → Terra → Titã → Mimas → Ganímedes: 19,4 anos
• Mimas → Titã → Io → Calisto → Ganímedes → Terra → Mimas: 19,4 anos
• Titã → Mimas → Io → Calisto → Ganímedes → Terra → Titã: 18,9 anos
Assim, escolhe-se um dos ciclos de 18,9 anos, por exemplo:
• Io → Calisto → Ganímedes → Terra → Titã → Mimas → Io: 18,9 anos.
Rearranjado para iniciar na Terra:
Terra → Titã → Mimas → Io → Calisto → Ganímedes → Terra.
3. O caminho euleriano é dado pelas seguintes arestas:
(v1, v8), (v8, v2), (v2, v7), (v7, v5), (v5, v6), (v6, v7), (v7, v3), (v3, v5), (v5, v4), (v4, v3), (v3, v2), (v2, v1)
4. O Teorema de Ore afirma que se o grafo possui mais de 3 vértices e para todo par
de vértices não adjacentes a soma de seus graus for maior ou igual ao número de
vértices, então, o grafo é hamiltoniano.
Assim, se as condições do teorema forem satisfeitas, garante-se um grafo
hamiltoniano.
O grafo G possui 6 vértices (que é maior ou igual a 3, conforme condição). Não é
informado quais vértices são adjacentes, mas como todos têm grau igual a três,
a soma dos graus de quaisquer pares de vértices é igual a 6. Para os vértices não
adjacentes, a soma de seus graus também é 6, atendendo à outra condição do
teorema.
Portanto, o grafo G é hamiltoniano.
5. O grafo G não é euleriano. O Teorema de Euler atesta que o grafo ter grau par em
todos os vértices é uma condição necessária e suficiente para ser euleriano.
O grafo G apresentado possui os vértices v1 e v2 com grau ímpar, portanto, não é
euleriano.
5 Problemas em Grafos
1. Uma clique é um subconjunto de vértices que induz o subgrafo completo do grafo
original. No grafo apresentado tem-se 12 cliques, oito de tamanho 2 e quatro
cliques de tamanho 3, a saber:
• {v1, v2}
• {v2, v4}
124 Teoria dos Grafos
• {v4, v5}
• {v1, v5}
• {v1, v3}
• {v2, v3}
• {v3, v4}
• {v3, v5}
• {v1, v2, v3}
• {v1, v3, v5}
• {v2, v3, v4}
• {v3, v4, v5}
2. A clique máxima nesse grafo é {v2, v7, v5, v4}, que induz a um subgrafo K4. Observe
a seguir o grafo apresentado com as arestas adjacentes aos vértices da clique em
tracejado.
v7 v5
v1v4
v2
v3
v6
3. Grafo K3,3:
v4 v5 v6
v2 v3v1
Uma cobertura de arestas é: {(v1, v4), (v2, v5), (v3, v6)} e pode ser vista em tracejado a
seguir.
v4 v5 v6
v2 v3v1
Gabarito 125
4. Pelo Corolário 5.2, um grafo planar tem seu número de arestas limitado pela
seguinte fórmula: a ≤ 3n – 6. Assim, um grafo planar, contendo oito vértices, possui,
no máximo, 18 arestas.
5. O Teorema de Kuratowski afirma que um grafo é planar, se, e somente se, não
possuir um subgrafo homeomorfo a K5 ou K3,3.
Como se quer provar que o grafo não é planar, para conseguir um subgrafo pode-se
remover arestas ou vértices até encontrar um grafo homeomorfo a K5 ou K3,3.
Para o grafo em questão, removem-se as arestas (v8, v6) e (v1, v7), obtendo-se o
seguinte grafo:
v7
v6v8
v1
v2v5
v3v4
Esse grafo é homeomorfo a K5 e isso pode ser observado, pois, se forem removidas
as séries 1) (v4, v8), (v8, v5); 2) (v4, v7), (v7, v3); e 3) (v2, v6) e (v6, v3), obtém-se exatamente
o K5, como pode ser observado no grafo a seguir, provando que o grafo original
não é planar.
v4 v3
v2v5
v1
6. O número cromático do grafo é 2, pois é possível usar, no mínimo, duas cores para
colori-lo. A seguir tem-se o resultado da aplicação da coloração no grafo.
v7
v6
v8
v1
v2
v5
v3
v4
Razer Anthom Nizer Rojas Montaño
TEORIA DOS GR
AFOS
Razer Anthom
N
izer Rojas M
ontaño
Código Logístico
59398
Fundação Biblioteca Nacional
ISBN 978-85-387-6636-0
9 7 8 8 5 3 8 7 6 6 3 6 0
Página em branco
Página em branco