Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Глава 21, Кратчайшие пути
■ Чтобы переназначить вес ребра, необходимо добавить к весу этого ребра разность ■ Чтобы переназначить вес сети, необходимо переназначить веса всех ребер сети. Например, следующий простой код переназначает вес сети в соответствие с принятыми соглашениями: for (v = 0; v < G-> V(); v++) { typename Graph:: adjIterator A(G, v); for (Edge* e = A.beg();! A.end(); e = A.nxt()) e-> wt() s e-> wt() + wt[v] - wt[e-> w()] } Эта операция является простым линейным во времени процессом, который строго определен для всех сетей, независимо от весов. Замечательно, что кратчайшие пути в полученной сети остаются теми же, что и кратчайшие пути в исходной сети. Свойство 21.23. Переназначение весов сети не воздействует на кратчайшие пути. Доказательство: Для любых двух заданных вершин s и t переназначение весов изменяет вес любого пути из s в t за счет добавления разности между весами s и t Это утверждение легко доказать методом индукции по длине пути. При переназначении веса сети вес каждого пути из s в t изменяется на одно и то же значение каким бы путь ни был, длинным или коротким. В частности, этот факт предполагает непосредственно, что длина кратчайшего пути между любыми двумя вершинами в преобразованной сети остается такой же, как и длина кратчайшего пути между ними в исходной сети. ■ Поскольку в путях между различными парами вершин веса могут быть переназначены по-разному, переназначение весов могло бы повлиять на такие факторы, которые включают сравнение длин кратчайших путей (например, вычисление диаметра сети). В таких случаях нам следует обратить переназначение весов после завершения вычисления кратчайших путей, но перед использованием результатов. Переназначение весов не помогает в случае сетей с отрицательными циклами: эта операция не изменяет веса ни одного цикла, так что с ее помощью мы не можем удалить отрицательные циклы. Но для сетей без отрицательных циклов мы можем стремиться обнаружить такое множество вершин, что переназначение весов приведет к весам ребер, которые являются неотрицательными, независимо от того, каковы были первоначальные веса. С неотрицательными весами ребер мы можем затем решить задачу поиска кратчайших путей для всех пар с помощью версии алгоритма Дейкстры для всех пар. Например, рис. 21.31 дает такой пример для нашей типовой сети, а рис. 21.32 показывает вычисление кратчайших путей по алгоритму Дейкстры на преобразованной сети без отрицательных ребер. Следующее свойство показывает, что мы всегда можем найти такое множество весов. Свойство 21.24. В произвольной сети, не содержащей отрицательных циклов, выберем произвольную вершину s и присвоим каждой вершине \ вес, равный длине кратчайшего пути в v из s. Переназначение весов сети с этими весами вершин дает в результате неотрицательные веса ребер для каждого ребра, которое соединяет вершины, достижимые из s. Доказательство: Для заданного произвольного ребра v-w вес v суть длина кратчайшего пути в v, а вес w суть длина кратчайшего пути в w. Если v-w есть конечное ребро Часть 5. Алгоритмы на графах
на кратчайшем пути в w, то разность между весом w и весом v в точности составит вес v-w. Другими словами, переназначение веса ребра даст вес 0. Если кратчайший путь через w не проходит через v, то вес v плюс вес v-w должен быть больше или равен весу w. Другими словами, переназначение веса ребра даст положительный вес. ■ Подобно тому, как это было в случае применения алгоритма Беллмана-Форда для обнаружения отрицательных циклов, существуют два способа, чтобы в произвольной сети без отрицательных циклов сделать вес каждого ребра неотрицательным. Либо можно начать с источника в каждой сильно связной компоненте, либо добавить к каждой вершине сети фиктивную вершину с ребром длины 0. В любом случае результатом будет остовный лес кратчайших путей, которым можно воспользоваться для присвоения весов вершинам (а именно, веса пути в SPT из корня в вершину). Например, значения весов, выбираемые на рис. 21.31, являются в точности длинами кратчайших путей из 4, поэтому ребра в дереве кратчайших путей с корнем в 4 имеют веса 0 для сети с переназначенными весами. В конечном итоге мы можем решить задачу поиска кратчайших путей для всех пар в сетях, которые содержат отрицательные веса ребер, но не имеют отрицательных циклов, продолжая следующим образом: ■ При помощи алгоритма Беллмана-Форда нахо ■ Если алгоритм выявляет отрицательный цикл, ■ Переназначаем вес сети на основе леса. ■ Применяем версию алгоритма Дейкстры для После этих вычислений матрица путей дает кратчайшие пути в обеих сетях, а матрица расстояний дает длины путей в сети с переназначенными весами. Эта последовательность шагов иногда известна как алгоритм Джонсона (Johnson's algorithm) (см. раздел ссылок). РИСУНОК 21.31. ПЕРЕНАЗНАЧЕНИЕ ВЕСОВ СЕТИ Для любого произвольно заданного распределения весов на вершинах (верхняя часть рисунка) можно переназначить веса всех ребер в сети за счет добавления к каждому весу ребра, разности весов его начальной и конечной вершин. Переназначение весов не воздействует на кратчайшие пути, поскольку оно вносит одно и то же изменение в веса всех путей, соединяющих каждую пару вершин. Например, рассмотрим путь 0-5-4-2-3, его вес в первоначальной сети есть 0.29 + 0.21 + 0.32 + 0.50 = 1.32, а в переназначенной сети — 1.12 + 0.19 + 0.12 + 0.34 = 1.77; эти веса отличаются на 0.45 = 0.81 — 0.36, т.е. на разность весов вершин 0 и 3. При этом веса всех путей между 0 и 3 изменились на одну и ту же величину. Свойство 21.25. С помощью алгоритма Джонсона можно решить задачу поиска кратчайших путей для всех пар в сетях, которые не содержат отрицательных циклов, за время, пропорциональное VE log(d)V где d = 2, если Е < 2V, и d = E/V в противном случае. Глава 21, Кратчайшие пути РИСУНОК 21.32. ВСЕ КРАТЧАЙШИЕ ПУТИ В СЕТИ С ПЕРЕНАЗНАЧЕННЫМИ ВЕСАМИ Эти диаграммы показывают SPT для каждой вершины в сети, обратной для сети с переназначенными весами из рис. 21.31, которые были бы получены по алгоритму Дейкстры при вычислении кратчайших путей в исходной сети из рис. 21.26. Эти пути являются такими же, как для сети перед переназначением весов (см. рис. 21.9). Векторы st в этих схемах представляют собой столбцы матрицы путей из рис. 21.26. Векторы wt в этой схеме соответствуют столбцам в матрице расстояний, но нам необходимо отменить переназначение весов для каждого элемента за счет вычитания веса исходной вершины и добавления веса конечной вершины в пути (см. рис. 21.31). Например, из третьей строки снизу можно видеть, что в обоих сетях кратчайшим путем из 0 в 3 будет 0-5-1-4-3, а его длина составляет 1.13 в показанной здесь сети с переназначенными весами. Сравнивая с рис. 21.31 можно вычислить его длину в исходной сети, вычтя вес 0 и добавив вес 3, получив при этом результат 1.13-0.81 + 0.36 = 0.68, т.е. элемент в строке 0 и столбце 3 матрицы расстояний на рис. 21.26. Все кратчайшие пути, ведущие в 4 в этой сети, имеют длину 0, поскольку эти пути использовались для переназначения весов. Часть 5. Алгоритмы на графах Доказательство: См. свойства 21.22-21.24 и резюме, подведенное в предыдущем абзаце. Граница худшего случая времени выполнения непосредственно вытекает из свойств 21.7 и 21.22. ■ Для реализации алгоритма Джонсона мы объединяем реализацию программы 21.9, код переназначения весов, рассмотренный перед свойством 21.23, и реализацию алгоритма Дейкстры поиска кратчайших путей для всех пар из программы 21.4 (или из программы 20.6 для случая плотных графов). Как отмечалось в доказательстве свойства 21.22, мы должны соответствующим образом модифицировать алгоритм Беллмана-Форда для сетей, которые не являются сильно связными (см. упражнения 21.135—21.137). Для завершения реализации интерфейса поиска кратчайших путей для всех пар можно либо вычислить истинные длины путей за счет вычитания веса начальной и добавления веса конечной вершины (т.е. отменить операцию переназначения весов для путей) при копировании двух векторов в матрицы расстояний и путей в алгоритме Дейкстры, либо поместить эти вычисления в GRAPHdist в реализации АТД. Для сетей, не содержащих отрицательных весов, задача выявления циклов решается более просто, чем задача вычисления кратчайших путей из единственного источника ко всем другим вершинам; при этом последняя решается более просто, чем задача вычисления кратчайших путей, соединяющих все пары вершин. Данные факты соответствуют нашим интуитивным представлениям. В противоположность этому, аналогичные факты для сетей, которые содержат отрицательные веса, нам кажутся противоестественными: алгоритмы, которые мы обсудили в этом разделе, показывают, что для сетей, которые содержат отрицательные веса, лучшие из известных алгоритмы решения трех упомянутых задач обладают сходными характеристиками быстродействия для худшего случая. Например, в худшем случае, определение, содержит ли сеть единственный отрицательный цикл, приблизительно столь же сложно, как и поиск всех кратчайших путей в сети того же размера, которая не имеет отрицательных циклов.
|