You are on page 1of 6

Algoritmos para hallar caminos mnimos.

Algoritmo de Dijkstra
A continuacin se especifica Algoritmo de Dijkstra en pseudo-cdigo.
Estructura de datos auxiliar: Q = Estructura de datos Cola de prioridad (se puede
implementar con un heap
DIJKSTRA (Grafo G, nodo_fuente s)
// inicializamos todos los nodos del grafo. La distancia de
cada nodo es infinita
// y los padres son NULL
for u V[G] do
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
//encolamos todos los nodos del grafo
Encoar (coa, V[G])
mientras coa != 0 do
// OJO: e e!trae el nodo "ue tiene distancia m#nima y se
conser$a la condici%n
// de &ola de prioridad
u = e"traer_#ini#o(coa)
for $ ad$acencia[ u] do
if distancia[$] % distancia[u] & peso(u,') do
distancia[$] = distancia[u] & peso(u,')
padre[$] = u
Algoritmo 24.1: Algoritmo de Dijkstra.
Inicializacin.
- !ea " un conjunto de #$rtices de un grafo.
- !ea C una matri% de costos de las aristas del grafo& donde en C'u&#( se
almacena el costo de la arista entre u ) #.
- !ea ! un conjunto *ue contendr+ los #$rtices para los cuales )a se tiene
determinado el camino m,nimo.
- !ea D un arreglo unidimensional tal *ue D'#( es el costo del camino m,nimo
del #$rtice origen al #$rtice #.
- !ea - un arreglo unidimensional tal *ue -'#( es el #$rtice predecesor de # en el
camino m,nimo *ue se tiene construido.
- !ea #inicial el #$rtice origen. .ecordar *ue el Algoritmo Dijkstra determina
los caminos m,nimos *ue existen partiendo de un #$rtice origen al resto de los
#$rtices
Paso 1. ! /#inicial0 11Inicialmente S contendr el vrtice
11origen
Paso 2. Para cada #"& # 2 #inicial& hacer
1.1. D'#( C'#inicial& #( 11Inicialmente el costo del 11camino
mnimo de vinicial a v es lo contenido en 11la matriz de
costos
1.2. -'#( #inicial 11Inicialmente, el 11predecesor
de v en el camino mnimo construido 11hasta el momento es
vinicial
Paso 3. ientras (" 3 ! 2 hacer 11Mientras existan vrtices para
11los cuales no se ha determinado el
11camino mnimo
3.1. Elegir un #$rtice 4("-! tal *ue D'4( sea el m,nimo.
3.2. ! ! /40 11Se agrega w al conjunto S, pues ya se
11tiene el camino mnimo hacia w
3.3. Para cada #("-! hacer
3.3.1. D'#( min(D'#(&D'4(5C'4&#( 11Se escoge, entre
11el camino mnimo hacia v que se tiene 11hasta el
momento, y el camino hacia v 11pasando por w
mediante su camino mnimo, 11el de menor costo
3.3.2. !i min(D'#(&D'4(5C'4&#( = D'4(5C'4&#( entonces
-'#( 4 11Si se escoge ir por w entonces
11el predecesor de v por el momento es w
Paso 4. "in
A continuacin se muestra formalmente el Algoritmo de 6lo)d.
Algoritmo 24.2: Algoritmo de "lo#d.
Inicializacin.
- !ea " el conjunto de #$rtices de un grafo.
- !ea C la matri% de costos de las aristas del grafo& donde en C'u&#( se almacena
el costo de la arista entre u ) #.
- !ea D una matri% tal *ue D'u&#( es el costo del camino m,nimo del #$rtice u al
#$rtice #.
- !ea - una matri% de predecesores tal *ue -'u&#( es el #$rtice predecesor de #
en el camino m,nimo *ue #a de u a #.
Paso 1. Para cada par u&#"7" hacer
1.1. D'u&#( C'u& #( 11Inicialmente el costo del 11camino
mnimo de u a v es lo contenido en la 11matriz de costos
1.2. -'u&#( 8 11Inicialmente, no hay predecesor de v
en el camino mnimo de u a v
Paso 2. Para cada u" hacer
Para cada par #&4"7" hacer
2.1. D'#&4( min(D'#&4(&D'#&u(5D'u&4( 11Se escoge,
11entre el camino de v a w que se tiene
11hasta el momento, y el camino de v a w
11pasando por u, el de menor costo
2.2. !i min(D'#&4(&D'#&u(5D'u&4( = D'#&u(5D'u&4(
entonces -'#&4( u 11Si se escoge ir por u
11entonces el predecesor de w por el momento es u
Paso 3. "in
$onstr%ccin de los caminos mnimos
9a construccin del camino m,nimo entre dos #$rtices presenta un es*uema recursi#o
mu) sencillo& *ue se presenta a continuacin.
9ista:;< Camino=inimo(; #& ; 4
Inicio
9ista:;< Camino>
entero i #ertices.?uscar(#> 11i es la posici!n que ocupa v
11en la lista de vrtices
entero j #ertices.?uscar(4> 11Idem
si -'i&j( 2 8 entonces
inicio
; u #ertices.@Atener(-'i&j(> 11u es un vrtice intermedio
11en el camino mnimo de v a w
9ista:;< 9B Camino=inimo(#&u>
9ista:;< 9C Camino=inimo(u&4>
Camino 9B.Concatenar(9C> 11realiza la concatenaci!n
""de dos listas
&in
sino inicio 11Si no hay vrtice intermedio
Camino.Adicionar(#>
Camino.Adicionar(4>
&in
retornar Camino>
"in
Algoritmos para hallar el 'r(ol de e)pansin mnima.
A continuacin se especifica Algoritmo de -rim en pseudo-cdigo.
Estructura de datos auxiliar: Q = Estructura de datos $ola de prioridad (se puede
implementar con un heap
PRIM (Grafo G, nodo_fuente s)
// inicializamos todos los nodos del grafo. La distancia la
ponemos a infinito
// y el padre de cada nodo a NULL
for each u V[G] do
distancia[u] = INFINITO
padre[u] = NULL
distancia[s]=0
//encolamos todos los nodos del grafo
Encoar(coa, V[G])
while coa != 0 do
// OJO: e e!trae el nodo "ue tiene distancia m#nima y se
conser$a la condici%n
// de &ola de prioridad
u = e"traer_#ini#o(coa)
for v ad$acencia[ u] do
if (($ coa) && (distancia[$] % peso(u, ')) do
padre[$] = u
distancia[$] = peso(u, ')
Inicializacin(
) *ea + e con,unto de '-rtices de .rafo
) *ea +/ e con,unto de '-rtices 0ue ir1n siendo incuidos en e
1r2o de e"pansi3n #4ni#a( Inicia#ente +/ =
) *ea E/ e con,unto de aristas de 1r2o de e"pansi3n #4ni#a(
Inicia#ente E/ =
) *ea 5 una coa de prioridad donde ser1n a#acenadas as aristas en
orden decreciente se.6n su peso(
Paso 1 *eeccionar un '-rtice ar2itrario r +(
+/ 7r8 99e a'ade r como ra#z del (r)ol de e!pansi%n m#nima
Paso ! Para cada s :d$acentes:(r) hacer
!1 5(:dicionar(;r, s%, Peso(;r, s%))
99*diciona la arista +r, s- a la cola con prioridad .
Paso " Mientras (+ < +/ = ) hacer 99/ientras e!istan $0rtices "ue no
99pertenezcan a los $0rtices del
991r)ol
"1 ;r, s% 5(E"traer()99e e!trae la arista de menor costo
"! E
/
E
/
7;r, s%8 99e a'ade la arista +r, s- al 1r)ol
"" +
/
+
/
7s8 99e a'ade el $0rtice s al 1r)ol
"# Para cada " :d$acente:(s) hacer
"#1 Si " +/

99i ! no es uno de los $0rtices del
991r)ol(
$ntonces 5( :dicionar (; s,"%, Peso(;s,"%))
99 *dicionar la arista + s ,! - a la &ola .
Paso # Retornar :(+
/
,E
/
) // 2e$ol$er el 1r)ol formado por los $0rtices
// V3

y por las aristas 4
5

A continuacin se especifica Algoritmo de Druskal en pseudo-cdigo
6unciona de la siguiente manera:
se crea un Aos*ue # (un conjunto de +rAoles& donde cada #$rtice del grafo es un +rAol
separado
se crea un conjunto $ *ue contenga a todas las aristas del grafo
mientras $ es novaco
o eliminar una arista de peso m,nimo de $
o si esa arista conecta dos +rAoles diferentes se aEade al Aos*ue& comAinando los dos
+rAoles en un solo +rAol
o en caso contrario& se desecFa la arista
Al acaAar el algoritmo& el Aos*ue tiene una sola componente& la cual forma un +rAol de
expansin m,nimo del grafo.
6rus7al 8 Grafo No 2irigidodo .onderado G98V, 4::
Inicializacin(
4
3
9 ; < // 1r)ol sin aristas
" Paso 1 Para cada ' > + hacer
# ?@rear (') //crear una colecci%n 2 de =V = con>untos dis>untos
//diferentes
%
Paso ! Ordenar las aristas de E por peso no decrecientes
Paso " Para cada &'(v)

E
"1 Si Encotrar(?,u) ? Encotrar(?,') entonces // si u y $ est(n en
con>untos diferentes.
"11 E/ & 7;u, '%8 99 *e aAade a arista
;u, '% a as aristas de Br2o(
"1" Union(?, u, ') 99 Unir os
con,untos 0ue contienen a u $ '
Paso # Retornar : (+, E/) // 2e$ol$er el 1r)ol formado por los $0rtices V

y
por las aristas 43