Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
флеров.doc
Скачиваний:
118
Добавлен:
25.11.2018
Размер:
2.4 Mб
Скачать
    1. Нахождение кратчайших путей в графе

В этом разделе мы будем рассматривать ориентированные графы G = <V, E >, ребрам которых приписаны веса. Это означает, что каждому ребру поставлено в соответствие вещественное число c(u,v), называемое весом данного ребра. Полагаем, что с(u, v) =, если <u, v>E.

Если S = <v0, v1, ... , vp>- путь в G, то его длина определяется как сумма

.

(Отметим, что если в произвольном графе мы примем вес каждого ребра равным единице, то получим обычное определение длины пути как числа ребер).

Нас будет интересовать нахождение кратчайшего пути между фиксированными вершинами Длину такого кратчайшего пути d(v,t) и будем называть расстоянием от v до t . Отметим, что если каждый цикл нашего графа имеет положительную длину, то кратчайший путь будет всегда простым.

Во многих приложениях достаточно находить кратчайшие пути между двумя конкретными вершинами, однако, неизвестен алгоритм, который решал бы эту задачу эффективнее (в худшем случае), чем лучший из известных алгоритмов для нахождения кратчайших расстояний от одной вершины v0, называемой источником, до всех остальных вершин.

Задача нахождения кратчайших путей от одного источника решается для трех случаев.

1. Ориентированный граф без циклов с отрицательной длиной (cложность алгоритма - , где n - число вершин).

2. Веса всех ребер неотрицательны (cложность алгоритма - ).

3. Граф без циклов (cложность алгоритма - ).

Рассмотрим второй случай.

      1. Алгоритм нахождения расстояния от источника до всех остальных вершин в ориентированном графе с неотрицательными весами ребер

Исходные данные: G=<V, E > - ориентированный, связный, конечный граф c неотрицательными весами ребер.

v0 - источник, v0V.

- матрица весов ребер.

Результат: расстояния от источника до всех вершин графа

D[v]=d(v0,v), vV.

Метод. Строим такое подмножество S множества вершин графа, , что кратчайший путь из источника в каждую вершину целиком лежит в S.

S:={v0};

D[v]:=c(v0,v); D[v0]:=0;

while VS DO

begin

выбрать вершину uV\S,

для которой ;

;

для всех vV\S: D[v]:=min( D[v], D[v]+C[u,v] )

end.

Чтобы показать корректность алгоритма, надо доказать индукцией по размеру множества S, что для каждой вершины число D[v] равно длине кратчайшего пути из v0 в v. Более того, для всех vV\S число D[v] равно длине кратчайшего пути из v0 в v, лежащего целиком (если не считать саму вершину v) в S.

Базис индукции. Пусть S =1. Кратчайший путь из v0 в себя имеет длину 0, а путь из v0 в v, лежащий целиком (исключая v) в S, состоит из единственного ребра <v0, v>.

Шаг индукции. Пусть u - узел для которого .

Если число D[u] не равно длине кратчайшего пути из v0 в u, то должен быть более короткий путь P. Этот путь должен содержать вершину, отличную от u и не принадлежащую S. Пусть v - первая такая вершина на пути P из вершины v0 в вершину u (смотрите рис. 3.9).

Но тогда расстояние от v0 до v меньше D[u], а кратчайший путь в вершину v, целиком (исключая сам узел v) лежит в S. Следовательно, по предположению индукции, D[v] < D[u] в момент выбора u; таким образом, мы пришли к противоречию. Отсюда заключаем, что такого пути P нет и D[u] - длина кратчайшего пути из v0 в u.

Рис. 3.9.

Второе утверждение (о том , что D[u] остается корректным) очевидно ввиду последнего оператора присваивания в алгоритме.