
Алгоритм Флойда-Уоршелла.
Алгоритм Флойда-Уоршелла создан для нахождения кратчайших расстояний между всеми вершинами графа, в котором могут присутствовать рёбра с отрицательными весами.
В данном алгоритме используются методы динамического программирования. Задача разбивается на подзадачи меньшего размера, осуществляется рекурсивное оптимальное решение подзадач, которые затем используются для конструирования решения исходной задачи.
Рассмотрим граф
с вершинами {v1,
v2… vn}.
В графе существует путь рij
от vi
до vj, который
проходит через множество вершин.
Обозначим через
- длину кратчайшего пути из i
в j, проходящего через
вершины v1…vk-1.
Расширим множество разрешенных вершин
на одну: v1…vk.
При этом возможны две ситуации. Ситуация
1: вершина vk
не входит в кратчайший путь от i в
j. Длина кратчайшего пути не изменится,
соответственно
.
Ситуация 2: вершина vk
входит в кратчайший путь от i в j.
Новый кратчайший путь разбит вершиной
vk на два
пути рik и
рkj
(кратчайшее расстояние от vi
до vk
и кратчайшее расстояние от vk
до vj).
Значит общая длина пути
Вершина vk
в данных путях либо конечный, либо
начальный элемент, в множество
промежуточных она не входит, поэтому
.
Для обоих рассмотренных случаев
минимальный путь складывается из
минимальных длин путей для предыдущих
значений. Зная начальные значения при
k=0 можно последовательно найти все
остальные пути.
-
минимальное расстояние от i
до j проходящее через
0 вершин, другими словами это длина
прямых соединений между i
до j, которое известно.
Для вычисления минимального пути необходимо определить минимальное из двух чисел:
.
При k=n получаем искомые пути.
Блок-схема алгоритма приведена на рисунке 6. При инициализации создаётся матрица смежности W размерности n x n, если в графе n-вершин.
Рис. 6
Блок-схема программы нахождения кратчайших расстояний
между вершинами графа, реализующая алгоритм Флойда-Уоршелла.
ЗАДАНИЕ:
1.Разработать программу для определения длины минимальных путей из вершины 0 графа во все остальные вершины. Использовать алгоритм Дэйкстры.
2.Разработать программу для определения длины минимальных путей из вершины 0 графа во все остальные вершины. Использовать алгоритм Флойда-Уоршелла.
Графы для домашнего задания приведены в таблице 1 вариант согласно журналу.
Задание №1.
Разработать программу для определения длины минимальных путей из вершины 0 графа во все остальные вершины. Использовать алгоритм Дэйкстры.
Вариант 17
Рис. 1
Построим матрицу смежности для графа, изображённого на рис1. Если между двумя вершинами есть ребро, записываем его вес на пересечении столбца и строки, соответствующих данным вершинам. Если ребра нет – в ячейку записывается бесконечность. Так как представление бесконечности в компьютере связано с определёнными трудностями, вместо неё возьмём некоторое большое число. Для данного графа таким числом является, например,1000, так как величина пути из любой вершины в любую другую будет определённо меньше 1000.
Матрица смежности:
|
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1000 |
20 |
1000 |
3 |
1000 |
1000 |
1 |
20 |
1000 |
2 |
1 |
2 |
1000 |
2 |
1000 |
2 |
1000 |
1000 |
2 |
2 |
3 |
3 |
1 |
1000 |
1000 |
1000 |
1000 |
4 |
1000 |
2 |
2 |
1000 |
1000 |
4 |
5 |
1000 |
1000 |
2 |
1000 |
4 |
1000 |
В папке Dijkstra приведён проект, реализующий алгоритм Дэйкстры.
В программе создаётся двумерный массив для сохранения матрицы смежности int G[6][6];
Также создаётся массив из шести элементов, для сохранения меток вершин W[6]. При инициализации нашего алгоритма веса всех вершин равны бесконечности (1000), вес начальной вершины равен 0:
W[0]=0;
W[1]=1000;
W[2]=1000;
W[3]=1000;
W[4]=1000;
W[5]=1000;
По завершении работы алгоритма минимальные значения путей от 0 вершины до остальных находятся в массиве W[].
Результат выполнения алгоритма: