
- •1. Условный оператор, оператор выбора
- •5. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов.
- •2. Операторы организации циклов
- •3. Обработка двумерных массивов.
- •4. Процедуры и функции
- •37. Алгоритмы генерирования k-элементных подмножеств множества
- •6. Использование множеств для решения задач
- •7. Процедуры и функции обработки строк
- •8. Сортировка и поиск информации. Методы внутренней сортировки: Сортировка «пузырек»
- •9.Сортировка подсчетом.
- •10.Сортировка простым обменом
- •11. Методы внутренней сортировки: «Шейкер-сортировка»
- •12. Методы внутренней сортировки: Сортировка «Хаора»
- •14. Методы внутренней сортировки: Пирамидальная сортировка
- •16.Сортировка бинарными вставками
- •17. Методы внутренней сортировки: Сортировка «Шелла»
- •15 Сортировка простыми вставками.
- •19.Чтение типизированных файлов
- •18. Сортировка слиянием
- •20.Алгоритмы удаления записей типизированного файла.
- •19.Сортировка естественным слиянием.
- •28. Динамическая структура очередь, ее создание и использование.
- •20. Поразрядная сортировка
- •32. Деревья: построение бинарного дерева
- •52.Чтение типизированных файлов
- •21. Рекуррентные выражения. Рекурсия: прямая и косвенная.
- •22.Стандартные процедуры и функции Unit Graph.
- •53.Алгоритмы удаления записей типизированного файла.
- •27. Динамическая структура стек, ее создание и использование.
- •34. Алгоритмы генерирования перестановок (антилексикографическом порядке )
- •29. Списки: односвязные
- •33. Алгоритм генерирования перестановок в лексикографическом порядке.
- •30.Списки: двухсвязные
- •31. Динамическая структура кольцо, ее создание и использование.
- •34. Алгоритмы генерирования перестановок
- •51. Создание типизированных файлов.
- •36. Алгоритмы генерирования множества всех подмножеств
- •65. Создание таблиц базы данных с помощью Database Desktop.
- •38. Введение в теорию графов. Способы представления ориентированных и неориентированных графов: матрицы смежности
- •39. Поиск в ширину в графе
- •40. Поиск в глубину в графе
- •41,42. Построение остовного дерева графа.
- •43. Поиск кратчайшего пути в графе (Алгоритм Дейкстры)
- •44.Алгоритм Форда поиска кратчайших расстояний в графе.
- •45.Алгоритм Флойда поиска кратчайших расстояний в графе.
- •46. Алгоритмы с возвращением, их реализация с помощью рекурсий и динамических структур. Примеры алгоритмов с возвращением.
- •50.Типизированные файлы, их назначение и использование. Основные процедуры обработки типизированных файлов
- •47,48. Типы файлов, объявление, логическая и физическая организация файловой системы, процедуры и функции обработки файлов
- •67,68 Компоненты страниц Data Access, Data Controls. Создание базы данных, псевдонима бд
- •62 Компоненты страницы Samples, их назначение, свойства, примеры применения
- •56.Полиморфизм. Виртуальные методы. Таблица виртуальных методов
- •54.Понятие объекта.(класса). Инкапсуляция. Иерархия классов (типов). Правила наследования
- •57. Компоненты страницы Standard, их назначение, свойства, примеры применения.
- •49. Нетипизированные файлы
- •58.Компоненты страницы Additional, их назначение, свойства, примеры применения
- •1. TBitBtn
- •2. TSpeedButton
- •3. TMaskEdit
- •4. TDrawGrid
- •60. Компоненты страницы System, их назначение, свойства, примеры применения
- •71. Создание справочной системы
- •61,. Компоненты страницы Dialogs их назначение, свойства, примеры применения
- •63. Задание и изменение свойств компонентов с помощью Инспектора объектов и программно
- •64. Обработка событий, связанных с использованием компонентов.
- •70. Мультимедийные возможности Delphi
- •66. Создание и использование модуля данных Data Module.
- •69. Графические возможности Delphi
44.Алгоритм Форда поиска кратчайших расстояний в графе.
Алгоритм Форда-Беллмана
Пусть дан ориентированный взвешенный граф с вершинами и рёбрами, и указана некоторая вершина . Требуется найти длины кратчайших путей от вершины до всех остальных вершин.
В отличие от алгоритма Дейкстры, этот алгоритм применим также и к графам, содержащим рёбра отрицательного веса. Впрочем, если граф содержит отрицательный цикл, то, понятно, кратчайшего пути до некоторых вершин может не существовать (по причине того, что вес кратчайшего пути должен быть равен минус бесконечности); впрочем, этот алгоритм можно модифицировать, чтобы он сигнализировал о наличии цикла отрицательного веса, или даже выводил сам этот цикл.
Описание алгоритма
Мы считаем, что граф не содержит цикла отрицательного веса. Случай наличия отрицательного цикла будет рассмотрен ниже в отдельном разделе.
Заведём массив расстояний , который после отработки алгоритма будет содержать ответ на задачу. В начале работы мы заполняем его следующим образом: , а все остальные элементы равны бесконечности .
Сам алгоритм Форда-Беллмана представляет из себя несколько фаз. На каждой фазе просматриваются все рёбра графа, и алгоритм пытается произвести релаксацию (relax, ослабление) вдоль каждого ребра стоимости . Релаксация вдоль ребра — это попытка улучшить значение значением . Фактически это значит, что мы пытаемся улучшить ответ для вершины , пользуясь ребром и текущим ответом для вершины .
Утверждается, что достаточно фазы алгоритма, чтобы корректно посчитать длины всех кратчайших путей в графе (повторимся, мы считаем, что циклы отрицательного веса отсутствуют). Для недостижимых вершин расстояние останется равным бесконечности .
Реализация
Для алгоритма Форда-Беллмана, в отличие от многих других графовых алгоритмов, более удобно представлять граф в виде одного списка всех рёбер (а не списков рёбер — рёбер из каждой вершины). В приведённой реализации заводится структура данных для ребра. Входными данными для алгоритма являются числа , список рёбер, и номер стартовой вершины . Все номера вершин нумеруются с по .
Простейшая реализация
Константа обозначает число "бесконечность" — её надо подобрать таким образом, чтобы она заведомо превосходила все возможные длины путей.
Обозначим через МинСт(1,s,к) наименьшую стоимость проезда из 1 в s менее чем с k пересадками. Тогда выполняется такое соотношение:
МинСт (1,s,k+1) = наименьшему из чисел МинСт(1,s,k) и МинСт(1,i,k) + a[i][s] (i=1..n)
Как отмечалось выше, искомым ответом является МинСт(1,i,n) для всех i=1..n.
k:= 1;
for i := 1 to n do begin x[i] := a[1][i]; end;
{инвариант: x[i] := МинСт(1,i,k)}
while k <> n do begin
| for s := 1 to n do begin
| | y[s] := x[s];
| | for i := 1 to n do begin
| | | if y[s] > x[i]+a[i][s] then begin
| | | | y[s] := x[i]+a[i][s];
| | | end;
| | end
| | {y[s] = МинСт(1,s,k+1)}
| | for i := 1 to n do begin x[s] := y[s]; end;
| end;
| k := k + 1;
end;