Я думаю, что основная идея решения этой проблемы заключается в том, чтобы помнить, что W является константой, поэтому, если вы представляете свою приоритетную очередь как некоторую структуру, размер которой ограничен W, весь список на каждой итерации не изменит временную сложность вашего алгоритма...
Например, если вы представляете свою приоритетную очередь в виде массива T с W + 1 позициями, имеющего связанный список вершин в каждой позиции, так что T[i ] — это список со всеми вершинами, имеющими приоритет, равный i, и использующий T[W + 1] для хранения вершин с приоритетом, равным бесконечности, вы возьмет
O(V) для построения очереди с приоритетом (просто вставьте все вершины в список T[W+1])
O(W), чтобы извлечь минимальный элемент (просто перемещайтесь по T в поисках первой непустой позиции)
O(1) для уменьшения ключа (если вершина v имела ключ, равный i, и он был обновлен до j , просто удалите v из списка T[i] и вставьте в первую позицию списка T[j]).
Таким образом, это даст вам сложность O(VW + E) вместо O(V logV + E).
(Конечно, это не сработает, если диапазон будет от 1 до V, потому что V^2 + E больше, чем V \logV + E сильный>).
person
Hilder Vitor Lima Pereira
schedule
04.12.2014