SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
Лекция 9
Поиск кратчайшего
пути в графе
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net/teaching
Понятие графа
2
 Граф (graph) – это совокупность непустого множества
𝑉 вершин и множества 𝐸 ребер
𝐺 = 𝑉, 𝐸 ,
𝑛 = 𝑉 , 𝑚 = |𝐸|,
𝑉 = 1,2, … , 𝑛 , 𝐸 = { 𝑢1, 𝑣1 , 𝑢2, 𝑣2 , … , (𝑢 𝑚, 𝑣 𝑚)}
𝑽 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓
𝑬 = 𝟏, 𝟓 , 𝟐, 𝟓 , 𝟐, 𝟑 , 𝟐, 𝟒 , (𝟑, 𝟒)
(1, 5) и (5, 1) – это одно и тоже ребро
vertex
edge
Поиск кратчайшего пути в графе
3
 Имеется взвешенный граф G = (V, E)
 Каждому ребру (i, j)  E
назначен вес wij
 Заданы начальная вершина s  V
и конечная d  V
 Требуется найти
кратчайший путь
из вершины s в вершину d
(shortest path problem)
 Длина пути
(path length, path cost, path weight) –
это сумма весов ребер, входящих в него
d (destination)
s
(source)
Длина пути в графе
4
 Длина пути (5, 4, 6, 7) =
w54 + w46 + w67 = 4 + 6 + 9 = 19
d (destination)
s
(source)
Длина пути в графе
5
 Длина пути (5, 4, 6, 7) =
w54 + w46 + w67 = 4 + 6 + 9 = 19
 Длина пути (5, 3, 8, 7) =
3 + 2 + 16 = 21
d (destination)
s
(source)
Длина пути в графе
6
 Длина пути (5, 4, 6, 7) =
w54 + w46 + w67 = 4 + 6 + 9 = 19
 Длина пути (5, 3, 8, 7) =
3 + 2 + 16 = 21
 Длина пути (5, 3, 4, 6, 7) =
3 + 3 + 6 + 9 = 21
d (destination)
s
(source)
Длина пути в графе
7
 Длина пути (5, 4, 6, 7) =
w54 + w46 + w67 = 4 + 6 + 9 = 19
 Длина пути (5, 3, 8, 7) =
3 + 2 + 16 = 21
 Длина пути (5, 3, 4, 6, 7) =
3 + 3 + 6 + 9 = 21
 Альтернативные пути
 (5, 1, 4, 3, 8, 7)
 (5, 2, 3, 8, 7)
 …
d (destination)
s
(source)
Постановки задачи о кратчайшем пути
8
 Задача о кратчайшем пути между парой вершин
(single-pair shortest path problem)
Требуется найти кратчайший путь из заданной вершины s
в заданную вершину d
 Задача о кратчайших путях из заданной вершины во все
(single-source shortest path problem)
Найти кратчайшие пути из заданной вершины s во все
 Задача о кратчайшем пути в заданный пункт назначения
(single-destination shortest path problem)
Требуется найти кратчайшие пути в заданную вершину v из всех
вершин графа
 Задача о кратчайшем пути между всеми парами вершин
(all-pairs shortest path problem)
Требуется найти кратчайший путь из каждой вершины u
в каждую вершину v
Алгоритмы поиска кратчайшего пути в графе
9
Алгоритм Применение
Алгоритм Дейкстры
Находит кратчайший путь от одной из вершин графа до всех
остальных. Алгоритм работает только для графов без ребер
отрицательного веса (wij ≥ 0)
Алгоритм
Беллмана-Форда
Находит кратчайшие пути от одной вершины графа до всех
остальных во взвешенном графе. Вес ребер может быть
отрицательным
Алгоритм поиска A*
(A star)
Находит путь с наименьшей стоимостью от одной вершины к
другой, используя алгоритм поиска по первому наилучшему
совпадению на графе
Алгоритм
Флойда-Уоршелла
Находит кратчайшие пути между всеми вершинами взвешенного
ориентированного графа
Алгоритм Джонсона
Находит кратчайшие пути между всеми парами
вершин взвешенного ориентированного графа
(должны отсутствовать циклы с отрицательным весом)
Алгоритм Ли
(волновой алгоритм)
Находит путь между вершинами s и t графа, содержащий
минимальное количество промежуточных вершин
(трассировки электрических соединений на кристаллах
микросхем и на печатных платах)
Алгоритмы Viterbi, Cherkassky, …
Алгоритм Дейкстры
10
 Алгоритм Дейкстры (Dijkstra’s algorithm, 1959) –
алгоритм поиска кратчайшего пути в графе из заданной
вершины во все остальные (single-source shortest path problem)
 Находит кратчайшее расстояние от одной из вершин графа до
всех остальных
 Применим только для графов без ребер отрицательного веса
и петель (wij ≥ 0)
 Эдсгер Дейкстра (Edsger Wybe Dijkstra) –
нидерландский ученый (структурное программирование,
язык Алгол, семафоры, распределенные вычисления)
 Лауреат премии Тьюринга (ACM A.M. Turing Award)
1. Дейкстра Э. Дисциплина программирования = A discipline of
programming. — М.: Мир, 1978. — С. 275.
2. Дал У., Дейкстра Э., Хоор К. Структурное программирование =
Structured Programming. — М.: Мир, 1975. — С. 247.
Алгоритм Дейкстры (Dijkstra)
11
 Пример: найти кратчайший путь
из вершины 1 в вершину 5
 Введем обозначения:
 H – множество посещенных
вершин
 D[i] – текущее известное
кратчайшее расстояние
от вершины s до вершины i
 prev[i] – номер вершины,
предшествующей i в пути
1
2
5
3
4
100
10
30
50
10
20
60
Алгоритм Дейкстры (Dijkstra)
12
1
2
5
3
4
100
10
30
50
10
20
60
1. Устанавливаем расстояние D[i]
от начальной вершины s до всех
остальных в ∞
2. Полагаем D[s] = 0
3. Помещаем все вершины
в очередь с приоритетом Q (min-heap):
приоритет вершины i это значение D[i]
0 ∞ ∞ ∞ ∞D[i]
1 2 53 4
Алгоритм Дейкстры (Dijkstra)
13
1
2
5
3
4
100
10
30
50
10
20
60
4. Запускаем цикл из n итераций (по числу вершин)
1. Извлекаем из очереди Q вершину v
с минимальным приоритетом –
ближайшую к s вершину
2. Отмечаем вершину v как посещенную
(помещаем v во множество H)
3. Возможно пути из s через вершину v
стали короче, выполняем проверку:
для каждой вершины u смежной
с вершиной v и не включенной в H
проверяем и корректируем расстояние D[u]
if D[v] + w(v, u) < D[u] then
// Путь из s до u через (v, u) короче
D[u] = D[v] + w(v, u)
PrioQueueDecrease(Q, u, D[u])
prev[u] = v
end if
D[2] = 10
D[4] = 30
D[5] = 100
0 10 ∞ 30 100D[i]
11
4. Запускаем цикл из n итераций (по числу вершин)
1. Извлекаем из очереди Q вершину v
с минимальным приоритетом –
ближайшую к s вершину
2. Отмечаем вершину v как посещенную
(помещаем v во множество H)
3. Возможно пути из s через вершину v
стали короче, выполняем проверку:
для каждой вершины u смежной
с вершиной v и не включенной в H
проверяем и корректируем расстояние D[u]
if D[v] + w(v, u) < D[u] then
// Путь из s до u через (v, u) короче
D[u] = D[v] + w(v, u)
PrioQueueDecrease(Q, u, D[u])
prev[u] = v
end if
Алгоритм Дейкстры (Dijkstra)
14
1
2
5
3
4
100
10
30
50
10
20
60
D[3] = 60
0 10 60 30 100D[i]
2
1
2
4. Запускаем цикл из n итераций (по числу вершин)
1. Извлекаем из очереди Q вершину v
с минимальным приоритетом –
ближайшую к s вершину
2. Отмечаем вершину v как посещенную
(помещаем v во множество H)
3. Возможно пути из s через вершину v
стали короче, выполняем проверку:
для каждой вершины u смежной
с вершиной v и не включенной в H
проверяем и корректируем расстояние D[u]
if D[v] + w(v, u) < D[u] then
// Путь из s до u через (v, u) короче
D[u] = D[v] + w(v, u)
PrioQueueDecrease(Q, u, D[u])
prev[u] = v
end if
Алгоритм Дейкстры (Dijkstra)
15
1
2
5
3
4
100
10
30
50
10
20
60
D[3] = 50
D[5] = 90
0 10 50 30 90D[i]
4
1
4
2
4. Запускаем цикл из n итераций (по числу вершин)
1. Извлекаем из очереди Q вершину v
с минимальным приоритетом –
ближайшую к s вершину
2. Отмечаем вершину v как посещенную
(помещаем v во множество H)
3. Возможно пути из s через вершину v
стали короче, выполняем проверку:
для каждой вершины u смежной
с вершиной v и не включенной в H
проверяем и корректируем расстояние D[u]
if D[v] + w(v, u) < D[u] then
// Путь из s до u через (v, u) короче
D[u] = D[v] + w(v, u)
PrioQueueDecrease(Q, u, D[u])
prev[u] = v
end if
Алгоритм Дейкстры (Dijkstra)
16
1
2
5
3
4
100
10
30
50
10
20
60
D[5] = 60
0 10 50 30 60D[i]
3
1
3
2
4
4. Запускаем цикл из n итераций (по числу вершин)
1. Извлекаем из очереди Q вершину v
с минимальным приоритетом –
ближайшую к s вершину
2. Отмечаем вершину v как посещенную
(помещаем v во множество H)
3. Возможно пути из s через вершину v
стали короче, выполняем проверку:
для каждой вершины u смежной
с вершиной v и не включенной в H
проверяем и корректируем расстояние D[u]
if D[v] + w(v, u) < D[u] then
// Путь из s до u через (v, u) короче
D[u] = D[v] + w(v, u)
PrioQueueDecrease(Q, u, D[u])
prev[u] = v
end if
Алгоритм Дейкстры (Dijkstra)
17
1
2
5
3
4
100
10
30
50
10
20
60
0 10 50 30 60D[i]
3
1
3
2
4
 В массиве D[1:n] содержаться
длины кратчайших путей из
начальной вершины s = 1
o D[1] – длина пути из 1 в 1
o D[2] – длина пути из 1 в 2
o D[3] – длина пути из 1 в 3
o D[4] – длина пути из 1 в 4
o D[5] – длина пути из 1 в 5
 Как определить какие вершины входят
в кратчайший путь из s = 1 в d = 5?
 Как восстановить путь?
Алгоритм Дейкстры (Dijkstra)
18
1
2
5
3
4
100
10
30
50
10
20
60
0 10 50 30 60D[i]
3
1
3
2
4
Алгоритм Дейкстры (Dijkstra)
19
 Восстановление кратчайшего пути
 Массив prev[i] содержит номер
вершины, предшествующей i в пути
0 10 50 30 60D[i]
3
1
2
3
4
1
2
5
3
4
100
10
30
50
10
20
60
-1 1 4 1 3prev[i]
1 2 3 4 5
 Восстанавливаем путь с конца
 Вершина 5
 Вершина prev[5] = 3
 Вершина prev[3] = 4
 Вершина prev[4] = 1
Кратчайший путь (1, 4, 3, 5)
function ShortestPath_Dijkstra(G, src, d, prev)
// Input: G = (V, E), src, dst
// Output: d[1:n], prev[1:n]
// prev[i] - узел, предшествующий i в пути
// Помещаем вершины в очередь с приоритетом
for each i in V  {src} do
d[i] = Infinity
prev[i] = -1
PriorityQueueInsert(Q, i, d[i])
end for
d[src] = 0
prev[src] = -1
PriorityQueueInsert(Q, src, d[src])
Алгоритм Дейкстры (Dijkstra)
20
Алгоритм Дейкстры (Dijkstra)
21
for i = 0 to n – 1 do
// Извлекаем узел ближайший к начальному
v = PriorityQueueRemoveMin(Q)
// Отмечаем v как посещенный
H = H + {v}
// Цикл по смежным вершинам узла v
for each u in Adj(v)  H do
// Путь через u короче текущего пути?
if d[v] + w(v, u) < d[u] then
d[u] = d[v] + w(v, u)
PriorityQueueDecrease(Q, u, d[u])
prev[u] = v
end if
end for
end for
end function
Восстановление кратчайшего пути
22
function SearchShortestPath(G, src, dst)
ShortestPath_Dijkstra(G, src, d, prev)
// Восстановление пути из src в dst
i = dst
pathlen = 1
while i != src do
pathlen = pathlen + 1
i = prev[i]
end while
j = 0
i = dst
while i != s do
path[pathlen – j] = i
i = prev[i]
j = j + 1
end while
return path[], pathlen
end function
T = TDijikstra + O(|V|)
Вычислительная сложность алгоритм Дейкстры
23
 Вычислительная сложность алгоритма Дейкстры
определяется следующими факторами:
1) выбором структуры данных для хранения графа
(матрица смежности, списки смежных вершин)
2) способом поиска вершины с минимальным
расстоянием D[i]:
 Очередь с приоритетом:
Binary heap – O(logn), Fibonacchi heap, …
 Сбалансированное дерево поиска:
Red-black tree – O(logn), AVL-tree, …
 Линейный поиск – O(n)
function ShortestPath_Dijkstra(G, src, d, prev)
// Input: G = (V, E), src, dst
// Output: d[1:n], prev[1:n]
// prev[i] - узел, предшествующий i в пути
// Помещаем вершины в очередь с приоритетом
for each i in V  {src} do
d[i] = Infinity
prev[i] = -1
PriorityQueueInsert(Q, i, d[i])
end for
d[src] = 0
prev[src] = -1
PriorityQueueInsert(Q, src, d[src])
Алгоритм Дейкстры (Dijkstra)
24
BinaryHeap
𝑂(𝑛 log 𝑛)
𝑂(log 𝑛)
for i = 0 to n – 1 do
// Извлекаем узел ближайший к начальному
v = PriorityQueueRemoveMin(Q)
// Отмечаем v как посещенный
H = H + {v}
// Цикл по смежным вершинам узла v
for each u in Adj(v)  H do
// Путь через u короче текущего пути?
if d[v] + w(v, u) < d[u] then
d[u] = d[v] + w(v, u)
PriorityQueueDecrease(Q, u, d[u])
prev[u] = v
end if
end for
end for
end function
Алгоритм Дейкстры (Dijkstra)
25
 В худшем случае функция PriorityQueueRemoveMin() вызывается n раз,
суммарная сложность 𝑂(𝑛 log 𝑛)
 В худшем случае функция PriorityQueueDecrease() вызывается
для каждого из m ребер графа, суммарная сложность 𝑂(𝑚 log 𝑛)
𝑂(log 𝑛)
BinaryHeap
𝑂(log 𝑛)
Вычислительная сложность алгоритм Дейкстры
26
 Вариант 1. D[i] – это массив или список (поиск за время O(n))
𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑛2
+ 𝑚 = 𝑂( 𝑉 2
+ 𝐸 )
 Вариант 2. D[i] хранятся в бинарной куче (Binary heap)
𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛 = 𝑂(𝑚 log 𝑛)
 Вариант 3. D[i] хранятся в Фибоначчиевой куче (Fibonacci heap)
𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑚 + 𝑛 log 𝑛
 Вариант 4. …
 В ориентированных ациклических графах (Directed acyclic graph)
кратчайший путь можно найти за время O(n)
Разреженные и насыщенные графы
27
Вариант реализации
алгоритма Дейкстры
Насыщенный граф
𝑚 = 𝑂(𝑛2
)
Разреженный граф
𝑚 = 𝑂(𝑛)
Вариант 1
D[i] – это массив
(поиск за время O(n))
𝑇 = 𝑂 𝑛2
+ 𝑚 =
𝑶(𝒏 𝟐
)
𝑇 = 𝑂 𝑛2
+ 𝑚 =
𝑶(𝒏 𝟐
)
Вариант 2
D[i] хранятся
в бинарной куче
𝑇 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛
= 𝑶(𝒏 𝟐 𝐥𝐨𝐠 𝒏)
𝑇 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛
= 𝑶 𝒏 𝐥𝐨𝐠 𝒏
Вариант 3
D[i] хранятся в
Фибоначчиевой куче
𝑇 = 𝑂 𝑚 + 𝑛 log 𝑛
= 𝑶(𝒏 𝟐
)
𝑇 = 𝑂 𝑛 + 𝑛 log 𝑛
= 𝑶(𝒏 𝐥𝐨𝐠 𝒏)
Алгоритм Дейкстры + бинарная куча
28
 Необходимые операции над очередью с приоритетом
 int heap_insert(struct heap *h,
int priority, int value)
 int heap_removemin(struct heap *h)
 void heap_decreasekey(struct heap *h,
int value, int priority)
 Реализация в лекции 7 (неполная)
Алгоритм Дейкстры + бинарная куча
29
 void heap_decreasekey(struct heap *h,
int value, int priority)
 Находим в куче узел со значением value
 Изменяем у узла приоритет на priority
 Восстанавливаем свойства кучи – поднимаем элемент
вверх по дереву (min-heap)
Prio: 3
Value: 6
Prio: 8
Value: 1
Prio: 9
Value: 4
Prio: 13
Value: 2
Prio: 45
Value: 3
heap_decreasekey(h, 3, 2)
swap
Алгоритм Дейкстры + бинарная куча
30
 void heap_decreasekey(struct heap *h,
int value, int priority)
 Поиск узла со значением value за O(1)
 Таблица value2index[value] --> указатель на элемент в куче
 Таблицу надо обновлять в insert, removemin, decreasekey
Prio: 3
Value: 6
Prio: 8
Value: 1
Prio: 9
Value: 4
Prio: 13
Value: 2
Prio: 45
Value: 3
heap_decreasekey(h, 3, 2)
swap
Домашнее задание + чтение
31
 Оценить трудоемкость по памяти алгоритма Дейкстры
в следующих случаях:
 при использовании матрицы смежности
и двоичной кучи;
 при использовании списков смежности
и двоичной кучи
 Описание алгоритма Дейкстры в [CLRS, С. 680]

Más contenido relacionado

La actualidad más candente

Depth first search and breadth first searching
Depth first search and breadth first searchingDepth first search and breadth first searching
Depth first search and breadth first searchingKawsar Hamid Sumon
 
PRIM’S AND KRUSKAL’S ALGORITHM
PRIM’S AND KRUSKAL’S  ALGORITHMPRIM’S AND KRUSKAL’S  ALGORITHM
PRIM’S AND KRUSKAL’S ALGORITHMJaydeepDesai10
 
Dijkstra's algorithm presentation
Dijkstra's algorithm presentationDijkstra's algorithm presentation
Dijkstra's algorithm presentationSubid Biswas
 
Prims and kruskal algorithms
Prims and kruskal algorithmsPrims and kruskal algorithms
Prims and kruskal algorithmsSaga Valsalan
 
minimum spanning trees Algorithm
minimum spanning trees Algorithm minimum spanning trees Algorithm
minimum spanning trees Algorithm sachin varun
 
Graph traversal-BFS & DFS
Graph traversal-BFS & DFSGraph traversal-BFS & DFS
Graph traversal-BFS & DFSRajandeep Gill
 
Bellman ford algorithm
Bellman ford algorithmBellman ford algorithm
Bellman ford algorithmA. S. M. Shafi
 
Dijkstra's Algorithm
Dijkstra's AlgorithmDijkstra's Algorithm
Dijkstra's AlgorithmArijitDhali
 
Bellmanford . montaser hamza.iraq
Bellmanford . montaser hamza.iraqBellmanford . montaser hamza.iraq
Bellmanford . montaser hamza.iraqmontaser185
 
Interesting applications of graph theory
Interesting applications of graph theoryInteresting applications of graph theory
Interesting applications of graph theoryTech_MX
 
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)Mohanlal Sukhadia University (MLSU)
 
Dijkstra algorithm a dynammic programming approach
Dijkstra algorithm   a dynammic programming approachDijkstra algorithm   a dynammic programming approach
Dijkstra algorithm a dynammic programming approachAkash Sethiya
 
introduction to graph theory
introduction to graph theoryintroduction to graph theory
introduction to graph theoryChuckie Balbuena
 
Breadth first search and depth first search
Breadth first search and  depth first searchBreadth first search and  depth first search
Breadth first search and depth first searchHossain Md Shakhawat
 
Ppt of graph theory
Ppt of graph theoryPpt of graph theory
Ppt of graph theoryArvindBorge
 

La actualidad más candente (20)

Depth first search and breadth first searching
Depth first search and breadth first searchingDepth first search and breadth first searching
Depth first search and breadth first searching
 
PRIM’S AND KRUSKAL’S ALGORITHM
PRIM’S AND KRUSKAL’S  ALGORITHMPRIM’S AND KRUSKAL’S  ALGORITHM
PRIM’S AND KRUSKAL’S ALGORITHM
 
Dijkstra's algorithm presentation
Dijkstra's algorithm presentationDijkstra's algorithm presentation
Dijkstra's algorithm presentation
 
Prims and kruskal algorithms
Prims and kruskal algorithmsPrims and kruskal algorithms
Prims and kruskal algorithms
 
minimum spanning trees Algorithm
minimum spanning trees Algorithm minimum spanning trees Algorithm
minimum spanning trees Algorithm
 
Graphs bfs dfs
Graphs bfs dfsGraphs bfs dfs
Graphs bfs dfs
 
Graph traversal-BFS & DFS
Graph traversal-BFS & DFSGraph traversal-BFS & DFS
Graph traversal-BFS & DFS
 
Bellman ford algorithm
Bellman ford algorithmBellman ford algorithm
Bellman ford algorithm
 
Dijkstra's Algorithm
Dijkstra's AlgorithmDijkstra's Algorithm
Dijkstra's Algorithm
 
Bellmanford . montaser hamza.iraq
Bellmanford . montaser hamza.iraqBellmanford . montaser hamza.iraq
Bellmanford . montaser hamza.iraq
 
Graph algorithms
Graph algorithmsGraph algorithms
Graph algorithms
 
Connectivity of graph
Connectivity of graphConnectivity of graph
Connectivity of graph
 
Interesting applications of graph theory
Interesting applications of graph theoryInteresting applications of graph theory
Interesting applications of graph theory
 
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
 
Shortest path
Shortest pathShortest path
Shortest path
 
Dijkstra algorithm a dynammic programming approach
Dijkstra algorithm   a dynammic programming approachDijkstra algorithm   a dynammic programming approach
Dijkstra algorithm a dynammic programming approach
 
Graph theory
Graph  theoryGraph  theory
Graph theory
 
introduction to graph theory
introduction to graph theoryintroduction to graph theory
introduction to graph theory
 
Breadth first search and depth first search
Breadth first search and  depth first searchBreadth first search and  depth first search
Breadth first search and depth first search
 
Ppt of graph theory
Ppt of graph theoryPpt of graph theory
Ppt of graph theory
 

Destacado

Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Ирина Слуцкая
 
опитування
опитуванняопитування
опитуванняkalishnatalka
 
створення сторIнки 11 клас
створення сторIнки 11 класстворення сторIнки 11 клас
створення сторIнки 11 класИрина Слуцкая
 
Сервіс SlideShara
Сервіс SlideSharaСервіс SlideShara
Сервіс SlideSharaalyonka24112
 
додавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класдодавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класИрина Слуцкая
 
Цикли з умовою
Цикли з умовоюЦикли з умовою
Цикли з умовоюOlga Lyulchik
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Nikolay Grebenshikov
 
Основы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовОсновы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовAlex Dainiak
 
информатика рабочая тетрадь 9 класс босова
информатика рабочая тетрадь 9 класс босоваинформатика рабочая тетрадь 9 класс босова
информатика рабочая тетрадь 9 класс босоваreshyvse
 

Destacado (20)

Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2
 
Algoritm
AlgoritmAlgoritm
Algoritm
 
масиви
масивимасиви
масиви
 
опитування
опитуванняопитування
опитування
 
створення посту 11кл
створення посту 11клстворення посту 11кл
створення посту 11кл
 
створення сторIнки 11 клас
створення сторIнки 11 класстворення сторIнки 11 клас
створення сторIнки 11 клас
 
створення блогу 11 клас
створення блогу 11 класстворення блогу 11 клас
створення блогу 11 клас
 
Цикли
ЦиклиЦикли
Цикли
 
Сервіс SlideShara
Сервіс SlideSharaСервіс SlideShara
Сервіс SlideShara
 
PowerPoint1
PowerPoint1PowerPoint1
PowerPoint1
 
додавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класдодавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 клас
 
Цикли з умовою
Цикли з умовоюЦикли з умовою
Цикли з умовою
 
Задания ОГЭ на графы
Задания ОГЭ на графыЗадания ОГЭ на графы
Задания ОГЭ на графы
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
 
Основы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовОсновы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графов
 
информатика рабочая тетрадь 9 класс босова
информатика рабочая тетрадь 9 класс босоваинформатика рабочая тетрадь 9 класс босова
информатика рабочая тетрадь 9 класс босова
 

Similar a Лекция 9: Графы. Поиск кратчайшего пути в графе

Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахMikhail Kurnosov
 
практика 14
практика 14практика 14
практика 14student_kai
 
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Nikolay Grebenshikov
 
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Nikolay Grebenshikov
 
практика 13
практика 13практика 13
практика 13student_kai
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Nikolay Grebenshikov
 
экспертные системы
экспертные системыэкспертные системы
экспертные системыsokol_klinik
 
задания государственного экзамена по математике 15
задания государственного экзамена по математике 15задания государственного экзамена по математике 15
задания государственного экзамена по математике 15svetlana
 
20071118 efficientalgorithms kulikov_lecture08
20071118 efficientalgorithms kulikov_lecture0820071118 efficientalgorithms kulikov_lecture08
20071118 efficientalgorithms kulikov_lecture08Computer Science Club
 
функция
функцияфункция
функцияmara2101
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 

Similar a Лекция 9: Графы. Поиск кратчайшего пути в графе (20)

Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графах
 
лекция 14
лекция 14лекция 14
лекция 14
 
практика 14
практика 14практика 14
практика 14
 
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
 
5
55
5
 
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
 
практика 13
практика 13практика 13
практика 13
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
 
графы
графыграфы
графы
 
экспертные системы
экспертные системыэкспертные системы
экспертные системы
 
задания государственного экзамена по математике 15
задания государственного экзамена по математике 15задания государственного экзамена по математике 15
задания государственного экзамена по математике 15
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
20071118 efficientalgorithms kulikov_lecture08
20071118 efficientalgorithms kulikov_lecture0820071118 efficientalgorithms kulikov_lecture08
20071118 efficientalgorithms kulikov_lecture08
 
6.0a
6.0a6.0a
6.0a
 
Funkciya 1
Funkciya 1Funkciya 1
Funkciya 1
 
функция
функцияфункция
функция
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 
Алгоритмы решения Судоку
Алгоритмы решения СудокуАлгоритмы решения Судоку
Алгоритмы решения Судоку
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 

Más de Mikhail Kurnosov

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 

Más de Mikhail Kurnosov (20)

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 

Лекция 9: Графы. Поиск кратчайшего пути в графе

  • 1. Лекция 9 Поиск кратчайшего пути в графе Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Понятие графа 2  Граф (graph) – это совокупность непустого множества 𝑉 вершин и множества 𝐸 ребер 𝐺 = 𝑉, 𝐸 , 𝑛 = 𝑉 , 𝑚 = |𝐸|, 𝑉 = 1,2, … , 𝑛 , 𝐸 = { 𝑢1, 𝑣1 , 𝑢2, 𝑣2 , … , (𝑢 𝑚, 𝑣 𝑚)} 𝑽 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓 𝑬 = 𝟏, 𝟓 , 𝟐, 𝟓 , 𝟐, 𝟑 , 𝟐, 𝟒 , (𝟑, 𝟒) (1, 5) и (5, 1) – это одно и тоже ребро vertex edge
  • 3. Поиск кратчайшего пути в графе 3  Имеется взвешенный граф G = (V, E)  Каждому ребру (i, j)  E назначен вес wij  Заданы начальная вершина s  V и конечная d  V  Требуется найти кратчайший путь из вершины s в вершину d (shortest path problem)  Длина пути (path length, path cost, path weight) – это сумма весов ребер, входящих в него d (destination) s (source)
  • 4. Длина пути в графе 4  Длина пути (5, 4, 6, 7) = w54 + w46 + w67 = 4 + 6 + 9 = 19 d (destination) s (source)
  • 5. Длина пути в графе 5  Длина пути (5, 4, 6, 7) = w54 + w46 + w67 = 4 + 6 + 9 = 19  Длина пути (5, 3, 8, 7) = 3 + 2 + 16 = 21 d (destination) s (source)
  • 6. Длина пути в графе 6  Длина пути (5, 4, 6, 7) = w54 + w46 + w67 = 4 + 6 + 9 = 19  Длина пути (5, 3, 8, 7) = 3 + 2 + 16 = 21  Длина пути (5, 3, 4, 6, 7) = 3 + 3 + 6 + 9 = 21 d (destination) s (source)
  • 7. Длина пути в графе 7  Длина пути (5, 4, 6, 7) = w54 + w46 + w67 = 4 + 6 + 9 = 19  Длина пути (5, 3, 8, 7) = 3 + 2 + 16 = 21  Длина пути (5, 3, 4, 6, 7) = 3 + 3 + 6 + 9 = 21  Альтернативные пути  (5, 1, 4, 3, 8, 7)  (5, 2, 3, 8, 7)  … d (destination) s (source)
  • 8. Постановки задачи о кратчайшем пути 8  Задача о кратчайшем пути между парой вершин (single-pair shortest path problem) Требуется найти кратчайший путь из заданной вершины s в заданную вершину d  Задача о кратчайших путях из заданной вершины во все (single-source shortest path problem) Найти кратчайшие пути из заданной вершины s во все  Задача о кратчайшем пути в заданный пункт назначения (single-destination shortest path problem) Требуется найти кратчайшие пути в заданную вершину v из всех вершин графа  Задача о кратчайшем пути между всеми парами вершин (all-pairs shortest path problem) Требуется найти кратчайший путь из каждой вершины u в каждую вершину v
  • 9. Алгоритмы поиска кратчайшего пути в графе 9 Алгоритм Применение Алгоритм Дейкстры Находит кратчайший путь от одной из вершин графа до всех остальных. Алгоритм работает только для графов без ребер отрицательного веса (wij ≥ 0) Алгоритм Беллмана-Форда Находит кратчайшие пути от одной вершины графа до всех остальных во взвешенном графе. Вес ребер может быть отрицательным Алгоритм поиска A* (A star) Находит путь с наименьшей стоимостью от одной вершины к другой, используя алгоритм поиска по первому наилучшему совпадению на графе Алгоритм Флойда-Уоршелла Находит кратчайшие пути между всеми вершинами взвешенного ориентированного графа Алгоритм Джонсона Находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа (должны отсутствовать циклы с отрицательным весом) Алгоритм Ли (волновой алгоритм) Находит путь между вершинами s и t графа, содержащий минимальное количество промежуточных вершин (трассировки электрических соединений на кристаллах микросхем и на печатных платах) Алгоритмы Viterbi, Cherkassky, …
  • 10. Алгоритм Дейкстры 10  Алгоритм Дейкстры (Dijkstra’s algorithm, 1959) – алгоритм поиска кратчайшего пути в графе из заданной вершины во все остальные (single-source shortest path problem)  Находит кратчайшее расстояние от одной из вершин графа до всех остальных  Применим только для графов без ребер отрицательного веса и петель (wij ≥ 0)  Эдсгер Дейкстра (Edsger Wybe Dijkstra) – нидерландский ученый (структурное программирование, язык Алгол, семафоры, распределенные вычисления)  Лауреат премии Тьюринга (ACM A.M. Turing Award) 1. Дейкстра Э. Дисциплина программирования = A discipline of programming. — М.: Мир, 1978. — С. 275. 2. Дал У., Дейкстра Э., Хоор К. Структурное программирование = Structured Programming. — М.: Мир, 1975. — С. 247.
  • 11. Алгоритм Дейкстры (Dijkstra) 11  Пример: найти кратчайший путь из вершины 1 в вершину 5  Введем обозначения:  H – множество посещенных вершин  D[i] – текущее известное кратчайшее расстояние от вершины s до вершины i  prev[i] – номер вершины, предшествующей i в пути 1 2 5 3 4 100 10 30 50 10 20 60
  • 12. Алгоритм Дейкстры (Dijkstra) 12 1 2 5 3 4 100 10 30 50 10 20 60 1. Устанавливаем расстояние D[i] от начальной вершины s до всех остальных в ∞ 2. Полагаем D[s] = 0 3. Помещаем все вершины в очередь с приоритетом Q (min-heap): приоритет вершины i это значение D[i] 0 ∞ ∞ ∞ ∞D[i] 1 2 53 4
  • 13. Алгоритм Дейкстры (Dijkstra) 13 1 2 5 3 4 100 10 30 50 10 20 60 4. Запускаем цикл из n итераций (по числу вершин) 1. Извлекаем из очереди Q вершину v с минимальным приоритетом – ближайшую к s вершину 2. Отмечаем вершину v как посещенную (помещаем v во множество H) 3. Возможно пути из s через вершину v стали короче, выполняем проверку: для каждой вершины u смежной с вершиной v и не включенной в H проверяем и корректируем расстояние D[u] if D[v] + w(v, u) < D[u] then // Путь из s до u через (v, u) короче D[u] = D[v] + w(v, u) PrioQueueDecrease(Q, u, D[u]) prev[u] = v end if D[2] = 10 D[4] = 30 D[5] = 100 0 10 ∞ 30 100D[i] 11
  • 14. 4. Запускаем цикл из n итераций (по числу вершин) 1. Извлекаем из очереди Q вершину v с минимальным приоритетом – ближайшую к s вершину 2. Отмечаем вершину v как посещенную (помещаем v во множество H) 3. Возможно пути из s через вершину v стали короче, выполняем проверку: для каждой вершины u смежной с вершиной v и не включенной в H проверяем и корректируем расстояние D[u] if D[v] + w(v, u) < D[u] then // Путь из s до u через (v, u) короче D[u] = D[v] + w(v, u) PrioQueueDecrease(Q, u, D[u]) prev[u] = v end if Алгоритм Дейкстры (Dijkstra) 14 1 2 5 3 4 100 10 30 50 10 20 60 D[3] = 60 0 10 60 30 100D[i] 2 1 2
  • 15. 4. Запускаем цикл из n итераций (по числу вершин) 1. Извлекаем из очереди Q вершину v с минимальным приоритетом – ближайшую к s вершину 2. Отмечаем вершину v как посещенную (помещаем v во множество H) 3. Возможно пути из s через вершину v стали короче, выполняем проверку: для каждой вершины u смежной с вершиной v и не включенной в H проверяем и корректируем расстояние D[u] if D[v] + w(v, u) < D[u] then // Путь из s до u через (v, u) короче D[u] = D[v] + w(v, u) PrioQueueDecrease(Q, u, D[u]) prev[u] = v end if Алгоритм Дейкстры (Dijkstra) 15 1 2 5 3 4 100 10 30 50 10 20 60 D[3] = 50 D[5] = 90 0 10 50 30 90D[i] 4 1 4 2
  • 16. 4. Запускаем цикл из n итераций (по числу вершин) 1. Извлекаем из очереди Q вершину v с минимальным приоритетом – ближайшую к s вершину 2. Отмечаем вершину v как посещенную (помещаем v во множество H) 3. Возможно пути из s через вершину v стали короче, выполняем проверку: для каждой вершины u смежной с вершиной v и не включенной в H проверяем и корректируем расстояние D[u] if D[v] + w(v, u) < D[u] then // Путь из s до u через (v, u) короче D[u] = D[v] + w(v, u) PrioQueueDecrease(Q, u, D[u]) prev[u] = v end if Алгоритм Дейкстры (Dijkstra) 16 1 2 5 3 4 100 10 30 50 10 20 60 D[5] = 60 0 10 50 30 60D[i] 3 1 3 2 4
  • 17. 4. Запускаем цикл из n итераций (по числу вершин) 1. Извлекаем из очереди Q вершину v с минимальным приоритетом – ближайшую к s вершину 2. Отмечаем вершину v как посещенную (помещаем v во множество H) 3. Возможно пути из s через вершину v стали короче, выполняем проверку: для каждой вершины u смежной с вершиной v и не включенной в H проверяем и корректируем расстояние D[u] if D[v] + w(v, u) < D[u] then // Путь из s до u через (v, u) короче D[u] = D[v] + w(v, u) PrioQueueDecrease(Q, u, D[u]) prev[u] = v end if Алгоритм Дейкстры (Dijkstra) 17 1 2 5 3 4 100 10 30 50 10 20 60 0 10 50 30 60D[i] 3 1 3 2 4
  • 18.  В массиве D[1:n] содержаться длины кратчайших путей из начальной вершины s = 1 o D[1] – длина пути из 1 в 1 o D[2] – длина пути из 1 в 2 o D[3] – длина пути из 1 в 3 o D[4] – длина пути из 1 в 4 o D[5] – длина пути из 1 в 5  Как определить какие вершины входят в кратчайший путь из s = 1 в d = 5?  Как восстановить путь? Алгоритм Дейкстры (Dijkstra) 18 1 2 5 3 4 100 10 30 50 10 20 60 0 10 50 30 60D[i] 3 1 3 2 4
  • 19. Алгоритм Дейкстры (Dijkstra) 19  Восстановление кратчайшего пути  Массив prev[i] содержит номер вершины, предшествующей i в пути 0 10 50 30 60D[i] 3 1 2 3 4 1 2 5 3 4 100 10 30 50 10 20 60 -1 1 4 1 3prev[i] 1 2 3 4 5  Восстанавливаем путь с конца  Вершина 5  Вершина prev[5] = 3  Вершина prev[3] = 4  Вершина prev[4] = 1 Кратчайший путь (1, 4, 3, 5)
  • 20. function ShortestPath_Dijkstra(G, src, d, prev) // Input: G = (V, E), src, dst // Output: d[1:n], prev[1:n] // prev[i] - узел, предшествующий i в пути // Помещаем вершины в очередь с приоритетом for each i in V {src} do d[i] = Infinity prev[i] = -1 PriorityQueueInsert(Q, i, d[i]) end for d[src] = 0 prev[src] = -1 PriorityQueueInsert(Q, src, d[src]) Алгоритм Дейкстры (Dijkstra) 20
  • 21. Алгоритм Дейкстры (Dijkstra) 21 for i = 0 to n – 1 do // Извлекаем узел ближайший к начальному v = PriorityQueueRemoveMin(Q) // Отмечаем v как посещенный H = H + {v} // Цикл по смежным вершинам узла v for each u in Adj(v) H do // Путь через u короче текущего пути? if d[v] + w(v, u) < d[u] then d[u] = d[v] + w(v, u) PriorityQueueDecrease(Q, u, d[u]) prev[u] = v end if end for end for end function
  • 22. Восстановление кратчайшего пути 22 function SearchShortestPath(G, src, dst) ShortestPath_Dijkstra(G, src, d, prev) // Восстановление пути из src в dst i = dst pathlen = 1 while i != src do pathlen = pathlen + 1 i = prev[i] end while j = 0 i = dst while i != s do path[pathlen – j] = i i = prev[i] j = j + 1 end while return path[], pathlen end function T = TDijikstra + O(|V|)
  • 23. Вычислительная сложность алгоритм Дейкстры 23  Вычислительная сложность алгоритма Дейкстры определяется следующими факторами: 1) выбором структуры данных для хранения графа (матрица смежности, списки смежных вершин) 2) способом поиска вершины с минимальным расстоянием D[i]:  Очередь с приоритетом: Binary heap – O(logn), Fibonacchi heap, …  Сбалансированное дерево поиска: Red-black tree – O(logn), AVL-tree, …  Линейный поиск – O(n)
  • 24. function ShortestPath_Dijkstra(G, src, d, prev) // Input: G = (V, E), src, dst // Output: d[1:n], prev[1:n] // prev[i] - узел, предшествующий i в пути // Помещаем вершины в очередь с приоритетом for each i in V {src} do d[i] = Infinity prev[i] = -1 PriorityQueueInsert(Q, i, d[i]) end for d[src] = 0 prev[src] = -1 PriorityQueueInsert(Q, src, d[src]) Алгоритм Дейкстры (Dijkstra) 24 BinaryHeap 𝑂(𝑛 log 𝑛) 𝑂(log 𝑛)
  • 25. for i = 0 to n – 1 do // Извлекаем узел ближайший к начальному v = PriorityQueueRemoveMin(Q) // Отмечаем v как посещенный H = H + {v} // Цикл по смежным вершинам узла v for each u in Adj(v) H do // Путь через u короче текущего пути? if d[v] + w(v, u) < d[u] then d[u] = d[v] + w(v, u) PriorityQueueDecrease(Q, u, d[u]) prev[u] = v end if end for end for end function Алгоритм Дейкстры (Dijkstra) 25  В худшем случае функция PriorityQueueRemoveMin() вызывается n раз, суммарная сложность 𝑂(𝑛 log 𝑛)  В худшем случае функция PriorityQueueDecrease() вызывается для каждого из m ребер графа, суммарная сложность 𝑂(𝑚 log 𝑛) 𝑂(log 𝑛) BinaryHeap 𝑂(log 𝑛)
  • 26. Вычислительная сложность алгоритм Дейкстры 26  Вариант 1. D[i] – это массив или список (поиск за время O(n)) 𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑛2 + 𝑚 = 𝑂( 𝑉 2 + 𝐸 )  Вариант 2. D[i] хранятся в бинарной куче (Binary heap) 𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛 = 𝑂(𝑚 log 𝑛)  Вариант 3. D[i] хранятся в Фибоначчиевой куче (Fibonacci heap) 𝑇 𝐷𝑖𝑗𝑖𝑘𝑠𝑡𝑟𝑎 = 𝑂 𝑚 + 𝑛 log 𝑛  Вариант 4. …  В ориентированных ациклических графах (Directed acyclic graph) кратчайший путь можно найти за время O(n)
  • 27. Разреженные и насыщенные графы 27 Вариант реализации алгоритма Дейкстры Насыщенный граф 𝑚 = 𝑂(𝑛2 ) Разреженный граф 𝑚 = 𝑂(𝑛) Вариант 1 D[i] – это массив (поиск за время O(n)) 𝑇 = 𝑂 𝑛2 + 𝑚 = 𝑶(𝒏 𝟐 ) 𝑇 = 𝑂 𝑛2 + 𝑚 = 𝑶(𝒏 𝟐 ) Вариант 2 D[i] хранятся в бинарной куче 𝑇 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛 = 𝑶(𝒏 𝟐 𝐥𝐨𝐠 𝒏) 𝑇 = 𝑂 𝑛 log 𝑛 + 𝑚 log 𝑛 = 𝑶 𝒏 𝐥𝐨𝐠 𝒏 Вариант 3 D[i] хранятся в Фибоначчиевой куче 𝑇 = 𝑂 𝑚 + 𝑛 log 𝑛 = 𝑶(𝒏 𝟐 ) 𝑇 = 𝑂 𝑛 + 𝑛 log 𝑛 = 𝑶(𝒏 𝐥𝐨𝐠 𝒏)
  • 28. Алгоритм Дейкстры + бинарная куча 28  Необходимые операции над очередью с приоритетом  int heap_insert(struct heap *h, int priority, int value)  int heap_removemin(struct heap *h)  void heap_decreasekey(struct heap *h, int value, int priority)  Реализация в лекции 7 (неполная)
  • 29. Алгоритм Дейкстры + бинарная куча 29  void heap_decreasekey(struct heap *h, int value, int priority)  Находим в куче узел со значением value  Изменяем у узла приоритет на priority  Восстанавливаем свойства кучи – поднимаем элемент вверх по дереву (min-heap) Prio: 3 Value: 6 Prio: 8 Value: 1 Prio: 9 Value: 4 Prio: 13 Value: 2 Prio: 45 Value: 3 heap_decreasekey(h, 3, 2) swap
  • 30. Алгоритм Дейкстры + бинарная куча 30  void heap_decreasekey(struct heap *h, int value, int priority)  Поиск узла со значением value за O(1)  Таблица value2index[value] --> указатель на элемент в куче  Таблицу надо обновлять в insert, removemin, decreasekey Prio: 3 Value: 6 Prio: 8 Value: 1 Prio: 9 Value: 4 Prio: 13 Value: 2 Prio: 45 Value: 3 heap_decreasekey(h, 3, 2) swap
  • 31. Домашнее задание + чтение 31  Оценить трудоемкость по памяти алгоритма Дейкстры в следующих случаях:  при использовании матрицы смежности и двоичной кучи;  при использовании списков смежности и двоичной кучи  Описание алгоритма Дейкстры в [CLRS, С. 680]