Вот ответы на ваши вопросы.
1) Алгоритм Флойд использует рекуррентное уравнение динамического программирования для определения кратчайших путей всех пар среди вершин;повторение основано на том факте, что для того, чтобы найти кратчайший путь между парой вершин i и j , необходимо проверить, идет ли он непосредственно от i до j дешевле, чем переход от i к промежуточной вершине k , а затем от k до j ,Вы проверяете это для всех вершин i , j и k , так что сложность составляет O ( n ^ 3).Теперь рассмотрим это: если все веса неотрицательны, то понятие кратчайшего пути хорошо определено.Вместо этого, если есть отрицательные циклы, это понятие не имеет смысла.Зачем?Потому что если вы найдете отрицательный цикл на пути от вершины i к вершине j , то вы можете проходить цикл столько раз, сколько пожелаете, и каждый раз, когда вы проходитецикл, стоимость соответствующего пути уменьшается, потому что веса на ребрах, принадлежащих циклу, являются отрицательными.Таким образом, отрицательный цикл, очевидно, улучшает стоимость кратчайшего пути (стоимость уменьшается).Поэтому важно иметь возможность обнаруживать отрицательные циклы, если вы разрешаете отрицательные веса на краях.Алгоритм Флойд предполагает, что ребра положительны, но способен обнаружить отрицательный цикл.
2) Уравнение повторения следующее, слегка упрощенное с учетом вашей записи:
d[i, j] <- min(d[i, j], d[i, k] + d[k, j])
thisфактически используется, как показано в следующем псевдокоде
for k <- 0 to n-1
for i<- 0 to n-1
for j <- 0 to n-1
d[i, j] <- min(d[i, j], d[i, k] + d[k, j])
Каждое обновление d [i, j] требует доступа к d [i, k] и d [k, j], поэтому автор спрашивает:обновление d [i, j] требует значений d [i, k] и d [k, j], как мы можем быть уверены, что эти значения уже были вычислены во время k -й итерации?Как мы можем быть уверены, что эти значения не изменятся во время k -й итерации?
На самом деле эти значения не могут измениться во время k -й итерации, так чтонет функциональной зависимости.Вот почему.Действительно, во время итерации k обновление d [i, k] принимает форму
d[i, k] <- min(d[i, k], d[i, k] + d[k, k])
, но d [k, k] равно нулю, так что d [i, k] не изменяется.
Аналогично, обновление для d [k, j] равно
d[k, j] <- min(d[k, j], d[k, k] + d[k, j])
, так что d [k, j] тоже не меняется.