Новосибирский Государственный Университет
Опубликован: 08.11.2006 | Доступ: свободный | Студентов: 1941 / 96 | Оценка: 4.27 / 4.09 | Длительность: 12:16:00
Специальности: Программист
Лекция 16:

Алгоритмы на графах

< Лекция 15 || Лекция 16: 123 || Лекция 17 >
Аннотация: Поиск в глубину. Алгоритм Дейкстры нахождения кратчайшего пути. Алгоритм Флойда нахождения кратчайших путей между парами вершин. Программы.

Поиск в глубину

При решении многих задач, касающихся ориентированных графов, необходим эффективный метод систематического обхода вершин и дуг орграфов. Таким методом является метод поиск в глубину. Метод поиска в глубину является основой многих эффективных алгоритмов работы с графами. Предположим, что есть ориентированный граф G, в котором первоначально все вершины помечены меткой " unvisited ". Поиск в глубину начинается с выбора начальной вершины v орграфа G, для этой вершины метка " unvisited " меняется на метку " visited ". Затем для каждой вершины, смежной с вершиной v и не посещаемой раньше, рекурсивно применяется поиск в глубину. Когда все вершины, которых можно достичь из вершины v, будут рассмотрены, поиск заканчивается. Если некоторые вершины остались не посещенными, то выбирается одна из них и алгоритм повторяется. Этот процесс продолжается до тех пор, пока не будут обойдены все вершины орграфа G.

Метод получил свое название - поиск в глубину, поскольку поиск не посещенных вершин идет в направлении вглубь до тех пор, пока это возможно. Например, пусть x является последней посещенной нами вершиной. Выбираем очередную дугу (x,y) (ребро), выходящую из вершины x. Возможна следующая альтернатива: вершина y помечена меткой " unvisited "; вершина y помечена меткой " visited ". Если вершина y уже посещалась, то отыскивается другая вершина, смежная с вершиной x ; иначе вершина y метится меткой " visited " и поиск начинается заново от вершины y. Пройдя все пути, которые начинаются в вершине y, возвращаемся в вершину x, то есть в ту вершину, из которой впервые была достигнута вершина y. Затем процесс повторяется, то есть продолжается выбор нерассмотренных дуг, исходящих из вершины x, и так до тех пор, пока не будут исчерпаны все эти дуги.

Алгоритм Дейкстры нахождения кратчайшего пути

Рассмотрим алгоритм нахождения путей в ориентированном графе. Пусть есть ориентированный граф G(V,E), у которого все дуги имеют неотрицательные метки (веса дуг), а одна вершина определена как источник. Задача состоит в нахождении весов кратчайших путей от источника ко всем другим вершинам граф G(V,E). Здесь длина пути определяется как сумма весов дуг, составляющих путь. Эта задача часто называется задачей нахождения кратчайшего пути с одним источником. Отметим, что мы будем говорить о длине пути даже тогда, когда она измеряется в других, не линейных, единицах измерения, например, во временных единицах или в денежном эквиваленте.

Можно представить орграф G(V,E) в виде карты маршрутов рейсовых полетов из одного города в другой. Каждая вершина соответствует городу, а ребро (дуга) (v,w) - рейсовому маршруту из города v в город w. Вес дуги (v,w) - это время полета из города v в город w. В этом случае решение задачи нахождения кратчайшего пути с одним источником для ориентированного графа трактуется как минимальное время перелета между различными городами.

Для решения поставленной задачи будем использовать "жадный" алгоритм, который называют алгоритмом Дейкстры (Dijkstra). Алгоритм строит множество S вершин, для которых кратчайшие пути от источника уже известны. На каждом шаге к множеству S добавляется та из оставшихся вершин, расстояние до которой от источника меньше, чем для других оставшихся вершин. Если веса всех дуг неотрицательны, то можно быть уверенным, что кратчайший путь от источника к конкретной вершине проходит только через вершины множество S. Назовем такой путь особым. На каждом шаге алгоритма используется также массив M, в который записываются длины кратчайших особых путей для каждой вершины. Когда множество S будет содержать все вершины орграфа, то есть для всех вершин будут найдены особые пути, тогда массив M будет содержать длины кратчайших путей от источника к каждой вершине.

Алгоритм Флойда нахождения кратчайших путей между парами вершин

Предположим, что мы имеем помеченный орграф, который содержит время полета по маршрутам, связывающим определенные города, и~мы хотим построить таблицу, где приводилось бы минимальное время перелета из одного (произвольного) города в любой другой. В этом случае мы сталкиваемся с общей задачей нахождения кратчайших путей, то есть нахождения кратчайших путей между всеми парами вершин орграфа.

Формулировка задачи.Есть ориентированный граф G(V,E), каждой дуге (ребру) (v,w) этого графа сопоставлен неотрицательный вес C_{vw}. Общая задача нахождения кратчайших путей заключается в нахождении для каждой упорядоченной пары вершин v,w любого пути от вершины v в вершину w, длина которого минимальна среди всех возможных путей от v к w .

Можно решать эту задачу, последовательно применяя алгоритм Дейкстры для каждой вершины, объявляемой в качестве источника. Но мы для решения поставленной задачи воспользуемся алгоритмом, предложенным Флойдом (R.W. Floyd). Пусть все вершины орграфа последовательно пронумерованы от 1 до n. Алгоритм Флойда использует матрицу A(n \times n), в которой находятся длины кратчайших путей:

A_{ij}  = C_{ij}, если i \ne j ;

A_{ij}  = 0, если i = j ;

A_{ij}  = \infty если отсутствует путь из вершины i в вершину j.

Над матрицей A выполняется n итераций. После k -й итерации A_{ij} содержит значение наименьшей длины пути из вершины i в вершину j, причем путь не проходит через вершины с номерами большими k.

Вычисление на k -ой итерации выполняется по формуле: A_{ij}^k  = \min (A_{ij}^{k - 1},A_{ik}^{k - 1},A_{kj}^{k - 1} ) Верхний индекс k обозначает значение матрицы A после k -ой итерации.

Для вычисления A_{ij}^k проводится сравнение величины A_{ij}^{k -1} (то есть стоимость пути от вершины i к вершине j без участия вершины k или другой вершины с более высоким номером) с величиной A_{ik}^{k - 1}  + A_{kj}^{k - 1} (стоимость пути от вершины i к вершине k плюс стоимость пути от вершины k до вершины j ). Если путь через вершину k дешевле, чем A_{ij}^{k - 1}, то величина A_{ij}^k изменяется. Рассмотрим орграф:

Помеченный орграф

Рис. 16.1. Помеченный орграф

Матрица A(3 * 3) на нулевой итерации (k = 0)

\left[ {\begin{array}{*{20}c}
   0 & 8 & 5  \\
   3 & 0 & \infty   \\
   \infty  & 2 & 0  \\
 \end{array} } \right]

Матрица A(3 * 3) после первой итерации (k = 1)

\left[ {\begin{array}{*{20}c}
   0 & 8 & 5  \\
   3 & 0 & 8  \\
   \infty  & 2 & 0  \\
 \end{array} } \right]

Матрица A(3 * 3) после второй итерации (k = 2)

\left[ {\begin{array}{*{20}c}
   0 & 8 & 5  \\
   3 & 0 & 8  \\
   5 & 2 & 0  \\
 \end{array} } \right]

Матрица A(3 * 3) после третьей итерации (k = 3)

\left[ {\begin{array}{*{20}c}
   0 & 7 & 5  \\
   3 & 0 & 8  \\
   5 & 2 & 0  \\
 \end{array} } \right]
< Лекция 15 || Лекция 16: 123 || Лекция 17 >