Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комб_2.doc
Скачиваний:
0
Добавлен:
16.09.2019
Размер:
177.66 Кб
Скачать

21

2.Нахождение кратчайших путей в графе

2.1.Начальные понятия

Рассмотрим ориентированные графы , дугам которых приписаны веса. Это означает, что каждой дуге поставлено в соответствие некоторое вещественное число , называемое весом данной дуги. Полагаем, кроме того, что отсутствующие дуги графа будут иметь бесконечно большие веса. Если последовательность вершин v0, v1, v2, . . . , vp определяет путь в G, то его длина определяется как сумма .

Если в произвольном графе принять вес каждой дуги равным 1, то получается обычное определение длины пути как числа дуг.

В случае веса, отличного от1, рассмотрим нахождение кратчайшего пути между фиксированными вершинами . Длину такого кратчайшего пути обозначим d(s,t) и назовем расстоянием от s до t (может быть и отрицательным). Если не существует ни одного пути из s в t, то .

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

Будут рассмотрены алгоритмы нахождения расстояния между вершинами, а не самих путей. Но, зная расстояния, можно при условии положительной длины всех контуров, легко определить кратчайшие пути. Для этого отметим, что для произвольных существует вершина v, такая что d(s,t) = d(s,v) + a(v,t).

Действительно, таким свойством обладает предпоследняя вершина произвольного кратчайшего пути из s в t. Далее находим вершину u, для которой d(s,v) = d(s,u) + a(u,v), и т. д. Из положительности длины всех контуров легко следует, что созданная таким образом последовательность t, v, u, . . . не содержит повторений и оканчивается вершиной s. Очевидно, что она определяет (при обращении очередности) кратчайший путь из s в t.

Таким образом получается следующий алгоритм нахождения кратчайшего пути из s в t при известных расстояниях от фиксированной вершины s до всех остальных вершин v ориентированного графа G. Эти расстояния представлены в массиве D. Кольцевые структуры графа G содержат помимо номеров вершин (n), из которых приходят направленные дуги, также веса дуг (a), что будет отражено в операции circ.element.

Алгоритм_2.1 = proc (G:graph; s,t:int; D[n]:array of int) returns (T:stack)

effects 1. T = stack.new( ); stack.pop (T,t); v = t

2. пока v < > s

2.1. c = graph.fetch(G,v);

2.2. пока ( D[v] < > D[circ.element(c).n] + circ.element(c).a ) circ.change(c)

2.3. u = circ.element(c).n

2.4. stack.pop(T,u)

2.5. v = u

Рис.2.1.Процедура нахождения кратчайшего пути в ориентированном графе.

Для всех последующих алгоритмов будем полагать, что является ориентированным графом, . Веса дуг будут либо содержаться в кольцевых структурах графа, либо в массиве .