- •Лекция 1. Введение
- •Лекция 2. Графы и деревья
- •Лекция 3. Машинное представление графов
- •Лекция 4. Поиск в глубину в графе
- •Лекция 5. Поиск в ширину в графе
- •Лекция 6. Стягивающие деревья (кАркасы)
- •Лекция 7. Фундаментальное множество циклов графа
- •Лекция 8. Нахождение компонент двуcвязности (блоков) графа
- •Лекция 9. Эйлеровы пути
- •Лекция 10. Классификация задач по степени сложности
- •Лекция 11. Алгоритмы с возвратом
- •Лекция 12. Модификации алгоритма с возвратом. Задачи на максимум и минимум
- •Лекция 13. Кратчайшие пути
- •Лекция 14. Алгоритм форда-беллмана
- •Лекция 15. Алгоритм дейкстры
- •Лекция 16. Пути в бесконтурном графе
- •Лекция 17. Алгоритм флойда
- •Лекция 18. Кратчайшие пути с фиксированными платежами
- •Лекция 19. Первые k кратчайших путей
- •Приложение 1. Список np-полных задач
- •9. Множество представителей
- •10. Упорядочение внутри интервалов
- •11. Составление учебного расписания
- •Библиографический список
Лекция 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 до всех остальных vV, фиксированная вершина t, матрица весов A[u,v], u,vV.
Результаты: СТЕК, содержащий путь от 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 для самого общего случая, т.е. для графа без контуров отрицательной длины.
