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

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

Алгоритм Дейкстры применим лишь в том случае, когда для всех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 и всеми другими вершинами с помощью алгоритма Дейкстры.

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

Пусть требуется найти кратчайшие пути между всеми парами вершин графа. Очевидный способ получить ответ на этот вопрос заключается в 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), то конечное значение величины будет равно весу цепи, проходящей через вершину . Исходя из структуры матрицы , полученной в процессе той итерации, когда элемент становится отрицательным, можно найти цикл отрицательного веса, соответствующий этому элементу.

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