Смысл алгоритма Дейкстры (а также BFS) заключается в том, что когда узел выходит из очереди приоритетов (или очереди FIFO в BFS), он должен иметь самое короткое расстояние от исходного узла, и расстояние будет заблокировано. Эти узлы будут помечены как посещенные и никогда не будут go в очередь снова. Вот почему очередь FIFO отлично работает в BFS, потому что веса каждого ребра равны, а кратчайшее расстояние от источника будет минимальным числом «прыжков».
Теперь давайте рассмотрим этот взвешенный граф:
(s)
/ \
2/ |
/ |
(a) |
| |
3| |
| |
(b) |100
| |
2| |
| |
(c) |
\ |
4\ |
\ /
(d)
Давайте попробуем очередь FIFO, чтобы найти кратчайший путь от узла s.
Push s: Queue: [s], Distance: s:0
Pop s, Push a, d: Queue: [a, d], Distance: s:0, a:2, d:100
Pop a, Push b: Queue: [d, b], Distance: s:0, a:2, d:100, b:5
Pop d, Push c: Queue: [b, c], Distance: s:0, a:2, d:100, b:5, c:104
Pop b, No new neighbors, Queue: [c], Distance: s:0, a:2, d:100, b:5, c:104
Pop c, No new neighbors, Queue: [], Distance: s:0, a:2, d:100, b:5, c:104
Очевидно, что это неправильно для узлов c и d, где наименьшее расстояние будет 7 и 11 . Использование очереди с приоритетами определенно сделало бы это правильно.