
- •Алгоритмы на графах
- •Обходы графов
- •Поиск в глубину (пг)
- •Алгоритм поиска в глубину в неориентированном связном графе
- •Поиск в ширину (пш)
- •Алгоритм поиска в ширину в неориентированном связном графе
- •Нахождение деревьев и остовов с помощью пг и пш
- •Нахождение дерева покрытия с помощью .
- •Нахождение дерева покрытия с помощью
- •Остов минимального веса (кратчайший остов)
- •Задача об остове минимального веса:
- •Алгоритм Краскала.
- •Алгоритм Прима.
- •Кратчайшие пути
- •Алгоритм Дейкстра
- •Алгоритм Дейкстра поиска кратчайшего пути.
- •Алгоритм Флойда
- •Алгоритм Флойда
Нахождение дерева покрытия с помощью
Результат работы алгоритма – дерево
покрытия (ориентированное)
.
Пусть
- вершина, с которой начинается поиск.
-
;
;
; // адрес 1-ой ячейки
;
// адрес последней ячейки
-
;
;
-
;
-
Если вершина
уже просмотрена, то п.5. Иначе
;
;
п.5.
-
Если
, то и.6, иначе
и п.4.
-
;
-
Если
, то конец, иначе п.2.
Чтобы найти остов несвязного графа, нужно для каждой компоненты связности построить дерево покрытия.
-
Остов минимального веса (кратчайший остов)
-
Граф (ориентированный или неориентированный), каждому ребру которого сопоставлено число, будем называть взвешенным. Число, сопоставленное ребру, будем называть весом или длиной ребра.
-
Остов минимального веса – остов, сумма весов рёбер которого минимальна по сравнению с другими остовами.
Замечание. Далее мы будем рассматривать взвешенные графы.
Рассмотрим следующую задачу: во взвешенном связном графе требуется найти остов минимального веса. Эта задача возникает при проектировании линий электропередачи, дорог, и т.д., когда требуется заданные центры соединить некоторой системой каналов связи так, чтобы любые два центра были связаны либо непосредственно соединяющим их каналом, либо через другие центры и каналы, и чтобы общая стоимость (или длина) каналов была минимальной.
Для решения задачи нахождения минимального остова имеются эффективные алгоритмы. Опишем некоторые из них – алгоритм Краскала и Прима, применимые к произвольно связному графу.
Задача об остове минимального веса:
В связном взвешенном графе
порядка
найти остов минимального веса,
-
функция, ставящая в соответствие ребру
графа некоторый вес
.
Алгоритм Краскала.
-
Строим граф
, присоединяя к пустому графу
ребро
минимального веса.
-
Если граф
уже построен и
, то строим граф
где
- ребро графа
, имеющее минимальный вес среди ребер, не входящих в
и не составляющих циклов с рёбрами из
.
Рассмотрим граф:
Алгоритм Прима.
-
Выбираем ребро
минимального веса и строим дерево
, пологая
.
-
Если дерево
порядка
- уже построена и
, то среди рёбер, вершины этого дерева с вершинами графа
, не входящими в
, выбираем ребро
минимального веса. Строим дерево
, присоединяя к
ребро
вместе с его не входящими в
концами.
В некоторых ситуациях требуется построить остов не минимального а, максимального веса. К этой задаче также применимы оба алгоритма. Следует только всюду минимальный вес заменять на максимальный.
-
Кратчайшие пути
Пусть
-
ориентированный взвешенный граф.
Задача о кратчайшем пути состоит в
отыскании пути минимального веса,
соединяющего задание начальную и
конечную вершину графа
при условии, что хотя бы 1 такой путь
ет.
Начальную и конечную вершины обозначим
соответственно через
и
.
-
путь минимального веса будем называть
кратчайшим
путём.
-
Алгоритм Дейкстра
Вначале рассмотрим случай, когда веса
всех дуг неотрицательны, т.е.
для каждой дуги
.
В этом случае решение задачи о кратчайшем
пути является мене трудоёмким, чем в
общем случае.
Первый эффективный алгоритм построения кратчайшего пути в графе с неотрицательными весами дуг предложил Дейкстра в 1959.
На каждой итерации этого алгоритма
всякая вершина
графа
имеет метку
,
которая может быть постоянной или
временной. В первом случае
-вес
кратчайшего
-
пути. Если же метка
временная, то
-
вес кратчайшего пути,
-пути,
проходящего только через вершины с
постоянными метками. Т.о., временная
метка
является оценкой сверху для веса
кратчайшего
-
пути, и став на некоторой итерации
постоянной, она остается такой до конца
работы алгоритма.
Кроме
,
с каждой вершиной
графа
,
за исключением
,
связывается ещё одна метка
.
На каждой итерации
является номером вершины, предшествующей
в
- пути имеющем минимальный вес среди
всех
-
путей, проходящих через вершины,
получившие к этому моменту постоянные
метки. После того, как вершина
получила постоянную метку. С помощью
меток
легко указать последовательность
вершин, составляющий кратчайший
-
путь.
Перед началом первой итерации алгоритма
вершина
имеет постоянную метку
,
а метки всех остальных вершин
и эти метки временные.
Будем считать, что граф
задан матрицей весов либо списками
смежности.