Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм Джонсона — Википедия

Алгоритм Джонсона

Алгоритм Джонсона — позволяет найти кратчайшие пути между всеми парами вершин взвешенного ориентированного графа. Данный алгоритм работает, если в графе содержатся рёбра с положительным или отрицательным весом, но отсутствуют циклы с отрицательным весом. Назван в честь Д. Б. Джонсона[en], опубликовавшего алгоритм в 1977 году.

АлгоритмПравить

Дан граф G = ( V , E )   с весовой функцией ω : E R  . Если веса всех рёбер ω   в графе неотрицательные, можно найти кратчайшие пути между всеми парами вершин, запустив алгоритм Дейкстры один раз для каждой вершины. Если в графе содержатся рёбра с отрицательным весом, но отсутствуют циклы с отрицательным весом, можно вычислить новое множество рёбер с неотрицательными весами, позволяющее воспользоваться предыдущим методом. Новое множество, состоящее из весов рёбер ω ^  , должно удовлетворять следующим свойствам.

  • Для всех рёбер ( u , v )   новый вес ω ^ ( u , v ) > 0  .
  • Для всех пар вершин u , v V   путь p   является кратчайшим путём из вершины u   в вершину v   с использованием весовой функции ω   тогда и только тогда, когда p   — также кратчайший путь из вершины u   в вершину v   с весовой функцией ω ^  .

Сохранение кратчайших путейПравить

Лемма (Изменение весов сохраняет кратчайшие пути). Пусть дан взвешенный ориентированный граф G = ( V , E )   с весовой функцией ω : E R  , и пусть h : V R   — произвольная функция, отображающая вершины на действительные числа. Для каждого ребра ( u , v ) E   определим

ω ^ ( u , v ) = ω ( u , v ) + h ( u ) h ( v ) .  

Пусть p = v 0 , v 1 , , v k   — произвольный путь из вершины v 0   в вершину v k  . p   является кратчайшим путём с весовой функцией ω   тогда и только тогда, когда он является кратчайшим путём с весовой функцией ω ^  , то есть равенство ω ( p ) = δ ( v 0 , v k )   равносильно равенству ω ^ ( p ) = δ ^ ( v 0 , v k )  . Кроме того, граф G   содержит цикл с отрицательным весом с использованием весовой функции ω   тогда и только тогда, когда он содержит цикл с отрицательным весом с использованием весовой функции ω ^  .

Изменение весаПравить

  1. Для данного графа создадим новый граф G = ( V , E )  , где V = V { s }  , для некоторой новой вершины s V  , а E = E { ( s , v ) : v V }  .
  2. Расширим весовую функцию ω   таким образом, чтобы для всех вершин v V   выполнялось равенство ω ( s , v ) = 0  .
  3. Далее определим для всех вершин v V   величину h ( v ) = δ ( s , v )   и новые веса для всех рёбер ω ^ ( u , v ) = ω ( u , v ) + h ( u ) h ( v ) 0  .

Основная процедураПравить

В алгоритме Джонсона используется алгоритм Беллмана — Форда и алгоритм Дейкстры, реализованные в виде подпрограмм. Рёбра хранятся в виде списков смежных вершин. Алгоритм возвращает обычную матрицу D = d i j   размером | V | × | V |  , где d i j = δ ( i , j )  , или выдает сообщение о том, что входной граф содержит цикл с отрицательным весом.

Алгоритм Джонсона
Строится граф 
  
    
      
        
          G
          
        
      
    
    
   
if Bellman_Ford
  
    
      
        (
        
          G
          
        
        ,
        
        ω
        ,
        
        s
        )
      
    
    
    = FALSE
   then do print «Входной граф содержит цикл с отрицательным весом»
           return ø
for для каждой 
  
    
      
        v
        
        
          V
          
        
      
    
    
   
   do присвоить величине 
  
    
      
        h
        (
        v
        )
      
    
    
    значение 
  
    
      
        δ
        (
        s
        ,
        
        v
        )
      
    
    
   ,
      вычисленное алгоритмом Беллмана — Форда
   for для каждого ребра 
  
    
      
        (
        u
        ,
        
        v
        )
        
        
          E
          
        
      
    
    
   
      do 
  
    
      
        
          
            
              ω
              ^
            
          
        
        (
        u
        ,
        
        v
        )
        
        ω
        (
        u
        ,
        
        v
        )
        +
        h
        (
        u
        )
        
        h
        (
        v
        )
      
    
    
   
   for для каждой вершины 
  
    
      
        u
        
        V
      
    
    
   
      do вычисление с помощью алгоритма Дейкстры
         
  
    
      
        (
        G
        ,
        
        
          
            
              ω
              ^
            
          
        
        ,
        
        u
        )
      
    
    
    величин 
  
    
      
        
          
            
              δ
              ^
            
          
        
        (
        u
        ,
        
        v
        )
      
    
    
   
         для всех вершин 
  
    
      
        v
        
        V
      
    
    
   
      for для каждой вершины 
  
    
      
        v
        
        V
      
    
    
   
         do 
  
    
      
        
          d
          
            u
            v
          
        
        
        
          
            
              δ
              ^
            
          
        
        (
        u
        ,
        
        v
        )
        +
        h
        (
        v
        )
        
        h
        (
        u
        )
      
    
    
   
return D

СложностьПравить

Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде фибоначчиевой кучи, то время работы алгоритма Джонсона равно O ( V 2 log V + V E )  . При более простой реализации неубывающей очереди с приоритетами время работы становится равным O ( V E log V )  , но для разреженных графов эта величина в асимптотическом пределе ведёт себя лучше, чем время работы алгоритма Флойда — Уоршелла.

См. такжеПравить

СсылкиПравить

ЛитератураПравить