Escolar Documentos
Profissional Documentos
Cultura Documentos
2017
Caminhos em Grafos
Caminho Euleriano
Ciclo Hamiltoniano
Caminho Euleriano
Um matemático suíço Leonhard Euler (1707-1783)
ficou curioso com uma charada de Kõnigsberg
A charada era determinar se uma pessoa poderia passear
pela cidade passando apenas uma vez em cada ponte
Caminho Euleriano
Euler então resolveu a questão geral de quando um
grafo apresenta um caminho euleriano.
Definição: Caminho Euleriano
Um Caminho Euleriano em um grafo G é um caminho
que usa cada aresta de G exatamente uma vez.
Caminho Euleriano
Teorema dos Caminhos Eulerianos
Um grafo G possui um caminho euleriano se, e somente
se, não houver nenhum ou existirem exatamente dois
vértices ímpares.
No caso de não haver vértices ímpares, o caminho será
um ciclo, começando em qualquer vértice e terminando
neste mesmo vértice.
Para o caso de haver dois vértices ímpares, o caminho
deve começar em um vértice ímpar e terminar no outro.
Caminho Euleriano
Existe caminho euleriano no problema de Kõnigsberg?
Exercícios
Ciclo Hamiltoniano
William Rowan Hamilton (1805-1865), propôs um
problema parecido com o de Euler, o problema de se
determinar se um grafo possui um ciclo ou caminho que
usa cada vértice do grafo exatamente uma vez.
Ainda não existe um algoritmo eficiente capaz de
avaliar se um grafo possui ou não um ciclo
hamiltoniano.
Os grafos completos com 𝑛 > 2 sempre possuem um
ciclo hamiltoniano.
Ciclo Hamiltoniano
Algumas condições confirmam a existência de ciclo
hamiltoniano em casos específicos.
Teorema de Dirac
Se um grafo simples com 𝑛 vértices, sendo 𝑛 ≥ 3, tiver
cada vértice com grau maior ou igual a 𝑛/2. Então o grafo
possui ciclo hamiltoniano.
Exercícios
Quais dos grafos possuem caminho euleriano e/ou ciclo
hamiltoniano?
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmos
Caminho Euleriano e Ciclo Hamiltoniano
11
Ciclo Euleriano
Algoritmo de Hierholzer, proposto em 1873 foi um
dos primeiros a tratar ciclos eulerianos.
Usa a ideia de criar vários ciclos em grafos reduzidos
até cobrir todas as arestas.
Algoritmo de Hierholzer
Seja 𝐺 um grafo conexo com todos os vértices pares:
𝑐𝑖𝑐𝑙𝑜 = um ciclo aleatório que comece em algum vértice de 𝐺.
Retorna 𝑐𝑖𝑐𝑙𝑜
Algoritmo de Hierholzer
função Hierholzer(G = (V,E): grafo) : caminho
G' := G { G' = (V', E')}
v0 := um vértice de G'
C := [v0] {Inicialmente, o circuito contém só v0}
Enquanto E' não vazio
vi := um vértice de C tal que d(vi) > 0 em G'
C' := Circuito em G' que contém vi
G' := G' - {a | a é aresta contida em C'}
Em C, substituir o vértice vi pelo circuito C'
Retornar C
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmo de Fleury
função Fleury(G = (V,E): grafo) : caminho
G' := G { G' = (V', E')}
v0 := um vértice de G'
C := [v0] {Inicialmente, o circuito contém só v0}
Enquanto E' não vazio
vi := último vértice de C
Se vi tem só uma aresta incidente;
ai := a aresta incidente a vi em G'
Senão
ai := uma aresta incidente a vi em G' e que não é uma
ponte
Retirar a aresta ai do grafo G'
Acrescentar ai no final de C
vj := vértice ligado a vi por ai
Acrescentar vj no final de C
Retornar C
15
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Caminho Mínimo
Algoritmo de Dijkstra
Caminho Mínimo
Admita que temos um grafo simples e conexo. Então
existe um caminho entre quaisquer dois vértices. De
fato, pode haver vários desses caminhos, como
encontrar o mais curto?
Arestas com peso
Alguns grafos podem possuir um “peso” associado a
cada aresta, esse peso representa algum tipo de custo
que encontramos nos problemas reais
Um peso pode representar:
Distância entre locais
Custo ($) de passar por uma aresta
Algoritmo de Dijkstra
Para computar o caminho mais curto de um grafo, é
usado o algoritmo de Dijkstra
Caminho Mínimo - Dijkstra
Algoritmo Dijkstra:
Funciona em grafos direcionados e não direcionados;
Todas as arestas devem ter peso não negativo;
Guloso
22
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
23
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmo de PRIM
Algoritmo de PRIM (G) {
inicie de um vértice qualquer
marque o vértice inicial como processado
enquanto houver vértices não processados faça
encontre a aresta com menor peso associado,
que seja incidente a um vértice processado
e a outro que não
marque esta aresta e o vértice
fim enquanto
retorne o conjunto de vértices e arestas marcadas
24
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmo de PRIM
25
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmo de Kruskal
Algoritmo de Kruskal ( G )
ordena as arestar de G de forma crescente
repita
se próxima aresta na ordem não cria um ciclo então
inclui a aresta em T
fim se
enquanto T é conexo e contém todos os vértices de G
26
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Algoritmo de Kruskal
27
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Busca em Grafos
Busca em largura e profundidade
28
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Busca em grafos
Tem como objetivo:
Encontrar um vértice em específico;
Listar/percorrer todos os vértices do grafo.
In-ordem(nó T) {
In-ordem( T.filho_esq )
Escreva/acesse( T )
In-ordem( T.filho_dir )
}
Pós-ordem(nó T) {
Pós-ordem( T.filho_esq )
Pós-ordem( T.filho_dir )
Escreva/acesse( T )
}
Busca em profundidade
Profundidade(𝐺:grafo, 𝑎:vértice) {
marque 𝑎 como visitado
Escreva/acesse( 𝑎 )
Para cada vértice 𝑛 adjacente a 𝑎 faça
Se 𝑛 não foi visitado então
Profundidade(𝐺,𝑛)
}
Busca em Largura
Largura(𝐺: grafo, 𝑎: vértice){
𝑄: fila de vértices
Escreva/acesse(𝑎)
IncluiNaFila(𝑄, 𝑎)
}
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Exercício
Processe a busca em largura e profundidade para o grafo
a seguir, a partir do vértice a:
33
UFMT - Ciência da Computação - Prof. Ivairton M. Santos
Exercício
Desenhe as árvore de busca em profundidade, iniciando
no vértice a:
34