Você está na página 1de 53

Teoria dos Grafos

Prof. Suzana Matos França de Oliveira


Revisão
Revisão

Algoritmo de Roy para componentes fortemente conexas
– Baseado em verificar quem são os sucessores e os antecessores

Algoritmo de Warshall para fechos transitivos
– Baseado em colocar arestas para os sucessores dos sucessores

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

Se for disjunto arestas é


também em vértices?
E o contrário?

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

Você também pode gostar