Si les poids de bord sont des entiers dans , vous pouvez implémenter Dijkstra pour qu'il s'exécute en O ( K | V | + | E | ){0,1,…,K}O(K|V|+|E|) , en suivant la suggestion de @ rrenaud. Voici une explication plus explicite.
À tout moment, les clés (finies) de la file d'attente prioritaire sont dans une certaine plage , où D est la valeur de la dernière clé retirée de la file d'attente prioritaire. (Chaque clé est au moins D , car la séquence de clés supprimée par l'algorithme de Dijkstra n'est pas décroissante, et chaque clé est au plus D + K , car chaque clé a la valeur d [ u ] + w t ( u , w ) pour un bord ( u ,{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w)(u,w)où est la distance de la source à un sommet u qui a déjà été supprimé, donc d [ u ] ≤ Dd[u]ud[u]≤D )
Pour cette raison, vous pouvez implémenter la file d'attente prioritaire avec un tableau circulaire de taille K + 1 , chaque cellule contenant un compartiment. Stockez chaque sommet avec la clé k dans le seau dans la cellule A [ h ( k ) ] où h ( k ) = k mod ( K + 1 ) . Gardez une trace de DA[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D . Effectuez les opérations comme suit:
delete-min : Alors que est vide, incrément D . Ensuite, supprimez et renvoyez un sommet de A [ h ( D ) ]A[h(D)]DA[h(D)] .
insérer avec la clé : ajouter le sommet au seau de A [ h ( k ) ]kA[h(k)] .
touche décroissante à k ′ : déplacer le sommet de A [ h ( k ) ] à A [ h ( k ′ ) ]kk′A[h(k)]A[h(k′)] .
L'insertion et la diminution de la clé sont des opérations à temps constant, donc le temps total passé dans ces opérations sera . Le temps total passé en suppression min sera O ( | V | ) ainsi que la valeur finale de D . La valeur finale de D est la distance maximale (finie) de la source à tout sommet (car une suppression-min qui prend i itérations augmente D de i ). La distance maximale est au plus K ( | V | - 1O(|V|+|E|)O(|V|)DDiDiK(|V|−1) car chaque chemin a au plus bords. Ainsi, le temps total passé par l'algorithme est O ( K | V | + | E | ) .|V|−1O(K|V|+|E|)