Está en la página 1de 2

Algoritmo de Floyd-Warshall

En informtica, el algoritmo de Floyd-Warshall, descrito en 1959 por Bernard Roy, es un algoritmo de anlisis sobre grafos para encontrar el camino mnimo en grafos dirigidos ponderados. El algoritmo encuentra el camino entre todos los pares de vrtices en una nica ejecucin. El algoritmo de Floyd-Warshall es un ejemplo de programacin dinmica.

ndice

1 Algoritmo 2 Pseudocodigo 3 Cdigo en C++ 4 Comportamiento con ciclos negativos 5 Ejemplo 6 Anlisis 7 Aplicaciones y generalizaciones 8 Implementacin del algoritmo de Floyd-Warshall 9 Referencias 10 Vase tambin 11 Enlaces externos

Algoritmo
El algoritmo de Floyd-Warshall compara todos los posibles caminos a travs del grafo entre cada par de vrtices. El algoritmo es capaz de hacer esto con slo comparaciones (esto es notable considerando que puede haber hasta aristas en el grafo, y que cada combinacin de aristas se prueba). Lo hace mejorando paulatinamente una estimacin del camino ms corto entre dos vrtices, hasta que se sabe que la estimacin es ptima. Sea un grafo con conjunto de vrtices , numerados de 1 a N. Sea adems una funcin

que devuelve el camino mnimo de a usando nicamente los vrtices de 1 a como puntos intermedios en el camino. Ahora, dada esta funcin, nuestro objetivo es encontrar el camino mnimo desde cada a cada usando nicamente los vrtices de 1 hasta . Hay dos candidatos para este camino: un camino mnimo, que utiliza nicamente los vrtices del conjunto ; o bien existe un camino que va desde hasta , y de el camino ptimo de a que nicamente utiliza los vrtices de 1 hasta camino sera la concatenacin del camino mnimo de a mnimo de a (que tambin utiliza los vrtices en hasta , que es mejor. Sabemos que est definido por a , la longitud de este ) y el camino

, y est claro que si hubiera un camino mejor de a (utilizando vrtices de ).

Por lo tanto, podemos definir

de forma recursiva:

Esta frmula es la base del algoritmo Floyd-Warshall. Funciona ejecutando primero para todos los pares para todos los pares , usndolos para despus hallar ... Este proceso contina hasta que ,y usando algn vrtice

habremos encontrado el camino ms corto para todos los pares de vrtices intermedio.

Pseudocodigo
Convenientemente, cuando calculamos el k-esimo caso, se puede sobreescribir la informacin salvada en la computacin k -1. Esto significa que el algoritmo usa memoria cuadrtica. Hay que cuidar la inicializacin de las condiciones:
1 /* Suponemos que la funcin pesoArista devuelve el coste del camino que va de i a j 2 (infinito si no existe). 3 Tambin suponemos que es el nmero de vrtices y pesoArista(i,i) = 0 4 */ 5 6 int camino[][]; 7 /* Una matriz bidimensional. En cada paso del algoritmo, camino[i][j] es el camino mnimo 8 de i hasta j usando valores intermedios de (1..k-1). Cada camino[i][j] es inicializado a 9 pesoArista(i,j) 10 */ 11 12 procedimiento FloydWarshall () 13 para k: = 0 hasta n 1 14 para todo (i,j) en (0..n 1) 15 camino[i][j] = mn ( camino[i][j], camino[i][k]+camino[k][j]) 16 fin para 17 fin para

Cdigo en C++
// Declaraciones en el archivo .h int cn; //cantidad de nodos vector< vector<int> > ady; // Devuelve una matriz con las distancias minimas de cada nodo al resto de los vertices. vector< vector<int> > Grafo :: floydWarshall(){ vector< vector<int> > path = this->ady; for(int i = 0; i < cn; i++) path[i][i] = 0; for(int k = 0; k < cn; k++) for(int i = 0; i < cn; i++) for(int j = 0; j < cn; j++){ int dt = path[i][k] + path[k][j]; if(path[i][j] > dt) path[i][j] = dt; } return path; }

También podría gustarte