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

Алгоритм Форда (случай общей матрицы весов)

Алгоритм Дейкстры применим лишь в том случае, когда для всех i и j. Однако если матрица С является матрицей стоимостей, то дуги, приносящие доход, должны иметь отрицательные «стоимости». В этом случае для нахождения кратчайших путей между вершиной s и всеми другими вершинами можно воспользоваться описанной ниже процедурой. Этот метод также является итерационным и основан на пометках вершин, причем в конце k-й итерации пометки равны длинам тех кратчайших путей (от s ко всем остальным вершинам), которые содержат не более k+1 дуг. В отличие от алгоритма Дейкстры никакая из пометок во время этого процесса не рассматривается как окончательная. Описываемый метод был первоначально предложен Фордом.

Описание алгоритма Форда:

Пусть - пометка вершины в конце (k+1)–й итерации.

Шаг 1. Положить S=Г(s), k=1, , для всех и для всех остальных xi.

Шаг 2. Для каждой вершины () изменить ее пометку следующим образом:

,

где (множество содержит те вершины, для которых текущие кратчайшие пути из s состоят из k дуг и для которых существуют дуги к вершине xi.). Для вершин положим .

Шаг 3.

1. Если и для всех xi, то получен оптимальный ответ и пометки равны длинам кратчайших путей.

2. Если и для некоторой вершины xi, то перейти к шагу 4.

3. Если и для некоторой вершины xi, то в графе существует цикл отрицательного веса и задача не имеет решения.

Шаг 4. Обновить множество S следующим образом:

.

Шаг 4. Положить и перейти к шагу 2.

Также можно привести общую матрицу весов к неотрицательной, увеличив вес каждого ребра на величину и найти кратчайшие пути между вершиной s и всеми другими вершинами с помощью алгоритма Дейкстры.

Алгоритм Флойда (кратчайшие пути между всеми парами вершин)

Пусть требуется найти кратчайшие пути между всеми парами вершин графа. Очевидный способ получить ответ на этот вопрос заключается в n- кратном применении алгоритма Дейкстры или алгоритма Форда, причем каждый раз в качестве начальной вершины s берутся различные вершины. В случае полного графа с неотрицательной матрицей весов C время, необходимое для вычислений, пропорционально , а для произвольной матрицы весов оно пропорционально .

Опишем совершенно иной подход к задаче нахождения кратчайших путей между всеми парами вершин. Этот метод применим как к неотрицательным, так и к произвольным матрицам весов и время, необходимое для вычислений, пропорционально . Если этот метод применим к графам с неотрицательной матрицей весов, то он сэкономит почти 50 % времени по сравнению с n-кратным применением алгоритма Дейкстры. Метод был предложен первоначально Флойдом. Он базируется на использовании последовательности из n преобразований (итераций) начальной матрицы весов С. При этом на k-й итерации матрица представляет длины кратчайших путей между каждой парой вершин с тем ограничением, что путь между и (для любых и ) содержит в качестве промежуточных только вершины из множества .

Описание алгоритма Флойда:

Предположим, что в начальной матрице весов для всех и , если в графе отсутствует дуга .

Шаг 1. Присвоить .

Шаг 2. .

Шаг 3. Для всех , таких, что , и для всех , таких, что , введем операцию

. (1.3)

Шаг 4.

1. Если , то в графе G существует цикл отрицательного веса, содержащий вершину , и решения нет.

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

3. Если все , но , то вернуться к шагу 2.

Сами кратчайшие пути можно найти по их длинам с помощью рекурсивной процедуры, подобной той, которая выше определялась соотношением (1.2). С другой стороны, можно использовать информацию о самих путях (наряду с информацией о длинах путей). Этот последний метод полезен в тех случаях, когда требуется найти в графе цикл отрицательного веса (если такой существует). В этом методе в дополнение к матрице весов C хранится и обновляется вторая -матрица . Элемент указывает вершину, непосредственно предшествующую вершине в кратчайшем пути от к . Матрице присваиваются начальные значения для всех и . В соответствии с (1.3) на шаге 3 алгоритма обновление матрицы происходит так:

.

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

,

где , , и т.д. до .

Здесь следует отметить, что если всем придать начальные значения ∞ (а не 0), то конечное значение величины будет равно весу цепи, проходящей через вершину . Исходя из структуры матрицы , полученной в процессе той итерации, когда элемент становится отрицательным, можно найти цикл отрицательного веса, соответствующий этому элементу.

Соседние файлы в папке Прикладная теория графов