Você está na página 1de 13

ESCOLA DE ENGENHARIA

C++
Dijkstra e Prim
Algoritmo de Dijkstra (1959)
L=
L= L=3
L= L=5
L=
1 2
1 2 3
Comprimento
Acumulado u2 u3 u4
2 6 5 3 9 7 9
L=0 L=
L=7
L= L=6
L= L=11
L
L=
=12 L=13
L
L=
=14
8 1 6 2
4 5 6 7 8
u0 u6 u5 u9 u10

1 7 2 4 3 1 4
L=1
L= L
L=9
L=
=10 L=10
L=
9 10 11
9 1
u1 u7 u8
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 2/13
Análise
1 2 Qual a distância mínima entre os vértices:
2 3
•4e1? Resposta: 2
3 5
u0= 4 0 •4e2? Resposta: 3
5 7
L= 6 6 • 4 e 11 ? Resposta: 10
7 11
8 13 • 4 e 10 ? Resposta: 9
9 1
•4e8? Resposta: 13
10 9
11 10 Qual caminho possui distância
mínima entre os vértices 4 e
C++ - Dijkstra e Prim 8 ? Prof. Lincoln Cesar Zamboni 3/13
O Caminho do 4 até o 8
Comprimento L=
L=2, A=4 L=
L=3, A=1 L=
L=5, A=2
Acumulado 1 2
1 2 3
Vértice
Anterior
u2 u3 u4
2 6 5 3 9 7 9
L=0 L=
L=
L=  L= L
L=6 L= 
 L
11,
=12
= L= 
=14
=13 

8 1 6 A=11 2
4 5 6 7 8
u0 u6 u5 u9 u10

1 7 2 4 3 1 4
L=
L= L=
L 
L=
=10  
L=10
L= 10

9 10 11
9 1
u1 u7 u8 4/13
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni
Análise
1 4
2 1 Qual caminho possui distância mínima
3 2 entre os vértices:
u0 = 4 0
• 4 e 8 ? Resposta: 8, 7, 11, 10, 5, 6, 2, 1, 4
5 6
6 2 •4e2? Resposta: 2, 1, 4
A= 7 11
8 7 • 4 e 11 ? Resposta: 11, 10, 5, 6, 2, 1, 4
9 4
10 5 • 4 e 10 ? Resposta: 10, 5, 6, 2, 1, 4
11 10
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 5/13
Árvore de Caminhos 1
2
4
1

Mínimos 3
4
2
0
5 6
1 2 A= 6 2
1 2 3 7 11

9 8 7
9 4
10 5
2 6 5 3 9 7 11 10

8 1 6 2
4 5 6 7 8

1 7 2 4 3 1 4

9 1
9 10 11
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 6/13
Matriz de Pesos (W) 77/121 
64% de
nulos
simétrica 1 2 3 4 5 6 7 8 9 10 11
1 0 1 0 2 6 0 0 0 0 0 0
2 1 0 2 0 5 3 9 0 0 0 0
3 0 2 0 0 0 0 7 9 0 0 0
4 2 0 0 0 8 0 0 0 1 0 0
5 6 5 0 8 0 1 0 0 7 2 0
6 0 3 0 0 1 0 6 0 0 4 0
7 0 9 7 0 0 6 0 2 0 3 1
8 0 0 9 0 0 0 2 0 0 0 4
9 0 0 0 1 7 0 0 0 0 9 0
10 0 0 0 0 2 4 3 0 9 0 1
11 0 0 0 0 0 0 1 4 0 1 0

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


(L)ength, (A)nterior e (M)arcação
L A M
1 
2 4
0 F
T
L= 
L=2, A=4 L= 
L=3, A=1 L= 
L=5, A=2 2 
3 0 T
1 F
1 2
1 2 3
3 
5 20 T
F
u2 u3 u4
4 0 0 FT
2 6 5 3 9 7 9
L=0 L= 
L=
L=  L= 
L=6 L
L= L=
=12 
11, L
L= 
=14
=13  5 
8 6
7 0
4 FT
4 8 5 1 6 6 7A=11 2 8 6 
6 20 FT
u0 u6 u5 u9 u10 7 
11 2
0
12 11 FT
1 7 2 4 3 1 4 8 
14 7
13 3
0 FT
L= 
L= L
L= 
L=
=10 L
L= 
=10 1

9 10 11
0 9 
1 40 FT
u1
9
u7
1
u8 10 
9 5
10 0
9 FT
11  0
10 10
FT
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 8/13
início Os vértices V foram
numerados a partir do
Complexidade Dijkstra V = {1, 2, ..., n} número 1.

obter o vértice M é o conjunto dos vértices fim


inicial u0 Î V e o Marcados e D o dos
vértice final uf Î V Desmarcados.

n–i–1 M = {u0}
D=V-M
L(u0) é a distância acumulada até u 0
O caminho para a
e A(u0) é o vértice anterior a u0 –
compa- neste caso 0 significa que não há distância mínima
de uf até u0 é C
L(u0) = 0 um vértice anterior.
rações e A(u0) = 0
Os vértices
adições. L(v) = ¥
desmarcados recebem
a distância acumulada Não existe um
A(v) = 0 ¥ e não possuem caminho com distância
" vÎ D vértice anterior mínima de uf até u0 sim
(simbolizado por ter o
valor A(v) nulo).
não
i=0
C é inicializada com a v = u0
seqüência ordenada nula ().

L(uf) é a distância C = ()
n ui ¹ uf não
mínima de u0 até uf. v = uf
vértices. sim não
Expansão da árvore
de caminhos
L(v) = mínimo(L(v), mínimos. a(ui, v)
L(ui) + w(ui, v)) representa a
adjacência entre ui v ¹ u0 e
A(v) = ui
e v. A(v) ¹ 0
O(n2)

" vÎ D e a(ui, v) ¹ 0
sim
Busca do vértice C é concatenada com a
ui+1 | L(ui+1) = mínimo(L(v)) desmarcado com seqüência ordenada
" vÎ D distância C = C + (v) unitária (v).
acumulada mínima.
v = A(v)
M = M È {ui+1} O vértice buscado
agora é marcado.

i=i+1 n – i – 1 comparações.
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 9/13
Dijkstra: total de operações com n
vértices
Adições
a = (n-1)+(n-2)+...+ 1 + 0
a= 0 + 1 +...+ (n-2)+(n-1)

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

Comparações
c = n(n-1)
Total
0(n2)
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 10/13
Algoritmo de Prim
L=  A=0
L=A=4 L= A=0
L= L=
L= A=0
1 2
Distância
1 2 3
u2 u3 u4
2 6 5 3 9 7 9
L=0 A=0 L= A=9
L=7
L=
L=
L=
L=
A=0 L=  A=0 L=1
L= L=3A=11
L=
L=
L=
A=10
L= L=
A=0 L=2
L=4A=7
A=0
L=
A=11
8 1 6 2
4 5 6 7 8
u0 u6 u5 u9 u10

1 7 2 4 3 1 4
L=  A=0
L= L= A=5
L=4
L=2
L=9 A=6 L=1A=10
A=0 L=
A=9 A=0
9 10 11
9 1
u1 u7 u8
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 11/13
Árvore de Cobertura 1
2
4
1

Mínima 3
4
2
0
5 6
1 2 A= 6 2
1 2 3 7 11

9 8 7
9 4
10 5
2 6 5 3 9 7 11 10

8 1 6 2
4 5 6 7 8

1 7 2 4 3 1 4

9 1 tot = 16
9 10 11
C++ - Dijkstra e Prim Prof. Lincoln Cesar Zamboni 12/13
Prim início fim
Os vértices V foram numerados
a partir do número 1.
V = {1, 2, ..., n}
M é o conjunto dos vértices Marcados
M = {u0} e D o dos Desmarcados.
A árvore de
D=V-M cobertura mínima
L(u0) é a distância acumulada até
u0 e A(u0) é o vértice anterior a u 0 é T e a soma total
L(u0) = 0 – neste caso 0 significa que não de pesos é tot.
A(u0) = 0 há um vértice anterior.

Não existe
L(v) = ¥ Os vértices desmarcados uma árvore de sim
A(v) = 0 recebem a distância ¥ e
não possuem vértice
cobertura
" vÎ D
anterior (simbolizado por mínima.
ter o valor A(v) nulo).
i=0 não
v = n+1
T é inicializada com a seqüência
ordenada nula ().

T = ()
D¹ Æ não tot = 0
v=1
sim não

L(v) = mínimo(L(v), Expansão da árvore.


w(ui, v)) a(ui, v) representa a v £n e
A(v) = ui adjacência entre ui e A(v) ¹ 0
" vÎ D e a(ui, v) ¹ 0 v.
sim
Busca do vértice T é concatenada
ui+1 | L(ui+1) = mínimo(L(v))
desmarcado com T = T + ((v, A(v))) com a seqüência
" vÎ D distância mínima. ordenada unitária
de um par
O vértice buscado tot = tot + L(v) ordenado (v, A(v)).
M = M È {ui+1}
agora é marcado.

v=v+1
i=i+1

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

Você também pode gostar