
- •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
45.Алгоритм Флойда поиска кратчайших расстояний в графе.
Алгоритм Флойда — Уоршелла — динамический алгоритм для нахождения кратчайших расстояний между всеми вершинами взвешенного ориентированного графа. Разработан в 1962 году Робертом Флойдом и Стивеном Уоршеллом.
Пусть граф задан матрицей смежности A[N][N] по следующему правилу: A[i][j] равно
- 0, если i равно j;
- бесконечности (очень большому числу), если из i в j нет ребра;
- весу ребра между вершинами i и j в остальных случаях.
Алгоритм Флойда делает N итераций, после i-й итерации матрица А будет содержать длины кратчайших путей между любыми двумя парами вершин при условии, что эти пути проходят через вершины от первой до i-й. На каждой итерации перебираются все пары вершин и путь между ними сокращается при помощи i-й вершины. Ниже приведен код основного фрагмента программы и иллюстрация:
Таким образом будет получена матрица длин кратчайших путей из каждой вершины в каждую (заметим, что алгоритм очень похож на алгоритм построения транзитивного замыкания графа). Если между двумя вершинами нет пути, в соответствующей ячейке матрицы A будет стоять бесконечность.
Для определения кратчайших путей (т.е. вершин, через которые проходит кратчайший путь) приходится воспользоваться дополнительным массивом C[N][N]. Существует несколько способов заполнения массива C и определения кратчайшего пути:
1. Изначально C[i][j] = i, при изменении значения
A[j][k] = A[j][i] + A[i][k]
производится также изменение значения C[j][k]:
C[j][k] = C[i][k].
В этом случае значение массива C[j][k] после окончания алгоритма будет указывать вершину, предпоследнюю в пути от j к k, и восстановление пути будет возможно сделать простым циклом;
2. Изначально C[i][j] = -1, при изменении значения
A[j][k] = A[j][i] + A[i][k]
производится также изменение значения C[j][k]:
C[j][k] = i.
В этом случае значение массива C[j][k] после окончания алгоритма будет указывать одну из вершин, через которую проходит путь от j к k, и восстановление пути будет возможно сделать простым циклом либо при помощи рекурсивной функции.
Реализация:
type
Graph = array[1..nn,1..nn] of integer;
Procedure Floyd(var a, p: graph);
var i,j,k: integer;
c: graph;
begin
//A - матрица содержащая кратчайшие пути.
//P - матрица, сохраняющая маршруты.
Randomize;
for i:=1 to nn do
for j:=1 to nn do
c[i,j] := random(100);
for i:=1 to nn do
for j:=1 to nn do
begin
a[i,j]:=c[i,j];
p[i,j]:=0;
end;
for i:=1 to nn do a[i,i]:=0;
for k:=1 to nn do
for i:=1 to nn do
for j:=1 to nn do
if (a[i,k]+a[k,j] < a) then
begin
a[i,j]:=a[i,k]+a[k,j];
p[i,j]:=k;
end;
end;