Você está na página 1de 104

Teoria dos Grafos 2011/01

Algoritmo de Dijkstra Estudo e Implementao


Professora: Claudia Boeres Alunos: Jos Alexandre Macedo Maycon Maia Vitali

Problema do Caminho Mnimo


Qual o caminho mnimo entre um vrtice e os demais de um grafo?

Problema do Caminho Mnimo


Aplicaes
Calculo de rotas

Problema do Caminho Mnimo


Aplicaes
Algoritmos de roteamento (Vetor de Distncias)

Problema do Caminho Mnimo


Aplicaes
Pr computao para heursticas do Caixeiro Viajante

Soluo mais simples...


O algoritmo de busca em largura (BFS) calcula o caminho mnimo entre os vrtices de grafos no valorados
4 0 1 2

2
0

2 1

5
3 1 3

5
1

Algoritmo de Dijkstra
Encontra o caminho mnimo de origem nica
Caractersticas
Funciona para grafos ponderados
Apenas para arestas com peso positivo

Os grafos podem conter ciclo

Algoritmo de Dijkstra

Relembrando o algoritmo...

Algoritmo de Dijkstra
Estruturas necessrias

Algoritmo de Dijkstra

Algoritmo de Dijkstra
Vrtice inicial

Funo de peso

Remove vrtice com distncia mnima do conjunto Q

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{1, 2, 3, 4, 5, 6}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{1, 2, 3, 4, 5, 6}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1}
0

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

NULL

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

NULL

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

NULL

NULL

NULL

NULL

12

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{2, 3, 4, 5, 6} {1} 1

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{3, 4, 5, 6} {1} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
12

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

1
9

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

NULL

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

NULL

NULL

NULL

11

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

NULL

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

NULL

NULL

15

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{3, 4, 5, 6} {1, 2} 2

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{4, 5, 6} {1, 2} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
15

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

2
13

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{4, 5, 6} {1, 2, 3} 3

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{5, 6} {1, 2, 3} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

NULL

32

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{5, 6} {1, 2, 3, 4} 4

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{6} {1, 2, 3, 4} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
32

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

4
28

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{6} {1, 2, 3, 4, 5} 5

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{} {1, 2, 3, 4, 5} 6

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{} {1, 2, 3, 4, 5, 6} 6

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{} {1, 2, 3, 4, 5, 6} 6

Simulao
8 1 12 3 4 5

2
1

4 7 5

21 6 15

NULL

1
8

2
9

2
11

3
13

5
28

{} {1, 2, 3, 4, 5, 6} FIM! 6

Implementao
Estruturas de dados considerada
Lista de adjacncia com pesos nos ns
v0 v1 v2 v3 v3 v3 v0 v0 v2
NULL NULL

v3 v1

NULL

v2

NULL

Algoritmo implementado utilizando heaps

H?! heap!?
Caractersticas dos heaps (rvores especiais):
Se B filho de A, ento valor(B) > valor(A) Implementaes de fila de prioridade

Heaps mais comuns


heap binrio: STL priority_queue do C++ heap binomial heap de fibonacci: implementado no trabalho

Heap Binrio
Implementaes de min-heap ou max-heap
Implementado pela STL priority_queue do C++ Complexidade:
Insero
O(log n)

Remoo do mnimo
O(log n)

Heap de Fibonacci
Composto por vrias rvores enraizadas Cada n x possui como apontadores:
p[x] para seu pai child[x] para qualquer um de seus filhos left[x] e right[x] para seus irmo
Fila circular duplamente encadeada No ns raiz, left[x] e right[x] apontam para os ns razes vizinhos.

min[H] aponta para o valor mnimo do heap

Exemplo de Heap de Fibonacci

Exemplo de Heap de Fibonacci

Heap de Fibonacci: Insero

Heap de Fibonacci: Insero

Inserir um elemento 21 no heap = O(?)

Heap de Fibonacci: Insero

Inserir um elemento 21 no heap = O(1)

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

Heap de Fibonacci: Extrair Mnimo

O(log n)

Implementao: Complexidade
Estruturas de Dados Consideradas
Heap Binrio INSERO REMOVE-MIN O(log n) O(log n) Vetor Esttico O(1) O(n) Heap de Fibonacci O(1) O(log n)

Tipo de grafos
Grafo Genrico Heap Binrio Vetor Esttico Heap de Fibonacci O((v + e) log v) O(v) O(e + v log v) Grafo Denso e v(v-1)/2 = O(v) O(v log v) O(v) O(v + v log v) = O(v) Grafo Esparso e v-1 = O(v) O(v log v) O(v) O(v + v log v) = O(v log v)

Implementao
Linguagem
C++

Bateria de Testes
Grafos
Denso Esparso Completo

Nmero de vrtices variando entre 50 e 5000 (de 50 em 50 com um total de 300 amostras)

Testes
Esparso (5,4 Mb)

Testes
Esparso (5,4 Mb)

Denso (3,9 Gb)

Testes
Esparso (5,4 Mb)

Denso (3,9 Gb)

Completo (4,8 Gb)

Testes
Esparso (5,4 Mb)

Denso (3,9 Gb)

Completo (4,8 Gb)

~9Gb de Grafos!!

Resultados (Grafos Esparso)

Resultados (Grafos Denso)

Resultados (Grafos Completo)

Concluso

Qual a melhor estrutura?