Введение

Алгоритм поиска двух непересекающихся кратчайших путей — это алгоритм в области маршрутизации компьютерных сетей. Он используется для нахождения пары кратчайших путей без общих ребер между заданной парой вершин. Для неориентированного графа G(V, E) алгоритм формулируется следующим образом:

1. Запустить алгоритм поиска кратчайшего пути для заданной пары вершин.
2. Заменить каждое ребро кратчайшего пути (эквивалентное двум дугам, направленным в противоположные стороны) одной дугой, направленной к исходной вершине.
3. Присвоить каждой из вышеуказанных дуг отрицательную длину.
4. Запустить алгоритм поиска кратчайшего пути (Примечание: алгоритм должен поддерживать отрицательные веса).
5. Удалить общие ребра двух найденных путей и изменить направление оставшихся дуг на первом кратчайшем пути так, чтобы каждая дуга была направлена к целевой вершине. В результате получается искомая пара путей. Вместо универсального алгоритма Форда для кратчайшего пути, работающего с отрицательными дугами в любом месте графа (при условии отсутствия отрицательных циклов), Бхандари предлагает два различных алгоритма, любой из которых можно использовать на шаге 4. Один из алгоритмов является незначительной модификацией традиционного алгоритма Дейкстры, а другой, называемый алгоритмом поиска в ширину (BFS), является вариантом алгоритма Мура. Поскольку отрицательные дуги присутствуют только на первом кратчайшем пути, в преобразованном графе не возникает отрицательных циклов (шаги 2 и 3). В неотрицательном графе модифицированный алгоритм Дейкстры сводится к традиционному алгоритму Дейкстры и, следовательно, может быть использован на шаге 1 вышеописанного алгоритма (и аналогично алгоритм BFS).

Пример

Основные шаги алгоритма поиска двух непересекающихся кратчайших путей показаны ниже: на рисунке А представлен данный неориентированный граф G(V, E) с весами ребер. На рисунке B изображен вычисленный кратчайший путь ABCZ из A в Z (выделен жирным шрифтом). На рисунке C показано изменение направления дуг кратчайшего пути и присвоение им отрицательных весов. На рисунке D изображен кратчайший путь ADCBZ из A в Z, найденный в новом преобразованном графе, представленном на рисунке C (это определяется с использованием модифицированного алгоритма Дейкстры (или алгоритма BFS), применимого к графам с отрицательными весами дуг; в таком преобразованном графе не возникает отрицательных циклов). На рисунке E показан найденный кратчайший путь ADCBZ в исходном графе. На рисунке F показана найденная пара непересекающихся кратчайших путей (ABZ, ADCZ) после удаления общего ребра BC из путей ABCZ и ADCBZ и соответствующей группировки оставшихся ребер.

Обсуждение

В неотрицательном графе модифицированный алгоритм Дикстры функционирует как традиционный алгоритм Дикстры. В графе, характеризующемся вершинами со степенями O(d) (d < |V|), эффективность составляет O(d|V|), будучи O(|V|²) в худшем случае, как и в случае традиционного алгоритма Дикстры. В преобразованном графе алгоритма поиска кратчайших пар ребер без общих ребер, который содержит отрицательные дуги, заданная вершина, ранее "постоянно" помеченная на шаге 2a модифицированного алгоритма Дикстры, может быть пересмотрена и перемаркирована на шаге 3a и возвращена в набор вершин S (шаг 3b). Эффективность модифицированного алгоритма Дикстры в таком преобразованном графе становится O(d²|V|), будучи O(|V|³) в худшем случае. Большинство графов, представляющих практический интерес, обычно являются разреженными, имеющими степень вершины O(1), в этом случае эффективность модифицированного алгоритма Дикстры, применяемого к преобразованному графу, становится O(|V|) (или, эквивалентно, O(|E|)). Алгоритм поиска кратчайших пар ребер без общих ребер затем становится сопоставимым по эффективности с алгоритмом Суурбаля, который в общем случае имеет сложность O(|V|²), из-за дополнительного преобразования графа, которое перевешивает граф, чтобы избежать отрицательных весов дуг, позволяя использовать алгоритм Дикстры для обоих шагов поиска кратчайшего пути. Перевес требует построения всего дерева кратчайших путей, укорененного в исходной вершине. Обходя это дополнительное преобразование графа и используя вместо этого модифицированный алгоритм Дикстры, подход Бхандари приводит к упрощенной версии алгоритма поиска кратчайших пар ребер без общих ребер без существенной потери эффективности, по крайней мере, для разреженных графов. Получающаяся простая форма также легко расширяется до алгоритмов поиска K (>2) непересекающихся путей и их вариаций, таких как частично непересекающиеся пути, когда полная непересекаемость отсутствует, а также к графам с ограничениями, с которыми сталкивается сетевой специалист в более сложных реальных сетях. Версия алгоритма поиска пар кратчайших путей без общих вершин получается путем разделения каждой вершины (за исключением исходной и целевой вершин) первого кратчайшего пути на шаге 3 алгоритма, соединения пары разделенных вершин дугой с нулевым весом (направленной к исходной вершине) и замены любого инцидентного ребра двумя дугами противоположного направления, одна из которых инцидентна вершине разделенной пары (ближе к исходной вершине), а другая дуга исходит из другой вершины. Версии для K (>2) получаются аналогичным образом, например, вершины кратчайшей пары ребер без общих ребер (за исключением исходной и целевой вершин) разделяются, причем вершины в каждой разделенной паре соединяются друг с другом дугами нулевого веса, а также внешние ребра соединяются аналогичным образом [8][9]. Алгоритмы, представленные для ненаправленных графов, также распространяются на направленные графы и применимы в целом к любой задаче (в любой технической дисциплине), которая может быть смоделирована как граф вершин и ребер (или дуг).