Sunteți pe pagina 1din 2

El único algoritmo SSSP

Al igual que el recorrido de grafos y los árboles de expansión mínima, muchos


algoritmos SSSP diferentes pueden describirse como casos especiales de un único
algoritmo genérico, propuesto por primera vez por Lester Ford en 1956 y descrito
independientemente por George Dantzig en 1957 y nuevamente por George Minty en
1958. Cada vértice v en el grafo almacena dos valores, que (inductivamente) describen
el camino tentativo más corto de s a v.

 dist(v) es la longitud de la ruta tentativa más corta de s ⇝ v, o ∞ si no existe tal


ruta.
 pred(v) es el predecesor de v en la ruta tentativa más corta de s ⇝ v, o Null si no
existe tal vértice.
Los punteros predecesores definen automáticamente un árbol tentativo de la ruta más
corta enraizado en s; estos punteros son exactamente los mismos que los punteros
principales en nuestro algoritmo genérico de recorrido de grafos. Al comienzo del
algoritmo, inicializamos las distancias y los predecesores de la siguiente manera:

InitSSSP(s):
dist(s) ← 0
pred(s) ← Null
para todos los vértices: v≠s
dist(v) ← ∞
pred(v) ← Null

Durante la ejecución del algoritmo, un borde u → v es tenso si dist (u) + w(u → v) <
dist(v). Si de u → v es tenso, la ruta tentativa más corta de s ⇝ v es claramente
incorrecta, porque la ruta de s⇝ u → v es más corta. Podemos corregir (o, al menos,
mejorar) esta sobrestimación sobredimensionada, aflojando el borde de la siguiente
manera:

Relax(u→ v):
dist(v)←dist(u)+w(u→ v)
pred(v)←u

Ahora que todo está configurado, el algoritmo genérico de Ford tiene una descripción
simple de una línea.

Relaje repetidamente los bordes tensos, hasta que no haya más bordes tensos.

FordSSSP(s):
InitSSSP(s):
mientras que hay al menos un borde tenso
RELAX cualquier borde tenso
Si FordSSSP termina finalmente (porque no hay más bordes tensos), entonces los
punteros predecesores definen correctamente un árbol de ruta más corta, y cada valor
dist (v) es la distancia real de ruta más corta de s a v. En particular, si s no puede
alcanzar v, luego dist (v) = ∞, y si se puede alcanzar algún ciclo negativo desde s ,
entonces el algoritmo nunca termina.

La exactitud del algoritmo genérico de Ford se desprende de la siguiente serie de


afirmaciones similares:
1. En cualquier momento durante la ejecución del algoritmo, para cada vértice, la
distancia dist(v) es ∞ o la longitud de una caminata de s a v. Esta afirmación se
puede probar por inducción en el número de relajaciones.
2. Si la gráfica no tiene ciclos negativos, entonces dist(v) es ∞ o la longitud de
algún camino simple de s a v. Específicamente, si dist(v) es la longitud de un
recorrido de s a v que contiene un ciclo dirigido, ese ciclo debe tener una
longitud negativa. Esta afirmación implica que si G no tiene ciclos negativos, el
algoritmo de relajación finalmente se detiene, porque solo hay un número finito
de rutas simples en G.
3. Si ningún borde en G es tenso, entonces para cada vértice v, la distancia dist (v)
es la longitud de las trayectorias predecesoras s→···pred(pred(v))→ pred(v)→v.
Específicamente, si viola esta condición pero su predecesor pred(v) no, el borde
pred(v)→v es tenso.
4. Si no hay ningún borde entre los tiempos, entonces para cada vértice, la ruta de
acceso predecesor s→···→pred(pred(v))→pred(v)→v es de hecho una ruta más
corta de s a v. Específicamente, si v viola esta condición pero su predecesor u en
una ruta más corta no, el borde u → v es tenso Esta afirmación también implica
que si G tiene un ciclo negativo, entonces alguna ventaja es siempre tensa, por lo
que el algoritmo genérico nunca se detiene.

Hasta ahora no he dicho nada sobre cómo encontrar bordes tensos, o qué borde tenso se
relaja si hay más de uno. Al igual que con el recorrido de grafos, hay diferentes
instancias del algoritmo genérico de relajación de Ford. Sin embargo, al igual que el
recorrido de grafos, la eficiencia y la corrección de cada estrategia de búsqueda
dependen de la estructura del grafo de entrada. En el resto de este capítulo, analizamos
las cuatro instancias más comunes del algoritmo de Ford, cada uno de los cuales es la
mejor opción para una clase diferente de grafos de entrada. Dejaré los detalles restantes
de la prueba de corrección genérica como ejercicios, y en su lugar daré pruebas de
corrección (más informativas) para cada uno de estos cuatro algoritmos en específico.

S-ar putea să vă placă și