Está en la página 1de 2

Algoritmo de Floyd

Sirve para hallar las mı́nimas distancias entre todos los vértices de un grafo valorado
(G, f ), con G = (V, E), de n vértices V = {v1 , v2 , ..., vn } con valores positivos, es decir
f : E −→ R+ .
Formalmente, la entrada del algoritmo es la matriz de adyacencia n × n M = (aij ),
que en cada entrada aij guarda el valor de la flecha vi → vj ∈ E. El algoritmo utiliza
como recurso una matriz del mismo tamaño que la matriz de adyacencia, la matriz de
resultados parciales D = (dij ). Al inicio, la matriz de resultados parciales toma el valor de
la matriz de adyacencia, es decir, dij = aij . El cuerpo del algoritmo es un bucle indexado
por k, tal que en la iteración k-ésima se compara la suma (componente a componente)
de la fila y columna k-ésimas de la matriz de resultados parciales, quedándose con
el mı́nimo. El resultado del algoritmo, al final del bucle, es la matriz de resultados
parciales, que coincidirá con la matriz de mı́nimas distancias.
En pseudocódigo, representando la entrada dij de la matriz de resultados parciales
D por D[i, j], se tiene:

Para k = 0 hasta n hacer


{
Para i = 0 hasta n hacer
{
Para j = 0 hasta n hacer
{
D[i,j] = mı́nimo(D[i,j],D[i,k] + D[k,j])
}
}
}

[Referencia: http://es.wikipedia.org/wiki/Algoritmo de Floyd-Warshall]


La validez del algoritmo se demuestra teniendo en cuenta el significado de la entrada
dij de la matriz de resultados parciales al final de la iteración k-ésima: es el valor del
camino entre vi y vj , que sea mı́nimo entre los que pueden opcionalmente utilizar, como
vértices intermedios, los del conjunto {v1 , v2 , ..., vk }. Es decir dij = mı́n(f (C)), siendo C
del conjunto de caminos entre vi y vj que utiliza, como mucho, los k primeros vértices.
Que se cumple esta propiedad es fácil de ver en la primera iteración (k = 1), porque
el valor ai1 + a1j que resulta de sumar la primera fila y la primera columna de la matriz
de resultados parciales (que al inicio coincide con la matriz de adyacencia) es el valor del
camino vi → v1 → vj . Por lo tanto al hacer el mı́nimo mı́n(f (vi → vj ), f (vi → v1 → vj )),
queda el valor del camino mı́nimo entre los que pueden usar el vértice v1 . Se puede utilizar
el sı́mbolo corchete ’[]’ para representar estas opciones de caminos en una expresión:
vi → [v1 →]vj . Al final de la iteración 1, dij tiene el valor del mı́nimo camino.
En la segunda iteración, al hacer el mı́nimo se compara el valor de esos caminos
con los de vi → [v1 →]v2 → [v1 →]vj , que podemos representas con la expresión
vi → [v1 → |v2 →]∗ vj (La barra ’|’ separa diversas opciones, y el asterisco ’*’ indica que
pueden repetirse la elección de opciones varias veces). Por tanto, dij al final de la segunda
iteración contiene el valor del mı́nimo camino entre vi y vj que utiliza, opcionalmente,
los vértices v1 y v2 .
En general, por inducción sobre k, el valor de dij al final de la iteración k-ésima es
el mı́nimo de dos números: el primero es el valor de dij en la iteración anterior (que se
corresponde, por inducción, con un camino mı́nimo de de la forma vi → [v1 → |v2 →
|...|vk−1 →]∗ vj ); el segundo número es una suma que se corresponde con el mı́nimo
camino de la forma vi → [v1 → |v2 → |...|vk−1 →]∗ vk → [v1 → |v2 → |...|vk−1 →]∗ vj .
Por tanto el resultado de esa comparación se corresponde con el mı́nimo camino entre
los descritos por la expresión vi → [v1 → |v2 → |...|vk →]∗ vj , porque un camino mı́nimo
sólo pasa una vez, como mucho, por cada vértice. Por tanto, en la iteración final (k = n)
contiene el valor del camino mı́nimo usando cualesquiera de los vértices de G, que es el
resultado buscado.

También podría gustarte