
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.Процедура нахождения кратчайшего пути в ориентированном графе.
Для
всех последующих алгоритмов будем
полагать, что
является ориентированным графом,
.
Веса дуг будут либо содержаться в
кольцевых структурах графа, либо в
массиве
.