You are on page 1of 12

Algoritmo de Dijkstra

• Supóngase un grafo dirigido G=(V, A) en el cual cada arco


tiene una etiqueta no negativa, y donde un vértice se
especifica como origen.

M.TL: Juan Carlos González Pinto


• El problema es determinar el costo del camino más corto
del origen a todos los demás vértices de V, donde la
longitud de un camino es la suma de los costos de los
arcos del camino.

86
Algoritmo de Dijkstra

• El algoritmo de Dijkstra opera a partir de un conjunto de


S de vértices cuya distancia más corta desde el origen ya
es conocida.

M.TL: Juan Carlos González Pinto


• Inicialmente S sólo contiene al origen.
• En cada paso se integra un nuevo vértice, cuya distancia
al origen es la más corta posible.
• En cada paso se utiliza un arreglo D para registrar el
camino más corto.

87
Algoritmo de Dijkstra
• Se supone que se tiene un grafo dirigido G=(V, A) en el
que V={1, 2, …, n}.
• C es un arreglo bidimensional de costos, donde C[i, j] es
el costo de ir del vértice i al j.

M.TL: Juan Carlos González Pinto


• En caso de que no exista dicho arco, C[i, j] es ∞.
• D[i] contiene la longitud del camino más corto al vértice
i.
• P[v] contiene el vértice inmediato anterior a v en el
camino más corto.

88
Algoritmo de Dijkstra
1. Inicio
2. S{1}
3. Para i2 hasta n hacer
D[i]C[1,i]
4. Fin_para
5. Para i1 hasta n-1 hacer

M.TL: Juan Carlos González Pinto


Elige un vértice w en V-S tal que D[w] es mínimo.
Agrega w a S
Para cada vértice v en V-S hacer
Si D[w]+C[w, v]<D[v] entonces
P[v] w
D[v] D[w]+C[w, v]
Fin_si
Fin_para
6. Fin_para
7. Fin 89
Algoritmo de Floyd

• Se tiene un grafo y se desea obtener el camino más corto


entre cualesquiera dos pares de vértices.
• Se tiene un grafo dirigido G=(V, A) en el cual cada arco

M.TL: Juan Carlos González Pinto


tiene un costo no negativo.
• El Algoritmo de Floyd obtiene una matriz en la que se
calculan los costos de los caminos más cortos.
• Inicialmente A[i, j]=C[i, j] para toda i≠j.
• Si no hay arco de i a j se supone C[i, j]=∞.

90
Algoritmo de Floyd
1. Inicio
2. Para i1 hasta n hacer
Para j1 hasta n hacer
A[i, j]C[i, j]
Fin_para

M.TL: Juan Carlos González Pinto


3. Fin_para
4. Para i1 hasta n hacer
A[i, i]0
5. Fin_para
6. Para k1 hasta n hacer
Para i1 hasta n hacer
Para j1 hasta n hacer Fin_para
Si A[i, k]+A[k, j]<A[i, j] entonces Fin_para
A[i, j]A[i, k]+A[k, j] Fin_para 91
Fin_si Fin
Árbol abarcador de costo mínimo
• Sea G=(V, A) un grafo conexo, con un costo en las aristas.

• Sea U algún subconjunto propio del conjunto de vértices


V.

M.TL: Juan Carlos González Pinto


• Si (u, v) es una arista de costo mínimo, tal que uU y
vV-U, existe un árbol abarcador de costo mínimo que
incluye (u, v) entre sus aristas.

92
Algoritmo de Prim

• Supóngase que V={1, 2, …, n}.


• El algoritmo de Prim comienza cuando se asigna a un
conjunto U un valor inicial {1}, en el cual crece un árbol

M.TL: Juan Carlos González Pinto


abarcador, arista por arista.
• En cada paso se localiza la arista más corta (u, v) que
conecta a U con V-U, agregando vV-U a U.
• Esto se repite hasta que V=U.

93
Algoritmo de Prim
Prim
1. T
2. U{1}
3. Mientras UV hacer

M.TL: Juan Carlos González Pinto


Sea (u, v) una arista de costo mínimo tal que uU y
vV-U.
TT{(u,v)}
UU {v}
4. Fin_mientras
5. Fin 94
Algoritmo de Kruskal

• Supóngase que se tiene el grafo G=(V, A) con V={1, 2, …,


n}.
• Se inicia con el grafo T=(V, ) constituido solo por los

M.TL: Juan Carlos González Pinto


vértices de G sin aristas.
• Por lo tanto, cada vértice es un componente conexa.
• Conforme el algoritmo avanza, se conectan dos
componente conexas distintas.
• Se repite hasta tener una única componente.

95
Algoritmo de Kruskal

• Se utilizan las siguientes operaciones:


• COMBINA(A, B, C): Se combinan las componentes A y B
en C.

M.TL: Juan Carlos González Pinto


• ENCUENTRA(v, C): Devuelve la componente C, del cual
el vértice v es miembro.
• INICIAL(A, v, C): Para que A sea el nombre de una
componente que pertenece a C, y que inicialmente
contiene solo el vértice v.

96
Algoritmo de Kruskal
1. comp_sig0
2. comp_nnúmero de miembros en V Si comp_u  comp_v
3. Para cada v en V hacer entonces
comp_sigcomp_sig+1 COMBINA(comp_u,comp
INICIAL (comp_sig,v,componentes) _v,componentes)

M.TL: Juan Carlos González Pinto


4. Fin_para
INSERTA(a, T)
5. Para cada a en A hacer
INSERTA(a, aristas) comp_ncomp_n-1
6. Fin_para Fin_si
7. Mientras comp_n>1 hacer 8. Fin_Mientras
aSUPRIME_MIN(aristas) 9. Fin
Sea a=(u, v)
comp_uENCUENTRA(u,componente)
97
comp_vENCUENTRA(v,componente)

You might also like