06. Задача о кратчайшем пути в графе
Граф – совокупность 2х конечных множеств: вершин и ребер (или дуг).
Не ориентированный граф Ориентированный граф
Ребрам придают некоторые числовые значения, например расстояния, время, пропускная способность и т. п.
Путь в ориентируемом графе – последовательность сцепленных ориентированных дуг, в которых начало каждой следующей дуги совпадает с концом предыдущей.
Цикл
В неориентированном графе цикл называют контуром.
Граф может быть задан в матричном виде
|
В графике не должно быть
А) тупиковых событий (не выходит ни 1 стрелки, за исключением последнего события);
Б) хвостовых событий (не предшествует ни одна вершина, за исключением первого события);
В) циклов;
Г) петель;
Д) 2х стрелок
Найти кратчайший путь в графе, значит указать упорядоченный набор дуг графа, в котором начало каждой следующей дуги совпадает с концом предыдущей, например или .
Каждой дуге сопоставляется целое неотрицательное число , называемое длинной этой дуги. Длина пути – сумма длин всех дуг, составляющих этот путь.
Для решения задачи о кратчайшем пути применяется алгоритм Форда, заключающейся в присвоении каждой вершине графа двойной метки , - некоторое число и в дальнейшем изменении этих меток. Рассмотрим работу алгоритма Форда на примере.
Пример.
1. Начальный шаг алгоритма.
Выделенной вершине присваивается метка и поставим рядом *, то есть и назовём такую метку Конечной, а вершину – Помеченной.
2. Общий шаг (повторяется многократно).
Рассмотрим все дуги, выходящие из отмеченной (помеченной) вершины. На первом шаге отмеченная вершина это вершина . Вычислим метки для вершин, в которые ведут дуги из : - это сумма метки и длины дуги, ведущей из в вершину . Из всех меток, которые получит вершина , выбираем наименьшую, отмечаем её * и считаем конечной. Повторяем общий шаг для определения конечных меток для всех вершин.
Рассмотрим работу Форда на примере.
Построить граф, заданный таблицей и найти кратчайший путь из в .
0,1 |
0,2 |
1,3 |
1,4 |
1,6 |
2,3 |
2,5 |
2,6 |
3,7 |
4,6 |
4,8 |
5,7 |
6,8 |
7,6 |
7,8 | |
10 |
11 |
8 |
23 |
12 |
4 |
6 |
18 |
13 |
9 |
15 |
8 |
13 |
8 |
17 |
Из вершины выходят 2 дуги, ведущие в вершины и с длинами , .
Из ведут 3 дуги в , и и т. д.
Построим граф
Рис. 1
Начальный шаг (применяется однократно).
Вершине присваивается метка . Вершину считаем помеченной.
Общий шаг.
1) Вершина имеет конечную метку. Из неё выходят 2 дуги в и . Вычисляем две метки и и записываем их рядом с вершинами и . Соответственно других дуг, ведущих в и нет, поэтому эти метки конечные, отмечаем их * и изобразим две конечные (окончательные) метки на рис. 1.
2) Вершина имеет конечную метку. Из неё выходят 3 дуги, ведущие в , , и .
Вычисляем соответствующие метки , , , и , . Так как в вершину больше не входит других стрелок, то и метка для вершины окончательная.
Изобразим вычисленные три метки для , , и на рис. 2. Вершина имеет конечную метку. Из неё выходят 3 стрелки в , , и . Вычисляем метки: для вершины , для вершины и для вершины .
Рис. 2
В вершину не входят другие дуги. Из двух меток вершины выбираем наименьшую, это метка , она окончательная. Изобразим метки вершин , , и на рис.2, причем окончательные метки вершин и отмечаем *.
3) Вершина имеет конечную метку, из неё выходит единственная дуга в . Для получаем метку , т. е. , она не окончательная.
Из вершины в вершину идёт дуга, . Вычислим метку .
Вершина имеет окончательную метку.
Из двух меток вершины выбираем меньшую, это , она окончательная. Изобразим на рис. 3.
Рис. 3
4) Вершина имеет конечную метку, из неё ведут две дуги, вычисляем соответствующие метки в и в . Для вершин уже вычислены две метки. Из трех вычисленных меток , , выбираем меньшую и отмечаем её *.
Далее повторяем общий шаг пока не рассмотрим все оставшиеся вершины. При этом вершина получит окончательную метку *, вершина - *.
Двигаясь из в по помеченным меткам, получим кратчайший путь из вершины в вершину
и путь единиц.
Кратчайший путь из в равен 15, .
Также можно найти кратчайшие пути из в любую вершину , они равны окончательной метке вершины
< Предыдущая | Следующая > |
---|