- •Лекция 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. Составление учебного расписания
- •Библиографический список
Лекция 19. Первые k кратчайших путей
…а по короткому пути туда и вовсе не дойти. С.Я. Маршак «Кошкин дом»
При решении практических задач часто бывает недостаточно знать один самый короткий путь. Будем искать первые K кратчайших путей между парой фиксированных вершин s и t, расположенных в порядке возрастания длин и не содержащих контуров. Граф, как обычно, не должен содержать контуры отрицательного веса.
?Вопрос 1. В каком случае первые K кратчайших путей могут быть найдены уже рассмотреными нами методами?
Основная идея алгоритма — поиск отклонений от уже найденных кратчайших путей.
Пусть
мы уже нашли первые j путей
(j<K).
Обозначим их P1, P2,…, Pj.
Найдем j+1 кратчайший путь.
Рассмотрим последний найденный путь
Pj=s,
, …,
, t.
Зафиксируем
какую-нибудь вершину этого пути, не
равную t. Пусть это будет
i-тая вершина
(вершина s имеет номер 1).
Будем искать отклонение
в этой вершине.
устроено так: от s до
оно совпадает с Pj,
затем от
до t идет по кратчайшему
пути с учетом некоторых запретов
(рис. 38):
Рис. 38
Запреты нужны для того, чтобы, во-первых, не сгенерировать путь, содержащий цикл; во-вторых, не сгенерировать уже найденный путь.
Для этого:
1. Запретим использовать вершины s, , …, при поиске кратчайшего пути от до t.
2.
Сравним все уже найденные пути
P1, P2,…, Pj-1
с путем Pj. Выберем
из них те, у которых начальный участок
из i вершин s,
, …,
совпадает с начальным участком j-го
пути s,
,… ,
.
Чтобы не сгенерировать в качестве
отклонения один из этих путей, запретим
использовать дуги
→
в каждом из этих путей. Для этого в
матрицу стоимостей A для
всех таких дуг запишем A[
,
]=.
Также запретим использование дуги
→
:
A[
,
]=.
С учетом этих запретов можно найти отклонение , найдя кратчайший путь от до t алгоритмом Форда-Беллмана или Дейкстры (если в графе все дуги имеют неотрицательные стоимости). Таким образом будет найдено отклонение от пути Pj в i-й вершине.
Уже найденные кратчайшие пути будем хранить в окончательном списке L0, отклонения от кратчайших путей — в рабочем списке L. Поместим в L отклонения от кратчайшего пути Pj во всех вершинах. Минимальный путь из списка L переместим в список L0. Этот путь и будет j+1-м кратчайшим путем.
АЛГОРИТМ ЙЕНА ПОИСКА ПЕРВЫХ K КРАТЧАЙШИХ ПУТЕЙ БЕЗ КОНТУРОВ
Шаг 1.
Положить j=1. С помощью алгоритма Форда-Беллмана или Дейкстры найти кратчайший путь от s до t и поместить его в L0.
Шаг 2.
Для всех вершин (кроме последней) j-го кратчайшего пути найти отклонения и поместить их в список L. Для этого выполнить шаги 3-5. Положить i=1.
Шаг 3.
Наложить запрет на использование вершин s, ,…, . Проверить все пути из списков L0 и L и выбрать пути с начальным участком, равным s, ,…, . Для всех таких путей наложить запрет на использование ребра → . Для этого в матрицу весов записать A[ , ]=.
Шаг 4.
С помощью алгоритма Форда-Беллмана или Дейкстры найти кратчайший путь от до t. Добавить к нему начальный участок s, , …, .
Полученный путь поместить в список L.
Шаг 5.
Восстановить матрицу весов A и допустимость вершин s, , …, .
Положить i=i+1. Если не равна t, то переход к шагу 3; иначе переход к шагу 6.
Шаг 6.
Все отклонения от j-го пути уже помещены в список L.
Положить j=j+1. Если L пуст, то останов; иначе найти в L минимальный путь и перенести его в список L0.
Если j=K, то останов; иначе переход к шагу 2.
Подсчитаем вычислительную сложность алгоритма Йена и оценим размерность рабочих списков L0 и L.
Для каждого из первых K-1 путей ищем отклонения во всех вершинах. Вершин в пути не более n, поиск отклонения для одной вершины O(n3) или O(n2). Окончательно, вычислительная сложность равна O(Kn4) или O(Kn3) для неотрицательных весов.
Длина каждого пути не превосходит n (пути не содержат циклов). Количество путей в списке L0 не превосходит K; количество путей в списке L не превосходит числа отклонений (во всех вершинах, кроме последней) для K-1 пути, т.е. (K-1)(n-1).
Пути можно хранить в виде массивов, но наиболее экономным способом является динамическая структура «связанный список» для пути и «списки инцидентности» для списков L0 и L.
Ответы
Ответ 1. Если в графе имеется не менее K различных путей одной и той же минимальной длины.
