Mtodo Guloso
uma rvore
Contm todos os vrtices de G
rvore geradora de G
Sub-estrutura tima
T2
AEM T
T1
n
w(T ) =
w(u, v)
n
n
n
( u , v )T
3
Escolha Gulosa
n
Propriedade:
n
V-S
Teorema
n
n
x
u
y
v
Prova
n Suponha (u,v) T
n Mesmo assim, u e v devem estar em T e deve haver
um caminho de u at v emT
n Seja qualquer aresta (x, y) neste caminho que cruza
de S paraV S
n Como (u,v) tem o menor custo, ento w(u,v) w(x,y)
n Assim, a rvore que inclui (x,y) no pode ter o custo
menor que rvore que inclui (u,v) e portanto ela no
mnima.
AEM(G,w)
1 A // Conter os arcos da AEM
2 enquanto A no formar uma AEM faa
3
Encontre um arco (u,v) seguro para A
4
AA{(u,v)}
5 retorne A
Algoritmo de Prim
n
AEM2(G, w)
1
A // Conter as arestas da AEM
2
enquanto A no for uma rvore geradora faa
3.1
Faa um corte(S, V-S) em G que respeita A
3.2
Seja (u,v) a aresta mnima entre S e V-S
4
AA{(u,v)}
5 retorne A
10
Prim(G,w,r)
Prim(G,w,r)
01
02
03
04
05
06
07
08
09
10
11
01
02
03
04
05
06
07
08
09
10
11
11
Atualiza
key[v]
12
Prim: exemplo
O(V)
14
15
16
Filas de Prioridade
n
n
n
T(ExtriMin)
T(Atualiza)
Total
array
O (V )
O (1)
O(V 2)
Heap binrio
O (lg V)
O(lg V)
O(E lgV )
Heap de Fibonacci
O(lg V)
O(1)
O(V lgV +E )
ConstriFP O(n)
ExtraMin e Atualiza O(lg n)
17
18
Algoritmo de Kruskal
n
n
n
n
19
Kruskal(G,w) /* G=(V,E) */
01
02
03
04
05
06
07
08
09
A
para cada vrtice v V[G] do
Constri-Conjunto({v})
Ordenar as arestas de acordo com o custo w
para cada arco (u,v) nesta ordem faa
se Conjunto_de(u) Conjunto_de(v) ento
A A {(u,v)}
Unio(Conjunto_de(u),Conjunto_de(v))
retorne A
20
Exemplo Kruskal
21
22
23
24
Implementao de Conjuntos
n
n
n
Constri_Conjunto(x): S {x}
Unio(Si,Sj): S S {Si,Sj} {Si Sj}
Conjunto_de(x): retorna Si, tal que x Si
25
26
Inicializao: O(V)
(E lg E) ~ (E lg V)
O(E) chamadas para Conjunto_De
Custo de unies
n
Caminhos Mnimos
vV
27
28
Caminho Mnimo
n
Caminhos Mnimos
k 1
w( p ) = w(vi , vi +1 )
i =1
29
30
Sub-estrutura tima
n
Inequao de tringulos
Teorema: os sub-caminhos de um
caminho mnimo so caminhos mnimos
Prova (cut and paste)
n
Definio
n
Teorema
n
31
Prova
n
32
Relaxamento
Relax(u,v)
5
u
if d[v]>d[u]+w(u,v)then
d[v] d[u]+w(u,v)
[v] u
Relax(u,v)
6
v
33
34
Algoritmo de Dijkstra
n
n
Dijkstra(G,w,s)
Dijkstra
01
02
03
04
05
06
07
08
09
10
11
para cada v V
d[v]
d[s] 0
S Conjunto de vrtices j processados
Q V
enquanto Q faa
u ExtriMin(Q) Retira o u de menor d[u] de Q
S S {u}
para cada v Adj[u] faa
se d[v] > d[u]+w(u,v) ento
Relaxamento
d[v] d[u]+w(u,v)
36
Dijkstra: Exemplo
u
u
2
0
5
7
y
7
y
0
5
10
9
7
u
3
9
9
5
x
7
y
38
Dijkstra: Corretude
37
13
y
v
10
14
x
u
10
10
10
10
10
Dijkstra: Exemplo
39
40
Vrtice
corretamente
escolhido
Assim:
n
n
n
n
Primeiro vrtice
escolhido tal que
d[u] no mnimo
d[u] >
>
>
d[u] >
(s,u)
(s,y)+(y,u)
d [y]+(y,u)
d [y]
* Hiptese inicial
* Sub-estrutura tima
* Corretude de d [y]
* Pesos no negativos
41
42
01
02
03
04
05
06
07
08
09
10
11
43
para cada v V
d[v]
d[s] 0
S
Q V
enquanto Q faa
u ExtriMin(Q)
S S {u}
para cada v Adj[u] faa
se d[v] > d[u]+w(u,v) ento
d[v] d[u]+w(u,v)
O(V)
O(V)
O(log V)
O(V) vezes
O(E) arestas
O(log V)
44
Algoritmo de Bellman-Ford
n
Bellman-Ford(G,w,s)
01
02
03
04
05
06
07
08
09
10
Bellman-Ford
Relax (u,v,w)
if d[v]>d[u]+w(u,v)then
d[v] d[u]+w(u,v)
[v] u
45
46
Bellman-Ford: Exemplo
652
Bellman-Ford: Tempo
6
s 0
8
7
5
2
2
9
4 7
6
s 0
7
y
(a)
6
s 0
t
2
8
7
y
(d)
5
2
8
7
t
6
2
9
4 7
(b)
5
2
2
9
x
4
3
4 7
2
z
6
s 0
t
2
8
7
y
6
s 0
t
6
x
4
3
8
7
5
2
7
y
4 7
2
z
(c)
5
2
2
9
x
4
3
4 7
2
z
Bellman-Ford(G,w,s)
01
02
03
04
05
06
07
08
09
10
(e)
47
48
Bellman-Ford: Corretude
n
49
50
Problema da Mochila
52