Можем ли мы изменить алгоритм Дейкстры для работы с отрицательными весами?

Псевдокод, взятый из Википедии:

function Dijkstra(Graph, source):
 2      for each vertex v in Graph:                                // Initializations
 3          dist[v] := infinity ;                                  // Unknown distance function from source to v
 4          previous[v] := undefined ;                             // Previous node in optimal path from source
 5      end for ;
 6      dist[source] := 0 ;                                        // Distance from source to source
 7      Q := the set of all nodes in Graph ;                       // All nodes in the graph are unoptimized - thus are in Q
 8      while Q is not empty:                                      // The main loop
 9          u := vertex in Q with smallest distance in dist[] ;    // Start node in first case
10          if dist[u] = infinity:
11              break ;                                            // all remaining vertices are inaccessible from source
12          end if ;
13          remove u from Q ;
14          for each neighbor v of u:                              // where v has not yet been removed from Q.
15              alt := dist[u] + dist_between(u, v) ;
16              if alt < dist[v]:                                  // Relax (u,v,a)
17                  dist[v] := alt ;
18                  previous[v] := u ;
19                  decrease-key v in Q;                           // Reorder v in the Queue
20              end if ;
21          end for ;
22      end while ;
23      return dist[] ;
24  end Dijkstra.

Теперь в строке 14 мы видим, что релаксация применяется только к соседям u, которые еще не удалены из Q . Но если мы возьмем также соседей u, которые были удалены из Q, мне кажется, что алгоритм действительноработает с отрицательными весами. Я не нашел ни одного примера, который противоречит этому утверждению.

Так почему же алгоритм Дейкстры не изменен таким образом?

7
задан Ori Popowski 29 May 2012 в 13:15
поделиться