- •Введение
- •Неориентированные графы
- •Основные определения
- •Маршруты, циклы и связность
- •Ориентированные графы
- •Основные определения
- •Маршруты и связность в ориентированных графах
- •Структуры данных для представления графа
- •Матричное представление графов
- •Матрица инциденций
- •Матрица циклов
- •Матрица разрезов
- •Матрица смежности вершин
- •Матрица путей
- •Представление графов в виде списков
- •Упорядоченные графы
- •Задачи нахождения путей в графах
- •Алгоритм вычисления стоимости прохождения между узлами
- •Алгоритм
- •Алгоритм нахождения кратчайшего пути
- •Задачи с одним источником
- •Алгоритм Дейкстры
- •Метод поиска в глубину
- •Алгоритм поиска в глубину на неориентированном графе
- •Поиск в глубину в ориентированном графе
- •Вычислительная сложность алгоритмов
- •Библиографический список
- •Оглавление
Алгоритм Дейкстры
Вход. Орграф G = (V, E), источник, функция l, отображающая множество V V в множество неотрицательных вещественных чисел. Полагаем l(vi, vj) = +, если ребро не принадлежит графу, vi vj, и l(v, v) = 0.
Выход. Для каждого узла v V наименьшая сумма меток на ребрах, взятая по всем путям, идущим из v0 в v.
Метод. Строим такое множество узлов S V, что кратчайший путь из источника в каждый узел v S целиком лежит в S. Массив D[v] содержит стоимость текущего кратчайшего пути из v0 в v, который проходит только через узлы из S.
S = {v0}
D[v0] = 0
v (V \ {v0}): D[v] = l(v0, v)
S V:
Выбрать узел w (V \ S), для которого D[w] принимает наименьшее значение.
Добавить w к S.
Для v (V \ S):
D[v] = MIN(D[v], D[w] + l(w, v))
Рассмотрим
пример решения задачи с применением
алгоритма (рис.16):

Рис.16. Граф для иллюстрации применения алгоритма Дейкстры
Результат работы алгоритма обычно оформляется в виде таблицы (табл. 1).
Таблица 1
Таблица результатов работы алгоритма Дейкстры
|
Итерация |
S |
w |
D[w] |
D[v1] |
D[v2] |
D[v3] |
D[v4] |
|
Нач. знач. |
{v0} |
- |
- |
2 |
+ |
+ |
10 |
|
1 |
{v0 ,v1} |
v1 |
2 |
2 |
5 |
+ |
9 |
|
2 |
{v0,v1, v2} |
v2 |
5 |
2 |
5 |
9 |
9 |
|
3 |
{v0,v1, v2, v3} |
v3 |
9 |
2 |
5 |
9 |
9 |
|
4 |
{v0,v1, v2, v3, v4} |
v4 |
9 |
2 |
5 |
9 |
9 |
Метод поиска в глубину
Метод обхода узлов неориентированного графа называется поиском в глубину, так как процесс поиска идет в направлении вперед (вглубь) до тех пор, пока это возможно. Идея алгоритма состоит в следующем.
Выбираем и посещаем некоторый произвольный узел v. Затем выбираем произвольное ребро (v, w) и посещаем узел w. Пусть x – последний посещенный узел. Для продолжения процесса поиска выбираем какое-нибудь, не рассмотренное еще ребро (x, y). Если узел y уже посещался, ищем другое новое ребро, инцидентное x. Если y раньше не посещался, идем в y и заново начинаем поиск от узла y. Пройдя все пути, начинающиеся в y, возвращаемся в x, то есть в тот узел, из которого был впервые достигнут узел y. Затем продолжаем выбор нерассмотренных ребер, инцидентных узлу x, до тех пор, пока не будет исчерпан список этих ребер.
Этот метод поиска можно применить и на ориентированном графе. В этом случае, находясь в узле x, необходимо выбирать ребра (x, y), только выходящие из x. Исследовав все ребра, выходящие из y, возвращаемся в x даже тогда, когда в y входят другие ребра, еще не рассмотренные.
Метод поиска в глубину на неориентированном графе G = (V, E) разбивает множество его ребер E на два подмножества T и B. Ребро (v, w) помещается в T, если узел w не посещался до того момента, когда, рассматривая ребро (v, w), оказываемся в узле v. В противном случае, ребро (v, w) помещается во множество B.
Ребра из T называются древесными, а ребра из B – обратными. Подграф (V, T) представляет собой неориентированный лес, называемый остовным лесом для G, построенным поиском в глубину или глубинным остовным лесом для G.
