Если веса ребер являются целыми числами в , вы можете реализовать Dijkstra для выполнения за , следуя предложению @ rrenaud. Вот более явное объяснение.O ( K | V | + | E | ){0,1,…,K}O(K|V|+|E|)
В любое время (конечные) ключи в очереди с приоритетами находятся в некотором диапазоне , где - это значение последнего ключа, удаленного из очереди с приоритетами. (Каждый ключ по крайней мере , потому что последовательность ключей, удаленных алгоритмом Дейкстры, неубывающая, и каждый ключ не более , потому что каждый ключ имеет значение для некоторого ребро где - расстояние от источника до некоторой вершины , которая уже удалена, поэтому )D D D + K d [ u ] + w t ( u , w ) ( u , w ) d [ u ] u d [ u ] ≤ D{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w)(u,w)d[u]ud[u]≤D
По этой вы можете реализовать очередь с приоритетом с помощью кругового массива размера , в каждой ячейке которого содержится сегмент. Сохраните каждую вершину с ключом в ячейке в ячейке где . Отслеживайте . Выполните операции следующим образом:K + 1 k A [ h ( k ) ]A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
удалить-мин : В то время как пуст, приращение . Затем удалите и верните вершину из .A[h(D)]DA[h(D)]
вставить с ключом : добавить вершину в корзину .A [ h ( k ) ]kA[h(k)]
клавиша уменьшения к : переместите вершину из в .k ′ A [ h ( k ) ] A [ h ( k ′ ) ]kk′A[h(k)]A[h(k′)]
Вставка и уменьшение ключа являются операциями с постоянным временем, поэтому общее время, потраченное на эти операции, будет . Общее время , затраченное на Delete-мин будет плюс конечное значение . Конечным значением является максимальное (конечное) расстояние от источника до любой вершины (потому что delete-min, который занимает итераций, увеличивает на ). Максимальное расстояние не более потому что каждый путь имеет не более ребер. Таким образом, общее время, проведенное алгоритмом, составляет .O(|V|+|E|)O(|V|)DDiDiK(|V|−1)|V|−1O(K|V|+|E|)