Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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)
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=3A=11
L=
L=
L=
A=10
L= L=
A=0 L=2
L=4A=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=1A=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
v=v+1
i=i+1