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