Что делает: находит кратчайшие расстояния от одной вершины до всех остальных в взвешенном ориентированном графе БЕЗ рёбер отрицательного веса!
| Чего | С очередью с приоритетом | С массивом |
|---|---|---|
| Время | O([E + V]*logV) | O(V^2 + E) |
| Память | O(V) | похуй |
Как получается такая асимптотика по времени:
| Время, затраченное на... | с очередью с приоритетом | с массивом |
|---|---|---|
| Инициализацию | O(V) | O(V) |
| Создание структуры | O(V) | O(V) |
| Extract-minimum из структуры | V * O(logV) | V * O(V) |
| Релаксацию рёбер | E * O(logV) | E * O(1) |
| ** **** | лучше для... | ...задачи, где |
| Свойства графа | E < V^2 | E = O(V^2) |
Общая идея:
Разделить граф на два подмножества: S - множество вершин, для которых вычислены окончательные веса кратчайших путей от s T - все остальные вершины, T = V \ S (множество вершин без множества S)
Реализация:
int main() {
for u из G(V) do { // инициализация
u.distance = INF
u.parent = NULL
}
s.distance = 0 // инициализируем стартовую вершину
vector<int> S = ø // множество вершин с окончательным
// кратчайшем путём
queue<int> Queue // заполняем очередь/массив вершинами
while (!Queue.empty()) {
u = Extract-min(Queue) // быстрее на очереди с приоритетом
S.push_back(u)
for v смежные с u
Relax(edge(u,v)) // с соответствующими вызовами
// Decrease-key;
// релаксация быстрее на массиве
}
}
‼ Особенности алгоритма Дейкстра:
Визуализация: этим я займусь чуть попозже