Олимпиады по программированию

olympiads.ru

Дистанционные семинары
Оглавление
Как пользоваться
Система проверки задач
Регистрация, изменение настроек
Страница сдачи решений
Результаты
МИОО, МЦНМО, Оргкомитет Московской олимпиады по информатике

Дистанционные семинары
по подготовке к олимпиадам по информатике

Занятие 8. Графы. Поиск кратчайшего пути. Алгоритм Форда-Беллмана.

Пусть дан взвешенный ориентированный граф с N вершинами и M ребрами. Требуется найти кратчайшие расстояния от данной вершины s до всех остальных. Эта задача может быть решена с помощью алгоритма Форда-Беллмана.

В основе алгоритма Форда-Беллмана лежит метод динамического программирования. Пусть 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 действий.

Восстановление пути
Пусть в формуле (*) в ходе работы алгоритма Форда-Беллмана минимум достигается при i=k или в формуле (**) на дуге (m,k). Тогда запишем в dm значение k. В конце работы алгоритма мы получим, что для каждой вершины i в di хранится номер предыдущей вершины в кратчайшем пути от s до i. По массиву d легко восстановить путь.

Нахождение вершин, до которых существует сколь угодно короткий путь
Сравним an,i и a2n,i. Если an,i > a2n,i, то до вершины i существует сколь угодно короткий путь. Иначе - нет.

Задача 08-1. Форд-Беллман
Задача 08-2. Лабиринт знаний
Задача 08-3. Цикл