Для данного ориентированного взвешенного графа, имеющего одно отрицательное ребро (u, v), найти кратчайший путь (s, t)

Дано: ориентированный взвешенный граф G (V, E) и s,t являются вершинами V, все ребра положительны, за исключением ребра (u,v), которое отрицательно.

Проблема: найдите кратчайший путь (Значение: с наименьшим весом) от s до t.

Мое решение: Так как у нас есть отрицательное преимущество, мы должны использовать алгоритм Беллмана-Форда. Выполнение n-1 "расслабления" краев, и если есть проблема на n итерации, есть цикл - таким образом, верните false. в противном случае верните кратчайший путь от s до t.

Другое решение: используя Дейкстру и немного изменив его, сохранив d (u) и передав отрицательный край (u, v) и сделав «расслабление», мы снова проходим по всем краям без отрицательный край, если расстояния были изменены, мы имеем цикл, в противном случае все хорошо и возвращаем кратчайший путь.

Примечание. Я, очевидно, не уверен в своем решении, тот факт, что есть одно отрицательное преимущество, сложно, есть идеи?

Примечание 2: Чтобы было интересно, вы не можете использовать Bellman-Ford.


person Ilan Aizelman WS    schedule 03.06.2017    source источник


Ответы (1)


Вы можете использовать информацию о наличии единственного отрицательного края для создания эффективного алгоритма.

Обозначим как a исходный узел отрицательного края и b узел назначения, так что у нас есть отрицательный край a -> b.

Есть два вида путей от узла s к узлу t:

  1. край a->b не является частью пути;
  2. край a->b является частью пути.

Мы намерены найти кратчайший путь от s до t, и мы сделаем это, найдя кратчайший путь каждого из двух вышеуказанных типов.


Минимальный путь вдоль линий типа (1) можно найти, просто применив алгоритм Дейкстры к модифицированному графу, в котором удалено отрицательное ребро.


Для типа (2) теперь нас интересует кратчайший путь от s до t, который содержит ребро a->b. Этот путь должен иметь следующую форму: s -> ... -> a -> b -> ... -> t.

Если у нас нет отрицательных циклов в графе, то ребро a->b должно появиться только один раз на кратчайшем пути (см. Последнюю часть этого ответа, чтобы обсудить отрицательные циклы).

В этой ситуации (без отрицательных циклов) мы можем применить алгоритм Дейкстры дважды, сначала чтобы найти кратчайший путь от s до a; а затем найти кратчайший путь от b до t. В обоих случаях алгоритм Дейкстры следует применить к графу, измененному путем удаления отрицательного ребра a->b.


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

Однако можно определить, есть ли такой цикл на графе, снова используя алгоритм Дейкстры. Обратите внимание: поскольку существует единственный отрицательный край, a->b, отрицательный цикл должен содержать его. Таким образом, нам нужен путь от b к a, общая стоимость которого меньше абсолютного значения веса a->b. Мы можем проверить, существует ли такой путь, применив алгоритм Дейкстры с начальным узлом b и пунктом назначения a. Опять же, алгоритм Дейкстры должен быть применен к графу с удаленным ребром a->b (нас не интересует его наличие на пути), поэтому все веса ребер положительны.

person qwertyman    schedule 03.06.2017
comment
Я понимаю. Поэтому, если у нас нет отрицательного края кратчайшего пути, мы просто запускаем Дейкстру один раз. В противном случае мы запускаем его 4 раза, дважды для поиска кратчайшего пути и дважды для проверки наличия отрицательного цикла. - person Ilan Aizelman WS; 03.06.2017
comment
@IlanAizelmanWS На самом деле, просто мы не знаем заранее, находится ли отрицательный край на кратчайшем пути, поэтому мы всегда пробуем оба случая. Мы проверяем, в какой ситуации общая стоимость меньше, и это будет ответ. - person qwertyman; 03.06.2017
comment
Что ж, я все еще немного запутался. Если я начну Дейкстру с s, он не остановится на u. Он пройдет по всем вершинам графа. добавит ли ему строку «если достигну, то вернет кратчайший путь»? - person Ilan Aizelman WS; 03.06.2017
comment
И почему цикл должен содержать отрицательный край? Могут быть положительные циклы. - person Ilan Aizelman WS; 03.06.2017
comment
Собственно я только что нашел решение этого вопроса в точности как ваше. Ну, что ж, спасибо! - person Ilan Aizelman WS; 03.06.2017
comment
@IlanAizelmanWS Тем не менее я отвечу на вопросы, чтобы сделать этот ответ более ясным. Что касается применимости Dijkstra для поиска пути к одному месту назначения - вы можете прекратить поиск, как только вы вытолкнете целевой узел из очереди. Гарантируется, что соответствующая стоимость не будет обновлена. Что касается положительных циклов - они не актуальны, потому что оптимальный путь не должен содержать ни одного из них (включение положительного цикла в путь только увеличит общую стоимость пути). - person qwertyman; 03.06.2017