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

Лекция 13. Кратчайшие пути

Чеширский Мурлыка… — заговорила Алиса. Скажите, пожалуйста, куда мне идти? Это во многом зависит от того, Куда ты хочешь прийти, — ответил Кот. Да мне почти все равно, — начала Алиса. Тогда все равно, куда идти, — сказал Кот. Льюис Кэррол «Приключения Алисы в стране чудес».

Для поиска оптимальных решений часто существуют более разумные методы, чем тот, который выбрала Алиса, блуждая по стране чудес. В этом разделе будут рассмотрены алгоритмы, позволяющие не только «дойти до выбранного места», но и сделать это «самым коротким путем».

Дадим основные определения и обозначения для объектов, из которых будет построена наша математическая модель.

Будем рассматривать ориентированные графы, дугам которых приписаны веса.

Рис. 28

Это означает, что каждой дуге u→v поставлено в соответствие вещественное число A[u,v]. Матрицу весов дуг данного графа будем обозначать A, несуществующим дугам будем приписывать веса, равные , т.е. A[u,v]=, если дуга u→v не существует.

Матрица весов A для рисунка 28:

1

3

3

3

8

1

-5

2

4

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

В списках SLED для каждой вершины v хранится список ее потомков, т.е. вершин, в которые из v идет дуга.

Длина пути будет подсчитываться как сумма весов входящих в него дуг.

Зафиксируем в графе пару вершин s (источник) и t.

Длину кратчайшего пути от s до t будем обозначать D[s, t], где D — матрица расстояний между всеми парами вершин. Если такого пути не существует, то будем считать, что D[s, t]=.

Если источник s зафиксирован, то расстояния от s до остальных вершин графа будут храниться в векторе (одномерном массиве) D, где D[v] — расстояние от s до v.

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

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

Окончательная постановка:

БУДЕМ ИСКАТЬ КРАТЧАЙШИЕ ПУТИ НА ГРАФАХ БЕЗ КОНТУРОВ ОТРИЦАТЕЛЬНОЙ ДЛИНЫ.

В этом разделе мы рассмотрим четыре алгоритма, которые будут вычислять матрицу D расстояний между источником и всеми остальными вершинами:

  • первый подходит графам самого общего вида, т.е. без контуров отрицательной длины;

  • второй применяется для графов с неотрицательными весами;

  • третий для бесконтурных графов

  • и четвертый на графе общего вида находит расстояния между всеми парами вершин.

Сразу возникает вопрос: зачем нужны четыре различных алгоритма, когда для решения всех этих задач было бы достаточно одного, самого первого?

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

Прежде, чем рассматривать эти алгоритмы, обратим внимание на следующее: алгоритм выдает в качестве результата не сами пути, а матрицы расстояний. Решим следующую задачу:

зная расстояния от источника s до всех остальных вершин, найти путь от источника до какой-то выбранной вершины t.

Если нам удастся по последней вершине t восстановить предпоследнюю (назовем ее v), то задача решена. Восстановим предпоследнюю, по ней предпредпоследнюю и так до тех пор, пока не дойдем до источника.

Предпоследняя вершина v кратчайшего пути обладает следующим свойством:

D[s,t]=D[s,v] + A[v,t].

Алгоритм. {Нахождение кратчайшего пути}

Данные: Расстояния D[v] от источника s до всех остальных vV, фиксированная вершина t, матрица весов A[u,v], u,vV.

Результаты: СТЕК, содержащий путь от s до t.

1 begin

2 СТЕК:=0; СТЕКt; v:=t;

3 while v<>s do

4 begin

5 u:= первая из списка PRED[v] ;

6 while D[v]<>D[u] + A[u,v] do

7 u:=следующая из списка PRED[v];

8 СТЕКu; v:=u;

9 end

10 end.

Так как для поиска всех вершин u происходит просмотр не более m дуг (в списках PRED), то вычислительная сложность этого алгоритма О(m).

?Вопрос 1. Как переделать процедуру восстановления пути так, чтобы в случае существования нескольких путей одной длины на печать выдавались все?

Рассмотрим теперь алгоритм, формирующий массив расстояний D для самого общего случая, т.е. для графа без контуров отрицательной длины.