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

Лекция 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(Kn4) или O(Kn3) для неотрицательных весов.

Длина каждого пути не превосходит n (пути не содержат циклов). Количество путей в списке L0 не превосходит K; количество путей в списке L не превосходит числа отклонений (во всех вершинах, кроме последней) для K-1 пути, т.е. (K-1)(n-1).

Пути можно хранить в виде массивов, но наиболее экономным способом является динамическая структура «связанный список» для пути и «списки инцидентности» для списков L0 и L.

Ответы

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