Jeśli wagi krawędzi są liczbami całkowitymi w , możesz zaimplementować Dijkstrę do działania w czasie O ( K | V | + | E | ) , zgodnie z sugestią @ rrenaud. Oto bardziej jednoznaczne wyjaśnienie.{0,1,…,K}O(K|V|+|E|)
W dowolnym momencie (skończone) klucze w kolejce priorytetowej znajdują się w pewnym zakresie , gdzie D jest wartością ostatniego klucza usuniętego z kolejki priorytetowej. (Każdy klucz ma co najmniej D , ponieważ sekwencja kluczy usuniętych przez algorytm Dijkstry nie zmniejsza się, a każdy klucz ma co najwyżej D + K , ponieważ każdy klucz ma wartość d [ u ] + w t ( u , w ) dla jakaś przewaga ( u ,{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w) gdzie d [ u ] to odległość od źródła do jakiegoś wierzchołka u, który został już usunięty, więc d [ u ] ≤ D. )(u,w)d[u]ud[u]≤D
Z tego powodu można zaimplementować kolejkę priorytetową za pomocą okrągłej tablicy o rozmiarze K + 1 , przy czym każda komórka zawiera segment. Przechowuj każdy wierzchołek z kluczem k w wiadrze w komórce A [ h ( k ) ], gdzie . Śledzić . Wykonaj operacje w następujący sposób:A[0..K]K+1kA[h(k)]Dh(k)=kmod(K+1)D
usunięta, min : Gdy jest pusta, przyrost . Następnie usuń i zwróć wierzchołek z .D A [ h ( D ) ]A[h(D)]DA[h(D)]
wstaw za pomocą klawisza : dodaj wierzchołek do segmentu .A [ h ( k ) ]kA[h(k)]
Klawisz zmniejszania do : Przenieś wierzchołek z do .k ′ A [ h ( k ) ] A [ h ( k ′ ) ]kk′A[h(k)]A[h(k′)]
Klawisz wstawiania i zmniejszania są operacjami o stałym czasie, więc całkowity czas spędzony na tych operacjach będzie wynosił . Całkowity czas spędzony w usunięta, min będzie plus wartość końcowa . Ostateczna wartość jest maksymalny (Finite) odległość od źródła do każdego wierzchołka (ponieważ usuwania-min, że wykonuje iteracji zwiększa o ). Maksymalna odległość wynosi co najwyżej ponieważ każda ścieżka ma co najwyżej krawędzie . Zatem całkowity czas spędzony przez algorytm wynosi .O ( | V | ) D D i D i K ( | V | - 1 ) | V | - 1 O ( K | V | + | E | )O(|V|+|E|)O(|V|)DDiDiK(|V|−1)|V|−1O(K|V|+|E|)