Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
графы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.09 Mб
Скачать

Кратчайший путь

Рассмотрим задачу поиска кратчайшего пути, связывающего пару данных вершин в нагруженном орграфе. Слово «кратчайший» здесь вполне уместно, поскольку довольно часто веса в орграфе — это расстояния между пунктами.

Типичная ситуация, которая моделируется нагруженным орграфом, это транспортная сеть (по которой товары доставляются из города в город) и коммуникационная сеть (по которой переправляется информация).

Рассмотрим нагруженный граф на рис. 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.