Расслабляет ли алгоритм Дейкстраса края кратчайшего пути по порядку?

В упражнении 24.3-5 «Введение в алгоритмы, 3-е издание» нужен пример того, что это неверно (не всегда верно). Это возможно? На мой взгляд, это невозможно, потому что каждое ребро расслаблено в то время, когда путь к текущей вершине уже определен.

Слово в слово:

Профессор Н. утверждает, что имеет доказательство правильности алгоритма Дейкстры. Он утверждает, что алгоритм Дейкстры расслабляет ребра каждого кратчайшего пути в графе в том порядке, в котором они появляются на пути, и поэтому свойство релаксации пути применяется к каждой вершине, достижимой из источника. Покажите, что профессор ошибается, построив ориентированный граф, для которого алгоритм Дейкстры мог бы ослабить ребра кратчайшего пути в неправильном порядке.


person Steinbitglis    schedule 18.09.2010    source источник
comment
получите это упражнение здесь или какой-нибудь пример кода   -  person Svisstack    schedule 19.09.2010
comment
Это точный вопрос? Если нет, выложите, пожалуйста, точно, слово в слово?   -  person IVlad    schedule 19.09.2010
comment
Мое единственное предположение - использовать ребра с нулевым весом (поскольку они явно разрешены в ITA). Очевидно, что в сети нулевых ребер каждый путь - кратчайший.   -  person Nikita Rybak    schedule 19.09.2010


Ответы (5)


Я думаю, что ключевая фраза в формулировке состоит в том, что алгоритм Дейкстры «ослабляет края каждого кратчайшего пути в графе ...»

Это уже ложь, если существует несколько кратчайших путей с одинаковой стоимостью.

Рассмотрим этот граф: A -> B, A -> C, B -> D, C -> D. Источник - A, пункт назначения - D. Вес каждого ребра равен 1. Есть два пути от A к D, один через B. и один через C. Однако одно ребро B-> D или C-> D никогда не расслабляется.

Все еще не убежден, потому что дейкстра завершается до вычисления другого ребра в D? Добавьте дополнительное ребро D-> E и установите Destination на E. Путь от A-> D через B имеет ту же стоимость, что и A-> D через C, и они оба дешевле, чем стоимость от A-> E. Однако вы никогда не ослабите второе ребро в D, поскольку алгоритм ослабляет ребра только до вершин, к которым ему еще не известен кратчайший путь.

person Nate    schedule 10.11.2011
comment
Не знаю, правильно ли это, но я пометил ваш ответ как решение. - person Steinbitglis; 02.12.2011
comment
@Nate your argument- ... алгоритм только ослабляет ребра к вершинам, которые он еще не знает, кратчайший путь к неверен. Каждый раз, когда добавляется вершина, Дейкстра расслабляет каждое исходящее ребро. - person raghavsood33; 04.10.2015
comment
@ raghavsood33 Звучит правильно; Дейкстра расслабляет каждое исходящее ребро, когда посещает узел. Мне нравится ответ user2131509. - person Nate; 06.10.2015

Рассмотрим следующий ориентированный граф: (A, B), (A, C), (B, D), (C, D), (D, E) с весами ребер w (A, B) = 1, w (A , C) = 1, w (B, D) = 0, w (C, D) = 0, w (D, E) = 1, исходной вершиной является A. Возможная перестановка ребер, ослабленных в алгоритме Дейкстры, (A, B), (A, C), (B, D), (D, E), (C, D). Кроме того, A.d = 0, B.d = 1, C.d = 1, D.d = 1, E.d = 2 после выполнения алгоритма Дейкстры. Есть два кратчайших пути от A до E: один - ABDE, а другой - ACDE. Противоречие состоит в том, что для второго пути ребро (C, D) всегда должно быть расслаблено перед (D, E).

person user2131509    schedule 04.03.2013
comment
Кажется, единственный случай, когда какое-то ребро имеет нулевой вес. В этом примере D и C имеют одинаковое значение 1 после ослабления (A, B). Если D выбран перед C, релакс (C, D) не будет оцениваться. - person jason zhang; 20.12.2015

Дело в том, что вывод следует не из посылок, а для построения контрпримера. SSSP находит все кратчайшие пути. Нет причин, по которым кратчайшие пути нужно искать в строгом порядке. Рассмотрим древовидный граф. Все пути также кратчайшие. Теперь, если мы расслабим корень, то на ребрах не будет особого порядка. Но предположим, что вы даже наложили один. Затем, после ослабления ближайшего некорневого узла, у вас может появиться куча действительно длинных ребер для второго уровня. У следующего ближайшего корневого соседа может быть куча действительно коротких исходящих ребер к этой части второго уровня. В этом случае вы ослабите ребра, которые составляют общую длину пути КОРОЧЕ, чем другие ребра, которые вы уже ослабили, поскольку вы всегда ослабляете УЗЛЫ, а не ребра, в порядке кратчайшего пути.

person Ian    schedule 30.09.2010

Рассмотрим график:

    A--->B  A--->C  B--->C  C--->D 

и пусть каждое ребро имеет вес 0.

Алгоритмы Дейкстры могли ослабить края в порядке

    (A,C) (A,B) (C,D) (B,C)

В графе есть два кратчайших пути от A до D, каждый из которых стоит 0.

    A-->B-->C-->D   or   A-->C-->D

Ребра кратчайшего пути {A -> B -> C -> D} расслабляются не по порядку, поскольку (B, C) расслабляется ПОСЛЕ (C, D).

person Arun Kumar    schedule 26.11.2013

Изготовьте одно лезвие весом три, которое достигнет места назначения. Теперь добавьте путь, состоящий из нескольких остановок, общим весом менее трех, который также приведет к месту назначения. Когда вы ослабите начало координат, вы закрасите целевой узел как три, что неверно. Вы должны продолжать расслаблять все узлы ближе чем (мин. Известный путь к месту назначения), пока этот набор не станет пустым. Только тогда вы можете быть уверены, что алгоритм D дал вам правильный ответ.

Посмотрите алгоритм A *, чтобы получить больше удовольствия.

person Ian    schedule 19.09.2010
comment
Края кратчайшего пути по-прежнему расслаблены, не так ли? - person Steinbitglis; 19.09.2010