Você está na página 1de 23

Teoria dos Grafos

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?

mais ou menos tempo


Figueiredo 2011

Grafos com Pesos


Anotar arestas do grafo com intensidade
do relacionamento
peso da aresta (weight)
funo w(e) retorna peso da aresta e
Ex.

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 com Pesos


Comprimento de um caminho
soma dos pesos das arestas que definem o
caminho

Distncia
comprimento do menor caminho simples de
entre dois vrtices

Graficamente
1
-1

2.1
3
2

log(2)

4
-2

5
7

Comprimento do caminho 1,2,6,7?


Comprimento do caminho 1,3,4,7?
Comprimento do caminho 1,4,7?
Distncia entre 1 e 7?
Distncia entre 3 e 5?
Figueiredo 2011

Grafos Direcionados com Peso


Relacionamentos assimtricos com pesos
(diferentes intensidades)
Exemplo?
Mesma idia: anotar arestas do grafo com
intensidade do relacionamento
peso da aresta (weight)
funo w(e) retorna peso da aresta e
aresta direcionada, pesos potenciamente
diferentes

Figueiredo 2011

Viagem entre Cidades


Cidades brasileiras
Estradas entre cidades

Problema 1: Como saber se duas cidades esto


conectadas por estradas?
Problema 2: Qual o menor (melhor) caminho
entre duas cidades?

Figueiredo 2011

Viagem entre Cidades


Abstrao via grafos com pesos
1015Km
Brasa

Sampa

BH

Santos
429Km

586Km

716Km

72Km

434Km

Rio

Problema 1: Como saber d


seoduas
cidades esto
!
i
v
l
o
s
e
conectadas por R
estradas?
Problema 2: Qual o menor (melhor) caminho
entre duas cidades?
Figueiredo 2011

Distncia em Grafos com Peso


Calcular caminho mais curto entre cidades
calcular a distncia em grafos com peso
pesos sempre maior que zero

Dado G, com pesos


Qual a distncia do vrtice s ao d?

Como resolver este problema?


Como resolvemos o problema sem pesos?
Podemos adaptar algumas idias?
Figueiredo 2011

Distncia em Grafos com Peso


Idia
Partindo de s, expandir os caminhos,
incluindo vrtices

Mas em que ordem?


Na ordem em que caminhos
mnimos sejam garantidos!
Expandir caminhos mnimos at
chegar em d de maneira gulosa!
Figueiredo 2011

Distncia em Grafos com Peso


Exemplo: distncia de a g?
1

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))

Como o algoritmo executa?


Figueiredo 2011

Executando o Algoritmo
1

4
2

4
2

2
3

Manter tabela com


passos e distncias

ConjuntoS d(a) d(b)


{}
0 inf
{a}

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

Caso geral: |S| = k + 1


k+1 adiciona v S, dando origem a Pv
seja (u,v) ltima aresta no caminho Pv
Pela hiptese, Pu caminho mnimo s-u
Figueiredo 2011

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

No passo k+1, algortimo


escolhe v para adicionar a S (e
no y)
y

Ento, caminho sy maior ou


igual a Pv

Como dist(y,v) >=0, caminho P


ser maior ou igual a Pv
Logo, Pv caminho mnimo e
2011
dist[v] ser distncia at Figueiredo
v

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))

Depende do tempo para selecionar u


tal que dist[u] seja mnima!
Figueiredo 2011

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

Chaves podem inseridas, removidas ou


mudar de valor
Heap precisa ser reajustado heapify
custo O(log n)

Manter rvore balanceada

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))

Cada operao no heap: O(log n)


n operaes de remoo
m operaes de atualizao
Complexidade: O((n+m)log n) = O(m log n)

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

Você também pode gostar