Você está na página 1de 34

Matemática Discreta – Aula 7 - Grafos

UFMT – Campus Universitário do Araguaia

Curso de Ciência da Computação

Prof. Ivairton M. Santos

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 𝐺.

𝐻 = 𝐺 com as arestas do 𝑐𝑖𝑐𝑙𝑜 removidas

Enquanto 𝐻 tiver arestas:


𝑠𝑢𝑏𝑐𝑖𝑐𝑙𝑜 = um ciclo aleatório que comece em algum vértice de 𝐻 que
também esteja no 𝑐𝑖𝑐𝑙𝑜
𝐻 = 𝐻 com as arestas do 𝑠𝑢𝑏𝑐𝑖𝑐𝑙𝑜 e vértices isolados removidos
𝑐𝑖𝑐𝑙𝑜 ∪ 𝑠𝑢𝑏𝑐𝑖𝑐𝑙𝑜 com o 𝑠𝑢𝑏𝑐𝑖𝑐𝑙𝑜 inserido no vértice onde iniciou

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

 Entrada: Grafo G = 𝐸, 𝑉 e um vértice inicial 𝑠


 Saída: Distância do caminho mais curto de um dado
vértice 𝑠 para todos os outros vértices do grafo
Algoritmo de Dijkstra
1. Atribua valor zero à estimativa do custo mínimo do vértice s (a raiz
da busca) e infinito às demais estimativas;
2. Atribua um valor qualquer aos precedentes (o precedente de um
vértice t é o vértice que precede t no caminho de custo mínimo
de s para t);
3. Enquanto houver vértice aberto:
1. seja k um vértice ainda aberto cuja distância seja a menor dentre todos
os vértices abertos;
2. feche o vértice k
3. Para todo vértice j ainda aberto que seja sucessor de k faça:
1. some a estimativa do vértice k com o custo da aresta que une k a j;
2. caso esta soma seja melhor que a estimativa anterior para o vértice j,
substitua-a e anote k como precedente de j.
UFMT - Ciência da Computação - Prof. Ivairton M. Santos

Árvore geradora mínima

22
UFMT - Ciência da Computação - Prof. Ivairton M. Santos

Árvore geradora mínima

Uma árvore geradora de um grafo 𝐺 = 𝑉, 𝐸 é uma árvore


não-enraizada 𝐺′ = (𝑣′, 𝑒′) cujo conjunto de vértices 𝑣 ′ = 𝑉 e
cujas arestas 𝑒 ′ ⊂ 𝐸.

 Uma árvore geradora mínima conecta todos os vértices


de um grafo, sem arestas redundantes (ciclos).
 O algoritmo de PRIM permite obter a árvore geradora
mínima, sendo parecido com o algoritmo de Dijkstra.

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.

 Em árvores fazemos isso por meio dos percursos:


 Pré-ordem;
 Ordem (In-ordem);
 Pós-ordem.

 Em grafos genéricos fazemos por dois métodos:


 Busca em largura;
 Busca em profundidade.
29
Busca em Árvores – Princípio do algoritmo
 Pré-ordem(nó T) {
Escreva/acesse( T )
Pré-ordem( T.filho_esq )
Pré-ordem( T.filho_dir )
}

 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(𝑄, 𝑎)

Enquanto 𝑄 não está vazia faça


Para cada vértice 𝑛 adjacente a Primeiro(𝑄) faça
Se 𝑛 não foi visitado então
Marque 𝑛 como visitado
Escreva/acesse(𝑛)
IncluiNaFila(𝑄, n)
TiraDaFila(𝑄)

}
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

Você também pode gostar