Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СиАОД.docx
Скачиваний:
17
Добавлен:
01.03.2025
Размер:
4.62 Mб
Скачать
    1. Алгоритм Дейкстры

Алгоритм Дейкстры решает задачу о кратчайших путях из одной вершины для взвешенного ориентированного графа G=(V,E) с исходной вершиной s; в котором веса всех ребер неотрицательны (w(u,v) ≥ 0 для всех (u,v) E).

Предполагается, что граф задан с помощью списков смежных вершин.

В процессе работы алгоритма поддерживается множество SV, состоящее из вершин v, для которых ( s,v) уже найдено.

Алгоритм выбирает вершину u V \ S с наименьшим d[u], добавляет u к множеству S и производит релаксацию всех ребер, выходящих из u, после чего цикл повторяется.

Вершины, не лежащие в S, хранятся в очереди Q с приоритетами, определяемыми значениями функции d.

DIJKSTRA (G, w, s)

1 INITIALIZE-SINGLE-SOURCE (G,s)

2 S  

3 QV[G]

4 while Q  

5 do u EXTRACT-MIN(Q)

6 SS  {u}

7 for (для) всех вершин vAdj[u]

8 do RELAX (u,v,w)

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

Оценка времени работы алгоритма Дейкстры

Если очередь с приоритетами реализована как массив, стоимость операции EXTRACT-MIN есть O(V).

Алгоритм делает  V  таких операций.

Суммарная стоимость всех удалений из очереди есть O(V2).

Оценим стоимость остальных операций.

Каждая вершина v V добавляется к множеству S только один раз, и каждое ребро из Adj[v] обрабатывается тоже один раз. Общее количество элементов во всех списках смежных вершин есть  E ; стоимость каждой релаксации есть O(1).

Поэтому стоимость прочих операций есть O(E).

Общая стоимость алгоритма есть O(V2 + E).

Пример исполнения алгоритма Дейкстры

Исходный граф

Шаг 1

Шаг 2

Шаг 3

Шаг 4

Шаг 5

    1. Алгоритм Беллмана-Форда

Алгоритм Беллмана-Форда решает задачу о кратчайших путях из одной вершины для случая, когда весам ребер разрешено быть отрицательными.

Алгоритм возвращает значение TRUE, если в графе нет цикла отрицательного веса, достижимого из исходной вершины, и FALSE, если таковой цикл имеется.

В первом случае алгоритм находит кратчайшие пути и их веса; во втором случае кратчайших путей для некоторых вершин не существует

Алгоритм производит релаксацию ребер, пока все значения d[v] не сравняются с ( s,v).

BELLMAN-FORD (G, w, s)

1 INITIALIZE-SINGLE-SOURCE (G,s)

2 for i  1 toV[G]-1

3 do for (для) каждого ребра (u,v)  E[G]

4 do RELAX (u,v,w)

5 for (для) каждого ребра (u,v)  E[G]

6 do if d[v] > d[u] + w (u,v)

7 then return FALSE

8 return TRUE

Оценка времени работы алгоритма

Стоимость инициализации в строке 1 есть O(V).

Общее число релаксаций есть O(VE).

Стоимость цикла в строках 5-8 есть O(E).

Суммарное время работы алгоритма есть O(VE).

Исполнение алгоритма Беллмана-Форда

Исходный граф

Последовательность просмотра ребер при релаксации

(u,v), (u,x), (u,y), (v,u), (x,v), (x,y), (y,v), (y,z), (z,u), (z,x)

Исходная вершина – z

Шаг 1

Шаг 2

Шаг 3

Шаг 4

Проверка достижимости циклов отрицательного веса

uv1

vv2

v1

v2

d[v1]

d[v2]

w(v1, v2)

(1)+(3)

(2) ? (4)

(1)

(2)

(3)

(4)

u

v

2

4

1

3

>

u

x

2

7

8

10

<

u

y

2

-2

-4

-2

=

v

u

4

2

-2

2

=

x

v

7

4

-3

4

=

x

y

7

-2

9

16

<

y

v

-2

4

7

5

<

y

z

-2

0

2

0

=

z

u

0

2

6

6

<

z

x

0

7

7

7

=