81
1 Grafos: caminhos mínimos SCE-183 Algoritmos e Estruturas de Dados 2 Thiago A. S. Pardo Maria Cristina Gustavo Batista

Grafos: caminhos mínimos

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Grafos: caminhos mínimos

1

Grafos: caminhos mínimos

SCE-183 Algoritmos e Estruturas de Dados 2

Thiago A. S. Pardo

Maria Cristina

Gustavo Batista

Page 2: Grafos: caminhos mínimos

2

O problema do menor caminho

Um motorista deseja encontrar o caminho mais curto possível entre duas cidades do Brasil

Caso ele receba um mapa das estradas de rodagem do Brasil, no qual a distância entre cada par adjacente de cidades está exposta, como poderíamos determinar uma rota mais curta entre as cidades desejadas?

Uma maneira possível é enumerar todas as rotas possíveis que levam de uma cidade à outra, e então selecionar a menor

Page 3: Grafos: caminhos mínimos

3

Caminhos mínimos

O problema do caminho mínimo consiste em determinar um

menor caminho entre um vértice de origem u e um vértice de

destino v

Qual o menor caminho entre s e y?

6

5

u

3

s

6

2 7

v

x y

412

3

Page 4: Grafos: caminhos mínimos

4

Caminhos mínimos

Possíveis caminhos

6

5

u

3

s

6

2 7

v

x y

412

3

0

5

3

11

9

Page 5: Grafos: caminhos mínimos

5

Caminhos mínimos

Possíveis caminhos

6

5

u

3

s

6

2 7

v

x y

412

3

0

5

3

11

9

Page 6: Grafos: caminhos mínimos

6

Caminho mínimo

Duas abordagens para caminho mínimo

Se grafo não valorado (assume-se que cada

aresta tem peso 1), busca em largura é uma boa

opção

Se grafo valorado, outros algoritmos são

necessários

Page 7: Grafos: caminhos mínimos

7

Caminho mínimo

Grafo dirigido G(V,E) com função peso

w: E que mapeia as arestas em pesos

Peso (custo) do caminho p = <v0, v1, ..., vk>

Caminho de menor peso entre u e v:

k

iii vvwpw

11 ),()(

cc

vpuderotasevupwvu

p

/}:)(min{),(

Page 8: Grafos: caminhos mínimos

8

Caminho mínimo

Menor caminho entre os vértices u e v

definido como qualquer rota p com um peso

w(p) = (u,v)

Atenção especial com ciclos e pesos

negativos

Page 9: Grafos: caminhos mínimos

9

Caminho mínimo

Qual o menor caminho entre s e v?

6

5

u

3

s

6

2 7

v

x y

41-2

3

Page 10: Grafos: caminhos mínimos

10

Camino mínimo

Se há um ciclo positivo no caminho, ele não

faz parte do caminho mínimo

Por quê?

Page 11: Grafos: caminhos mínimos

11

Caminhos mínimos Conceitos

Parte-se do vértice s, associando-se a cada vértice um

número d(v) indicando a menor distância entre s e v

Quando chegamos ao vértice v, na figura abaixo, d(v) será

min(d(u)+6, d(x)+4, d(y)+7)

6

5

u

3

s

6

2 7

v

x y

412

3

Page 12: Grafos: caminhos mínimos

12

Caminhos mínimos

Conceitos

Relaxamento de arestas

Faz-se uma estimativa pessimista para o caminho mínimo até

cada vértice: d(v)=∞

O processo de relaxar uma aresta consiste em verificar se é

possível melhorar esta estimativa passando-se pelo vértice u

u v

d(u)=5

2

d(u)=9

u v

d(u)=5

2

d(u)=7relaxamento

Page 13: Grafos: caminhos mínimos

13

Caminhos mínimos

Conceitos

Relaxamento de arestas

Faz-se uma estimativa pessimista para o caminho mínimo até

cada vértice: d(v)=∞

O processo de relaxar uma aresta consiste em verificar se é

possível melhorar esta estimativa passando-se pelo vértice u

u v

d(u)=5

2

d(u)=6

u v

d(u)=5

2

d(u)=6não se faz

relaxamento

Page 14: Grafos: caminhos mínimos

14

Caminhos mínimos

Sub-rotina para relaxamento de arestas

relax(u, v, w)

início

se d[v] > d[u]+w(u,v) então

d[v] = d[u]+w(u,v)

antecessor[v]=u

fim

Page 15: Grafos: caminhos mínimos

15

Caminho mínimo

Várias possibilidades de caminhos

Caminhos mais curtos de origem única

Caminhos mais curtos de destino único

Caminho mais curto de par único

Caminhos mais curtos de todos os pares

Page 16: Grafos: caminhos mínimos

16

Algoritmo de Bellman-Ford

Características

Caminhos mais curtos de origem única

Arestas podem ter peso negativo

Detecta ciclos negativos

Método

1. Faz estimativas pessimistas para cada vértice

2. Faz |V|-1 vezes o relaxamento de todas as arestas, garantindo que os caminhos mínimos prevaleçam

Page 17: Grafos: caminhos mínimos

17

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

s

t x

y z

6

5

-2

8 7-3

-47

9

2

Page 18: Grafos: caminhos mínimos

18

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

Estimativas pessimistas

s

t x

y z

6

5

-2

8 7-3

-47

9

2

d(t)=∞

d(s)=0

d(x)=∞

d(z)=∞d(y)=∞

Page 19: Grafos: caminhos mínimos

19

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

Rodada 1 (de |V|-1=4) de relaxamento

(t,x), (t,y), (t,z)

(x,t)

(y,x), (y,z)

(z,x), (z,s)

(s,t), (s,y)

s

t x

y z

6

5

-2

8 7-3

-47

9

2

d(t)=∞6

d(s)=0

d(x)=∞

d(z)=∞d(y)=∞7

Page 20: Grafos: caminhos mínimos

20

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

Rodada 2 (de |V|-1=4) de relaxamento

(t,x), (t,y), (t,z)

(x,t)

(y,x), (y,z)

(z,x), (z,s)

(s,t), (s,y)

s

t x

y z

6

5

-2

8 7-3

-47

9

2

d(t)=6

d(s)=0

d(x)=∞114

d(z)=∞2d(y)=7

Page 21: Grafos: caminhos mínimos

21

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

Rodada 3 (de |V|-1=4) de relaxamento

(t,x), (t,y), (t,z)

(x,t)

(y,x), (y,z)

(z,x), (z,s)

(s,t), (s,y)

s

t x

y z

6

5

-2

8 7-3

-47

9

2

d(t)=62

d(s)=0

d(x)=4

d(z)=2d(y)=7

Page 22: Grafos: caminhos mínimos

22

Algoritmo de Bellman-Ford

Exemplo (a partir de s)

Rodada 4 (de |V|-1=4) de relaxamento

(t,x), (t,y), (t,z)

(x,t)

(y,x), (y,z)

(z,x), (z,s)

(s,t), (s,y)

s

t x

y z

6

5

-2

8 7-3

-47

9

2

d(t)=2

d(s)=0

d(x)=4

d(z)=2-2d(y)=7

Page 23: Grafos: caminhos mínimos

23

Algoritmo de Bellman-Ford

Na implementação, uso do antecessor

Sempre que um relaxamento de aresta (u,v) é

realizado, o antecessor é armazenado

antecessor[v]=u

Para se saber o caminho mínimo da origem s até

qualquer vértice v, basta que se percorra o

antecessor de v até s

Page 24: Grafos: caminhos mínimos

24

Algoritmo de Bellman-FordBELLMAN-FORD(G, w, s)

início

//inicializa variáveis

para cada vértice v faça

d[v]=∞

antecessor[v]=-1

d[s]=0

//faz relaxamento de arestas e determino caminhos mais curtos

para i=1 até |V| faça

para cada aresta (u,v) faça

relax(u,v,w)

//verifica se há ciclos negativos

para cada aresta (u,v) faça

se d[v] > d[u]+w(u,v) então

retorna FALSO

retorna VERDADEIRO

fim

Page 25: Grafos: caminhos mínimos

25

Algoritmo de Bellman-Ford

Complexidade de tempo: O(|V| x |E|)

Por quê?

Page 26: Grafos: caminhos mínimos

26

Exercício

Calcule os caminhos mínimos para o grafo

abaixo a partir do vértice 0 aplicando o

algoritmo de Bellman-Ford

Page 27: Grafos: caminhos mínimos

27

Exercício

Calcule os caminhos mínimos para o grafo

abaixo a partir do vértice s aplicando o

algoritmo de Bellman-Ford

6

5

u

3

s

6

2 7

v

x y

41-2

3

Page 28: Grafos: caminhos mínimos

28

Algoritmo baseado na ordenação topológica

Características

Caminho mais curto de origem única

Grafos sem ciclos

Podem haver pesos negativos

Método

Faz-se a ordenação topológica do grafo

Percorre-se a lista de vértices relaxando-se todas

as arestas que partem de cada vértice

Page 29: Grafos: caminhos mínimos

29

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

r s t x y z5 2 7 -1 -2

6 1

3

4

2

Page 30: Grafos: caminhos mínimos

30

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Estimativas pessimistas

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=∞ d(x)=∞ d(y)=∞ d(z)=∞

Page 31: Grafos: caminhos mínimos

31

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a r

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=∞ d(x)=∞ d(y)=∞ d(z)=∞

Page 32: Grafos: caminhos mínimos

32

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a s

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=∞2 d(x)=∞6 d(y)=∞ d(z)=∞

Page 33: Grafos: caminhos mínimos

33

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a t

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=2 d(x)=6 d(y)=∞6 d(z)=∞4

Page 34: Grafos: caminhos mínimos

34

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a x

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=2 d(x)=6 d(y)=65 d(z)=4

Page 35: Grafos: caminhos mínimos

35

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a y

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=2 d(x)=6 d(y)=5 d(z)=43

Page 36: Grafos: caminhos mínimos

36

Algoritmo baseado na ordenação topológica

Exemplo (a partir de s)

Arestas adjacentes a z

r s t x y z5 2 7 -1 -2

6 1

3

4

2

d(r)=∞ d(s)=0 d(t)=2 d(x)=6 d(y)=5 d(z)=3

Page 37: Grafos: caminhos mínimos

37

Algoritmo baseado na ordenação topológica

Caminho mínimo baseado na ordenação topológica(G, w, s)

início

//ordenação topológica

ordenar topologicamente o grafo

//inicializa variáveis

para cada vértice v faça

d[v]=∞

antecessor[v]=-1

d[s]=0

//faz relaxamento de arestas e determino caminhos mais curtos

para cada vértice u tomado em seqüência topológica faça

para cada vértice v adjacente a u faça

relax(u,v,w)

fim

Page 38: Grafos: caminhos mínimos

38

Algoritmo baseado na ordenação topológica

Complexidade de tempo: O(|V| + |E|)

Por quê?

Page 39: Grafos: caminhos mínimos

39

Exercício

Calcule os caminhos mínimos para o grafo

abaixo a partir do vértice 1 aplicando o

algoritmo baseado na ordenação topológica

1

2

3

4

5

6

2

4

21

3

4

2

3

2

Page 40: Grafos: caminhos mínimos

40

Algoritmo de Dijkstra

Características

Caminho mais curto de origem única

Podem haver ciclos

Somente pesos positivos

Método

A cada passo, adiciona um vértice u de menor estimativa

de caminho mínimo a um conjunto S com vértices com

caminhos mínimos desde a origem já definidos

Relaxam-se as arestas adjacentes a u

Page 41: Grafos: caminhos mínimos

41

Algoritmo de Dijkstra

Exemplo (a partir de s)

s

t x

y z

10

1

3 69

5

2

7

2 4

Page 42: Grafos: caminhos mínimos

42

Algoritmo de Dijkstra

Exemplo (a partir de s)

Estimativas pessimistas

S=Ø

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=∞

d(s)=0

d(x)=∞

d(z)=∞d(y)=∞

Page 43: Grafos: caminhos mínimos

43

Algoritmo de Dijkstra

Exemplo (a partir de s)

Adiciona s a S

S={s}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=∞10

d(s)=0

d(x)=∞

d(z)=∞d(y)=∞5

Page 44: Grafos: caminhos mínimos

44

Algoritmo de Dijkstra

Exemplo (a partir de s)

Adiciona y a S

S={s,y}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=108

d(s)=0

d(x)=∞14

d(z)=∞7d(y)=5

Page 45: Grafos: caminhos mínimos

45

Algoritmo de Dijkstra

Exemplo (a partir de s)

Adiciona z a S

S={s,y,z}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=8

d(s)=0

d(x)=1413

d(z)=7d(y)=5

Page 46: Grafos: caminhos mínimos

46

Algoritmo de Dijkstra

Exemplo (a partir de s)

Adiciona t a S

S={s,y,z,t}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=8

d(s)=0

d(x)=139

d(z)=7d(y)=5

Page 47: Grafos: caminhos mínimos

47

Algoritmo de Dijkstra

Exemplo (a partir de s)

Adiciona x a S

S={s,y,z,t,x}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=8

d(s)=0

d(x)=9

d(z)=7d(y)=5

Page 48: Grafos: caminhos mínimos

48

Algoritmo de Dijkstra

Exemplo (a partir de s)

S={s,y,z,t,x}

s

t x

y z

10

1

3 69

5

2

7

2 4

d(t)=8

d(s)=0

d(x)=9

d(z)=7d(y)=5

Page 49: Grafos: caminhos mínimos

49

Algoritmo de Dijkstra

Implementação

Uso de uma fila de prioridades com vértices

organizados em função da estimativa d de

caminho mínimo

Page 50: Grafos: caminhos mínimos

50

Algoritmo de Dijkstra

DIJKSTRA(G, w, s)

início

//inicializa variáveis

para cada vértice v faça

d[v]=∞

antecessor[v]=-1

d[s]=0

S=Ø

cria fila de prioridade F com vértices do grafo

//insere vértice u em S e faz relaxamento das arestas adjacentes

enquanto F≠Ø faça

u=retirar vértice de F

S=S+{u}

para cada vértice v adjacente a u faça

relax(u,v,w)

fim

Page 51: Grafos: caminhos mínimos

51

Algoritmo de Dijkstra

Complexidade de tempo: O(|V| log|V| + |E|),

se fila de prioridade bem implementada

Page 52: Grafos: caminhos mínimos

52

Exercício

Calcule os caminhos mínimos para o grafo

abaixo a partir do vértice 1 aplicando o

algoritmo de Dijkstra

5

1 2

43

1

10

12 8

010

Page 53: Grafos: caminhos mínimos

53

Caminhos Mais Curtos de Todos os Pares

Suponha que um grafo orientado ponderado representa as possíveis rotas de uma companhia aérea conectando diversas cidades

O objetivo é construir uma tabela com os menores caminhos entre todas as cidades

Esse e um exemplo de problema que exige encontrar os caminhos mais curtos para todos os pares de vértices

Page 54: Grafos: caminhos mínimos

54

Caminhos Mais Curtos de Todos os Pares

Uma possível solução é utilizar o algoritmo de Dijkstra utilizando cada vértice como origem alternadamente

Uma solução mais direta é utilizar o algoritmo de Floyd

O algoritmo de Floyd utiliza uma matrizA |V|×|V| para calcular e armazenar os tamanhos dos caminhos mais curtos

Page 55: Grafos: caminhos mínimos

55

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

Inicialmente os custos

entre vértices

adjacentes são

inseridos na tabela A

Pesos de self-loops

não são considerados

1 2 32

8

3

2

5

A

2

21

1

3

3

Page 56: Grafos: caminhos mínimos

56

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Inicialmente os custos

entre vértices

adjacentes são

inseridos na tabela A

Pesos de self-loops

não são considerados

1 2 32

8

3

2

5

Page 57: Grafos: caminhos mínimos

57

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

A matriz A é percorrida

|V| vezes

A cada iteração k,

verifica-se se um

caminho entre dois

vértices (v,w) que

passa também pelo

vértice k é mais curto

do que o caminho mais

curto conhecido

1 2 32

8

3

2

5

Page 58: Grafos: caminhos mínimos

58

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[v,w] = min(A[v,w],

A[v,k] + A[k,w]).1 2 32

8

3

2

5

Page 59: Grafos: caminhos mínimos

59

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[1,1] = min(A[1,1],

A[1,1] + A[1,1]).

k = 1

1 2 32

8

3

2

5

Page 60: Grafos: caminhos mínimos

60

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[1,2] = min(A[1,2],

A[1,1] + A[1,2]).

k = 1

1 2 32

8

3

2

5

Page 61: Grafos: caminhos mínimos

61

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[1,3] = min(A[1,3],

A[1,1] + A[1,3]).

k = 1

1 2 32

8

3

2

5

Page 62: Grafos: caminhos mínimos

62

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[2,1] = min(A[2,1],

A[2,1] + A[1,1]).

k = 1

1 2 32

8

3

2

5

Page 63: Grafos: caminhos mínimos

63

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[2,2] = min(A[2,2],

A[2,1] + A[1,2]).

k = 1

1 2 32

8

3

2

5

Page 64: Grafos: caminhos mínimos

64

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0

2 0

A

2

21

1

3

3

Ou seja:

A[2,3] = min(A[2,3],

A[2,1] + A[1,3]).

k = 1

1 2 32

8

3

2

5

Page 65: Grafos: caminhos mínimos

65

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

2 0

A

2

21

1

3

3

Ou seja:

A[2,3] = min(A[2,3],

A[2,1] + A[1,3]).

k = 1

1 2 32

8

3

2

5

Page 66: Grafos: caminhos mínimos

66

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

2 0

A

2

21

1

3

3

Ou seja:

A[3,1] = min(A[3,1],

A[3,1] + A[1,3]).

k = 1

1 2 32

8

3

2

5

Page 67: Grafos: caminhos mínimos

67

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

2 0

A

2

21

1

3

3

Ou seja:

A[3,2] = min(A[3,2],

A[3,1] + A[1,2]).

k = 1

1 2 32

8

3

2

5

Page 68: Grafos: caminhos mínimos

68

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

2 0

A

2

21

1

3

3

Ou seja:

A[3,3] = min(A[3,3],

A[3,1] + A[1,3]).

k = 1

1 2 32

8

3

2

5

Page 69: Grafos: caminhos mínimos

69

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

8

0 8 5

3 0 8

2 0

A

2

21

1

3

3

Ao final da iteração k=1

tem-se todos os

caminhos mais curtos

entre v e w que podem

passar pelo vértice 1

O processo se repete

para k=2 e k=3

1 2 32

8

3

2

5

Page 70: Grafos: caminhos mínimos

70

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

2 0

A

2

21

1

3

3

A[3,1] = min(A[3,1],

A[3,2] + A[2,1]).

k = 2

1 2 32

8

3

2

5

Page 71: Grafos: caminhos mínimos

71

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

5 2 0

A

2

21

1

3

3

A[3,1] = min(A[3,1],

A[3,2] + A[2,1]).

k = 2

1 2 32

8

3

2

5

Page 72: Grafos: caminhos mínimos

72

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 8 5

3 0 8

5 2 0

A

2

21

1

3

3

A[1,2] = min(A[1,2],

A[1,3] + A[3,2]).

k = 3

1 2 32

8

3

2

5

Page 73: Grafos: caminhos mínimos

73

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

0 7 5

3 0 8

5 2 0

A

2

21

1

3

3

A[1,2] = min(A[1,2],

A[1,3] + A[3,2]).

k = 3

1 2 32

8

3

2

5

Page 74: Grafos: caminhos mínimos

74

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floydprocedimento Floyd(var A: array[TVertice, TVertice]

de reais; var G: TGrafo)

variáveis

v,w,k: TVertice;

início

para v:=1 até G.NumVertices faça

para w:=1 até G.NumVertices faça

se v = w então

A[v,w] := 0;

senão

A[v,w] := peso da aresta (v, w);

para k:=1 até G.NumVertices faça

para v:=1 até G.NumVertices faça

para w:=1 até G.NumVertices faça

se A[v,k] + A[k,w] < A[v,w] então

A[v,w] := A[v,k] + A[k,w];

fim;

Page 75: Grafos: caminhos mínimos

75

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd

Exercício: aplique o algoritmo de Floyd para

o grafo abaixo

1

2

3

4

5

2

4

21

3

4

3

Page 76: Grafos: caminhos mínimos

76

Caminhos Mais Curtos de Todos os Pares:

Algoritmo de Floyd O algoritmo de Floyd é O(|V|3)

No caso do algoritmo de Dijksta for utilizado para solucionar o problema de caminhos mais curtos entre todos os pares, o algoritmo de Floyd tem desempenho similar ao algoritmo de Dijkstra com matriz de adjacência

Se o algoritmo de Dijkstra for implementado com listas de adjacências, então sua complexidade para encontrar os caminhos mais curtos entre todos os pares é O(|V| |A| log n)

Page 77: Grafos: caminhos mínimos

77

Fechamento Transitivo:

Algoritmo de Warshall

Para alguns problemas pode ser interessante simplesmente saber se existe um caminhode qualquer tamanho entre dois vértices

O algoritmo de Floyd pode ser especializado para esse problema, resultando no algoritmo de Warshall (o qual é mais antigo que o algoritmo de Floyd)

Page 78: Grafos: caminhos mínimos

78

Fechamento Transitivo:

Algoritmo de Warshall

A partir da matriz de adjacência M, deseja-se

criar uma matriz A, tal que A[v, w] = 1, se

existe um caminho de qualquer tamanho

entre v e w

Essa matriz é chamada de fechamento

transitivo da matriz de adjacência

Page 79: Grafos: caminhos mínimos

79

Fechamento Transitivo:

Algoritmo de Warshall

procedimento Warshall(var A: array[TVertice, TVertice] de lógico; var G: TGrafo)

variáveis

v,w,k: TVertice;

início

para v:=1 até G.NumVertices faça

para w:=1 até G.NumVertices faça

A[v,w] := peso da aresta (v,w)>0;

para k:=1 até G.NumVertices faça

para v:=1 até G.NumVertices faça

para w:=1 até G.NumVertices faça

se não A[v,w] então

A[v,w] := A[v,k] e A[k,w];

fim;

Page 80: Grafos: caminhos mínimos

80

Fechamento Transitivo:

Algoritmo de Warshall

Exercício: aplique o algoritmo de Warshall

para o grafo abaixo

5

1 2

43

1

10

12 8

010

Page 81: Grafos: caminhos mínimos

81

Exercício

Implemente à mão (em C) o algoritmo de

Dijkstra para entregar na próxima aula