
- •Глава 4. Графы
- •4.1. Введение в теорию графов
- •Графы и терминология
- •4.2. Гамильтоновы графы
- •Алгоритм ближайшего соседа
- •4.3. Деревья
- •Поиск минимального остовного дерева
- •Контрольные вопросы
- •Задачи для самостоятельного решения
- •Основные тезисы
- •4.4. Ориентированные графы
- •Алгоритм топологической сортировки
- •Пути в орграфах
- •Кратчайший путь
- •Алгоритм Дейкстры
- •Контрольные вопросы.
- •Задания для самостоятельного выполнения
- •Основные тезисы
Кратчайший путь
Рассмотрим задачу поиска кратчайшего пути, связывающего пару данных вершин в нагруженном орграфе. Слово «кратчайший» здесь вполне уместно, поскольку довольно часто веса в орграфе — это расстояния между пунктами.
Типичная ситуация, которая моделируется нагруженным орграфом, это транспортная сеть (по которой товары доставляются из города в город) и коммуникационная сеть (по которой переправляется информация).
Рассмотрим нагруженный граф на рис. 4.34. Он может представлять, например, длины дорог в милях между шестью деревнями. Поскольку количество вершин в этом графе невелико, то перебрать все возможные пути между любой парой заданных вершин нам вполне по силам. При этом, естественно, мы найдем наиболее короткий путь, соединяющий соответствующие деревни. В реальной задаче, возникающей в профессиональной деятельности, число вершин, как правило, настолько велико, что такой упрощенный подход к поиску кратчайшего пути слишком неэффективен.
Рис. 4.34. Нагруженный граф
Существует множество алгоритмов поиска кратчайшего пути, но мы познакомимся только с одним, алгоритмом Дейкстры.
Перед формальным изложением алгоритма мы опишем его действия и проиллюстрируем работу алгоритма на нашем примере. Допустим, что нужно найти кратчайший путь от вершины А к любой другой вершине орграфа (см. рис. 8.5). Кратчайший путь — это путь минимального общего веса, соединяющий выбранные вершины. Общий вес, по определению, равен сумме весов всех дуг, составляющих путь. Общий вес кратчайшего пути, ведущего из вершины и в вершину v , называют расстоянием от и до v.
Определим весовую матрицу w, чьи элементы w(u, v) задаются формулой
Для нашего графа весовая матрица выглядит следующим образом:
В течение работы алгоритма каждой вершине v орграфа присваивается число d[v], равное расстоянию от вершины А до v. Перед началом работы d[v] совпадает с весом дуги (A, v), если такая существует, или равно ∞ в противном случае. Мы будем проходить вершины орграфа и уточнять значения d[v].
На каждом шагу алгоритма отмечается одна вершина и, до которой уже найден кратчайший путь от A и расстояние d[u] до нее. Далее полученное значение d[u] отмеченной вершины не меняется. Для оставшихся, неотмеченных вершин v, число d[v] будет меняется с учетом того, что искомый кратчайший путь до них от А будет проходить через последнюю отмеченную вершину и. Алгоритм завершится в тот момент, когда все возможные вершины будут отмечены и получат свои окончательные значения d[v].
Для каждого шага алгоритма, описанного ниже, в соответствующую строку табл. 4.6 заносится отмеченная вершина, текущие значения d[v] и оставшиеся неотмеченные вершины. При этом полужирным шрифтом выделяется наименьшее из значений d[v] среди неотмеченных вершин. Соответствующую вершину следует отметить. Кроме того, в таблице все значения d[v] для уже отмеченных вершин отделены от остальных ломаной линией.
Таблица 4.6
Шаг |
Отмеченные вершины |
Расстояние до вершины |
Неотмеченные вершины |
||||||
А |
B |
C |
D |
E |
F |
||||
0 |
A |
0 |
2 |
|
3 |
|
|
B,C,D,E,F, |
|
1 |
B |
0 |
2 |
3 |
3 |
6 |
|
C,D,E,F |
|
2 |
C |
0 |
2 |
3 |
3 |
5 |
|
D,E,F |
|
3 |
D |
0 |
2 |
3 |
3 |
5 |
|
E,F |
|
4 |
E |
0 |
2 |
3 |
3 |
5 |
6 |
F |
|
5 |
F |
0 |
2 |
3 |
3 |
5 |
6 |
|
Шаг 0 Поскольку мы интересуемся кратчайшими путями от вершины А, мы ее отмечаем и используем первую строку весовой матрицы w для определения начальных значений d[v]. Таким образом, получается первая строка таблицы. Наименьшее число из всех d[v] для неотмеченных вершин — это d[B] = 2.
Шаг 1 Отмечаем вершину В, так как она является ближайшей к А. Вычисляем длины путей, ведущих от A к неотмеченным вершинам через вершину В. Если новые значения d[v] оказываются меньше старых, то меняем последние на новые. Итак, при этом проходе цикла путь ABC имеет вес 3, а путь ABE — 6, в то время как старые расстояния до этих вершин от А были ∞. Следовательно, заполняя вторую строку таблицы, мы заменим d[C] на 3 и d[E] на 6.
Шаг 2 Из оставшихся неотмеченными, вершины С и D находятся ближе всех к А. Отметить можно любую из них. Возьмем вершину D. Так как длина пути ADE равна 5, текущее значение d[E] следует уменьшить до 5. Теперь можно заполнить третью строчку таблицы. Наименьшее значение d[v] среди неотмеченных к этому моменту вершин оказывается у вершины С.
Шаг 3 Отмечаем вершину С и подправляем значения d[v]. Теперь можно дойти и до вершины F, следуя путем А В C F. Его длина, а стало быть и значение d[F], равны 8. К этому моменту остались неотмеченными две вершины: Е и F.
Шаг 4 Мы отмечаем вершину Е, что позволяет нам уменьшитьвеличину d[F] с 8 до 6.
Шаг 5 Отмечаем вершину F.