caminhos mais curtos em grafos. a b cd fe encontrar o caminho produzido pelo algoritmo de busca em...
TRANSCRIPT
CAMINHOS MAIS CURTOS EM GRAFOS
A
B
C D
FE
Encontrar o caminho produzido pelo algoritmode busca em profundidade, ligando os vértices A a E, usando a seguinte ordenação entre os vértices: A < B < C < D < E < F
Caminho entre dois vértices usando busca em profundidade: cada ordem dos vértices produz um caminho distinto.
A
B
C
D
F
E
[1,12]
[2,11]
[3,10]
[4,9]
[5,8]
[6,7]
Árvore de Busca em Profundidade
Arestas Forward: B D C F C E A E
Arestas Back: F A
Não há arestas Cross
A
B
C D
FE
Caminho: A, B, C, D, F, ETamanho = 5
A
B
C D
FE
Encontrar o caminho produzido pelo algoritmode busca em profundidade, ligando os vértices A a E, usando a seguinte ordenação entre os vértices: A < B < C < E < D < F
A
B
C
E D
F
[1,12]
[2,11]
[3,10]
[4,5][6,9]
[7,8]
Árvore de Busca em ProfundidadeCaminho: A, B, C, ETamanho = 3
EXISTE ORDENAÇÃO DE VÉRTICES QUE PRODUZ CAMINHO MAIS CURTO ENTRE A e E ? SIM !!
A < E < B < D < C < F CAMINHO [A,E]TAMANHO = 1
A
B
C D
FE
A
E B
D
F
C
[1,12]
[2,3][4,11]
[5,8]
[6,7]
[9,10]
CROSS = C F, C D, F E, C EBACK = F A
BUSCA EM LARGURA
A
B
C D
FE
Busca em largura sempre produz •Caminho mais curto entre dois vértices, Independente da ordenação escolhida dos vértices.
A
B E Nivel 1
Nivel 0
C D
F
Nivel 2
Nivel 3
Algoritmo Busca em LarguraInput: Grafo G (dirigido ou não), vértice SOutput: para cada vértice v, dist(v) de S a v, distância do menor caminho entre
S e v.
1. Para todo vértice u O(|V|) 2. dist(u) = infinito3. dist(S) = 04. Q = [S] (Q é uma fila) 5. While Q ≠ O(|V|)6. u = eject(Q)7. Para cada aresta uv O(|E|) Cada aresta é testada 2 vezes8. se dist(v) = infinito9. inject(Q,v);10. dist(v) = dist(v) + 1
Complexidade = O(|V| + |E|)
Caminho mais curto em grafos com distâncias entre vértices
A
B
C D
FE
3082
1112
2304
A
B E Nivel 1
Nivel 0
C D
F
Nivel 2
Nivel 3
Busca em Largura a partir de Aproduz caminho com menor númerode arestas : A BC F
O custo deste caminho se contabilizarmos as distâncias entre as arestas é = 39
8
1
30
Caminho mais curto em grafos com distâncias entre vértices
A
B
C D
FE
82
1112
2304
Caminho mais curto: A B C D F Tem 4 arestas Custo = 20
A
B
C D
FE
82
11
1
2
2
304
1
Algoritmo para determinar caminho mais curto com distâncias
Algoritmo de Dijkstra
Filas com prioridade
Idéia do algoritmo Dijkstra
A B
C
4
2 1
A 0B infC inf
Fila com prioridade
B 4C 2
B 3
Idéia do algoritmo Dijkstra
A B
C
4
2 1
A 0B infC inf
Fila com prioridade
B 4C 2
B 3
Algoritmo de DijkstraInput: Grafo G (dirigido ou não), vértice S, cada aresta e tem uma dist(e)
associada.Output: para cada vértice v, dist(v) de S a v, distância do menor caminho entre S
e v.1. Para todo vértice u2. dist(u) = infinito3. prev(u) = nil 4. dist(S) = 05. Constrói H = fila com prioridade contendo os vértices de G (prioridade é a
menor distância a seus filhos) 6. While H ≠7. u = deletemin(H)8. Para cada aresta uv (arestas são ordenadas em ordem descrescente das
distâncias)9. se dist(v) > dist(u) + dist(u,v)10. dist(v) = dist(u) + dist(u,v)11. prev(v) = u12. Ajusta_valor(H,v) (v é recolocado com sua prioridadade ajustada)