Escolar Documentos
Profissional Documentos
Cultura Documentos
3
Caminhos em Grafos
Caminhos em Grafos
●
O caminho mais curto é um dos mais importantes
– Aplicações práticas diretas
5
Caminhos em Grafos
●
O caminho mais curto é um dos mais importantes Medidas faciais:
menor distância entre
– Aplicações práticas diretas duas landmarks
– Outros problemas de grafos
●
Distância entre vértices
6
Caminhos em Grafos
●
O caminho mais curto é um dos mais importantes
– Aplicações práticas diretas
– Outros problemas de grafos
●
Distância entre vértices Também conhecido
como caminho mínimo
7
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
8
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
9
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
Já sabemos achar?
10
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
Já sabemos achar?
Busca em largura!
11
Caminhos em Grafos
●
Caminho mais curto
– Grafo ponderado: É aquele cuja soma dos pesos
das arestas entre u e v é a menor possível
Já sabemos achar?
12
Caminhos em Grafos
●
Caminho mais curto
– Grafo ponderado: É aquele cuja soma dos pesos
das arestas entre u e v é a menor possível
Já sabemos achar?
NÃO!
13
Caminhos em Grafos
●
Caminho mais curto
– Grafo ponderado: É aquele cuja soma dos pesos
das arestas entre u e v é a menor possível
14
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
– Grafo ponderado: É aquele cuja soma dos pesos Arestas de
das arestas entre u e v é a menor possível peso 1
15
Caminhos em Grafos
●
Caminho mais curto
– Grafo não ponderado: É aquele cuja soma do número de arestas
entre os vértices u e v é a menor
– Grafo ponderado: É aquele cuja soma dos pesos Arestas de
das arestas entre u e v é a menor possível peso 1
Está na classe
de problemas P
16
Caminhos em Grafos
●
Caminho mais longo NP-Difícil
– É o caminho com maior peso possível dentre os existentes
17
Caminhos em Grafos
●
Problema dos caminhos disjuntos em arestas
– Dados um grafo G=(N,M) não direcionado
e um conjunto S de pares de vértices.
– O problema consiste em conectar através de
caminhos disjuntos em arestas tantos pares
do conjunto S quantos forem possíveis.
●
Qualquer par de caminhos não pode ter
uma aresta em comum
18
Caminhos em Grafos
●
Problema dos caminhos disjuntos em vértices
– Dados um grafo G=(N,M) não direcionado
e um conjunto S de pares de vértices.
– O problema consiste em conectar através de
caminhos disjuntos em vértices tantos pares
do conjunto S quantos forem possíveis
●
Qualquer par de caminhos não pode ter
um vértice em comum
19
Caminhos em Grafos
●
Problema dos caminhos disjuntos em vértices
– Dados um grafo G=(N,M) não direcionado
e um conjunto S de pares de vértices.
– O problema consiste em conectar através de
caminhos disjuntos em vértices tantos pares
do conjunto S quantos forem possíveis
●
Qualquer par de caminhos não pode ter
um vértice em comum
20
Caminhos em Grafos
●
Algoritmos
21
Algoritmos de Dijkstra
Algoritmo de Dijkstra
●
Descobre o menor caminho entre um vértice de origem e outro
vértice do grafo
Pode descobrir para
todos os outros também
23
Algoritmo de Dijkstra
●
Descobre o menor caminho entre um vértice de origem e outro
vértice do grafo
●
Ideia: um percurso que vai abrindo a partir do vértice descoberto
de menor peso
Qual a
diferença
do percurso
em largura?
E em pro-
fundidade?
24
Algoritmo de Dijkstra
ALGORITMO: Dijkstra(G[V,A], origem)
para cada vértice v em V faça
dist[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q ∞ ; ante[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q 0 ; adiciona v em Q
dist[origem] ← ∞ ; ante[v] ← 0 ; adiciona v em Q 0
enquanto Q ≠ Ø faça
u ← ∞ ; ante[v] ← 0 ; adiciona v em Q vértice onde dist[u] é o menor em Q
remova u de Q
para cada vizinho v de u em Q faça
d ← ∞ ; ante[v] ← 0 ; adiciona v em Q dist[u] + peso(u, v)
se d < dist[v] então
dist[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q d ; ante[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q u
retorne dist[], ante[]
25
Algoritmo de Dijkstra
ante[]
dist[]
26
Algoritmo de Dijkstra
27
Algoritmo de Dijkstra
28
Algoritmo de Dijkstra
29
Algoritmo de Dijkstra
30
Algoritmo de Dijkstra
31
Algoritmo de Dijkstra
32
Algoritmo de Dijkstra
33
Algoritmo de Dijkstra
34
Algoritmo de Dijkstra
Seria necessário
analisar, uma vez que
achou o vértice j? 35
Algoritmo de Dijkstra
36
Algoritmo de Dijkstra
●
Exercício:
37
Algoritmo de Dijkstra
●
Exercício:
FONTE: https://pt.wikipedia.org/wiki/Algoritmo_de_Dijkstra 38
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
39
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
Prova de corretude
Por indução nos
vértices descobertos
40
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Propriedade: Considerando que o vértice v visitado, então dist[v] é o
caminho mais curto entre a origem até o vértice v.
Quem não
está em Q
41
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Propriedade: Considerando que o vértice v visitado, então dist[v] é o
caminho mais curto entre a origem até o vértice v. Sendo o vértice u
descoberto, então dist[u] é assumido como a menor distância usando
um caminho de nós visitados.
Quem ainda
está em Q
42
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Propriedade: Considerando que o vértice v visitado, então dist[v] é o
caminho mais curto entre a origem até o vértice v. Sendo o vértice u
descoberto, então dist[u] é assumido como a menor distância usando
um caminho de nós visitados.
– Base da indução: No início há somente o nó de origem, sendo assim
trivial.
43
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Propriedade: Considerando que o vértice v visitado, então dist[v] é o
caminho mais curto entre a origem até o vértice v. Sendo o vértice u
descoberto, então dist[u] é assumido como a menor distância usando
um caminho de nós visitados.
– Base da indução: No início há somente o nó de origem, sendo assim
trivial.
– Hipótese da indução: A propriedade vale para todos os nós
descobertos até imediatamente antes da inserção de um vértice u.
44
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Passo de indução: Se o vértice u foi escolhido pelo algoritmo, então
dist[u] é mínimo dentre todos os vértices em A. Deve-se mostrar que
dist[u] é o comprimento do menor caminho entre o vértice origem e u.
45
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Passo de indução: Se o vértice u foi escolhido pelo algoritmo, então
dist[u] é mínimo dentre todos os vértices em A. Deve-se mostrar que
dist[u] é o comprimento do menor caminho entre o vértice origem e u.
– Por contradição, ou seja, existe pelo menos um vértice x no menor
caminho entre a origem e u, que não pertence ao caminho atual de
comprimento dist[u], tal que dist[x] < dist[u] e x ainda não foi visitado.
dist[u]
u
origem
46
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Passo de indução: Se o vértice u foi escolhido pelo algoritmo, então
dist[u] é mínimo dentre todos os vértices em A. Deve-se mostrar que
dist[u] é o comprimento do menor caminho entre o vértice origem e u.
– Por contradição, ou seja, existe pelo menos um vértice x no menor
caminho entre a origem e u, que não pertence ao caminho atual de
comprimento dist[u], tal que dist[x] < dist[u] e x ainda não foi visitado.
dist[u]
u
origem
dist[x] x
47
Algoritmo de Dijkstra
●
Teorema 8: O algoritmo de Dijkstra encontra o caminho mais
curto de um vértice fonte aos demais vértices do grafo
●
Prova:
– Passo de indução: Se o vértice u foi escolhido pelo algoritmo, então
dist[u] é mínimo dentre todos os vértices em A. Deve-se mostrar que
dist[u] é o comprimento do menor caminho entre o vértice origem e u.
– Por contradição, ou seja, existe pelo menos um vértice x no menor
caminho entre a origem e u, que não pertence ao caminho atual de
comprimento dist[u], tal que dist[x] < dist[u] e x ainda não foi visitado.
Nesse caso, o algoritmo deveria ter escolhido x em vez de u. Mas o
algoritmo escolheu u, significando que este nó x não existe. Portanto,
quando u é escolhido caminho mais curto da origem a u é encontrado.
48
Algoritmo de Dijkstra
●
Complexidade:
O(n)
ALGORITMO: Dijkstra(G[V,A], origem)
para cada vértice v em V faça
dist[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q ∞ ; ante[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q 0 ; adiciona v em Q
dist[origem] ← ∞ ; ante[v] ← 0 ; adiciona v em Q 0
O(n)
enquanto Q ≠ Ø faça
Busca linear O(n)
u ← ∞ ; ante[v] ← 0 ; adiciona v em Q vértice onde dist[u] é o menor em Q
remova u de Q
O(n2)
para cada vizinho v de u em Q faça
d ← ∞ ; ante[v] ← 0 ; adiciona v em Q dist[u] + peso(u, v)
O(n)
se d < dist[v] então
dist[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q d ; ante[v] ← ∞ ; ante[v] ← 0 ; adiciona v em Q u
retorne dist[], ante[]
49
Algoritmo de Dijkstra
●
Desvantagem:
– Só calcula caminhos a partir de uma única origem
– Para calcular os menores caminhos de todos os nós à todos os nós
seria O(n3)
– Não é possível usar o algoritmo com custo negativo
50
Algoritmo de Dijkstra
●
Desvantagem:
– Só calcula caminhos a partir de uma única origem
– Para calcular os menores caminhos de todos os nós à todos os nós
seria O(n3)
– Não é possível usar o algoritmo com custo negativo
●
No algoritmo, qualquer caminho de s para outro
vértice v deve passar apenas por vértices mais
próximos de s;
●
No exemplo, o caminho mais curto entre s e a
passa por b, que é mais distante do que a!
Fonte: http://www.decom.ufop.br/marco/site_media/uploads/pcc173/08_aula_08.pdf 51
Resumo
Resumo
●
Caminhos
– Caminho mais curto
– Caminho mais longo
– Caminhos disjuntos em Arestas e em Vértices
●
Algoritmo de Dijkstra
– Algoritmo para achar o caminho mais curto entre um vértice e todos
os outros
– Não serve para grafos com pesos negativos
53