Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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