Поиск кратчайших путей

Одна из проблем, о которой стоит помнить, — содержит ли версия алгоритма, эффективная по затратам памяти, достаточно информации для восстановления самих кратчайших путей?

В случае алгоритма выравнивания последовательностей из предыдущего раздела нам пришлось прибегнуть к хитроумному методу «разделяй и властвуй» для восстановления решения в реализации, эффективной по затратам памяти.

Однако на этот раз короткие пути восстанавливаются намного проще. Чтобы облегчить восстановление кратчайших путей, мы усовершенствуем код: каждый узел v будет сохранять первый узел (после себя) на пути к конечной точке t; обозначим этот первый узел first[v]. Значение first[v] обновляется при каждом обновлении расстояния M [v].

Другими словами, когда значение M [v] сбрасывается до минимума (cvw + M [w]), мы присваиваем first[v] узел w, для которого этот минимум достигается.

Пусть теперь P обозначает направленный «граф указателей», узлами которого являются V, а ребрами — {(v, first[v])}. Ключевой факт заключается в следующем:

(6.27) Если граф указателей P содержит цикл C, то этот цикл должен иметь отрицательную стоимость.

Доказательство. Если first[v] = w в любой момент времени, то должно выполняться условие M [v] ≥ cvw + M [w]. В самом деле, левая и правая стороны равны после обновления, которое задает first[v] равным w; а поскольку M [w] может уменьшаться, это уравнение может превратиться в неравенство.

Пусть v1, v2, …, vk — узлы, входящие в цикл C графа указателей; будем считать, что (vk, v1) — последнее добавляемое ребро.

Теперь рассмотрим значения непосредственно перед последним обновлением. В этот момент M [vi] ≥  + M [vi+1] для всех i = 1, …, k − 1, а также M [vk] >      + M [v1], потому что мы собираемся обновить M [vk] и изменить first[vk] на v1.

При суммировании всех этих неравенств значения M [vi] аннулируются, и мы получаем : отрицательный цикл, как и утверждалось.

Узнай цену консультации

"Да забей ты на эти дипломы и экзамены!” (дворник Кузьмич)