Задача №178. Форд-Беллман
Разбор добавил Джафар Исхоков
Пусть wi,j - длина дуги из вершины i в вершину j или бесконечность, если такой дуги нет. Пусть An,m - длина кратчайшего пути из начальной вершины в вершину m, проходящего не более чем по n ребрам. Пусть k - предыдущая вершина в этом пути. Тогда An,m=An-1,k + wk,m. Значит An,m = min(An-1,m, min{1<=i<=N}(An-1,i+wi,m)) (*).Значения A0,i равны бесконечности для всех i, отличных от s, A0,s=0.
Будем считать Ai,j в порядке неуменьшения i, а при равных i -
в порядке увеличения j. Тогда для вычисления i-й строки матрицы A нам необходимо знать только i-1-ую ее строку. Ответом на нашу задачу является N-я строка, значит, на каждом шаге можно хранить только предыдущую строку матрицы.При такой реализации алгоритм будет выполнять порядка N3 операций.
Заметим, что при вычислении следующей строки матрицы по предыдущей каждую дугу графа
мы рассмотрели ровно 1 раз. Воспользуемся этим, чтобы немного ускорить наш алгоритм. Пусть у нас известна n-1 строка матрицы A. Скопируем ее в n-ую строку. Далее рассмотрим все дуги нашего графа (x,y) и изменим An,y согласно формуле: An,y = min(An,y,An-1,x+wx,y) (**). Теперь у нас посчитана n-я строка матрицы A.При такой реализации алгоритм выполнит порядка NM действий.
Сдать: для сдачи задач необходимо войти в систему
3677
statement