Реферат: Построение эйлерова цикла. Алгоритм Форда и Уоршелла
а б
Рис. 2.1
На рис. 2.1а изображен исходный помеченный граф и начальные значения li . На рис. 2.1б для того же графа указаны конечные значения li и выделен кратчайший путь. Пометка вершин графа происходила в следующем порядке (в скобках указана дуга, вдоль которой выполняется (1)):
l1 = 6 (x 0 , x 1 ),
l2 = 7 (x 0 , x 2 ),
l3 = 6 (x 0 , x 3 ),
l4 = 12 (x 1 , x 3 ),
l4 = 11 (x 2 , x 4 ),
l5 = 16 (x 3 , x 4 ),
l5 = 15 (x 4 , x 5 ),
l6 = 18 (x 4 , x 6 ),
l6 = 17 (x 5 , x 6 ).
Иногда возникает задача отыскания кратчайших расстояний между всеми парами вершин. Одним из способов решения этой задачи является
Алгоритм Флойда
Обозначим lij длину дуги (xi , xj ), если таковой не существует примем lij = ¥, кроме того, положим lii = 0. Обозначим длину кратчайшего из путей из xi в xj с промежуточными вершинами из множества {x 1 , …, xm }. Тогда можно получить следующие уравнения
, (2)
. (3)
Уравнение (2) очевидно. Обоснуем уравнение (3). Рассмотрим кратчайший путь из xi в xj с промежуточными вершинами из множества {x 1 , …, xm , xm +1 }. Если этот путь не содержит xm +1 , то . Если же он содержит xm +1 , то деля путь на отрезки от xi до xm +1 и от xm +1 до xj , получаем равенство .
Уравнения (2) и (3) позволяют легко вычислить матрицу расстояний [dij ] между всеми парами вершин графа G (X , E ). На первом этапе согласно (2) составляем n ´n матрицу равную матрице [lij ] весов ребер (n – число вершин G (X , E )). n раз производим вычисление по итерационной формуле (3), после чего имеем – матрицу расстояний.
Отметим, что алгоритм Флойда непосредственно не указывает сам кратчайший путь между вершинами, а только его длину. Алгоритм Флойда можно модифицировать таким образом, чтобы можно было находить и сами пути. Для этого получим вспомогательную матрицу [Rij ], которая будет содержать наибольший номер вершины некоторого кратчайшего пути из xi в xj (Rij =0, если этот путь не содержит промежуточных вершин).
Эта матрица вычисляется параллельно с по следующим правилам
Последнее выражение следует из обоснования (3).
Теперь кратчайший путь выписывается из следующего рекурсивного алгоритма:
Кратчайший путь из xi в xj :
1°. Если Rij = 0 то выполнить 2°,
иначе выполнить 3°.
2°. Если i =j то выписать xi и закончить,
иначе выписать xi и xj закончить.