Post on 17-Apr-2015
ESCOLA DE ENGENHARIA
C++Dijkstra e Prim
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
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
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
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
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=
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
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
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.
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)
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
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
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