Недавно я изучал алгоритмы кратчайшего пути для всех пар, такие как алгоритм Флойда-Уоршалла и Джонсона, и заметил, что эти алгоритмы дают правильные решения, даже когда граф содержит ребра с отрицательным весом (но не циклы с отрицательным весом). Для сравнения, алгоритм Дейкстры (который является кратчайшим путем с одним источником) не работает для ребер с отрицательным весом. Что заставляет алгоритмы кратчайшего пути для всех пар работать с отрицательными весами?

6
user1696230 6 Апр 2014 в 12:00
Может быть полезно узнать, почему алгоритм Дейкстры не работает с отрицательными весами: stackoverflow.com/questions/13159337/…
 – 
Thomas
6 Апр 2014 в 12:03

2 ответа

Лучший ответ

Алгоритм поиска всех пар кратчайших путей Флойда Уоршалла работает для графов с отрицательными весами ребер, потому что правильность алгоритма не зависит от неотрицательности веса ребер, в то время как правильность алгоритма Дейкстры основана на этом факте.

Правильность алгоритма Дейкстры:

У нас есть 2 набора вершин на каждом шаге алгоритма. Набор A состоит из вершин, к которым мы вычислили кратчайшие пути. Набор B состоит из оставшихся вершин.

Индуктивная гипотеза : на каждом этапе мы будем предполагать, что все предыдущие итерации верны.

Индуктивный шаг : когда мы добавляем вершину V к множеству A и устанавливаем расстояние равным dist [V], мы должны доказать, что это расстояние является оптимальным. Если это не оптимально, то к вершине V должен существовать другой путь меньшей длины.

Предположим, что через некоторую вершину X из множества B проходит другой путь.

Теперь, поскольку dist[V] <= dist[X], следовательно, любой другой путь к V будет иметь длину как минимум dist [V], если только граф не имеет отрицательной длины ребер.

Правильность алгоритма Флойда Уоршалла: Любой путь от вершины S к вершине T будет проходить через любую другую вершину U графа. Таким образом, кратчайший путь от S до T может быть вычислен как

min (кратчайший_путь (от S до U) + кратчайший_путь (от U до T)) для всех вершин U в графе.

Как видите, нет зависимости от неотрицательности ребер графа, если подвызовы правильно вычисляют пути. И подвызовы правильно вычисляют пути, если базовые случаи были правильно инициализированы.

7
Nikunj Banka 6 Апр 2014 в 16:51
Вы не можете просто сказать «Теперь, поскольку dist[V] <= dist[X]», по крайней мере, не без уточнения X немного больше. Я думаю, что здесь вам нужно сказать «Предположим, что какой-то другой путь проходит через некоторую вершину X в B.» в предыдущем предложении и объяснить, почему нет необходимости рассматривать случай, когда X находится в А.
 – 
j_random_hacker
6 Апр 2014 в 16:32
Если путь должен пройти через какую-либо вершину множества A, то он начнется прямо из этой вершины. Я подумал, что это слишком просто, чтобы не добавить. Однако я добавил, что «X находится в наборе B». Спасибо, что указали.
 – 
Nikunj Banka
6 Апр 2014 в 16:55

Алгоритм Дейкстры не работает для ребра с отрицательным весом, потому что он основан на жадной стратегии (предположении), что после добавления вершины v к множеству S, d [v] содержит минимально возможное расстояние.

Но если последняя вершина в Q была добавлена ​​к S и у нее есть исходящие ребра с отрицательным весом. Влияние отрицательных краев на расстояние не учитывается.

Однако алгоритм всех пар кратчайших путей будет фиксировать эти обновления.

0
Robert.Li 23 Фев 2017 в 06:50