Пусть задан связный взвешенный граф. Будем истолковывать его вершины как населенные пункты, а веса как расстояния между ними. Поставим задачу о нахождении такого маршрута, соединяющего х и х
, что сумма расстояний была минимальной (маршрут не обязан включать все вершины).
| |||
| |||
|

Рис. 24. Пример дорожного графа.
Обозначим l - расстояние от i– той до смежной с ней j – той вершины. Задача о нахождении кратчайшего расстояния может быть решена прямым перебором всевозможных расстояний. Кроме кратчайшего расстояния нам необходимо еще и знание промежуточных вершин, через которые пролегает маршрут. Если n – велико, то эта задача становится трудно разрешимой. Возникает необходимость в разработке более компактного алгоритма.
Алгоритм Форда.
Сущность этого алгоритма заключается в том, что каждой i – той вершине ставится в соответствие некоторое число
, значение которого зависит от значения
предыдущей вершины и расстояния между ними. Сначала объявляется
- 0, а все остальные
= ∞:
![]() ![]() | ![]() ![]() | ![]() ![]() | … | ![]() ![]() |
∞ | ∞ | ∞ | ∞ |
Обозначим через l расстояние между i – той и j – той вершинами.
Пусть назначена
i – той вершине (i=0,1,…, n). Рассмотрим все j – ые вершины, смежные с i – той. Если
-
> l
(1),
то полагаем
=
+ l
(2)
И так до тех пор, пока не дойдем до
. Значение
и будет значением кратчайшего пути.
Обратный ход:
Мы получили
=
+l
(1*)
Среди расстояний, соединяющих х со смежными вершинами, ищем l
=
-
.
Затем ищем вершину х , у которой
=
+l
. Затем переходим в х
и так далее пока не доберемся до х
.
Замечание 1:
При каждом поиске предыдущей вершины обратного хода необходимо проверять все смежные вершины, так как предыдущая вершина может быть не единственной.
Замечание 2:
Изменение значения происходит только тогда, когда выполняется неравенство (1), то есть
>
+l
. Заменяя значение
по формуле (2), мы тем самым уменьшаем его. Так как граф связный, то висячих вершин нет, и, следовательно, каждая вершина получит значение
.
Обоснование алгоритма:
Так как значение при каждом шаге может только уменьшаться, то последовательность значений
для каждой вершины в конечном итоге принимает минимальное значение. В конечном итоге каждая
- это кратчайшее расстояние данной вершины от х
.
Пример:
Рис. 25. Пример взвешенного графа.
1) i=0, j=1,2,3;
j=1:
-
=∞-0, ∞>l
;
=
+l
=5; заносим в таблицу.
j=2:
-
=∞-0, ∞>l
;
=
+l
=6; заносим в таблицу.
j=3:
-
=∞-0, ∞>l
;
=
+l
=4; заносим в таблицу.
2) i=1, j=0,2,4 (0 –уже не рассматриваем)
j=2:
-
=1
,
<
+l
; значит не меняем
j=4:
>
+l
,
= 5+8 = 13; заносим в таблицу.
3) i=2, j=0, 1, 3, 4.
j=0; не рассматриваем
j=1:
<
+l
; значит не меняем
j=3:
<
+l
; значит не меняем
j=4:
>
+l
,
=6+2=8; заносим в таблицу.
4) i=3, j=0,2,5,6;
j=0; не рассматриваем
j=2:
<
+l
; значит не меняем
j=5:
=4+6=10; заносим в таблицу.
j=6:
=
+l
,
=4+110=14; заносим в таблицу.
5) i=4, j=1,2,5,7;
j=1:
<
+l
; значит не меняем
j=2:
<
+l
; значит не меняем
j=5:
<
+l
; значит не меняем
j=7:
=
+l
,
=10; заносим в таблицу.
6) i=5, j=3,4,6,7;
j=3:
<
+l
; значит не меняем
j=4:
<
+l
; значит не меняем
j=6:
=
+l
,
=14; заносим в таблицу.
j=7:
<
+l
; значит не меняем
7) i=6, j=3,5,7;
j=3:
<
+l
; значит не меняем
j=5:
<
+l
; значит не меняем
j=7:
<
+l
; значит не меняем
8) i=7, j=4,5,6;
j=4; не рассматриваем
j=5; не рассматриваем
j=6:
<
+l
; значит не меняем
Получили схему:
![]() ![]() | ![]() ![]() | ![]() ![]() | ![]() ![]() | ![]() ![]() | ![]() ![]() | ![]() ![]() | ![]() ![]() |
∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | |
Итого |
Обратный ход:
Начиная с последней вершины, проверяем все ей смежные на выполнение условия: l =
-
.
Получим кратчайший путь хПоучаем: х
х
х
х
.