ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13...

13
ESCOLA DE ENGENHARIA C++ Dijkstra e Prim

Transcript of ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13...

Page 1: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

ESCOLA DE ENGENHARIA

C++Dijkstra e Prim

Page 2: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 2/13

Algoritmo de Dijkstra (1959)Algoritmo de Dijkstra (1959)

1 2 3

4 5 6 7 8

9 10 11

2

1 2

96 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

u0

L=0

L= L= L=

L= L= L= L=

L= L= L=

L=

L=

L=1

u1

L=10

u2

L=3

u3

L=5

L=6

L=12

u4

L=14

u5

L=7

u6

L=9

u7

L=10

u8

L=11

u9

L=13

Comprimento

Acumulado

u10

Page 3: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 3/13

AnáliseAnálise11 22

22 33

33 55

uu00= 4= 4 00

55 77

66 66

77 1111

88 1313

99 11

1010 99

1111 1010

L=

Qual a distância mínima entre os vértices:

• 4 e 1 ?

• 4 e 2 ?

• 4 e 11 ?

• 4 e 10 ?

• 4 e 8 ?

Qual caminho possui distância mínima entre os vértices 4 e 8 ?

Resposta: 2

Resposta: 3

Resposta: 10

Resposta: 9

Resposta: 13

Page 4: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 4/13

O Caminho do 4 até o 8O Caminho do 4 até o 8

1 2 3

4 5 6 7 8

9 10 11

2

1 2

96 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

u0

L=0

L=

L=

L=

L=

L=

L=

L=

L=

L=

L=

L=2, A=4

L=

L=

u1

L=10

u2

L=3, A=1

u3

L=5, A=2

L=6

L=12

u4

L=14

u5

L=

u6

L=

u7

L=1010

u8

L=11, A=11

u9

L=13

u10

VérticeAnterio

r

Comprimento

Acumulado

Page 5: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 5/13

AnáliseAnálise11 44

22 11

33 22

uu00= 4= 4 00

55 66

66 22

77 1111

88 77

99 44

1010 55

1111 1010

A=

Qual caminho possui distância mínima entre os vértices:

• 4 e 8 ?

• 4 e 2 ?

• 4 e 11 ?

• 4 e 10 ?

Resposta: 8, 7, 11, 10, 5, 6, 2, 1, 4

Resposta: 2, 1, 4

Resposta: 11, 10, 5, 6, 2, 1, 4

Resposta: 10, 5, 6, 2, 1, 4

Page 6: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 6/13

Árvore de CaminhosÁrvore de CaminhosMínimosMínimos

1 2 3

4 5 6 7 8

9 10 11

2

1 2

9

6 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

11 44

22 11

33 22

44 00

55 66

66 22

77 1111

88 77

99 44

1010 55

1111 1010

A=

Page 7: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 7/13

Matriz de Pesos (W)Matriz de Pesos (W)

11 22 33 44 55 66 77 88 99 1010 1111

11 00 11 00 22 66 00 00 00 00 00 00

22 11 00 22 00 55 33 99 00 00 00 00

33 00 22 00 00 00 00 77 99 00 00 00

44 22 00 00 00 88 00 00 00 11 00 00

55 66 55 00 88 00 11 00 00 77 22 00

66 00 33 00 00 11 00 66 00 00 44 00

77 00 99 77 00 00 66 00 22 00 33 11

88 00 00 99 00 00 00 22 00 00 00 44

99 00 00 00 11 77 00 00 00 00 99 00

1010 00 00 00 00 22 44 33 00 99 00 11

1111 00 00 00 00 00 00 11 44 00 11 00

simétrica

77/121 64% de nulos

Page 8: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 8/13

(L)ength, (A)nterior e (M)arcação(L)ength, (A)nterior e (M)arcação

1 2 3

4 5 6 7 8

9 10 11

2

1 2

96 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

u0

L=0

L=

L=

L=

L=

L=

L=

L=

L=

L=

L=

L=2, A=4

L=

L=

u1

L=10

u2

L=3, A=1

u3

L=5, A=2

L=6

L=12

u4

L=14

u5

L=

u6

L=

u7

L=1010

u8

L=11, A=11

u9

L=13

u10

LL AA MM

11 FF

22 FF

33 FF

44 FF

55 FF

66 FF

77 FF

88 FF

99 FF

1010 FF

1111 FF

TT00 00

00

00

00

00

00

00

00

00

00

00

22 44

88 44

11 441010 99

33 11

55 22

66 221212 221414 33

77 66

99 551010 1010

1111 1111

1313 77

TT

TT

TT

TT

TT

TT

TT

TT

TT

TT

Page 9: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 9/13

Co

mp

lexi

dad

e D

ijks

tra

Co

mp

lexi

dad

e D

ijks

tra

OO(( nn

22 ))

início

obter o vértice inicial u0 ÎV e o

vértice final uf ÎV

M = {u0}D = V - M

L(u0) = 0A(u0) = 0

L(v) = A(v) = 0"vÎD

i = 0

ui ¹uf

L(v) = mínimo(L(v),L(ui) + w(ui, v))

A(v) = ui

"vÎD e a(ui, v) ¹ 0

sim

M é o conjunto dos vértices Marcados e D o dos Desmarcados.

L(u0) é a distância acumulada até u0 e A(u0) é o vértice anterior a u0 – neste caso 0 significa que não há um vértice anterior.

Os vértices desmarcados recebem a distância acumulada e não possuem vértice anterior (simbolizado por ter o valor A(v) nulo).

ui+1 | L(ui+1) = mínimo(L(v)) "vÎD

M = M È {ui+1}

i = i + 1

L(uf) é a distância mínima de u0 até uf.

não

fim

V = {1, 2, ..., n}

Expansão da árvore de caminhos mínimos. a(ui, v) representa a adjacência entre ui e v.

Busca do vértice desmarcado com distância acumulada mínima.

O vértice buscado agora é marcado.

C = ()v = uf

v ¹u0 eA(v) ¹0

C = C + (v)

v = A(v)

v = u0

O caminho para a distância mínima de uf até u0 é C

Não existe um caminho com distância

mínima de uf até u0

sim

não

não

sim

C é inicializada com a seqüência ordenada nula ().

C é concatenada com a seqüência ordenada unitária (v).

Os vértices V foram numerados a partir do número 1.

n vértic

es.

n – i – 1

compa-

rações e

adições.

n – i – 1 comparações.

Page 10: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 10/13

Dijkstra: total de operações com n Dijkstra: total de operações com n vérticesvértices

Adições

Comparações

a = 0 + 1 +...+ (n-2)+(n-1)

a = (n-1)+(n-2)+...+ 1 + 0

2a = (n-1)+(n-1)+...+ (n-1)+(n-1)

a = ½ n(n-1)

c = n(n-1)

Total

0(n2)

Page 11: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 11/13

Algoritmo de PrimAlgoritmo de Prim

1 2 3

4 5 6 7 8

9 10 11

2

1 2

96 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

u0

L=0 A=0

L= A=0 L= A=0 L= A=0

L= A=0 L= A=0L= A=0L= A=0

L= A=0 L= A=0 L= A=0

u1

u2 u3 u4

u5u6

u7 u8

u9

Distância

L=A=4

L=

L=

L=7 A=9

L=9 A=9

L=

L=

L=

L= L=

L=L=

L=

L= L=

L=4 A=6L=2 A=5

L=3 A=10

L=1 A=10

L=1 A=11

L=4 A=11L=2 A=7

u10

Page 12: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 12/13

Árvore de CoberturaÁrvore de CoberturaMínimaMínima

1 2 3

4 5 6 7 8

9 10 11

2

1 2

9

6 5 3 9 7

8 1 6 2

1 47 2 4 3 1

9 1

11 44

22 11

33 22

44 00

55 66

66 22

77 1111

88 77

99 44

1010 55

1111 1010

A=

tot = 16

Page 13: ESCOLA DE ENGENHARIA C++ Dijkstra e Prim. C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13 Algoritmo de Dijkstra (1959) 123 45678 91011 2 12 965397.

C++ - Dijkstra e PrimC++ - Dijkstra e Prim Prof. Lincoln Cesar ZamboniProf. Lincoln Cesar Zamboni 13/13

PrimPrim início

M = {u0}D = V - M

L(u0) = 0A(u0) = 0

L(v) = A(v) = 0"vÎD

i = 0

D ¹Æ

L(v) = mínimo(L(v),w(ui, v))A(v) = ui

"vÎD e a(ui, v) ¹ 0

sim

M é o conjunto dos vértices Marcados e D o dos Desmarcados.

L(u0) é a distância acumulada até u0 e A(u0) é o vértice anterior a u0 – neste caso 0 significa que não há um vértice anterior.

Os vértices desmarcados recebem a distância e não possuem vértice anterior (simbolizado por ter o valor A(v) nulo).

ui+1 | L(ui+1) = mínimo(L(v)) "vÎD

M = M È {ui+1}

i = i + 1

não

V = {1, 2, ..., n}

Expansão da árvore. a(ui, v) representa a adjacência entre ui e v.

Busca do vértice desmarcado com distância mínima.

O vértice buscado agora é marcado.

T = ()tot = 0v = 1

v £ n eA(v) ¹ 0

T = T + ((v, A(v)))

tot = tot + L(v)

A árvore de cobertura mínima é T e a soma total

de pesos é tot.

sim

não

T é inicializada com a seqüência ordenada nula ().

T é concatenada com a seqüência ordenada unitária de um par ordenado (v, A(v)).

Os vértices V foram numerados a partir do número 1.

v = v + 1

fim

v = n+1

Não existe uma árvore de

cobertura mínima.

não

sim