Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 9
Aulapassada
Grafosdirecionados
Buscaemgrafos
direcionados
Ordenao
topolgica
Auladehoje
Grafoscompesos
Dijkstra
Implementao
Filadeprioridadese
Heap
Dijkstra(oprprio)
Relacionamentos de Peso
Relacionamentos entre objetos nem sempre
so idnticos (mesma intensidade)
Exemplos?
Amizade
mais ou menos amigo
(Orktut)
Distncia fsica
perto ou longe
Tempo de translado
Como
representar tais
relacionamentos?
w:E
Graficamente
1
-1
2.1
3
2
log(2)
4
-2
5
5
w((2,6)) = 7
w((5,6)) = log(2)
w((2,4)) = 0
Figueiredo 2011
Distncia
comprimento do menor caminho simples de
entre dois vrtices
Graficamente
1
-1
2.1
3
2
log(2)
4
-2
5
7
Figueiredo 2011
Figueiredo 2011
Sampa
BH
Santos
429Km
586Km
716Km
72Km
434Km
Rio
4
2
4
2
2
3
Algoritmo
de Dijkstra!
Comear em a, expandir
Qual prximo vrtice?
Qual vrtice nos d caminho mnimo
garantido?
Figueiredo 2011
Algoritmo de Dijkstra
Como tornar a idia em algoritmo?
adicionar o vrtice para o qual temos o
menor caminho
Idias:
Manter dois conjuntos de vrtices
Manter comprimento do menor caminho
conhecido at o momento para cada vrtice
Adicionar o vrtice de menor caminho
Atualizar distncias
Figueiredo 2011
Algoritmo de Dijkstra
1.Dijkstra(G, s)
2.Para cada vrtice v
3.
dist[v] = infinito
4.Define conjunto S = 0 // vazio
5.dist[s] = 0
6.Enquanto S != V
7.
Selecione u em V-S, tal que dist[u] mnima
8.
Adicione u em S
9.
Para cada vizinho v de u faa
10.
Se dist[v] > dist[u] + w((u,v)) ento
11.
dist[v] = dist[u] + w((u,v))
Executando o Algoritmo
1
4
2
4
2
2
3
1
{a,b}
{a,b,e}
{a,b,e,d}
{a,b,e,d,c}
{a,b,e,d,c,f}
{a,b,e,d,c,f,g}
d(c)
inf
inf
5
5
4
d(d) d(e)
inf inf
4
2
3
2
3
d(f)
inf
inf
inf
5
5
5
d(g)
inf
inf
inf
inf
inf
6
6
Figueiredo 2011
Analizando o Algoritmo
Provar que algoritmo sempre produz
resultado correto caminho mnimo
entre dois vrtices
Teorema:
Considere um vrtice u pertencente ao
conjunto S em qualquer ponto do
algoritmo. Temos que dist[u] a
distncia entre s e u.
Figueiredo 2011
Prova
Prova por induo no tamanho de S
Caso base: |S| = 1
S = {s}, dist[s] = 0, devido inicializao
Hiptese: |S| = k
Para |S| = k, assuma que dist[u] igual a
distncia entre s e u
Prova
Considere outro caminho s-v, P, que no passa por u
Precisamos provar que P maior (ou igual) a Pv
P passa pela aresta (x,y), com x em S e y fora de S
(para algum x e y qualquer)
Situao:
s
u
Complexidade
Qual a complexidade do algoritmo?
1.Dijkstra(G, s)
2.Para cada vrtice v
3.
dist[v] = infinito
4.Define conjunto S = 0 // vazio
5.dist[s] = 0
6.Enquanto S != V
7.
Selecione u em V-S, tal que dist[u] mnima
8.
Adicione u em S
9.
Para cada vizinho v de u faa
10.
Se dist[v] > dist[u] + w((u,v)) ento
11.
dist[v] = dist[u] + w((u,v))
Complexidade
Algoritmo simples
Percorre vrtices e encontra dist[u] mnimo
Complexidade?
O(n )
Outra idia?
Fila de prioridades muito usada em grafos!
Chave: distncias
Extrair o mnimo (vrtice com menor distncia)
Atualizar chaves (distncias)
Figueiredo 2011
Fila de Prioridade
Estrutura de dados poderosa (priority queue)
Mantm um conjunto de elementos S
Cada elemento possui uma chave (nmero
de prioridade)
Permite inserir, remover e modificar
elementos de S atravs de sua chave
Permite remover menor chave (maior
prioridade)
Complexidade para inserir ou modificar
elemento: O(log n)
Figueiredo 2011
Heap
Como implementar Fila de Prioridade?
Heap!
O que um heap?
Estrutura de dados em rvore
Armazena conjunto de elementos, todos
associados a uma chave
Chave dos elementos define rvore
Heap order: chave(u) <= chave (v), quando u
pai de v
Figueiredo 2011
Heap - Exemplo
7
8
9
10
12
15
Figueiredo 2011
Complexidade
Usando um heap?
1.Dijkstra(G, s)
2.Para cada vrtice v
3.
dist[v] = infinito
4.Define conjunto S = 0 // vazio
5.dist[s] = 0
6.Enquanto S != V
7.
Selecione u em V-S, tal que dist[u] mnima
8.
Adicione u em S
9.
Para cada vizinho v de u faa
10.
Se dist[v] > dist[u] + w((u,v)) ento
11.
dist[v] = dist[u] + w((u,v))
Figueiredo 2011
Dijkstra, o Prprio
Edsger Wybe Dijkstra
Professor e pesquisador na
rea de Cincia da
Computao
Recebeu Turing Award 1972
mais renomado prmio da
Computao
Contribuies fundamentais
11/5/1930 6/8/2002
em ling. de programao e
verificao formal
Algoritmo de Dijkstra utilizado em
vrios sistemas (redes, GPS, etc)
Figueiredo 2011