Алгоритм Дейкстры используется только тогда, когда у вас есть один источник, и вы хотите знать наименьший путь от одного узла к другому, но он терпит неудачу [в графах с отрицательными ребрами]
Алгоритм Дейкстры является одним из примеров кратчайшего пути из одного источника или алгоритма SSSP . Каждый алгоритм SSSP вычисляет расстояния по кратчайшему пути от выбранного исходного узла до каждого другого узла в графе. Более того, он вычисляет компактное представление всех кратчайших путей от до любого другого узла в форме корневого дерева. В коде Википедии, является родителем в этом дереве.ssprevious[v]
v
Поведение алгоритма Дейкстры в графах с отрицательными ребрами зависит от конкретного обсуждаемого варианта. Некоторые варианты алгоритма, такие как в Википедии, всегда работают быстро, но неправильно вычисляют кратчайшие пути при наличии отрицательных ребер. Другие варианты, такие как вариант в этих примечаниях к лекции, всегда правильно вычисляют кратчайшие пути (если нет источника, до которого можно добраться до отрицательного цикла), но в худшем случае может потребоваться экспоненциальное время при наличии отрицательных ребер.
Алгоритм Флойда-Варшалла используется, когда любой из всех узлов может быть источником, поэтому вы хотите, чтобы кратчайшее расстояние достигло любого узла назначения из любого узла-источника. Это терпит неудачу только при наличии отрицательных циклов.
Правильно. Floyd-Warshall - один из примеров алгоритма кратчайшего пути для всех пар , то есть он вычисляет кратчайшие пути между каждой парой узлов. Другой пример - «для каждого узла v запустите Dijkstra с v в качестве исходного узла». Есть несколько других.
Bellman-Ford используется как Дейкстра, когда есть только один источник. Это может обрабатывать отрицательные веса, и его работа такая же, как у Флойд-Варшалла, за исключением одного источника, верно?
Беллман-Форд является еще одним примером алгоритма кратчайшего пути из одного источника , такого как Дейкстра. Беллман-Форд и Флойд-Варшалл похожи - например, они оба алгоритмы динамического программирования - но Флойд-Варшалл не тот же алгоритм, что и "для каждого узла v, запустите Bellman-Ford с v в качестве исходного узла". В частности, Флойд-Варшалл работает за время , тогда как повторный Беллман-Форд работает за время ( для каждой исходной вершины).O ( V3)O ( V2Е)O ( VЕ)
Для более подробной информации, обратитесь к вашему любимому учебнику по алгоритмам. (У вас есть любимый учебник алгоритмов, не так ли?)