CR Modulo4
CR Modulo4
CR Modulo4
Prof. Vladi
Baseados nos slides dos professores de CR
Jesús, Fabrício, Carlos K.
Algoritmos de caminhos mínimos
Caminhos mínimos - Motivação
Motivação
Existem diversos caminhos que podem ser percorridos para
chegar de um vértice a outro (e.g, enviar uma informação).
Ideia:
Minimizar (ou maximizar) um determinado valor.
Por exemplo:
- Minimizar o custo ou o tempo gasto.
- Maximizar o lucro ou o ganho.
Caminhos mínimos - Motivação
Exemplo 1
Considere uma empresa de entregas, com um centro de
distribuição e um caminhão.
Problema:
Dada uma lista de endereços de entrega encontrar uma
sequência que minimize a kilometragem total do caminhão
para realizar todas as entregas
Caminhos mínimos - Motivação
Vértices:
Endereços de entrega.
Arestas:
Uma rota conectando 2
endereços de entrega.
Peso/custo:
Distâncias entre as
extremidades.
Caminhos mínimos - Motivação
Exemplo 2
Considere um programa de GPS para o cálculo da “melhor
rota” entre dois pontos.
Problema:
Dado um endereço de origem e destino, encontrar um
camino mínimo entre a origem e o destino, i.e., encontrar a
rota com a menor distância.
Caminhos mínimos - Motivação
Vértices:
Cruzamentos entre ruas.
Arestas:
Cada trecho de rua.
Peso/custo:
Comprimento do trecho (em
kilometros)
Distância
b c Distância entre:
h,e = 3
h,k = Infinito
a d f
e k
Distância
3 7
E.g., distância para
e k percorrer estradas; energia
elêtrica utilizada; tempo
para receber informações
da Internet
Distância
h
1
1
b c Distância entre:
h,k = Infinito
5 7 1
h,e = ?
a d f
2 10
3 7
e k
Distância
h
1
1
b c Distância entre:
h,k = Infinito
5 7 1
h,e = 8
a d f
2 10
3 7
e k
Distância
h
1
1
b c Distância entre:
h,k = Infinito
5 7 1
h,e = 8
a d f
2 10 O comprimento de
um caminho é a
3 7
soma dos
e k pesos/custos das
arestas do caminho.
Busca de caminhos mínimos em grafos
Algoritmos específicos:
(1) Caminhos mínimos a partir de um determinado vértice.
(2) Caminos mínimos entre todos os pares de vértices.
Dijkstra: mínimos a partir de um vértice
Caminho mínimos com origem fixa
d(x,z) ≤ d(x,y)+d(y,z)
Entrada:
Grafo, G.
Vértices, s.
Pesos, w (não-negativos).
Saída:
Caminhos mínimos a partir de s.
Algoritmo de Dijkstra
Começando no vértice a
a
1 10
3
b e
5 1 6
c d
2
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10
∞ 3 ∞
b e
5 1 6
c d
∞ 2 ∞
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10 1 {a} 0 1 ∞ 3 10
1 3 10
b e
5 1 6
c d
∞ 2 3
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10 1 {a} 0 1 ∞ 3 10
1 3 10 2 {a,b} 0 1 6 3 10
b e
5 1 6
c d
6 2 3
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10 1 {a} 0 1 ∞ 3 10
1 3 9 2 {a,b} 0 1 6 3 10
b e
3 {a,b,d} 0 1 5 3 9
5 1 6
c d
5 2 3
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10 1 {a} 0 1 ∞ 3 10
1 3 6 2 {a,b} 0 1 6 3 10
b e
3 {a,b,d} 0 1 5 3 9
4 {a,b,d,c} 0 1 5 3 6
5 1 6
c d
5 2 3
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
1 10 1 {a} 0 1 ∞ 3 10
1 3 6 2 {a,b} 0 1 6 3 10
b e
3 {a,b,d} 0 1 5 3 9
4 {a,b,d,c} 0 1 5 3 6
5 1 6 5 {a,b,d,c,e} 0 1 5 3 6
c d
5 2 3
Algoritmo de Dijkstra
Inicialização:
Atribui uma distância infinita para todos os vértices.
O vértice de origem recebe distância zero (0).
Todos os vértices são marcados como não visitados.
Começando no vértice b
a
2 4
3
b e
6
7
3 3
c d
2
Algoritmo de Dijkstra
∞
iteração Vértices a.dis b.dis c.dis d.dis e.dis
visitados
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4
∞
b
6
3
e ∞
7
3 3
c d
∞ 2 ∞
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4 1 {b} 2 0 3 6 ∞
0
b
6
3
e ∞
7
3 3
c d
3 2 6
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4 1 {b} 2 0 3 6 ∞
0 3 2 {b,a} 2 0 3 6 6
b e 6
6
7
3 3
c d
3 2 6
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4 1 {b} 2 0 3 6 ∞
0 3 2 {b,a} 2 0 3 6 6
b e 6
6 3 {b,a,c} 2 0 3 5 6
7
3 3
c d
3 2 5
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4 1 {b} 2 0 3 6 ∞
0 3 2 {b,a} 2 0 3 6 6
b e 6
6 3 {b,a,c} 2 0 3 5 6
7
4 {b,a,c,d} 2 0 3 5 6
3 3
c d
3 2 5
Algoritmo de Dijkstra
a 0 {} ∞ ∞ ∞ ∞ ∞
2 4 1 {b} 2 0 3 6 ∞
0 3 2 {b,a} 2 0 3 6 6
b e 6
6 3 {b,a,c} 2 0 3 5 6
7
4 {b,a,c,d} 2 0 3 5 6
3 3 5 {b,a,c,d,e} 2 0 3 5 6
c d
3 2 5
Algoritmo de Dijkstra
Dijkstra(G,s,w)
Para cada vértice v em G Inicialização
v.dis = INFINITO
v.pre = VAZIO
s.dis = 0
T = todos os vértices de G
Percorre o grafo
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
Algoritmo de Dijkstra
1
t x
10 9
2 3
s
4 6
5 7
y z
2
∞ ∞ iteração Vértices
visitados
s.dis t.dis x.dis y.dis z.dis
1
t x
0 {} ∞ ∞ ∞ ∞ ∞
10 9
∞ 2 3
s
4 6
5 7
y z
2
∞ ∞
Algoritmo de Dijkstra
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
10 ∞ iteração Vértices
visitados
s.dis t.dis x.dis y.dis z.dis
1
t x
0 {} ∞ ∞ ∞ ∞ ∞
10 9 1 {s} 0 10 ∞ 5 ∞
0 2 3
s
4 6
5 7
y z
2
5 ∞
Algoritmo de Dijkstra
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
5 7
y z
2
5 7
Algoritmo de Dijkstra
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
y z
2
5 7
Algoritmo de Dijkstra
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
y z
2
5 7
Algoritmo de Dijkstra
Enquanto T != VAZIO faça
u = vértice em T com menor distância
remove u de T
Para cada vizinho v de u
d = u.dist + w(u,v)
Se d < v.dist
v.dist = d
v.pre = u
1 1 2 3 4 5
2 3
5 1 1 0 5 0 2 0
2 5 0 1 0 0
1 4 5
2 10 3 0 1 0 1 0
4 2 0 1 0 10
5 0 0 0 10 0
1 1 2 3 4 5
2 3
5 1 1 0 5 ∞ 2 ∞
2 5 0 1 ∞ ∞
1 4 5
2 10 3 ∞ 1 0 1 ∞
4 2 ∞ 1 0 10
5 ∞ ∞ ∞ 10 0
4 2 7 1 0 10
5 ∞ ∞ ∞ 10 0 …
3 6 1 0 1 ∞
4 2 7 1 0 10
5 ∞ ∞ ∞ 10 0
Algoritmo de Floyd-Warshall K=3
1 2 3 4 5 D[1,1] > D[1,3]+D[3,1] ? Não
1 0 5 6 2 ∞ D[1,2] > D[1,3]+D[3,2] ? Não
D[1,3] > D[1,3]+D[3,3] ? Não
2 5 0 1 7 ∞ D[1,4] > D[1,3]+D[3,4] ? Não
D[1,5] > D[1,3]+D[3,5] ? Não
3 6 1 0 1 ∞
4 2 7 1 0 10 D[2,1] > D[2,3]+D[3,1] ? Não
D[2,2] > D[2,3]+D[3,2] ? Não
5 ∞ ∞ ∞ 10 0
D[2,3] > D[2,3]+D[3,3] ? Não
D[2,4] > D[2,3]+D[3,4] ? SIM D[2,4]=1+1=2
D[2,5] > D[2,3]+D[3,5] ? Não
1 2 3 4 5
1 0 5 6 2 ∞ …
5 12 12 11 10 0
Algoritmo de Floyd-Warshall
1 2 3 4 5
1
1 0 4 3 2 12 2 3
2 4 0 1 2 12 5 1
3 3 1 0 1 11
1 4 5
2 1 0 10 2 10
4 2
5 12 12 11 10 0
Referências
Dijkstra
https://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/dijkstra.html