Re: Дейкстра
- From
- Dmitry Volkov (2:5015/185.5)
- To
- Arthur Martirosyan
- Date
- 2002-05-03T21:11:36Z
- Area
- RU.ALGORITHMS
Привет, многоуважаеый Arthur,
Правильно ли помню я, что 26.04.02 9:20:02
разговаривал ты с Vitaly Slobodskoy про "Дейкстра"?
AM>>>>>>> Проблема такого характера: Нужно написать прогу по алгоритму
AM>>>>>>> Дейкстра, реализовав его не для дерева, что, я понимаю, есть метод
AM>>>>>>> оптимизации путей в сетях,.. а нужно реализовать поиск кратчайшего
AM>>>>>>> пути из "А" (начального пункта) в "В" (конечный пункт).
Итак, во-первых, НЕ существует алгоритма, который ищет кратчайший путь
только между заданными вершинами. Есть на выбор два алгоритма:
- алгоритм Флойда, который ищет кратчайший путь между ВСЕМИ парами вершин.
Его сложность O(n^3).
Область применения: ориентированный граф без ЦИКЛОВ с отрицательным весом.
- и алгоритм Дейкстры(Дийкстры), который находит кратчайший путь от заданной
вершины до всех остальных. Сложность - O(n^2)
Область применения: ориентированный граф без ДУГ с отрицательным весом.
(Сюда, с соответственными ограничениями подойдут и неориентированный граф, и
даже дерево:)
Значит, выбрали Дейсктру:) Очень хорошо...
[прослушал...]
VS>> Так в чем проблема с Дейкстрой?? Есть у тебя, например, матрица
VS>> расстояний от i-ого пункта в j-ый, если прямого пути нет, то это как-то
VS>> выделяется, например, -1. К примеру, тебе надо узнать ВСЕ кратчайшие
VS>> пути из пункта 1 во все остальные пункты. Строишь таблицу (реализуешь
VS>> программно как захочешь):
[прослушал...]
Как примечание: собственно, эта матрица - матрица кратчайших расстояний
от начального пункта(в нашем случае - пункта 1) до всех остальных. Очевидно,
что Mas[1] = 0 и еще:
VS>> Вот, теперь во втором столбике указываешь из исходной матрицы
VS>> расстояния из 1-ого пункта в соответственно пункт, соответствуюший
VS>> строке таблицы, например, так:
[прослушал...]
VS>> путь, тебе нужно будет еще хранить маненькую историю. Все это очень
VS>> легко программируется. Вот и весь алгоритм Дейкстры.
[прослушал...]
AM> кратчайшего пути этот алгоритм (тобой приведенный) не дает.. в моей
AM> задаче это получился даже не второй и не третий по величине путь.. Так
AM> вот вопрос в том, работает ли вообще алгоритм Дейкстры для нахождения
AM> кратчайшего пути в неориентированном графе? У меня выбор кратчайшего
AM> пути
AM> получается простым перебором всех вариантов.. Кстати. вот моя задача:
AM> для
AM> понимания проще нарисовать неориентированный граф, я же привожу
AM> матрицу..
[прослушал...]
AM> Это простой пример, который я просто еру за основу.. Опять же,
AM> встречаются и вообще тупиковые ситуации, когда придется двигаться
AM> обратно..
Спасибо, конечно, за пример :)
Но, к сожалению, ты не указал:
- начальный пункт (как я понимаю, ты имеешь в виду - пункт 1)
- то, что у тебя выдавала РЕАЛИЗАЦИЯ алгоритма
- и то, что выдавал полный перебор
Я хотя тебе, конечно, верю, но Дейкстре как-то больше верится:))
Вопрос "на засыпку": почему же алгоритм работает правильно?
( Далее по тексту "время"="расстояние")
На каждом шаге мы выбераем пункт L, куда мы еще не "ходили" и куда мы можем
попасть за минимальное (из оставшихся пунктов) "время" и пытаемся из него с
помощью "его" ребер сминимизировать "время" до оставшихся пунктов.
Очевидно, "время" до тех пунктов, которые уже просмотрены, "сминимизить"
нельзя (действительно, для всех I (где I - пункт, который уже промотрен) Mas[I]
< Mas[L] + NewPut[I, L], т.к. Mas[I] < Mas[L] - по алгоритму, а все дуги имеют
неотрицательный вес )
Далее, предположим для выбранной вершины "время" не минимально. Тогда
существует путь с суммарным весом меньше, чем mas[I]. Обозначим за J
-предпоследний пункт в этом пути. Получили, что:
Mas[I] > Mas[J] + Duga[I, J].
Очевидно, получили противоречие.
ЗЫ: Разбор примера оставляю Виталику, благо до меня дошли слухи, что он
подробно его(пример) разобрал (только слухи - версия почты старая:).
ЗЫ2: Есть же нормальные книги, типа Кормена и др."Алгоритмы: построение и
анализ", нестареющий:) Кнут, Шень "Программирование: теоремы и задачи" и т.д.
Думаю, в описанных там алгоритмах глюков не много. Берешь и пишешь на
нужном языке...
ЗЫ3: В доказательстве мог наглючить(в чем (не)сильно сомневаюсь), но уж
Дейкстра-то точно не глючит:)
Ветра в спину, Arthur,
Не забывай в своих прогах о
2mi3 (DiMiTry Volkov)
--- WP/95 Rel 1.78E (215.0) Reg.
* Origin: Ибо Митин. (с) Теория сусликов (2:5015/185.5)