Si los pesos de borde son enteros en , puede implementar Dijkstra's para que se ejecute en tiempo O ( K | V | + | E | ) , siguiendo la sugerencia de @ rrenaud. Aquí hay una explicación más explícita.{ 0 , 1 , ... , K}O ( KEl | VEl | + | miEl | )
En cualquier momento, las teclas (finitas) en la cola de prioridad están en algún rango , donde D es el valor de la última clave eliminada de la cola de prioridad. (Cada clave es al menos D , porque la secuencia de claves eliminadas por el algoritmo de Dijkstra no es decreciente, y cada clave es como máximo D + K , porque cada clave tiene un valor d [ u ] + w t ( u , w ) para un poco de borde ( u ,{ D , D + 1 , ... , D + K}rereD + Kre[u]+wt(u,w) donde d [ u ] es la distancia desde la fuente a algún vértice u que ya se ha eliminado, entonces d [ u ] ≤ D. )(u,w)d[u]ud[u]≤D
Debido a esto, puede implementar la cola de prioridad con una matriz circular de tamaño K + 1 , con cada celda que contiene un depósito. Almacene cada vértice con la clave k en el depósito en la celda A [ h ( k ) ] donde h ( k ) = k mod ( K + 1 ) . Realizar un seguimiento de D . Realice las operaciones de la siguiente manera:A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
delete-min : Mientras está vacía, el incremento D . Luego borre y devuelva un vértice de A [ h ( D ) ] .A[h(D)]DA[h(D)]
inserte con la tecla : Agregue el vértice al cubo de A [ h ( k ) ] .kA[h(k)]
tecla de disminución a k ' : mueve el vértice de A [ h ( k ) ] a A [ h ( k ' ) ] .kk′A[h(k)]A[h(k′)]
Insertar y disminuir clave son operaciones de tiempo constante, por lo que el tiempo total dedicado a esas operaciones será . El tiempo total de permanencia en delete-min será O ( | V | ) más el valor final de D . El valor final de D es la distancia máxima (finita) desde la fuente a cualquier vértice (porque un delete-min que toma i iteraciones aumenta D en i ). La distancia máxima es como máximo K ( | V | - 1O(|V|+|E|)O(|V|)DDiDi porque cada ruta tiene como máximo | V | - 1 aristas. Por lo tanto, el tiempo total empleado por el algoritmo es O ( K | V | + | E | ) .K(|VEl | -1)El | VEl | -1O ( KEl | VEl | + | miEl | )