Beruflich Dokumente
Kultur Dokumente
Estructura de Datos
Clase 22: Algoritmos de Grafos
Carlos Contreras Bolton
Universidad Andr
es Bello
Facultad de Ingeniera
19 de Junio de 2014
1/48
Arboles
de Cobertura Mnima Caminos Mnimos
Contenido
1 Arboles
de Cobertura Mnima
Definicion
Algoritmo de Kruskal
Algoritmo de Prim
2 Caminos Mnimos
Definicion
El camino mas corto desde un origen a muchos destinos
Algoritmo Bellman-Ford
Algoritmo para GDA
Algoritmo de Dijkstra
2/48
Arboles
de Cobertura Mnima Caminos Mnimos
Arboles
de Cobertura Mnima
MST: Minimum Spanning Trees
n
Definicio
Un arbol de cobertura para un grafo no dirigido conexo
G = (V , E ) es un subgrafo de G que es un arbol no dirigido y
contiene todos los vertices de G . En un grafo ponderado
G = (V , E , W ), el peso de un subgrafo es la suma de los
pesos de las aristas incluidas en ese subgrafo. Un arbol
cobertura mnima para un grafo ponderado es un arbol
cobertura cuyo peso es mnimo.
3/48
Arboles
de Cobertura Mnima Caminos Mnimos
Arboles
de Cobertura Mnima
MST: Minimum Spanning Trees
4/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
5/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
6/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
7/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
8/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
9/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
10/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Kruskal
Implementado con disjoint-set
Algorithm KRUSKAL
Require: G : Grafo, w : pesos de las aristas
Ensure: A: aristas del MST.
1: A .
2: for cada vertice u G .V do
3:
MakeSet(u)
4: end for
5: Ordenar las aristas de G .E en orden creciente de peso w .
6: for cada arista (u, v ) G .E , tomada en orden creciente de peso do
7:
if Find(u) 6= Find(v ) then
8:
A A {(u, v )}
9:
Union(u, v )
10:
end if
11: end for
Carlos Contreras Bolton Estructura de Datos
11/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
12/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
13/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
14/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
15/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
16/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
17/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
18/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
19/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Prim
Implementado con heap binario
Algorithm PRIM
Require: G : Grafo, w : pesos de las aristas, u: v
ertice
inicial.
Ensure: G Grafo con key y en v
ertices.
1: for cada v G .V do
2:
v .key
3:
v . NULL
4: end for
5: u.key 0
6: Q G .V
7: while Q 6= do
8:
u EXTRAER-MIN(Q)
9:
for cada v G .Adyacente(u) do
10:
if v Q y w (u, v ) < v .key then
11:
v . u
12:
v .key w (u, v )
13:
end if
14:
end for
15: end while
Carlos Contreras Bolton Estructura de Datos
20/48
Arboles
de Cobertura Mnima Caminos Mnimos
Caminos Mnimos
n
Definicio
Dado un grafo dirigido con peso G = (V , E ), se tiene un
funcion de peso w : E < que asigna valores reales a las
aristas. El peso de un camino p = hv0 , v1 , . . . , vk i es la suma
de los pesos de las aristas que lo constituyen:
w (p) =
k
X
w (vi1 , vi )
i=1
caso contrario
Carlos Contreras Bolton Estructura de Datos
21/48
Arboles
de Cobertura Mnima Caminos Mnimos
Caminos Mnimos
Variantes
22/48
Arboles
de Cobertura Mnima Caminos Mnimos
23/48
Arboles
de Cobertura Mnima Caminos Mnimos
24/48
Arboles
de Cobertura Mnima Caminos Mnimos
25/48
Arboles
de Cobertura Mnima Caminos Mnimos
Relajacion
Para cada vertice v V se tiene un atributo v .d, el cual es
un lmite superior en el peso del camino mas corto desde el
origen s a v . El valor v .d se denomina el peso estimado del
camino mas corto.
Se inicializan los pesos estimados de los caminos mas cortos y
predecesores con el Algoritmo en (|V |).
Algorithm INICIALIZAR-UNICO-ORIGEN
Require: G : Grafo, s: vertice origen.
1: for cada vertice v G .V do
2:
v .d
3:
v . NULL
4: end for
5: s.d 0
Carlos Contreras Bolton Estructura de Datos
26/48
Arboles
de Cobertura Mnima Caminos Mnimos
Relajacion
El proceso de relajaci
on de una arista (u, v ) consiste en examinar si
se puede mejorar el camino mas corto a v pasando por u y, si es el
caso, actualizar v .d y v ..
La relajaci
on puede decrementar el valor del peso estimado del
camino mas corto v .d y actualizar el campo v . del predecesor de
v.
El Algoritmo realiza una relajaci
on de la arista (u, v ) en O(1).
Algorithm RELAJACION
Require: u: arista (u, v ), v : arista (u, v ), w : peso de (u, v ).
1: if v .d > u.d + w (u, v ) then
2:
v .d u.d + w (u, v )
3:
v . u
4: end if
Carlos Contreras Bolton Estructura de Datos
27/48
Arboles
de Cobertura Mnima Caminos Mnimos
Relajacion
Ejemplo
28/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo Bellman-Ford
29/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo Bellman-Ford
Algorithm Bellman-Ford
Require: G : Grafo, w : peso de las aristas, s: vertice origen.
, s)
1: INICIALIZAR-UNICO-ORIGEN(G
2: for i 1 to |G .V | 1 do
3:
for cada arista (u, v ) G .E do
4:
RELAJACION(u,
v, w)
5:
end for
6: end for
7: for cada arista (u, v ) G .E do
8:
if v .d > u.d + w (u, v ) then
9:
return false
10:
end if
11: end for
12: return true
30/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo Bellman-Ford
Ejemplo
31/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo Bellman-Ford
Eficiencia
32/48
Arboles
de Cobertura Mnima Caminos Mnimos
33/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
34/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
35/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
36/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
37/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
38/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
39/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algorithm DAG-Camino-Mas-Corto
Require: G : Grafo, w : peso de las aristas s: vertice origen.
1: Ordenar topol
ogicamente los vertice de G
2: INICIALIZAR-UNICO-ORIGEN(G
, w , s)
3: for cada vertice u, tomada en orden topol
ogicamente do
4:
for cada vertice v G .Adyacente(u) do
5:
RELAJACION(u,
v, w)
6:
end for
7: end for
Carlos Contreras Bolton Estructura de Datos
40/48
Arboles
de Cobertura Mnima Caminos Mnimos
El llamado a Inicializar-Unico-Origen
toma un tiempo
(V ).
El ciclo interno hace |E | iteraciones que toman un tiempo
(1) cada una, mientras que el ciclo externo hace una
sola iteracion por vertice.
Por lo tanto el tiempo total de ejecucion de este algoritmo es
(|V | + |E |).
41/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
El Algoritmo de Dijkstra resuelve el problema de caminos mas
cortos desde un origen a muchos destinos en un grafo dirigido
con peso G = (V , E ) para el caso en el cual todas las aristas
tienen un peso no negativo.
Heap binario: Tiene una eficiencia:
O((|V | + |E |) log |V |)
.
Heap-Fibonacci: Tiene una eficiencia:
O(|V | log |V | + |E |)
.
Carlos Contreras Bolton Estructura de Datos
42/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
43/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
44/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
45/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
46/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
47/48
Arboles
de Cobertura Mnima Caminos Mnimos
Algoritmo de Dijkstra
Algorithm Dijkstra
Require: G : Grafo, w : peso de las aristas, s:
v
ertice origen.
1: INICIALIZAR-UNICO-ORIGEN(G
, s)
2: S
3: Q G .V
4: while Q 6= do
5:
u EXTRAER-MIN(Q)
6:
S {u}
7:
for cada v
ertice v G .Adyacente(u) do
8:
RELAJACION(u,
v, w)
9:
end for
10: end while
48/48