Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ODM шпора.docx
Скачиваний:
7
Добавлен:
16.04.2019
Размер:
479.02 Кб
Скачать

Модификация Форда

Алгоритм Дейкстры можно модифицировать для случая, когда некоторые из дуг имеют отрицательные длины. Модификация состоит в следующем:

  1. На шаге 2 алгоритма Дейкстры пересчёт величин с помощью соотношения (1) производится для всех вершин, а не только для неокрашенных. Следовательно, числа могут уменьшаться как для неокрашенных, так и для окрашенных вершин.

  2. Если для некоторой окрашенной вершины x происходит увеличение длины , то с этой вершины и инцидентной ей окрашенной дуги окраска снимается.

  3. Процедура алгоритма заканчивается только тогда, когда все вершины окрашены и когда после выполнения шага 2 ни одно из чисел не меняется.

Алгоритм Форда не решает задачи нахождения кратчайшего пути при наличии в исходном графе контура, имеющего отрицательную длину. Действительно, в этом случае, повторяя неограниченное число раз этот алгоритм для контура, можно получить путь со сколь-угодно малой длиной.

В случае отсутствия сведений о наличии в графе контуров можно применить алгоритм Форда, но в процессе его работы необходимо учитывать сколько раз окрашиваются отдельные вершины. Как только число окрашиваемой какой-либо вершины достигнет величины n (число вершин графа) процедуру алгоритма можно остановить, т.к. исходный граф содержит контур отрицательной длины.

Алгоритмы поиска всех кратчайших путей

Эта задача могла бы быть решена путём многократного применения алгоритма Дейкстры с последовательным выбором каждой вершины графа в качестве вершины S. Однако, существуют алгоритмы более эффективные, чем процедура многократного повторения алгоритма Дейкстры.

Алгоритм Флойда

Введём некоторые обозначения, перенумеруем вершины исходного графа целыми числами от 1 до n. Обозначим через длину кратчайшего пути из вершины i в вершину j, который в качестве промежуточных может содержать только первые m – вершин графа. Если между вершинами i и j не существует ни одного пути, то будем считать, что . представляет собой кратчайший путь из вершины i в j, не имеющего промежуточных вершин. Для любой вершины i .

Обозначим через матрицу размером , (i, j)-ый элемент которой совпадает с .

Если в исходном графе известна длина каждой дуги, то мы можем сформировать матрицу .

Задача состоит в определении матрицы , представляющей кратчайшие пути между всеми вершинами рассматриваемого графа.

Рассмотрим основную идею, лежащую в основе алгоритма Флойда.

Предположим, что нам известно:

  1. кратчайший путь из вершины i в вершину m, в котором в качестве промежуточных допускается использование (m-1) первых вершин;

  2. кратчайший путь из вершины m в вершину j, в котором допускается использование в качестве промежуточных (m-1) первых вершин;

  3. кратчайший путь из вершины i в вершину j, в котором в качестве промежуточных допускается использование только (m-1) первых вершин.

Т.к. исходный граф не может содержать контур отрицательной длины, то один из двух путей ― путь, совпадающий с представленным в пункте в), или путь, являющийся объединением путей из пунктов а) и б), ― должен быть кратчайшим путём из вершины i в вершину j, в котором в качестве промежуточных допускается использование только (m-1) первых вершин.

Таким образом, (2)

Из этого соотношения видно, что для вычисления элементов матрицы необходимо располагать лишь элементами матрицы .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]