- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Список рёбер
Список рёбер — это тип представления графа, подразумевающий, что каждое ребро представляется двумя числами — номерами вершин этого ребра.
Алгоритмы обхода графа
Обходя граф мы двигаемся по ребрам и проходим все вершины. При этом накапливается много информации, которая полезна для дальнейшей обработки графа.
Обход графа входит как составная часть во многие алгоритмы.
Алгоритмы используют представление графа G=(V,E) или с помощью списка смежных вершин или с помощью матрицы связности (смежности).
Поиск в ширину
Поиск в ширину является базисным алгоритмом, составляющий основу многих других (алгоритм Дейкстры поиска кратчайших путей из одной вершины, алгоритм Прима поиска минимального покрывающего дерева)
Пусть задан граф G=(V,E) и фиксированная начальная вершина s.
Алгоритм поиска в ширину перечисляет все достижимые из вершины в порядке возрастания расстояния от s.
Расстояние – число ребер кратчайшего пути.
В процессе поиска из графа выделяется часть, называемая «деревом поиска в ширину» с корнем s. Она содержит все достижимые из s вершины. Путь из корня в дереве поиска до каждой из вершин в дереве поиска будет одним из кратчайших путей в графе.
Алгоритм применим и к ориентированным и к неориентированным графам.
Для вершин графа используется окраска – они могут быть белыми, серыми и черными.
Вначале все вершины белые.
В ходе работы белая вершина может стать серой, а серая – черной.
Окрашенные вершины (серые и черные) – уже обнаруженные в ходе поиска вершины.
Только серые вершины могут иметь смежные еще не обнаруженные вершины.
Вначале дерево поиска состоит только из корня – начальной вершины s. Как только алгоритм обнаруживает новую белую вершину v, смежную с ранее найденной вершиной u, вершина v вместе с ребром (u,v) добавляется к дереву поиска. Каждая вершина обнаруживается только однажды.
Процедура BFS (поиск в ширину) использует представление графа G=(V,E) списками смежных вершин. Для каждой вершины u графа дополнительно хранятся ее цвет color[u] и ее предшественник [u]. Если предшественника нет [u] = NIL.
Кроме того расстояние от s до u записывается в поле d[u].
Процедура использует очередь Q для хранения множества серых вершин.
head [Q] – указатель головы очереди;
ENQUEUE (Q,x) – процедура добавления элемента x в Q
DEQUEUE (Q) –процедура удаления элемента из Q
BFS (G,s)
1 for (для) каждой вершины u V[G] – {s}
2 do color[u] БЕЛЫЙ
3 d[u]
4 [u] NIL
5 color[s] СЕРЫЙ
6 d[s] 0
7 [s] NIL
8 Q {s}
9 while Q
10 do u head [Q]
11 for (для) всех v Adj [u]
12 do if colour [v] = БЕЛЫЙ
13 then color [v] СЕРЫЙ
14 d [v] d[u] +1
15 [v] u
16 ENQUEUE (Q,v)
17 DEQUEUE (Q)
18 colour[u] ЧЕРНЫЙ
Задача о кратчайшем пути
Дан ориентированный взвешенный граф G=(V,E) с вещественной весовой функцией w:E→R.
Весом пути p = v0,v1,…,vk называется сумма весов ребер, входящих в этот путь:
Вес кратчайшего пути из u в v равен , по определению,
Кратчайший путь из u в v – это любой путь p из u в v, для которого w(p)= (u,v) .
Варианты задачи о кратчайшем пути
Кратчайшие пути из одной вершины: дан взвешенный граф G=(V,E) и начальная вершина s; требуется найти кратчайшие пути из s во все вершины vV.
Кратчайшие пути в одну вершину: дана конечная вершина t, требуется найти кратчайшие пути в t из всех вершин vV.
Кратчайший путь между данной парой вершин: даны вершины u и v, найти кратчайший путь из u в v.
Кратчайшие пути для всех пар вершин: для каждой пары вершин u и v, найти кратчайший путь из u в v.
Ребра отрицательного веса
При наличии ребер отрицательного веса важно, есть ли циклы отрицательного веса.
Если из вершины s можно добраться до цикла отрицательного веса, для вершин этого цикла не существует кратчайших путей (-).
Если циклов отрицательного веса нет, то любой цикл можно выбросить, не удлиняя пути.
Представление кратчайших путей в алгоритме
Пусть G=(V,E) - заданный граф. Для каждой вершины vV мы будем помнить ее предшественника [v] . Предшественник – это либо другая вершина, либо NIL.
По завершении работы алгоритма цепочка предшественников, начинающаяся с произвольной вершины v, будет представлять кратчайший путь из s в v.
Ориентированный подграф предшествования G=(V,E), определенный так:
V ={ vV : [v] ≠ NIL } { s },
E={( [v], v) E: v V \{ s }},
по окончании работы алгоритмов будет «деревом кратчайших путей».
Пример графа
Граф предшествования (вариант 1)
Граф предшествования (вариант 2)
Свойство оптимальности для подзадач
Любая часть кратчайшего пути сама есть кратчайший путь. Это значит, что задача обладает свойством оптимальности для подзадач – признак того, что к ней может быть применено динамическое программирование или жадный алгоритм.
Релаксация
Все алгоритмы для поиска кратчайших путей основаны на технике, называемой релаксацией.
Для каждой вершины v V мы храним некоторое число d[v], являющееся верхней оценкой веса кратчайшего пути из s в v (далее будет использоваться термин – оценка кратчайшего пути).
Начальное значение оценки кратчайшего пути и массива устанавливается процедурой
INITIALIZE-SINGLE-SOURCE (G,s)
1 for (для) всех вершины v V[G]
2 do d[v]
3 [v] NIL
4 d[s]0
Релаксация ребра (u,v) E состоит в следующем: значение d [v] уменьшается до d [u] + w(u,v) ( если второе значение меньше первого). Одновременно с изменением d [v] меняется значение [v].
RELAX (u,v,w)
1 if d [v] > d [u] + w(u,v)
2 then d [v] d [u] + w(u,v)
3 [v] u
Пример релаксации
Доказательство правильности алгоритмов поиска кратчайших путей приводится в работе
Т.Кормен, Ч.Лейзерсон, Р.Ривест Алгоритмы: построение и анализ. М.:МЦНМО, 1999. – 960 с.
