Граф называется взвешенным, если каждой вершине приписано некоторое математическое выражение называемое весом. Чтоб задать взвешенный граф достаточно задать матрицу весов W = (wij), где wij вес дуги (ребра) идущей из вершины vi (i-я строка) в вершину vj (j-й столбец). В данной главе мы считаем, что веса wij ∈ R, где R — множество действительных чисел, дополненное символом ∞.
Пусть G = {V, X} — взвешенный граф, имеющий п вершин и матрицу весов W = (wij), wij ∈ R. Опишем некоторые методы нахождения взвешенного расстояния от фиксированной вершины ai ∈ V (называемой источником) до всех вершин графа G.
Мы будем предполагать, что в G отсутствуют контуры с отрицательным весом, поскольку, двигаясь по такому контуру достаточное число раз, то можно получить маршрут, имеющий вес, меньший любого заведомо взятого числа, и тем самым задача нахождения расстояния становится бессмысленной.
Алгоритм Форда-Беллмана.
1. Выбираем источник − вершину ai.
2. Зададим строку D1 = (d11, d21, …, dn1) − i-я строка в матрице W.
3. Последовательно определяем строки Ds = (d1s, d2s, …, dns), где
djs = min{djs-1, dks-1 + wkj},
k = 1, 2, …, n,
j=1, 2, …, n.
Нетрудно видеть, что djs — минимальный из весов маршрутов из ai в aj, состоящих не более чем из s дуг.
4. Искомая строка W — расстояний получается при s = n — 1.
Действительно, на этом шаге из весов всех маршрутов из ai в aj, содержащих не более n-1 дуг, выбирается наименьший, а каждый маршрут более чем с n-1 дугами содержит контур, добавление которого к маршруту не уменьшает w-расстояния, так как мы предположили отсутствие контуров отрицательного веса.
В обосновании алгоритма лежит принцип оптимальности Беллмана, который заключается в следующем: если в многошаговой задаче на каждом шаге применять оптимальный алгоритм, ведущий к оптимальному решению на данном шаге, то итоговый результат тоже будет оптимальным.
Замечание. Работу алгоритма можно завершить на шаге k, если Dk = Dk+1, т.к. посылки для получения Dk+2 будут такими же, как и при получении Dk+1 и, следовательно, Dk+1 = Dk+2.
Пример. Продемонстрируем работу алгоритма Форда-Беллмана на примере взвешенного графа, показанного на рисунке ниже, с матрицей весов W:
В качестве источника выберем вершину 1. Произведем вычисления по шагам.
1-шаг. D(1) = (0, 3, 4, ∞, ∞)
2-шаг. Вычислим D(2). Согласно пункту 3) для вычисления dj2 надо взять вектор D(1) и сложить его покоординатно с j-ой строкой матрицы W, после чего найти минимум полученных координат и dj1:
3-шаг. Так как D(2) ≠ D(1), то вычисляем D(3):
4-шаг. Так как D(3) ≠ D(2), то вычисляем D(4):
Вектор D(4) определяет минимальные расстояния от источника 1 до вершин 1, 2, 3, 4, 5 соответственно.
Отметим, что, зная минимальное расстояние от источника a, до всех остальных вершин графа, можно восстановить минимальный маршрут по формуле:
ρ(a, b) = ρ(a, c) + wcb, где
ρ(a, b) – минимальное расстояние от вершины a до вершины b.
Так, кратчайший (1, 4) — маршрут задается последовательностью вершин (1, 2, 3, 4), а кратчайший (1, 5) — маршрут задается последовательностью вершин (1, 3, 5).
Алгоритм Дейкстры является более эффективным, чем алгоритм Форда-Беллмана, но используется только для взвешенных графов, в которых веса всех дуг неотрицательны.
1. Выбираем источник − вершину ai.
2. Зададим строку D1 = (d11, d21, …, dn1) — i-я строка в матрице W. Обозначим T1 = V \ {ai}.
3. Предположим, что на шаге s уже определены строка Ds = (d1s, d2s, …, dns) и множество вершин Ts.
4. Выбираем вершину aj ∈ Ts такую, что djs = min{dks | ak ∈ Ts}. Положим Ts+1 = Ts \ {aj}, Ds+1 = (d1s+1, d2s+1, …, dns+1), где dks+1 = min{dks, djs + wjk}, если ak ∈ Ts+1, и dks+1 = dks, если ak ∉ Ts+1.
5. На шаге s = n — 1 образуется строка Dn-1 w-расстояний между источником ai; и остальными вершинами графа: dkn-1 = ρ(ai, ak).
Отметим, что для реализации алгоритма Форда-Беллмана требуется порядка n3 операций, тогда как в алгоритме Дейкстры необходимо выполнить порядка n2 операций.
Пример. Рассмотрим взвешенный граф G с матрицей весов W и источником 1. Требуется найти кратчайшие расстояния от источника 1 до других вершин, используя алгоритм Дейкстры.
По алгоритму Дейкстры последовательно находим:
В Ds подчеркнута величина djs, для которой Ts+1 = Ts \ {aj}.
Отметим, что если в приведенных алгоритмах символ ∞ заменить на -∞, min на max, то получим алгоритмы, которые позволяют в графах, не имеющих контуров положительных весов, находить маршруты наибольшей длины.