caminho m nimo de fonte nica em grafos sem pesos...

31
Caminho Mínimo Caminho Mínimo de Fonte Única em Grafos sem Pesos Negativos Letícia Rodrigues Bueno UFABC

Upload: lenga

Post on 23-Dec-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Caminho Mínimo

Caminho Mínimo de Fonte Única emGrafos sem Pesos Negativos

Letícia Rodrigues Bueno

UFABC

Caminho Mínimo

Problema 2: Menor caminho entre duas cidades

• Dado um mapa de cidades, contendo as distâncias entrecidades, qual o menor caminho entre quaisquer cidades Ae B?

Caminho Mínimo

Problema 2: Menor caminho entre duas cidades

• Dado um mapa de cidades, contendo as distâncias entrecidades, qual o menor caminho entre quaisquer cidades Ae B?

• Este problema pode ser modelado através de um grafo:• Cidade: vértices;• Estradas entre cidades: arestas ponderadas com peso

que indicam distância entre cidades.• Arestas ponderadas: podem indicar tempo, custo,

penalidades, perdas, etc;

• Esse problema é conhecido como Problema do CaminhoMínimo.

Caminho Mínimo

Abordagem

• Problema do caminho mínimo é semelhante a problemado número de Erdõs;

Caminho Mínimo

Abordagem

• Problema do caminho mínimo é semelhante a problemado número de Erdõs;

• Podemos utilizar uma idéia semelhante a do algoritmo deBusca em Largura ;

• Levar em consideração:• O problema tem subestrutura ótima: um caminho mínimo

entre dois vértices contém outros caminhos mínimos emseu interior.

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

s

t x

zy

10

1

5

2

2 3

9

4 6

7

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

∞ ∞

10

1

5

2

2 3

9

4 6

7

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

∞ ∞

10

1

5

2

2 3

9

4 6

7

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

10

1

5

2

2 3

9

4 6

7

5

10

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

10

1

5

2

2 3

9

4 6

7

5

8

7

14

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

10

1

5

2

2 3

9

4 6

7

5

8

7

13

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

10

1

5

2

2 3

9

4 6

7

5

8

7

9

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

0

s

t x

zy

10

1

5

2

2 3

9

4 6

7

5

8

7

9

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 relaxa(u, v):2 se v.d > u.d + p(u, v) então3 v.d = u.d + p(u, v)4 v.p = u

5

u v2 7

5

u v2 9

Relaxa(u,v)

(a)

5

u v2 6

5

u v2 6

Relaxa(u,v)

(b)

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Análise da complexidade:

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Análise da complexidade:

• Construção do heap(linha 6): O(n)

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Análise da complexidade:

• Construção do heap(linha 6): O(n)

• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Análise da complexidade:

• Construção do heap(linha 6): O(n)

• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)

• refaz_heap (linha 13)tem complexidade(log n) e é executadom vezes: O(m log n)

Caminho Mínimo

Caminho mínimo de fonte única: algoritmo de Dijkstra

1 dijkstra(G, s):2 para u em V(G) faça3 u.d = ∞4 u.p = None5 s.d = 06 s.p = s7 A = Heap(V(G)) \\ com base em d8 S = [ ]9 enquanto tamanho(A) > 1 faça

10 u = retira_min(A)11 S = S + u12 para v em adj(u) faça13 relaxa(u, v)14 refaz_heap(A)

Análise da complexidade:

• Construção do heap(linha 6): O(n)

• retira_min (linha 9)tem complexidade(log n) e é executadon vezes: O(n log n)

• refaz_heap (linha 13)tem complexidade(log n) e é executadom vezes: O(m log n)

• Complexidade total:O((n + m) log n)

Caminho Mínimo

Problemas do Caminho Mínimo

• Caminho mínimo de fonte única: algoritmo de Dijsktra;

Caminho Mínimo

Problemas do Caminho Mínimo

• Caminho mínimo de fonte única: algoritmo de Dijsktra;

• Caminho mínimo de destino único: inverta a direçãodas arestas e aplique algoritmo de Dijstra;

Caminho Mínimo

Problemas do Caminho Mínimo

• Caminho mínimo de fonte única: algoritmo de Dijsktra;

• Caminho mínimo de destino único: inverta a direçãodas arestas e aplique algoritmo de Dijstra;

• Caminho mínimo entre quaisquer vértices u e v :algoritmo de Dijsktra;

Caminho Mínimo

Problemas do Caminho Mínimo

• Caminho mínimo de fonte única: algoritmo de Dijsktra;

• Caminho mínimo de destino único: inverta a direçãodas arestas e aplique algoritmo de Dijstra;

• Caminho mínimo entre quaisquer vértices u e v :algoritmo de Dijsktra;

• Caminho mínimo de todos os vértices para todos osvértices: algoritmo de Floyd-Warshall em tempo O(n3).

Caminho Mínimo

Limitações do algoritmo de Dijkstra

• Não funciona para grafos que contém ciclos com pesosnegativos acessíveis a partir da origem;

Caminho Mínimo

Limitações do algoritmo de Dijkstra

• Não funciona para grafos que contém ciclos com pesosnegativos acessíveis a partir da origem;

• Alternativa: Algoritmo de Bellman-Ford de complexidadeO(n · m);

0

0

0

0

0

0

s

a b

gdc

e f

0

h i

j

-4

3

5

2

6

-3

3

-6

4

8

7

2

3-8−∞

∞∞

Caminho Mínimo

Caminho Mínimo em Grafos com Pesos Negativos

• E se adicionarmos uma constante ao peso de cadaaresta?

a

b

c

d

4

6

-9

2

Caminho Mínimo

Caminho Mínimo em Grafos com Pesos Negativos

• E se adicionarmos uma constante ao peso de cadaaresta?

a

b

c

d

13

15

0

11

a

b

c

d

4

6

-9

2mais 9

Caminho Mínimo

Caminho Mínimo em Grafos com Pesos Negativos

• E se adicionarmos uma constante ao peso de cadaaresta?

a

b

c

d

13

15

0

11

a

b

c

d

4

6

-9

2mais 9custo:1

custo:2

Caminho Mínimo

Caminho Mínimo em Grafos com Pesos Negativos

• E se adicionarmos uma constante ao peso de cadaaresta?

a

b

c

d

13

15

0

11

a

b

c

d

4

6

-9

2mais 9custo:1 custo:28

custo:11custo:2

Caminho Mínimo

Bibliografia Utilizada

CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L. e STEIN, C.Introduction to Algorithms, 3a edição, MIT Press, 2009.