Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дз по ФЛИТА.docx
Скачиваний:
51
Добавлен:
09.02.2015
Размер:
611.26 Кб
Скачать

Алгоритм Флойда-Уоршелла.

Алгоритм Флойда-Уоршелла создан для нахождения кратчайших расстояний между всеми вершинами графа, в котором могут присутствовать рёбра с отрицательными весами.

В данном алгоритме используются методы динамического программирования. Задача разбивается на подзадачи меньшего размера, осуществляется рекурсивное оптимальное решение подзадач, которые затем используются для конструирования решения исходной задачи.

Рассмотрим граф с вершинами {v1, v2vn}. В графе существует путь рij от vi до vj, который проходит через множество вершин. Обозначим через - длину кратчайшего пути из i в j, проходящего через вершины v1vk-1. Расширим множество разрешенных вершин на одну: v1vk. При этом возможны две ситуации. Ситуация 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[].

Результат выполнения алгоритма: