Você está na página 1de 8

CCAE

Centro de
Ciências
Aplicadas
e Educação
UFPB - Campus IV - Litoral Norte

Algoritmos Avançados
Grafos - Parte 2: Caminhos Mínimos
Sumário
 O Problema do Menor Caminho
 Single-pair Shortest Path

 Single-source Shortest Path

 Single-destination Shortest Path

 All-pairs Shortest Path

2
O Problema do Menor Caminho
 O Problema do Menor Caminho significa
encontrar o caminho entre dois vértices A e B em
um grafo cuja soma dos pesos das arestas no
caminho é mínima
 Exemplo: Encontrar a menor distância entre
dois pontos em um mapa rodoviário.
 Função básica de todo navegador GPS

3
Generalizações do Problema do Menor
Caminho
 Single-pair shortest path
 Encontrar o menor caminho entre um par de vértices
em um grafo
 Single-source shortest path
 Encontrar um menor caminho de um vértice V para
todos os outros vértices do grafo
 Single-destination shortest path
 Encontrar o menor caminho de qualquer vértice de um
grafo para o vértice V
 All-pairs shortest path
 Encontrar o menor caminho entre quaisquer dois
vértices de um grafo 4
Single-source [pair,destination] Shortest
Path
 Os problemas Single-pair shortest path e Single-
destination shortest path podem ser resolvidos por
qualquer algoritmo para o Single-source shortest
path
 Single-pair shortest path: interromper o algoritmo ao achar o
nó destino
 Single-destination shortest path: inverter o sentido das arestas

 Se todas as arestas têm o mesmo peso, o problema


pode ser resolvido facilmente utilizando uma
Busca em Amplitude, como visto nas aulas
anteriores
 Se os pesos das arestas são diferentes mas todos
5
positivos, pode-se utilizar o algoritmo de Dijkstra
O(n2)
Algoritmo de Dijkstra O(n2)
Entrada:
n => número de nós
custo => matriz n x n com o custo dos nós (ou pesos)
s => nó de onde começaremos o caminho (nó inicial)

Saída: c[], vetor de tamanho n, com os custos mínimos do vértice s para qualquer outro
vértices no grafo

Algoritmo:
inicialize fecho[] de tamanho n com falso
inicialize c[] de tamanho n com os custos iniciais (c[i] = custo[s][i])
fecho[s] = true

para i de 1 até n ­ 1
cMin = MAX_INT
jMin = 0
para j de 1 até n
se fecho[j] = false e c[j] < cMin
cMin = c[j]
jMin = j
fecho[jMin] = true 6
para j = 1 até n
se c[j] > c[jMin] + custo[jMin][j]
c[j] = c[jMin] + custo[jMin][j]
All-Pairs Shortest Path
 Para resolver este problema é preciso encontrar
o menor caminho entre quaisquer dois nós de um
grafo

 Ao resolver este problema, resolvemos também


os outros três!

 Por incrível que pareça, o algoritmo mais


utilizado para resolver este problema é mais
simples de implementar do que o de Dijkstra!
7
Algoritmo de Floyd-Warshall O(n3)
Entrada:
n => número de nós
custo => matriz n x n com o custo dos nós (ou pesos)

Saída:
D[n]=> matriz n x n, com o custo mínimo entre quaisquer dois nós no
grafo

Algoritmo:
inicialize D[0] (matriz n x n x n) com os valores em custo
para k de 1 até n
para i de 1 até n
para j de 1 até n
d[k][i][j] = min(d[k-1][i][j], d[k-1][i][k] + d[k-1][k][j]);

retorna D[n] 8

Você também pode gostar