Re: Кратчайший маршрут

From
Oleg I. Khovayko ()
To
Victor Antropov
Date
2003-01-06T19:14:27Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>

Victor Antropov wrote:

> Как рекурсивно найти кратчайший путь в графе?

Рекурсивно - наверное, обойти граф весь и ставить
в каждый узел длину пути.

На самом деле, эта задача решается без всякой рекурсии

  *** Волновым алгоритмом. ***

Идея следуюшая: Из точки-источника пускаешь волну.
Как только волна достигла точки-приемника - путь найден.

Пример:

Есть граф:

1--2--3---4---5
   |          |
   6----------+--7

Надо найти путь между точками 1..7.
Из точки 1 пускаешь волну.
На шаге 0 фронт волны находится в точке 1.
Далее:
Шаг: 1  Фронт: 2
Шаг: 2  Фронт: 3,6
Шаг: 3  Фронт: 4,5,7

Все, путь найден.
В каждом узле, куда пришел фронт, ставишь метку,
откуда он пришел, и по этим меткам раскручиваешь
обратный путь.

Реализовывать алгоритм надо через очередь.
То есть

1. Создаем очередь и засовываем в нее элемент 1
2. Пока очередь не пуста делать:
   2.1. вынуть ссылку на элемент из очереди (тек)
   2.2. Если тек. элемент - цель, выйти из цикла, и перейти на раскручивание
        пути. Тек. элемент должен содержать ссылку на пред., и т.п - до самой 
        начальной точки. Это и будет кратчайший путь.
   2.3. Иначе: для каждой граф-связи (дуги)
       тек. элемента делать:
       2.3.1. Заглянуть в узел, указаный связью (дугой)
       2.3.2. Если узел не помечен (ссылка на prev пустая), 
              пометить его номером тек. узла, и положить 
              ссылку на  указаный связь узел в очередь.

3. Ошибка: Пути не существует.

> Нужно внятное описание алгоритма или исходники на Паскале.

Не, это сам пиши.

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)