Разница между алгоритмом DIjkstra и BellmanFord

Я отжимаю тезис о кратчайших алгоритмах пути. И я ничего не понимаю... enter image description here

Я сделал визуализацию алгоритма dijkstras. 1) Правильно ли это? Или я делаю что-то неправильно? 2) Как бы выглядел алгоритм Беллмана-Форда? Поскольку я искал разницу, я нашел "Bellman-ford: основная идея очень похожа на Dijkstra's, но вместо того, чтобы выбирать краткими соседними краями, она выбирает все соседние края". Но также dijkstra проверяет все вершины и все ребра, не так ли?

Ответы

Ответ 1

dijkstra предполагает, что стоимость дорожек монотонно возрастает. что плюс упорядоченный поиск (с использованием очереди приоритетов) означает, что, когда вы впервые достигнете node, вы пришли через кратчайший путь.

это неверно с отрицательными весами. если вы используете dijkstra с отрицательными весами, то вы можете найти более поздний путь лучше предыдущего (потому что отрицательный вес улучшил путь на более позднем этапе).

поэтому в bellman-ford, когда вы придете к node, вы проверите, будет ли новый путь короче. в отличие от dijkstra, вы можете отбирать узлы

в некоторых (большинстве) случаях dijkstra не будет исследовать все полные пути. например, если G привязана только к C, то любой путь через G будет более дорогостоящим, чем любой через C. bellman-ford все равно будет рассматривать все пути через G к F (dijkstra никогда не будет смотреть на них, потому что они имеют более высокую стоимость, проходя через С). если он этого не делает, он не может гарантировать обнаружение отрицательных циклов.

вот пример: приведенное выше никогда не вычисляет путь AGEF. E уже отмечен как посещение к моменту поступления из G.

Ответ 2

Я тоже думаю о том же

Алгоритм Дейкстра решает проблему кратчайшего пути с одним источником, когда все ребра имеют неотрицательные веса. Это жадный алгоритм и аналогичный алгоритму Прима. Алгоритм начинается с исходной вершины, s, она вырастает дерево T, которое в конечном счете охватывает все вершины, достижимые из S. Вершины добавляются к T в порядке расстояния, т.е. сначала S, а затем ближайшая к S вершина, затем ближайшая ближайшая, и т.д.