Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.58 Mб
Скачать

Давайте придумаем что-нибудь простое

Рассмотрим какое-нибудь ребро (v, w). Что мы можем сказать про расстояния до его концов? Очевидно, dist[u, w] ≤ dist[u, v] + weight[v, w].

Доказательство

Давайте будем действовать итерационно. Изначально известно расстояние только до начальной вершины — оно равно 0. В каждый момент времени мы можем проверить выполнение свойства для какого-нибудь ребра и, если оно нарушено, улучшить существующую оценку расстояния до конечной вершины ребра. Это процедура называется релаксацией.

А если я педант?

Давайте докажем, что после k итераций алгоритм найдет все кратчайшие пути, состоящие из k ребер или менее. Тогда получится, что в конце работы он найдет все кратчайшие пути из не более, чем V ребер — то есть, все существующие кратчайшие пути. Для удобства обозначим начальную вершину u.

  • База: k = 0 очевидно, путь из начальной вершины в нее же найден верно

  • Предположение: после k итераций для всех вершин v, до которых существует кратчайший путь, состоящий из не более, чем k ребер, dist[v] равно расстоянию от начальной вершины до v

  • Шаг: рассмотрим некоторую вершину w, до которой существует кратчайший путь, состоящий из k + 1 ребра.

    • Обозначим предпоследнюю вершину в пути от u до w, как v.

    • Для v существует кратчайший путь из k вершин (например, начало кратчайшего пути до w).

    • Значит, кратчайший путь до v был найден на предыдущей итерации. Проведя релаксацию ребра (v, w) на k + 1-ой итерации, мы получим верное значение расстояния до вершины w.

    • Заметим, что при релаксации какого-либо другого ребра мы не могли получить значения, меньшего, чем верное расстояние, поскольку каждой релаксации ребра (x, w) можно поставить в соответствие путь из начальной вершины в w соответствующей длины.

    Алгоритм поиска кратчайших путей с помощью топологической сортировки

полное время работы алгоритма равно Θ(V + Е)

Ослабляя ребра взвешенного ориентированного ациклического графа G= (V, Е) в порядке, определенном топологической сортировкой его вершин, кратчайшие пути из одной вершины можно найти в течение времени Θ(V + Е). В ориентированном ациклическом графе кратчайшие пути всегда вполне определены, поскольку даже если у некоторых ребер вес отрицателен, циклов с отрицательными весами не существует.

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

Dag_Shortest_Paths(G, w, s)

1 Топологическая сортировка вершин графа G

2 Initialize_Single_Source(G, s)

3 for (для) каждой вершины u в порядке топологической сортировки

4 do for (Для) каждой вершины v∈Adj[u]

5 do Relax(u, v, w)

    Алгоритм Дейкстры (с кучей и с массивом)

О(V2 ) массив

Θ(VlogV + ЕlogE)куча

Алгоритм Дейкстры решает задачу о кратчайшем пути из одной вершины во взвешенном ориентированном графе G = (V, Е) в том случае, когда веса ребер неотрицательны. Поэтому в настоящем разделе предполагается, что для всех ребер (u, v) ∈ Е выполняется неравенство w (u, v) ≥ 0. При хорошей реализации алгоритм Дейкстры производительнее, чем алгоритм Беллмана-Форда.

В алгоритме Дейкстры поддерживается множество вершин S, для которых уже вычислены окончательные веса кратчайших путей к ним из истока s. В этом алгоритме поочередно выбирается вершина u∈ V — S, которой на данном этапе соответствует минимальная оценка кратчайшего пути. После добавления этой вершины u в множество S производится ослабление всех исходящих из нее ребер. В приведенной ниже реализации используется неубывающая очередь с приоритетами Q, состоящая из вершин, в роли ключей для которых выступают значения d.

Dijkstra(G, w ,s)

1. Initialize _Single_ Source(G,s)

2. S←0

3. Q ← V[G]

4. while Q ≠ ∅ 5. do u ← Extract Min(Q)

6. S←-S∪ {u}

7. for (для) каждой вершины v∈Adj[u]

8. do Relax(u, v, w)

9.

Процесс ослабления ребер в алгоритме Дейкстры проиллюстрирован на Рисунке. Исток s расположен на рисунке слева от остальных вершин. В каждой вершине приведена оценка кратчайшего пути к ней, а выделенные ребра указывают предшественников. Черным цветом обозначены вершины, добавленные в множество S, а белым — содержащиеся в неубывающей очереди с приоритетами Q = V — S. В части а рисунка проиллюстрирована ситуация, сложившаяся непосредственно перед выполнением первой итерации цикла while в строках 4-8. Выделенная серым цветом вершина имеет минимальное значение d и выбирается в строкt 5 в качестве вершины u для следующей итерации. В частях б-е изображены ситуации после выполнения очередной итерации цикла while. В каждой из этих частей выделенная серым цветом вершина выбирается в качестве вершины u в строке 5. В части е приведены конечные значения величин d и π.

    Кратчайшие пути между всеми парами вершин:

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

В этой задаче задается взвешенный ориентированный граф G = (V,E) с весовой функцией w : Е → R, отображающей ребра на их веса, выраженные действительными числами. Для каждой пары вершин u, v ∈V требуется найти кратчайший (обладающий наименьшим весом) путь из вершины u в вершину v, вес которого определяется как сумма весов входящих в него ребер. Обычно выходные данные представляются в табличной форме: на пересечении строки с индексом u и столбца с индексом v расположен вес кратчайшего пути из вершины u в вершину v.

алгоритм Флойда

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

  1. кратчайший путь из вершины i в вершину m, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин;

  2. кратчайший путь из вершины m в вершину j, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин;

  3. кратчайший путь из вершины i в вершину j, в котором в качестве промежуточных допускается использование только первых (m - 1) вершин.

Алгоритм

  1. Перенумеровать вершины графа от 1 до N целыми числами, определить матрицу D0, каждый элемент di,j  которой есть длина кратчайшей дуги между вершинами i и j. Если такой дуги нет, положить значение элемента равным ∞. Кроме того, положить значения диагонального элемента di,iравным 0.

  2. Для целого m, последовательно принимающего значения 1...N определить по элементам матрицы Dm-1элементы Dm

  3. Алгоритм заканчивается получением матрицы всех кратчайших путей DN, N – число вершин графа.

  Напомним, для определения по известным элементам матрицы Dm-1 элементов матрицы  Dm в алгоритме Флойда применяется рекурсивное соотношение:

di,jm=min{ di,mm-1+ dm,jm-1; di,jm-1}

di,jm – элемент матрицы Dm, di,jm-1 – элементы матрицы Dm-1 найденой на предыдущем шаге алгоритма.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]